Koach

A personal training and nutrition coach. It plans each day’s session from what you actually did, and keeps working offline.

What
Web app and Android
When
Oct 2026
Status
Live, v1.0.5

Screens are from the real app, run with a demo account (“Daniel”) and demo data.

The product

Koach is an installable web app with an Android build. A deterministic coaching engine adjusts each day’s session from attendance, a one-tap check-in and Health Connect, without ever asking you to log the weights you lifted. Training runs in 8-week blocks, and nutrition follows your weight trend.

The hard part

Most training apps ask you to log every set, and most people stop logging. Koach has to coach well from almost no input, and keep working in a basement gym with no signal.

“A change still waiting on a device wins over an older one arriving.”

koach README, Accounts and sync

How it works

  1. One tap after a session

    The check-in asks one thing: Easy, Right or Hard, with a separate flag if something hurt. In the app’s words, it “steers your next sessions: when to add weight, when to ease off.”

    src/components/training/Checkin.tsx

  2. A coach you can test

    prescribe(workout, state, date) is a pure function, so the same history always gives the same session. A test sweeps every generated program through checkProgram before anything ships.

    src/domain/training/training.ts

  3. Offline first, synced safely

    Every change is queued in an outbox in the same IndexedDB transaction that makes it. One Postgres sync function numbers the changes and enforces ownership, and row-level security blocks direct writes.

    src/db/tracking.ts, README

  4. Blocks that rotate

    Programs run in 8-week blocks, and the second block swaps in fresh exercise variations. New lifters get 14 lighter start-up days first.

    src/seed/program.ts, STARTUP_DAYS

  5. Food that follows the trend

    The coach reads the weight trend and offers to move the calorie target, for example by 150 kcal. Its 175-food database knows local names like koteg, bulgarit and pargiyot.

    src/db/actions.ts, src/data/foods.json

  6. Releases that refuse to break

    A release gate refuses to deploy unless CI passed on main and production reports its migrations applied. On Android, Kotlin plugins add Health Connect, local notifications and a background update check.

    scripts/release-gate.mjs, android/

Facts, with sources

446
app and server tests, plus 73 for the push server
koach README
1 tap
check-in after a session: Easy, Right or Hard
Checkin.tsx
8 weeks
per training block, then the exercises rotate
src/seed/program.ts
175
foods, most tied to a USDA FoodData Central entry
src/data/foods.json

Details

Built with

  • React 19
  • TypeScript
  • Vite PWA
  • Dexie (IndexedDB)
  • Supabase Postgres + RLS
  • Cloudflare Pages, Workers, D1
  • Capacitor + Kotlin
  • Vitest, Playwright, pgTAP

About these screens

  • Screens are from the real app, run with a demo account (“Daniel”) and demo data.
  • The exercise clips and the muscle figure are AI-generated assets in the app.
  • The code is in a private repository, so this page describes it at README level.