← All projects

Web app

coach.

My own training platform for a coach and their athletes. The coach plans against weekly volume, the athlete logs offline on their phone, and every set feeds the next plan.

View
Status
In private use, later for other coaches too
Stack
TypeScript, Preact, Vite, Cloudflare Workers, D1, R2, OpenRouter

Why I’m building it

I’ve been training for years and log every workout in Hevy. The app is good for logging. For planning it barely helps me. I plan my week by sets per muscle group, and so far I’ve added that up in my head or in a spreadsheet.

Right now only we use coach.: my coach plans, I train and log. But it’s meant to become my own software that other coaches can use with their athletes later.

In mid October 2026 I started building a tool for it. At first just a planner that loads my exercises from Hevy and writes the finished plan back into Hevy as a routine. Two days later it was clear: if I’m planning everything myself anyway, I want to own my data too.

What it does

  • Plan. The coach builds training days against each muscle’s weekly target and sees a running count of sets.
  • Log. Each day lands as a routine in the athlete’s mobile web app, which works offline in a basement gym and syncs when it’s back online.
  • History. All old workouts from Hevy are imported. For each exercise you can see how it developed over time.
  • Custom exercises. Create new exercises, with image search for the thumbnail. You can edit exercises imported from Hevy, and your change becomes your personal version.

The platform is private and invite-only.

Technical decisions

Copy Hevy’s data model instead of switching Hevy off. Before building anything, I had an agent check the public Hevy API: can the data model be rebuilt cleanly? Yes. The logger stores everything in its own database and exposes an API in the same shape as Hevy’s. So the planner can’t tell whether it’s talking to Hevy or to my logger.

Separate modules, one app. Planner and logger are separate parts with a clear boundary, but they run as one application under one address. The data model supports multiple users from the start. I don’t want to retrofit that later.

One stack for both. The planner was originally about 1,800 lines of handwritten template rendering. Before adding features, I moved it onto the same stack as the logger: Preact, TypeScript, Vite. No new frameworks, just one instead of two.

Local like production. The agents test in the same runtime that runs live, with a local database and local storage. No second code path just for development.

From the sessions

It started with a single prompt: build me a tool to plan my week by sets per muscle group, load my exercises from Hevy, and later sync the result into a dedicated folder in my Hevy account.

On October 15 the question came up whether I could replace Hevy entirely. The agent’s first proposal was cautious, I wanted more: “architecture wise this should be a different module”. The same day, the data model, the mobile logging app and the shared platform ran as parallel threads.

Then on October 17, the small things that show I’m actually using it: “why cant i edit exercises that were imported from hevy originally?” Now you can.

Train is still a tool for me. It’s meant to become more.