Shipping an extension, a shared crypto SDK and an admin dashboard from one repo only works if the tooling stays out of your way.

Workspaces

pnpm links local packages so the SDK is imported like any dependency but edited in place. No publishing, no version drift.

{ "packages": ["apps/*", "packages/*"] }

Caching the build graph

Turborepo caches task outputs keyed by inputs. Change one package and only its dependents rebuild — everything else is a cache hit.

  • Shared ESLint/TS config as internal packages
  • turbo run build respects the dependency graph
  • CI restores the remote cache, so cold builds are rare

> The monorepo isn't the hard part. Cache invalidation is — and Turbo makes it boring.