COURSE FILE · SUN AUG 30 2026
Theodore Wirth Par 3
Golden Valley, MN · sunrise to sunset · walking only
Nine holes, nine labels
Tap a hole to zoom. Fixed tees and known yardages make a par 3 the cleanest calibration lab a wrist model can ask for.
One gate, any sport
The start motion is generic. A swing, a stroke, a serve, a lift. The same wrist gate that opens a golf session opens any session, and the workout route gives every event a place on a map like this one. What no tracker in the competitive scan can copy is what sits underneath: the blood and sleep wallet. Every session lands next to your labs and your nights, and the verdict reads all three.
The validation loop
No club sensors. No launch monitor. The course labels itself.
Shot at point A
The Watch detects the swing at 100 Hz. The phone stamps the position. Raw motion stays in the vault.
The walk is the guess
You always walk to your ball. The path terminus before the next swing is the landing estimate.
The next hit is the proof
Swing n+1's position is shot n's landing spot. Every shot self-labels the one before it. Distance becomes ground truth.
The range inherits it
Validated course shots pair wrist features with true distance. Back at the range, the Watch estimates carry with a confidence band that tightens every round.
| club | validated shots | est. carry | confidence |
|---|---|---|---|
| driver | 0 | — | awaiting rounds |
| iron | 0 | — | awaiting rounds |
| wedge | 0 | — | awaiting rounds |
| putter | 0 | — | scored surface live |
Round contract
The page renders whatever the Worker serves at /api/course/round/latest. Bounded summaries only — same egress rule as /swing.
{
"course": "theodore-wirth-par3",
"session_stamp": "2026-08-30T22:15Z", // coarse, rounded
"walk": [[x, y], ...], // simplified polyline, meters from course datum
"shots": [{ "hole": 1, "from": [x,y], "to": [x,y],
"club": "7i|wedge|driver", // classifier read or user tag
"validated": true }], // next-hit confirmed
"putts": [{ "hole": 1, "from": [x,y], "to": [x,y] }],
"gates": { "min_shot_yd": 15, "max_shot_yd": 230 } // plausibility, same spirit as the junk gate
}