Changelog
What we shipped.
When we shipped it.
Reliability fixes, new features, performance wins, safety improvements. The plain-language log of every meaningful change.
- Marketing
Marketing surface area — pricing, about, FAQ, glossary, comparisons, press, resources.
Built out the public marketing pages from a single /welcome to the full /pricing + /about + /faq + /glossary + /contact + /press + /changelog + /resources hub + 4 comparison pages (Trackleaders, RaceMap, Strava Beacon, Garmin LiveTrack) + 4 long-form articles. Per-page social-share images so every link looks distinct in social previews. WebP photography pipeline shaving megabytes off marketing pages.
- Reliability
Spectator trail handles pause and teleport without drawing fake straight lines.
Selected-rider trails on the watch page now split at time gaps so a paused or signal-dropped rider doesn't get a straight line connecting their before-and-after positions. Same gap-splitting logic in free-ride watcher (commit bee9ff2). Leaderboard re-anchor logic now runs in the canonical query so WebSocket pushes and HTTP fetches agree on distance for every rider.
- Safety
Rule 5 — anonymous spectator access for public + unlisted events is part of the free-tier offer.
Surfaced a regression where /tracking/history was gated behind auth, breaking the historical-trail seed for incognito spectators. Fixed in commit 875f941 — the full live experience (map + leaderboard + rider trail + route polyline) is now anon-accessible for public/unlisted events. Rule 5 in CLAUDE.md pins the policy so it can't drift back.
- Reliability
Rule 4 — pings are bounded by start and stop; the bounded set is canonical truth.
Rewrote Rule 4 in CLAUDE.md and started shipping the hardening: server-side pre-Start cutoff on free-ride /pings (commit 1d5b922), leaderboard WS broadcast reading from the canonical bounded-ping query (commit e5d617c). Every surface that reports on a ride — rider summary, spectator polyline, leaderboard distance + time — now computes from a single query over the bounded set so the rider, spectator, and leaderboard see the same number.
- Marketing
Stripped "free for 2027" / "Year 1 free" claims from every customer-facing surface.
Found and pulled the unintentional "free for 2027" promise from the /for-organisers hero, the /welcome organiser card, the investor deck BUSINESS MODEL footer, the organiser deck lime YEAR 1 FREE banner, and the comparison-table footnote (commit 94a4fec). Pricing now consistent: £3 / rider / event capped at £6,000 for organisers; Free Ride free for athletes always.
- Feature
Point-to-point checkpoint system shipped end-to-end.
Phase 1 schema + CRUD endpoints (commit 7ad28b7), Phase 2 + 3 organiser editor + tracking detection + spectator rendering (commit cd5eb23). Drag-to-reorder checkpoint rows, map-picker for placement, visually distinct start + finish rows, explainer callout on the editor. Point-to-point events now run with checkpoint coords driving start/finish detection without requiring a GPX.
- Reliability
Race events #105 — pre-gun pings no longer pollute top-speed stats.
Pings collected before actual_start_time were inflating top-speed calculations at race start. Server-side gate (commit bdbc0d6) drops any ping with timestamp earlier than the gun. This is the fix that Rule 4 later generalised to TT gate-crossings and free-ride/grand-depart tap-Start.
- Marketing
Domain cutover — astertrack.app is the canonical home.
Swapped all vercel.app references over to astertrack.app and added a cutover runbook (commits 19162d5 + 366d71a). Search Console, social links, and outbound email signatures all point at the proper domain.
- Marketing
"Grand Départ" renamed to "Point-to-point adventure" across the app + marketing.
The grand-départ framing tested confusingly outside the bikepacking-ultra audience. Renamed to "Point-to-point adventure" everywhere — app navigation, marketing pages, persona language, organiser flows (commits f207b14, f82c5dd, 8bbc9a7).
- Marketing
Investor deck — 5 weakest body slides rewritten + SEIS + EIS tax-position slide added.
INSIGHT, PRODUCT, BRAND, TRACTION, TEAM slides rewritten for tighter typographic hierarchy and sharper claims (commit d4c40f3). New 17/20 slide quantifying the UK SEIS + EIS tax position for investors (commit 5bd4667). Decorative italics stripped across all four decks (commit 14eb67a).
- Reliability
Spectator Phase 1 — real-time-feel position updates with WebSocket catch-up.
Spectator-side redesign (commit ad2364a): visibility/WebSocket catch-up so a tab returning to focus snaps to the current state, health surface for connection state, retry on dropped connection, raised LIMIT on history fetch. Real-time-feel update cadence with position animation and tighter intervals (commit 23d728b).
- Reliability
Free-ride watcher polyline + distance no longer keep growing after WebSocket drops.
Incident on ride 3ced3199: when the watcher's WebSocket connection dropped, the rendered polyline and reported distance kept extending using stale state instead of pausing. Fixed in commit 9287455.
- Reliability
Late-drain ping symmetry — web and native paths agree.
Web /pings + native /pings-native now share the same late-arrival semantics with cutoff filtering and ON CONFLICT dedup (commits 7a28d36 + d89225c). intended_ended_at persists across retries so a /stop that fires hours later doesn't backdate or extend the ride.
- Reliability
Android P0 crash hotfix triple — gms-location dependency pinning.
Crash storm on Android 16 traced to a gms-location version mismatch. Stack of three commits to pin tslocationmanager to 4.1.5 + force-pin gms-location to 21.0.1 + drop the force-pin once upstream caught up (5eeba09, bd86155, 115fc03). Track.tsx reverted to a known-good state during the storm and re-stabilised afterwards.
- Safety
SOS push + broadcast restricted to event admins only.
SOS alerts and the linked WebSocket broadcast now only reach the event's admin set, not every connected user with /api access (commit b25bb89). Tightened the surface for sensitive emergency content.
- Safety
Free-ride SOS hardening — rate-limit, dedup, atomic fan-out.
PR5 (commit ea9a9d0): rate-limited the SOS endpoint, deduped repeat alerts within a window, made the watcher fan-out atomic so a half-sent broadcast can't leave watchers in inconsistent states. Paused-rider "I'm OK" handled in the same change.
- Marketing
Brand colour system — dark primary, lime global, red restricted to SOS + Sign Out.
Repointed the primary brand colour to dark, surfaced lime globally as the accent, and restricted the loud red to safety-critical actions (SOS, Sign Out) so its meaning stays sharp (commit ff2b709).
- Reliability
Free-ride rides INSERT — atomic lazy-create + race-safe.
Rule 4 hardening: rides.INSERT path now atomic so two near-simultaneous /start requests can't both create a row, and lazy-create from /pings (when pings land before /start due to offline queueing) closes any pre-existing open ride before opening a new one (commits 64d0ac2 + ce956cb).
- Safety
Crash-SOS delivery — surface failure, retry, fallback prompt.
When a crash-triggered SOS fails to deliver (network, server, or client error), the rider sees an explicit failure surface with a retry button and a fallback to call emergency services manually (commit 4d78d23). The silent-failure mode where a rider thinks the SOS went out and it didn't is closed.
- Feature
Initial release — Watch the Dot PWA, Free Ride, crash detection, SOS.
First commit of the platform (0ab6bab): GPS tracking PWA, Free Ride mode (standalone tracking without an event), crash detection with next-of-kin alerts, SOS chat, shareable watch links (commit 71bd357).
Want to be on the next entry?
Tell us what would change your race day. The roadmap is a conversation.