Coach
A progressive web app that acts as an AI personal trainer — programming, tracking and adapting workouts session by session.
What it does
Coach programmes and tracks strength training sessions, logs nutrition against a plan, and runs a weekly review reconciling what was actually done against what was planned. It installs as a PWA — usable offline for the core app shell — rather than requiring a native app store build.
How it works
The data model runs on Prisma over SQLite for local development, with authentication and validation handled by Auth.js and Zod respectively. The second build (“v2”) was a deliberate re-assembly of the app around a “journey-first spine” — the actual sequence a user moves through in a week (plan a session, do it, log it, review the week) — rather than the original data-model-first structure, with decisions logged per build slice as they were made.
The interesting problem
TODO (James) — the section a technical reviewer reads first. What made the original (v1) structure worth rebuilding, and what did “journey-first” actually change about how the app is put together?
Stack and why
SQLite was chosen for local-first development speed; Zod validation and a documented per-slice decision log (rather than a single upfront spec) were used to keep a genuinely iterative rebuild honest about what changed and why, rather than losing the reasoning once the old version was replaced.
What I would do differently
TODO (James) — short, in your own words.
Stack
- Next.js (App Router) / TypeScript
- Application and UI
- Prisma + SQLite
- Local data layer for development
- Auth.js (NextAuth)
- Credentials-based authentication
- Zod
- Input and data validation
- Tailwind CSS
- Styling
- PWA (manifest + service worker)
- Installable app shell with offline app-shell caching
- Vitest + Testing Library
- Test suite
- Repository — private repository