# Data Sources ## Summary `box-box` should treat data sources as inputs to a local product database, not as page-level dependencies. The current app fetches too much data on demand from OpenF1, which breaks down during free-tier lockouts and makes non-live screens feel empty. The live mode succeeds because it uses the official F1 live timing feed directly. ## Confirmed Sources ### OpenF1 REST API Reference: https://openf1.org/docs/ Current usage: - Meetings and sessions. - Drivers. - Championship standings. - Session results and starting grid. - Laps, stints, pit stops, positions, intervals. - Race control, weather, overtakes. - Car data, location, team radio metadata. Strengths: - Good historical/session data source. - JSON over simple HTTP. - Broad endpoint coverage. - Query filtering by fields and time ranges. Limitations: - Free-tier access can be locked during live sessions. - On-demand fetching is unreliable as a product behavior. - API schema or access rules can change. - High-volume endpoints can be expensive to fetch repeatedly. Policy: - Use OpenF1 primarily for ingestion and backfill. - Do not make historical Web pages depend on fresh OpenF1 calls. - Store successful fetches into the local domain database and raw payload log. ### Official F1 SignalR Live Feed Endpoint: https://livetiming.formula1.com/signalr Current code connects to the old ASP.NET SignalR protocol, negotiates a connection token, opens a websocket, and subscribes to the `Streaming` hub. Current subscribed topics: - `Heartbeat` - `TimingData` - `DriverList` - `LapCount` - `ExtrapolatedClock` - `TrackStatus` - `RaceControlMessages` - `WeatherData` - `SessionInfo` - `CurrentTyres` - `TimingAppData` - `TimingStats` Strengths: - Best current source for live timing. - Provides race-control updates quickly. - Avoids OpenF1 REST lockout during active sessions. - Powers the strongest part of the existing app. Limitations: - Payloads are less formally documented than OpenF1. - Topic schemas can drift. - Testing live behavior is difficult outside active sessions. - Current parser lives in `internal/ui`, which couples live source handling to the TUI layer. Policy: - Treat SignalR as the authoritative live source while a session is active. - Extract parsing and live-state logic into reusable backend/domain code. - Forward live state to the Web UI through SSE initially. - Research whether live snapshots/events should be persisted. ### Existing SQLite HTTP Cache Current location: user cache directory under `box-box/cache.db`. Current behavior: - Stores raw HTTP responses by URL. - Applies TTL rules based on URL patterns. - Can return stale responses when OpenF1 fails. - Stores track outlines in a structured table. Strengths: - Useful as a fallback. - Already integrated with the OpenF1 client. - Reduces repeated network calls. Limitations: - Not a queryable domain model. - URL keys are poor product identifiers. - Cannot easily power analytics, replay, ingestion status, or data provenance. - Pruning/TTL behavior is cache-oriented, not history-oriented. Policy: - Keep the raw cache as a fallback layer. - Do not use it as the primary application database. - Add a separate domain schema for product features. ## Candidate Source ### Official F1 Static Archived Timing Files Reference: https://livef1.goktugocal.com/livetimingf1/data_topics.html Examples in public references include: - `SessionInfo.json` - `ArchiveStatus.json` - `TrackStatus.jsonStream` - `SessionData.json` - `TyreStintSeries.json` - `SessionStatus.json` - `TimingDataF1.json` Potential strengths: - Could provide replay-quality archived live timing. - May fill gaps between OpenF1 REST data and SignalR live data. - May support historical race reconstruction. Known uncertainties: - Session path mapping must be researched. - Stability and access guarantees are unclear. - Topic schemas and file availability may vary by year/session. - Legal and operational usage expectations need review. Policy for now: - Do not make core architecture depend on this source yet. - Assign a dedicated research track to validate feasibility. - If adopted, ingest it through the same raw-plus-normalized source pipeline. ## Source Authority Tiers 1. Local SQLite domain database. - Primary read source for Web UI historical and completed-session data. 2. Official F1 SignalR live feed. - Primary source during active sessions. 3. OpenF1 REST ingestion/backfill. - Primary source for populating local historical data. 4. Optional F1 static archive source. - Research candidate for richer replay and archived live timing. 5. Raw HTTP cache fallback. - Last-resort resilience layer, not a product data model. ## Open Questions - Should SignalR snapshots/events be persisted during live sessions? - If persisted, should live data become the authoritative record for that session or a supplemental event stream? - Which OpenF1 endpoints are essential for v1 local-first Race Hub? - Can static archived timing files be mapped reliably from OpenF1 sessions? - What data should be refreshed after a session ends, and when should it become immutable?