One iPhone on the gallery rail · one Watch on the racket wrist
Your court,
measured.
A fixed phone films the court. A pipeline on your own Mac solves the camera from the court’s known geometry, tracks both players’ feet in real metres, and cuts the rallies out of the sound of the room.
Not released. There is no App Store listing, no beta link, no download and no price. This is a personal tool being built for one court and one player. The demo opens the real app in your browser on sample rows.
- Camera
- One iPhone, fixed, on the viewing gallery rail. 1080p at 120fps, segmented to disc.
- Sensor
- One Apple Watch on the racket wrist — wrist motion and heart rate, started and stopped from the wrist.
- Processing
- Python, on your own Mac. Nothing is uploaded.
- Court
- WSF singles, 9.75 × 6.40 m. Geometry is configuration, not code.
What it measures
What comes back is where you stood, how far you were from the T, how long you took to get back there, and how long the rallies lasted — in metres and seconds, on a court that is the same size everywhere on earth.
Two sensors produce all of it. A camera that can see the whole court, and the sound of the court itself. Positions are solved in court metres rather than pixels, so a number here means the same thing on any court anywhere.
Less timeMore
scripts/render-court-diagrams.mjs from the example session file that ships with the app.From that one picture
These six numbers are read from the same example session file as the heatmap beside them. That file describes itself, in its own quality block, as “fixture data — not a measurement”. No session has been recorded and processed with this build, so nothing on this page is a result.
The last of the six is the one that governs the other five. Below about 90 per cent of frames tracked, the numbers above it are soft and the app says so rather than printing them straight.
Rallies, cut from the sound of the court
A four-wall court is a sealed acoustic box, and racket, front wall, floor and tin each make a different transient. Onsets are detected and clustered, then grouped into rallies by the gaps between them. Indoors, with two players and four hard walls, audio is a better event sensor than vision.
Same example file. The work-to-rest figure is recomputed from the twenty-eight bars actually drawn above rather than read from the fixture’s stored field, because the two disagree and the page may only print what its own diagram shows.
How it works
One phone, fixed. One Watch, on the racket wrist. Then four steps on your own machine, none of which involve a server.
-
Calibrate, once
Click six to eight known court points on a still. The court is its own calibration target — standard dimensions, red lines at known heights — so one camera is enough to solve where it is standing.
-
Track the feet
Per-frame pose estimation finds both players’ ankles, and the ankles project through the known floor plane into court coordinates. Feet rather than bounding boxes, because a lunge is still a position.
-
Cut the rallies
Onsets in the audio are clustered by spectral shape into racket, front wall, floor and tin, then grouped into rallies by the gaps. The Watch’s impact spikes are cross-correlated against the same onsets, which is how the two streams check each other.
-
Report, with receipts
Heatmaps, T-dominance, distance from the T, recovery time, rally length and work-to-rest — and then the coaching, which is held to the rule in section 04 and may not say anything it cannot point at.
The pipeline is Python and runs on the owner’s own Mac. The video never leaves it. There is no server to send it to, which is the single largest simplification in the whole design and the reason there is nothing here to sign up for.
The threshold, published before the result
A system like this can close the loop end to end while measuring badly, and every number downstream then inherits the error quietly. So the measurement is held to a fixed threshold, written down in advance, before a single line of the coaching layer is built. This is that threshold.
| What is measured | Must clear |
|---|---|
| Player court position, against hand labels | median < 0.5 m, p90 < 1.0 m |
| Correct player identity | > 95% of frames |
| Rally boundaries, within ±0.5 s | F1 > 0.90 |
| Shots per rally, against a manual count | within ±10% |
This gate has not been run. When it is, the result goes here — pass or fail, with the labelled footage it was measured against. Until then this page describes what is measured and how it is measured, and publishes no accuracy figure, because there is no measured accuracy figure to publish. If the gate fails, the coaching layer does not get built until the measurement is fixed.
A claim must cite
The failure mode of an AI coach is fluent, confident, generic advice. “Get back to the T faster” is true of every squash player alive and worth nothing. So a finding may not exist without a number, a rally and a timestamp, and it renders with those clips beside it. A claim that cannot cite is dropped before rendering rather than softened.
Work on — movement
You are standing 2.43 m from the T on average, and you are losing the T in the second half.
Across 28 rallies you held the T zone for 46.8% of rally time against your opponent’s 53.2%, with a median 1.51 s to recover after playing a shot. You covered 1284 m; they covered 1211 m for less of the court.
- Rally 10 · 04:03
- Rally 16 · 07:00
- Rally 23 · 10:17
Illustration. Built from the same example session file, laid out the way the app renders a finding. It is not a recorded session, it is not advice, and it is not the output of any model that has been run.
What it is not
- No ball tracking. Version one measures two people and the sound of the room. Every number on this page comes from where the players stood and when the ball was struck — never from following the ball. That is a later phase, and it is the one genuinely uncertain piece of computer vision in the whole design.
- No cloud. The footage is processed on the owner’s own Mac. Nothing is uploaded, because there is nowhere to upload it to.
- No accounts. Nothing to sign into, no email address collected, no password to lose. See the privacy policy, which for once is short.
- Squash only. The court geometry lives in a configuration file and every coordinate is in world metres, so padel — enclosed, standardised, walled, badly served — is the intended second sport. It is not built.
- Not released, and not for sale. No store listing, no beta link, no download, no price, no waiting list. When any of that changes it will say so here.