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%
- 2024.10 ~ 2025.06
- Volta Corporation
- 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
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.
