Timed Fit is a fitness app: athletes follow ready-made, timed exercise routines; admins manage the exercise library and training plans. Access is a small monthly subscription (billing is not implemented yet — treat it as a future entitlement, not a role).
This repository is the monorepo: GraphQL API, Expo mobile app, admin CRM, and shared Supabase client and migrations.
- apps/
- graphql-server — Node.js GraphQL API (Apollo Server 5 on Express). Supabase via
@timed-fit/supabase-client.GET /health,POST /graphql. - mobile — React Native (Expo) for ATHLETE users. GraphQL only.
- admin — Vite React SPA for ADMIN users. GraphQL only. S3 + CloudFront.
- graphql-server — Node.js GraphQL API (Apollo Server 5 on Express). Supabase via
- packages/
- supabase-client — typed Supabase client for server-side use
- supabase-migrations — Supabase CLI config, auth, and DB migrations
- tsconfig — base TypeScript configs
See ARCHITECTURE.md for data flow, AGENTS.md for AI/agent guidance, and wiki/index.md for product/business context.
- Node.js 21.x (CI uses 21.7.3)
- pnpm 9.14.x (
packageManagerinpackage.json) - Supabase CLI (link to staging for migrations and type generation)
This project does not use NX Cloud (neverConnectToCloud in nx.json).
pnpm installCopy env examples:
apps/graphql-server/.env.example→.env.localapps/mobile/.env.exampleapps/admin/.env.example
| Command | Description |
|---|---|
pnpm nx run graphql-server:serve |
Start the GraphQL server (port 4000) |
pnpm nx run mobile:start |
Start the Expo app |
pnpm nx run admin:serve |
Start the admin Vite app |
pnpm nx run supabase-migrations:db-push |
Push migrations to the linked Supabase project |
pnpm nx run supabase-migrations:gen-types |
Generate TypeScript types into supabase-client |
pnpm nx run-many -t build |
Build all buildable projects |
Pull requests targeting main or develop run app-specific checks when relevant paths change:
| Workflow | Role on PRs |
|---|---|
supabase-pr.yml |
db push --dry-run (no apply) |
graphql-pr.yml |
Build, typecheck, test, Docker build (no push) |
mobile-pr.yml |
Typecheck and test (no EAS) |
admin-pr.yml |
Typecheck and test (no S3) |
pr-labels.yml |
Path labels |
Deploys are manual via release.yml on develop (staging) or main (production): Supabase db-push, GraphQL Docker → ECR → ECS Express Mode, admin S3 + CloudFront, optional EAS mobile.
See docs/aws-ecs-express.md for GraphQL AWS setup.