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.sh archives + 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

IDNameStateNotes
M-1Watch + iPhone v1.0 — timer + fleet sync + paywallIn 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-2Regatta management — entries, scoring, series, sailor viewIn 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-3Handicap + advanced scoring (PHRF / IRC / ORC)FutureDefer until M-2 ships and we have feedback
M-4Watch-side results visibilityFutureDefer — watch stays focused on race-day during M-2