Skip to content
Hooney
한국어

Team projects

Volta micro frontends and design system

I moved an e-tax invoice service to a structure where each part ships on its own (micro frontends) and built a design system for the whole company.

99.8%Usage free of crashes, measured in Sentry, up from 96%

Period
2024.10 ~ 2025.06
Organization
Volta Corporation
Role
Frontend architecture migration and design system

Core value

Volta can now ship and roll back only the part that changed, without rebuilding the whole service.

Outcomes

  • Usage free of crashes rose from 96% to 99.8% (measured in Sentry)
  • Scattered interface pieces unified into one design system
  • The interface stays responsive even when a flood of notifications arrives at once

Tech stack

  • Next.js
  • Turborepo
  • Vercel
  • Shadcn
  • TanStack Query
  • Zustand
  • Web Worker
  • Sentry

Context

Volta is an electronic tax invoice SaaS. As it grew, a single build and a single deployment became the bottleneck. UI was scattered across apps, accumulated technical debt had lowered app stability, and large volumes of real-time notifications stuttered because they blocked the main thread.

Decisions and implementation

  • Micro frontend migration: To let each app deploy on its own, I migrated the monolith to micro frontends step by step. I set up a Turborepo monorepo, defined the boundaries between apps and packages, and split cache units so only changed apps were rebuilt.
  • Moving from AWS Amplify to Vercel, I gave each app its own project so it could deploy and roll back independently, and shortened the deploy cycle with Next.js build caching and bundle optimization.
  • Shadcn design system: I put the company’s design tokens in a separate layer and wrapped Shadcn components so they received styles only through those tokens.
  • I defined the component prop contract on three axes (intent, size, and variant) so new variations could be expressed inside the system. Several apps consumed the same package, and I moved the scattered UI into it gradually.
  • FSD migration: I adopted Feature-Sliced Design (FSD) to decouple the domains, and used TanStack Query to organize the data flow and remove unnecessary global state.
  • I migrated the legacy code gradually to spread the risk, and confirmed in Sentry that the crash-free rate rose from 96% before the stability work to 99.8% after it.
  • I moved bulk notification handling into a Web Worker that combined SSE event processing, central Zustand state, and reconnection and error handling, so the UI kept rendering smoothly while notifications streamed in.