10 KiB
box-box — Product & UX Roadmap
An F1-geek + product/UX analysis of box-box as an F1 companion, and a prioritized plan to make it richer than "data in tables" — for both live race weekends and the quiet stretch between rounds.
Where the app is today (honest read)
box-box has a strong data layer with two front doors (TUI + web) and six web surfaces:
| Surface | What it does today | Where it's thin |
|---|---|---|
Command Center (/) |
Hero weekend + countdown, season calendar, championship snapshot, weekend schedule, news | Strong launcher, but tells you when, rarely what to care about. It's a menu, not a companion |
Race Hub (/race-hub) |
Per-session tabs: Overview, Race Story (position-evolution scrubber), Strategy (stints), Laps, Conditions, Race Control | RaceStoryCanvas is the best "beyond tables" work in the app. Everything else is still tables |
Live Timing (/live) |
SSE timing tower, battle chips, gap sparklines, pinned drivers, RC feed | Solid tower, but it's "a spreadsheet that updates" — no track map, no telemetry, no "what just happened" |
Championship (/championship) |
Standings + hub stats (wins/poles/form) + points simulator | Good; the simulator is a genuine differentiator |
Briefing (/briefing) |
7 RSS feeds (FIA, BBC, Autosport, RaceFans, Guardian, RACER, F1 YouTube) + readability extraction | Passive reading list, not tied to the season narrative |
Data Library (/admin) |
Ingestion / coverage admin | Fine as-is |
Biggest finding: the app already pulls the richest data in F1 — GPS
Location, full car telemetry (throttle / brake / DRS / gear / rpm / speed),
team-radio audio, mini-sector Segments, speed traps, overtakes — and the web
app visualizes almost none of it. The track map exists only in the TUI
(internal/ui/trackmap.go); telemetry is fetched and shown to nobody. This is a
large latent asset.
Core product thesis
An F1 companion serves two different jobs; the app currently treats them the same (data, in tables, per session):
-
On a race weekend — the "second screen." The user is watching the broadcast (or can't, and wants to feel it). They want: what's happening now, why it matters, what to watch next. The broadcast supplies emotion; box-box should supply the data the broadcast doesn't show — the delta the director cut away from, the undercut developing, the tyre cliff approaching.
-
Between races — "understand the season." No live action. The user wants to make sense of what happened and anticipate what's next: rewatch the story of the last race, argue strategy, track the title fight, get smart before the next round.
Everything below makes each job feel like a companion instead of a database.
Race-weekend experience ("second screen")
1. Live Track Map — highest-leverage missing feature
Port the TUI's GPS outline (trackmap.go, GetLocation) to a web SVG dot-map:
cars as team-colored dots on the circuit outline, DRS zones highlighted, sectors
tinted by status. Turn mini-sectors purple/green live using the Segments data
already fetched. Tap a car → mini-telemetry readout. This is what turns "updating
spreadsheet" into "I'm watching the race."
2. "What just happened" synthesized event rail — the companion voice
Combine Race Control + overtakes + pit stops + position deltas into plain-English beats: "LAP 34 — VER pits (2.4s), rejoins P4 behind NOR — undercut on RUS is live." The inputs all exist; this is a synthesis layer, not new data. It's the difference between data and commentary.
3. Telemetry compare overlay
On the tower / a driver panel, pick two drivers → overlaid speed/throttle/brake
traces + delta-time graph for their last comparable lap. The tifosi feature —
"where did Leclerc lose the lap." /api/v1/laps/comparison + car data already
exist; this needs a chart, not a table.
4. Live strategy / tyre-degradation view
Stints + tyre age + pit-lane times → live pit window and tyre-cliff panel, with
undercut/overcut threat indicators from gap-to-car-behind vs. pit-loss time.
The pit-window calculator exists in the TUI (pitwindow.go); bring it to the web
and make it live.
5. Team radio, surfaced
GetTeamRadio returns audio clips. Add a "Radio" ticker on the live page — play
button + driver + timestamp. Peak emotional content, and no rival dashboard has it
inline.
6. Session-aware Command Center
When a session is live, the home hero should pull the top battles, leader gap, and last RC flag onto the front page instead of only saying "LIVE." Make the front page reactive to the moment.
Between-races experience ("understand the season")
7. Race replay as a first-class story
Grow RaceStoryCanvas from a scrubber into a narrative replay: auto-generated
"chapters" (start, first pit phase, VSC, decisive overtake, finish) with a
headline each (derived from RC + position swings), and scrub the position graph
and track map together. The "watch the race in 90 seconds" mode that makes people
open the app on a Tuesday.
8. Driver pages + rivalry view (a real gap)
No driver profile exists in the web app. Add a driver page (season form, teammate H2H — already computed in the champ hub — quali vs. race pace, tyre management, track-by-track) and a rivalry view (two drivers → cumulative points, H2H, gap-over-season). Feeds the argument every fan has.
9. Next-race preview / "get smart" page
Between races the app goes quiet. Fill it: circuit characteristics, last year's result (2023/24 is cached), typical strategy (1 vs 2 stop), DRS zones, weather outlook, and the storylines (title-fight math to watch). Turn dead air into anticipation.
10. Championship scenario narratives
Extend the simulator from "drag points around" to narrative permutations: "VER clinches if he outscores NOR by 9 this weekend" / "first race McLaren can seal constructors'." The stuff fans actually search for.
11. Briefing → calendar-aware season digest
Reframe the news reader into a paddock digest tied to the calendar: group by GP,
tag by team/driver, surface a "since last race" summary. Optionally an
LLM-generated weekly briefing (a claude-haiku summarization pass over ingested
RSS — cheap and on-brand).
New / better data sources
- Jolpica (Ergast successor,
api.jolpi.ca) — free historical results back to 1950: qualifying, pit stops, lap times, circuit metadata. Unlocks all-time records, "best-ever at this track," and career stats OpenF1 (2023+) can't give. High value for driver pages and the "get smart" preview. - OpenF1 weather timeseries — already fetched; plot it as a session-long strip (track temp / rain / wind) instead of a table. Weather narrates strategy.
- Circuit metadata / DRS zones / corner names — enriches the track map and previews. Some is in OpenF1 circuit info; curate the rest once as static data.
- Static per-race context — a tiny curated JSON per round (tyre allocation, notable stats) goes a long way for previews.
Cross-cutting UX principles
- Replace tables with a shape wherever a shape carries the meaning. Lap times → a trace with fastest lap marked. Stints → a horizontal tyre timeline. Gaps → the sparkline already shipped. Keep tables only where data is genuinely tabular (standings) — but annotate them.
- Always answer "so what?" Every number sits next to its meaning (a gap next to "undercut live," a tyre age next to "5 laps from the cliff").
- One primary "moment" per screen. The Command Center should always have a single obvious "here's what to watch/do now."
- Make between-races feel alive. The app currently rewards you only on Sundays. Previews, digests, replays, and rivalries give a reason to open it midweek.
Suggested sequencing (impact × effort)
Phase 1 — turn live into a companion (highest impact; data already in hand)
- Web track map (SVG + GPS + mini-sectors)
- Telemetry compare overlay (speed/throttle/brake + delta)
- "What just happened" synthesized event rail
- Team radio ticker
Phase 2 — own the between-races window
5. Narrative race replay (grow RaceStoryCanvas)
6. Driver pages + rivalry view
7. Next-race preview page
Phase 3 — depth & reach 8. Jolpica/Ergast historical integration + all-time records 9. Championship scenario narratives 10. Calendar-aware briefing digest (optional LLM summaries)
Execution tracking (GitHub)
This roadmap is tracked on GitHub:
- Project board: https://github.com/users/AmanTahiliani/projects/2 ("box-box Roadmap")
- Epics: issues #2–#8 (label
epic), one per epic above, on Phase milestones - Stories: issues #9–#31, wired as native sub-issues under their epic (progress rolls up automatically)
- Labels:
epic,enabler,research,area:{live,viz,between-races,championship,data,ux} - Milestones:
Phase 1 — Live Companion,Phase 2 — Between-Races,Phase 3 — Depth & Reach
Board fields: Stage (Icebox → Research → Ready → In Progress → In Review → Done),
Priority (P0–P2), Effort (S/M/L), Phase (1–3).
Working model — active vs. bank:
- Only 1–2 epics active at a time (currently E1 Live Race Companion + E2 Viz Primitives); the other five epics are the theme-level idea bank.
Stage = Iceboxis the story-level bank. The 10 E1/E2 stories are seeded toReady; everything else isIcebox. Promote a handful toReady/In Progressper cycle; useResearchto scope a vague idea before it'sReady. Board views (built):- Backlog — Table, all epics with expandable sub-issues: the full bank.
- Board — grouped by
Stage, filtered-stage:Icebox: the active-WIP wall. - Roadmap — Table grouped by
Phase(Phase 1/2/3). Note: this is a phase-grouped table, not a timeline. A true timeline roadmap needs a date or iteration field (GitHub won't draw/persist a roadmap layout without one); add aTarget datefield and populate it once phases have real target dates, then switch this view to the Roadmap layout.