Hypertrophy and progressive overload tracking for serious lifters.
This is a monorepo containing:
packages/shared- TypeScript types shared between API and webpackages/api- Express.js REST APIpackages/web- Expo app (web + mobile)
- Node.js 20+
- npm 10+
# Install all dependencies
npm install --legacy-peer-deps
# Run API and web dev servers together
npm run dev
# Or run separately
npm run dev:api # API on localhost:3001
npm run dev:web # Web on localhost:8081# Build specific package
npm run build --workspace=@irondog/api
# Run tests
npm test
# Run tests for specific package
npm run test --workspace=@irondog/web
# Lint all code
npm run lintworkout-tracker/
├── packages/
│ ├── shared/ # Shared TypeScript types
│ │ └── src/types/ # User, Workout, Exercise, etc.
│ ├── api/ # Express REST API
│ │ └── src/ # Routes, middleware, JWT auth
│ └── web/ # Expo web/mobile app
│ ├── app/ # Expo Router screens
│ ├── context/ # React Context providers
│ └── lib/ # API client, utilities
├── .github/workflows/ # CI/CD pipelines
└── package.json # Root workspace config
All packages include tests:
npm test # Run all tests
npm run test:watch --workspace=@irondog/web # Watch modeCurrently: 62 tests passing ✅
- Web: https://irondog.fit (AWS Amplify) - Coming soon
- API: https://api.irondog.fit (AWS Lambda + API Gateway) - Coming soon
- Push to
maintriggers CI/CD - API deploys to AWS Lambda (esbuild bundle →
update-function-code), fronted by API Gateway HTTPS - Web: CI validates the build; Amplify deploys via the committed
amplify.ymlbuild spec - Path filters ensure only changed packages deploy
Each package requires environment variables. See:
packages/api/.env.example- Copy to
.envin each package for local development
- Create feature branch from
main - Make changes
- Run
npm testandnpm run lint - Push - CI will run automatically
- Create PR
Private - All Rights Reserved