It sits on top of the software you already run. It reads the reports your systems already export, flags who has drifted from their own baseline, and sends one short message before the session. Thirty seconds to read. It surfaces who to check. It never predicts injury.
It reads the reports your systems already produce. If a system has an API, it pulls from it. If it only exports a file, it reads the file. Each connection is a small adapter, written once. You rip out nothing, buy nothing new, and your staff learns nothing new.
The kinds of systems it’s built to read from. No rip-and-replace. No new dashboard to log into.
Before every session, a sports scientist pulls the force plates, pulls the GPS, pulls the wellness form and the HRV export, reconciles names that never match across systems, and tries to have a read before the athletes walk in. That manual synthesis is the hidden tax on the job.
Across a season it is the better part of two work-weeks — a specialist’s time spent moving numbers between tabs instead of coaching, and a read that too often lands late or as a spreadsheet nobody opens.
Illustrative of a typical morning — not a client measurement. The point is where a specialist’s hours go, and where they could go instead.
What you’re looking at — the one message the staff gets each morning. Shown as it lands in Slack.
Nine athletes in this morning. Three flagged against their own baselines — one on two systems at once, two on a single domain. The rest are within their normal range.
Wellness and RSI-mod (jump/reactive strength) are both down against his own 28-day baseline — two systems moving together the morning after a heavy week (ACWR 1.52, context only). Worth a conversation before he throws.
HRV — read as the 7-day rolling average, not a single reading — has drifted below his baseline (z −1.8). Workload has been normal, so this is not load. Eyes on him this week.
Third straight session of declining jump output (RSI-mod z −1.4). Not past the review line, but the trend is one direction. Recheck after his day down.
That’s the whole daily read. Thirty seconds, before anyone walks in. The dashboard below is only there when someone asks “why.”
The whole path, left to right. Code does every calculation. The model only phrases what the engine already computed — and never sees a real name.
Context, not a flag Training load and ACWR enter the engine to explain the “why” behind a change. They never set a status on their own.
Every athlete, three response domains, each measured against that athlete’s own 28-day baseline. A flag comes from convergence — domains agreeing — not one metric. The dots by each status show how many systems are down. Load is context; it never flags.
The same engine rolls the week into a report a coach reads in one sitting — who was flagged, by which system, and where next week’s risk is trending. Print-to-PDF, one command.
Of the nine athletes this week, six came back clear and three were flagged, with no one on watch. A. Rivera (OF) is the largest concern — flagged four of the days with readiness below baseline (z −1.21, down 1.14 from last week), driven by autonomic markers. R. Bennett (C) was flagged two days on a neuromuscular driver with a downward trend (z −0.84). D. Silva (RHP) was flagged one day, under review, on perceptual and neuromuscular signals together.
Generated by the same engine — ./report.sh. Every number verified; the AI never writes one.
The flag lands before the session, not in a report next week. You catch the drift while there is still something to do about it.
A programming change when the data says so — a lighter day, a moved rep scheme — instead of finding out at the next test block.
The morning synthesis stops eating a specialist’s time. That is a half-day a week back to coaching, where the value actually is.
A performance staff runs a dozen data sources. The job is to make them talk, keep the athletes’ data locked down, and draw a hard line between what code does and what the AI does.
Wellness forms, HRV wearables, VALD / Hawkin force plates, Catapult / GPS load — anything with an export or an API. Each stream is designed to be read on its own cadence and merged on the athlete, even when three systems spell his name three different ways. No more six tabs.
Each domain is scored against the athlete’s own 28-day baseline. A single soft reading is a monitor; two systems down together is a review. Convergence is the signal — it is much harder to fool than any one number.
Athlete health data is governed by the CBA, not by enthusiasm. Every name is stripped to a token before the AI touches anything. Code re-attaches it after. It can’t leak what it never sees — and it runs on infrastructure the team’s IT signs off on, access locked by role.
Every z-score and threshold is computed by code the staff can read and audit. The model never calculates — it takes a fact that is already true and says it plainly. Every number it writes is checked against the engine; invent one and the output is thrown away.
Training load and ACWR travel with every flag to explain it — but they never set a status. The workload literature is clear that ACWR does not predict injury, so it is shown, not obeyed.
The AI never writes a number. Code reads the data and applies the threshold your staff already trusts. The model only takes a fact that’s already true and says it simply.
Produced end to end by the real system. One command reads the synthetic squad’s raw sessions. The engine computes every baseline, every z-score, every flag. Names come off. Claude phrases the notes. Every number in its output is checked against what the engine computed — then the brief posts to Slack.
This clip shows an earlier single-metric version of the brief — the engine has since moved to the multi-domain read above. Re-render pending.
There is nothing to migrate and nothing for your staff to learn. It reads what you already collect. Standing it up is a conversation, not a project.
Name your systems. Each one gets a small adapter that reads its export or API — written once, then it just runs. Nothing changes for your staff, and nothing gets ripped out.
Twenty-eight days of their own data — not squad averages, not generic thresholds. A change only counts against their own normal.
Every morning before the session. Thirty seconds to read, then you go coach. The weekly report writes itself on Fridays.
The whole thing is real code, not slides. On the synthetic squad, one command —
./run.sh — prints the morning brief, and ./report.sh writes the
weekly report. It runs end to end today, on invented data, so you can watch the pipeline
work before a single real number is involved.
This is a working concept on synthetic data — the athletes and numbers are invented. Built by me to show how the data a performance staff already collects can become a decision, not just a dashboard.
Talk about building this for real