Design Systems That Survive Nx Monorepos
Shared UI packages, strict boundaries, and typed tokens so landing and dashboard apps do not fork the same button twice.

Monorepos fail when every app quietly becomes its own design system. The fix is not more documentation — it is a shared package with tree-shakable exports, typed props, and eslint boundaries that make the wrong import physically annoying.
Packages over copy-paste
Buttons, inputs, dialogs, and skeletons live in packages/ui. Apps consume them; features compose them. Business logic never leaks into primitives, and primitives never import from apps.
- Shared tsconfig and eslint-config packages
- Named exports for predictable tree shaking
- Storybook for visual regression on core components
- Tailwind v4 tokens mirrored across apps via CSS variables