Skip to main content

Monorepo Structure

The syncad repository is a Turborepo monorepo managed with pnpm.

Root Files

// package.json (root)
{
"name": "syncad",
"private": true,
"scripts": {
"build": "turbo build",
"dev": "turbo dev",
"lint": "turbo lint",
"test": "turbo test"
},
"devDependencies": {
"turbo": "^2.0.0"
}
}
// pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'
// turbo.json
{
"pipeline": {
"build": { "dependsOn": ["^build"], "outputs": [".next/**"] },
"dev": { "cache": false, "persistent": true },
"test": { "dependsOn": ["build"], "inputs": ["src/**/*.ts"] }
}
}

Directory Structure

syncad/
├── apps/
│ ├── api/ # NestJS API
│ │ ├── src/
│ │ │ ├── main.ts
│ │ │ ├── app.module.ts
│ │ │ ├── env.validation.ts
│ │ │ └── modules/
│ │ │ ├── school-admin/
│ │ │ ├── parent/
│ │ │ ├── teacher/
│ │ │ ├── driver/
│ │ │ ├── bus-tracking/
│ │ │ ├── messaging/
│ │ │ ├── aws/
│ │ │ └── super-admin/
│ │ ├── drizzle.config.ts
│ │ └── Dockerfile
│ ├── school-admin-ui/ # Next.js 14 (MUI + Tailwind)
│ │ ├── src/
│ │ │ ├── app/ # App Router pages
│ │ │ ├── components/
│ │ │ ├── store/ # Redux Toolkit slices
│ │ │ └── lib/ # TanStack Query, API client
│ │ └── next.config.js
│ ├── super-admin/ # Next.js 16 (shadcn + Tailwind)
│ │ ├── src/
│ │ │ ├── app/
│ │ │ ├── components/
│ │ │ └── lib/
│ │ └── next.config.js
│ ├── home/ # Marketing site (Next.js 15, Tailwind v4)
│ │ └── src/
│ │ └── app/
│ └── scs/ # Go school provisioning service
│ ├── cmd/server/main.go
│ ├── internal/
│ └── go.mod
├── packages/
│ ├── db/ # Drizzle ORM schema
│ │ ├── src/
│ │ │ ├── schema.ts # All table definitions
│ │ │ ├── client.ts # DB client factory
│ │ │ └── helpers.ts # getDbFromSchoolId(), etc.
│ │ └── drizzle.config.ts
│ └── react/ # Shared React components
│ ├── src/
│ │ └── components/
│ └── package.json
└── package.json

App Stacks

AppFrameworkUIStateHTTP
apiNestJS
school-admin-uiNext.js 14MUI + Tailwind CSSRedux Toolkit + TanStack QueryAxios
super-adminNext.js 16shadcn/ui + Tailwind CSSReact ContextFetch
homeNext.js 15Tailwind CSS v4React ContextFetch
scsGo

Running Apps

# Build all
pnpm build

# Start only API
pnpm --filter api start:dev

# Start specific UI
pnpm --filter school-admin-ui start:dev

# Run tests for a package
pnpm --filter @syncad/db test

Adding a New Package

mkdir packages/my-package
cd packages/my-package
pnpm init
# add to pnpm-workspace.yaml implicitly (apps/* pattern)

Adding a New App

mkdir apps/my-app
cd apps/my-app
# scaffold with: next init, nest new, etc.
# no manual changes needed to workspace config