Files
box-box/docs/PRODUCT_ROADMAP.md
2026-07-03 23:18:31 -04:00

10 KiB
Raw Permalink Blame History

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):

  1. 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.

  2. 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

  1. 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.
  2. 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").
  3. One primary "moment" per screen. The Command Center should always have a single obvious "here's what to watch/do now."
  4. 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)

  1. Web track map (SVG + GPS + mini-sectors)
  2. Telemetry compare overlay (speed/throttle/brake + delta)
  3. "What just happened" synthesized event rail
  4. 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 (P0P2), Effort (S/M/L), Phase (13).

Working model — active vs. bank:

  • Only 12 epics active at a time (currently E1 Live Race Companion + E2 Viz Primitives); the other five epics are the theme-level idea bank.
  • Stage = Icebox is the story-level bank. The 10 E1/E2 stories are seeded to Ready; everything else is Icebox. Promote a handful to Ready/In Progress per cycle; use Research to scope a vague idea before it's Ready. 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 a Target date field and populate it once phases have real target dates, then switch this view to the Roadmap layout.