Overview
The workspace is defined inpnpm-workspace.yaml:
pnpm-workspace.yaml
- Shared dependencies: Common packages used across multiple apps
- Code reuse: UI components, utilities, and auth logic shared between apps
- Efficient builds: Turborepo caches builds and runs tasks in parallel
- Type safety: TypeScript configurations shared via
@repo/typescript-config
Directory Structure
Applications (apps/)
The monorepo contains four Next.js applications, each serving a distinct purpose.
Cashgap
apps/cashgap
A comprehensive expense tracking and financial management application
- User authentication with NextAuth.js
- MongoDB integration for data persistence
- Dashboard with financial overview
- Expense and income tracking
- Subscription management
- Email notifications via Nodemailer
package.json
/- Landing page/(auth)/login- Login page/(auth)/register- Registration page/(dashboard)/dashboard- Main dashboard/expenses- Expense management/income- Income tracking/subscriptions- Subscription management/settings- User settings/api/*- API routes
pnpm --filter cashgap dev
Secure
apps/secure
Security-focused application with advanced authentication features
- Two-factor authentication (2FA)
- QR code generation for authenticator apps
- Session management with JWT
- User profile with avatar support
- Data visualization with Recharts
- Advanced security monitoring
package.json
pnpm --filter secure dev
Web
apps/web
Marketing website and landing page
- Server-side rendering
- Optimized for SEO
- Minimal dependencies
- Fast page loads
- Tailwind CSS v4 styling
package.json
pnpm --filter web dev
Docs
apps/docs
Documentation website
pnpm --filter docs dev
Shared Packages (packages/)
@repo/ui
packages/ui
Shared component library built on Radix UI and Tailwind CSS
package.json
button.tsx):
packages/ui/src/button.tsx
@radix-ui/*- Accessible component primitivesclass-variance-authority- Type-safe variant managementlucide-react- Icon librarytailwind-merge- Merge Tailwind classes intelligently
@repo/auth
packages/auth
Shared authentication components and hooks
package.json
use-auth.ts):
packages/auth/src/use-auth.ts
@repo/eslint-config
packages/eslint-config
Shared ESLint configurations for consistent code quality
eslint-config-next- Next.js specific ruleseslint-config-prettier- Prettier integration
app/package.json
@repo/typescript-config
packages/typescript-config
Shared TypeScript configurations
tsconfig.json
Scripts
Thescripts/ directory contains utility scripts:
clear-databases.ts
Utility script to reset MongoDB databases during development:fix-dev-decryption.sh
Bash script to resolve development decryption issues.Turborepo Configuration
Theturbo.json file defines how tasks are executed:
turbo.json
dependsOn: ["^build"]- Build dependencies firstoutputs- Cache Next.js build artifactsenv- Specify required environment variablescache: falsefor dev - Don’t cache development modepersistent: true- Keep dev servers running
Dependency Management
The monorepo uses pnpm workspaces with version pinning:package.json
Workspace Protocol
Shared packages use theworkspace:* protocol:
Adding Dependencies
- Root Dependencies
- App Dependencies
- Dev Dependencies
Design System
The monorepo includes a comprehensive design system documented inDESIGN_SYSTEM.md:
Color System
OKLCH colors for perceptually uniform dark-first design
Typography
Geist Sans font with consistent heading and body styles
Components
Buttons, inputs, cards, modals with standardized variants
Layouts
Auth pages, dashboards, and sidebar patterns
- Dark-first - Designed for dark mode primarily
- Soft corners - Large border-radius (20px+)
- Subtle depth - Light shadows and semi-transparent borders
- Consistent spacing - 4/8px grid system
- Muted accents - Color used sparingly for emphasis
Build Pipeline
When you runpnpm build, Turborepo:
- Analyzes dependencies - Determines build order
- Builds packages first -
@repo/ui,@repo/auth, configs - Builds apps - In parallel when possible
- Caches outputs - Skips unchanged packages
- Validates environment - Checks required env vars
Performance Optimization
Parallel Execution
Turborepo runs independent tasks in parallel for faster builds
Smart Caching
Build outputs are cached - only rebuild what changed
Remote Caching
Share cache across team members with Vercel Remote Cache
Incremental Builds
Only affected apps rebuild when you change code
Common Patterns
Creating a New App
Creating a New Package
Best Practices
Shared Code
Extract common code to packages - DRY principle
Type Safety
Use TypeScript extensively with strict mode enabled
Granular Exports
Export individual components for better tree-shaking
Consistent Styling
Follow the design system patterns in all apps
Related Resources
Quickstart
Get up and running quickly
Turborepo Docs
Learn more about Turborepo
pnpm Workspaces
Deep dive into pnpm workspaces