In-house product · training app
Training Companion
A training app that works without signal and keeps your history ready for an AI to tune your routine.
This is a private app: I can walk you through it on a video call.
Workout · Monday
- Squat 3×8, 60 or 65?
- Bench press, same as last time?
- Shoulder pain (write it down)
60 × 8 · 60 × 8 · 55 × ?
??

- Before:
- Scattered notes, with no progress or history.
- After:
- Every set logged and progress calculated automatically.
The problem
Without an organized log, you can't see what weight you used last time while you train, progress isn't calculated and aches or injuries aren't written down anywhere.
There was also no ready-made summary to share when a coach or an AI needed to adjust the routine.
The solution
An app installed on the phone that opens straight into today's session. Each exercise shows what you did last time next to today's target, every set is checked off with a tap and the rest timer starts on its own.
Between sessions it shows progress per exercise, records, measurements and aches. Routines can be built with AI: download a prompt, give it to your favorite assistant, paste the answer back, preview it and import it.
Plus an integration with a Custom GPT, built and ready: it reads the history with a read-only key so a "coach" gets the real context without copying it by hand.
The result
It's an in-house product in use, with real users. Every set is logged with weight, reps and effort, progress is calculated automatically and the history is ready to share.
Logging works even when the gym has no signal: nothing is lost and everything syncs once the connection is back.
On screen


PWA on the phone
Logs even with no signal
IndexedDB outbox
Ordered, coalesces edits and retries
Idempotent .NET API
Client ids: retries never duplicate
PostgreSQL
Immutable history
Custom GPT
Actions
Read-only API
Separate OpenAPI and read-only key
Under the hoodTechnical details
Stack
- .NET 10 (minimal APIs)
- EF Core 10 + PostgreSQL
- React 19 + TypeScript
- PWA with IndexedDB
- Docker
- xUnit, Vitest and Playwright
- Offline-first: writes go through an ordered IndexedDB outbox that coalesces repeated edits and retries with backoff.
- Idempotent API with client-generated ids: if a request arrives twice, it returns the same result.
- Immutable history: each session stores a snapshot of the routine, so publishing a new version never changes past workouts.
- A routine format in Markdown with a JSON block, readable by people and language models, with a parser tolerant of what assistants usually produce.
- Custom GPT integration through Actions: a separate OpenAPI document exposes read-only endpoints only, with a read-only API key stored as a hash.
- CI that deploys only when backend tests on real PostgreSQL, frontend tests and E2E on Pixel 7 and iPhone SE all pass.