Appearance
Monorepo Structure
TT Time Tracker is a pnpm workspace monorepo. All packages and services are managed from the root with a single pnpm install.
Directory tree
tt-time-tracker/
│
├── src/ # Vue 3 SPA (PWA) — the frontend
│ ├── api/ # HTTP client + generated SDK
│ ├── assets/ # Static assets (CSS, images)
│ ├── components/ # Shared Vue components
│ ├── composables/ # Vue composables (useFormat, useTasks, …)
│ ├── lib/ # Low-level utilities and helpers
│ ├── router/ # Vue Router configuration and routes
│ ├── stores/ # Pinia stores (one per domain)
│ ├── utils/ # Pure utility functions
│ └── views/ # Page-level Vue components
│
├── services/
│ ├── api/ # NestJS REST API
│ │ └── src/
│ │ ├── app.module.ts # Root module — imports all feature modules
│ │ ├── auth/ # better-auth integration, guards, decorators
│ │ ├── casl/ # CASL ability factory, TenantGuard, FeatureGuard
│ │ ├── config/ # Typed configuration via @nestjs/config
│ │ ├── modules/ # Feature modules (entry, invoice, project, …)
│ │ └── prisma/ # PrismaService and PrismaModule
│ └── worker/ # BullMQ background worker
│ └── src/
│ ├── app.module.ts # Worker root module
│ └── modules/ # Job processors
│
├── packages/
│ ├── database/ # @tt/database — Prisma schema, migrations, seed
│ │ └── prisma/
│ │ ├── schema.prisma # Main schema file (imports model files)
│ │ ├── models/ # One .prisma file per model
│ │ └── migrations/ # Migration history
│ ├── schemas/ # @tt/schemas — Zod schemas + TypeScript types
│ ├── queues/ # @tt/queues — BullMQ queue names + job interfaces
│ └── logger/ # @tt/logger — Pino logger
│
├── docs/ # This documentation site (VitePress)
│
├── docker-compose.yaml # Full-stack Docker Compose
├── Dockerfile # Frontend production image (nginx)
├── nginx.conf # nginx SPA config used inside the Docker image
├── package.json # Root scripts and devDependencies
├── pnpm-workspace.yaml # Workspace package paths
└── tsconfig.json # Root TypeScript config (extended by packages)Package roles
| Package | Import path | Who uses it |
|---|---|---|
@tt/database | (not imported — used via prisma.service) | API, worker |
@tt/schemas | @tt/schemas | API (DTO validation), frontend (form validation) |
@tt/queues | @tt/queues | API (enqueue), worker (process) |
@tt/logger | @tt/logger | API, worker |
@tt/telemetry | @tt/telemetry | API, worker |
Root scripts
| Script | Description |
|---|---|
pnpm dev:client | Vue dev server on :5173 |
pnpm dev:api | NestJS API with watch mode on :3000 |
pnpm dev:worker | BullMQ worker with watch mode |
pnpm build:client | Type-check + Vite production build |
pnpm build:api | NestJS production build |
pnpm db:up | Start infrastructure (postgres, redis, rustfs) |
pnpm db:migrate | Apply Prisma migrations |
pnpm db:generate | Regenerate Prisma client |
pnpm db:studio | Open Prisma Studio |
pnpm openapi | Generate typed SDK from openapi.json |
pnpm lint | ESLint the entire monorepo |
pnpm docs:dev | Start VitePress documentation site |
pnpm docs:build | Build the documentation site |