OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
For advanced players: pick a goal for a 30-minute session, or a single shot to practise on its own. Ready-made drills with video, on your phone.
Sports & fitnessGitHub @volkermaxmeyerOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
Pickleball sessions a group can run without a coach. A free side project, built by a product manager with Claude Code.
Loading the full README.
Read the full README ↗Pickleball sessions a group of advanced players (around 4.0 and up) can run without a coach, one phone page per session: https://open-training-site.vercel.app/
A free, non-commercial side project, built in my spare time by Volker Max Meyer, a product manager and service designer in Berlin, with Claude Code.
I coach the advanced group in my pickleball club. I play along on one court, and a playing co-coach runs the second. Good drills are spread across hundreds of YouTube videos, most of them written for two players, and none of them is a plan a group can pull up on court. My assumption is that players who want to train without a coach mostly end up playing matches instead. The test under Status is there to check it.
The start page asks what the group wants to get better at and offers nine goals, such as "Win the dink battle". Each goal opens a 30-minute session of three drills. A drill card shows one sentence, the part of a coach's video that demonstrates the drill (it plays inside the card after a tap), the rules, how to make it easier or harder, and what good looks like. A short form at the end asks whether the session worked without anyone explaining it.
This site is one of three interfaces on a private training system I built for my group.
┌──────────────── private ────────────────┐
YouTube videos │ Base: skill ladders, drills, weekly │──▶ Coach: plan a session, plus
+ research on │ themes, session frame, tactical and │ a card for the co-coach
teaching tactics │ mental cues, strategy playbook │──▶ Open Training (this repo)
│ │──▶ Overview: what the base
│ Quality loop: guard scripts, feedback │ contains, on one page
│ after every session │
└─────────────────────────────────────────┘
In November 2026 the base held 120 drills distilled from 205 reviewed videos, all in one shared vocabulary. The interfaces only read from it, so a new one is cheap to add, and the base was built with more of them in mind. It started as a Google Doc for my own training and grew into a system once I saw that other players could use the same material. The product view of the whole system is in docs/prd.md, a snapshot from 6 November 2026.
Claude Code wrote most of the code and much of the content. I set the goal, the rules and the priorities, and I approve or reject the work at fixed points. The checks themselves run by machine:
DESIGN.md and the CSS tokens in sync. They run before every publish commit and every push; red tests stop the release.Live since November 2026 with nine sessions. Groups beyond my own have not used it yet. A lean test through the club's coaches runs until January 2027: do groups play a session and come back to it?
private notes ──publish script──▶ src/content/sessions/*.json ──git push──▶ Vercel build ──▶ static site
(validate, extract, (leak guard runs on commit and push)
allowlist fields)
scripts/publish.ts reads the sessions marked for publishing and builds
each one from named fields only, so private notes and links never reach the repo. The site validates the JSON
against src/lib/session-schema.ts.version.txt with the commit it was built from;
scripts/check-deploy.ts polls it until the pushed commit is live.npm run publish:site -- --dry-run # show what would change
npm run publish:site # validate, write JSON, guard, tests, commit, push
npx tsx scripts/check-deploy.ts # wait until Vercel serves the new commit
This is the beginning of the README. Read the rest at the original. Read the full README ↗