Race Timer
Type: Software Status: In Progress Deadline: v1.0 ASAP (target: usable for 2026 Toronto Albacore season). M-2 follows. Created: 2026-06-02
What is this?
A sailboat race-day platform for Apple Watch + iPhone, built class-clean for one-design racing.
- Watch (sailor surface): pre-start countdown, race-state handling (AP / Recall / Abandon), race flag reference. Free forever. Optional fleet-sync receive — 30-day trial, then $9.99 one-time IAP.
- iPhone (RC + sailor surface): RC mode broadcasts the start sequence over BLE to every sailor’s watch + can score the regatta. RC features are paid (Individual $10/yr or Fleet Manager $50/yr + 20 seats).
Motivation
Build for a fleet, not just personal use. Pilot is the Toronto Albacore series — an active one-design dinghy class David sails in. The wedge from competitive teardown is fleet sync — no incumbent does it well, every existing app is a solo-racer manual-tap utility.
What does success look like?
- Reliable pre-start countdown sailors actually trust on the start line
- Toronto Albacore fleet adopts it during the 2026 season — visible enough on the line that other clubs notice
- Paid App Store listing with enough adoption beyond the pilot fleet to justify continued work
- Class-rules-clean: never causes a sailor to be DSQ’d
Technical
- Stack: SwiftUI, watchOS 10+ / iOS 17+ targets, Core Bluetooth, StoreKit 2. M-2 adds CloudKit + Sign in with Apple.
- Repo:
~/projects/race-timer/—djt53/race-timer(private) on GitHub - Build: XcodeGen →
RaceTimer.xcodeproj;./build.sharchives + uploads to App Store Connect - Team:
8HZAKZWFY8(Enigma Studio Inc.) - Intended users: One-design dinghy sailors + their RC volunteers; pilot with Toronto Albacore fleet
Spec snapshot (v1.0 — see decisions/, assets/feature-catalog.md)
- Pre-start sequence: 5-4-1-Go (RRS Rule 26) default; 10-5-1-Go big-boat, 3-2-1-Go dinghy
- Watch features: countdown with haptic schedule, pre-start flag chip from broadcast, AP / Recall / Abandon, race flag reference, GO splash, no GPS (class-clean, decision 001)
- Fleet sync: RC iPhone advertises BLE → sailor watches subscribe. Wire format
RaceBroadcast(sequence + start timestamp + state + pre-start flag). watchOS can’t be a peripheral, so RC role lives on iPhone (decision 002 → revised in BLE foundation work) - Monetization (decision 003 v3): watch free + $9.99 one-time for fleet sync; iPhone RC $10/yr Individual subscription with 1-month intro free, Fleet Manager $50/yr + 20 seats deferred to M-2
Milestones
| ID | Name | State | Notes |
|---|---|---|---|
| M-1 | Watch + iPhone v1.0 — timer + fleet sync + paywall | In TestFlight (build 14 processing) | Build 14 supersedes builds 12 + 13. Bundles all session-10 changes (new haptic mapping, pause button removed, broadcast CTA, complication, broadcast keepalive) plus a critical reversal: HKWorkoutSession is back (decision 014 supersedes 013) because build 13’s wrist-down hardware test showed haptic/sound cues queue and only fire on wake without it. The workout-started chime is accepted as the cost of reliable race-day cues; AOD-during-countdown comes back too. Haptics Review screen ships at Settings → Debug. Remaining: broadcast jank polish; hide Debug section before App Store submission; HealthKit nutrition label declaration before App Store submission; IAP registration deferred to App Store submission. |
| M-2 | Regatta management — entries, scoring, series, sailor view | In progress (M-2.1) | 12-16 weeks total. Decision 006. Backend pivot in flight (decision 011) — Supabase spike replacing CloudKit plan; Phases A + B shipped, Phase C (GRDB offline cache + airplane-mode test) pending. Sail-tracker decision 008 likely follows once race-timer’s decision locks. M-2.1 foundation shipped: data models, Low Point scoring (rank-based), CSV import/export, regatta + entry UI, race pre-creation, ResultsMatrixView as primary recording surface (entries × races grid with sticky Sail/Helm + Total columns, horizontal-scroll race columns, tap-to-place, long-press picker, sort, lock, add-race, landscape support), tab renamed to Events, tiered drop schedule data + setup UI (M-2.2 pulled forward). Remaining M-2.1: backend migration to Supabase, SiwA + identity, iPad layouts. Remaining M-2.2 piece: wire drops into Total column |
| M-3 | Handicap + advanced scoring (PHRF / IRC / ORC) | Future | Defer until M-2 ships and we have feedback |
| M-4 | Watch-side results visibility | Future | Defer — watch stays focused on race-day during M-2 |