# FuelBoard Backlog FuelBoard — England-wide petrol-station price widget + app. Relay mirrors the UK gov data (hourly CSV); app fetches the full-UK dump (~8,038 stations, all prices) once per 12 h and filters/sorts on-device. Priority guide: P0 = next build, P1 = soon, P2 = later, P3 = maybe/idea. Status: TODO / IN PROGRESS / DONE / BLOCKED. --- ## P0 — Next build - [ ] **Switch dataset to govuk API data** (BLOCKED on credentials) Register at developer.fuel-finder.service.gov.uk (GOV.UK One Login / OAuth 2.0). Relay already supports an OAuth provider upgrade path — `client_id`/`client_secret` go into relay `.env`, never into the IPA. Live API replaces the hourly CSV mirror; endpoint/schema mapping (E5/E10/DIESEL → FuelType) already proven in `FuelPriceProvider.swift`. Until credentials arrive, the CSV mirror stays. Any credentials received must be treated as secrets ([REDACTED] storage). ## P1 — Soon - [ ] **Unit test target for the app** — XCTest target covering: - `FuelStore.sanitizedStationTitle` (title-case chunks, Sainsbury's apostrophe, acronyms BP/MFG/ASDA/MOTO, hyphen/paren chunks, mixed-case passthrough) - decode price guard: grades outside 50–500 pence/litre dropped (`FuelPriceProvider.allPrices` + legacy `price` fallback) - RAG thresholds (≤1.5p green / ≤4p amber / >4p red) - Cheapest-vs-Closest sort + delta/TOP baseline (cheapest-within-radius both modes) - miles→km and km→miles conversions (× 1.60934 / × 0.621371) - [ ] **Backlog hygiene** — mark implemented items DONE, prune obsolete entries - [ ] **EV charging?** — National Chargepoint Registry as a 4th "Charging" tab (second relay endpoint, ~40k+ UK chargers, OGL, connector-type filter) vs fuel-only. ## P2 — Later - [ ] **Widget configuration** — let the widget's fuel be chosen per-widget (App Intent `FuelSelectionIntent` + `StaticConfiguration` → `AppIntentConfiguration`), instead of inheriting the app's selected fuel. Requires iOS 17 `AppIntentConfiguration`. - [ ] **CarPlay** — widgets render but can't launch Maps; consider a proper CarPlay scene (CPListTemplate) for navigation deep-links. - [ ] **Alert region tuning** — make alert trigger radius + dedup window user-configurable (currently fixed 300 m trigger / 1 per station per hour). - [ ] **Pull-to-refresh spinner state** — surface refresh in-flight state (currently `refreshable` fires but no visible progress in the row list). - [ ] **Offline first-run** — first launch without network currently shows empty states; bundle a sample dump so the app demos offline. - [ ] **Localization** — UK English only today; audit string catalog for l10n. - [ ] **Dark mode polish** — verify brand logos (white-circle clips) and RAG dot contrast under dark appearance on-device. ## P3 — Ideas / Research - [ ] **Fuel-price prediction** — trend from historical dumps (relay could keep a rolling archive) to show "price tends up/down". - [ ] **Price alerts for a specific station** — notify when a starred station's price drops below a user threshold. - [ ] **Share sheet** — share "Cheapest Unleaded near me" as text/image card. - [ ] **Watch app** — glanceable cheapest-price complication (WatchKit + shared app-group store; watch target would need to be added to the project). - [ ] **App Clip** — 10 MB budget for "find cheapest fuel nearby" without install. ## Done (recent) - [x] England-wide full-UK dump, on-device filtering (relay `142061b`, app `cf9765b`) - [x] Cache-first, 12 h gate, pull-to-refresh only - [x] Distance filter 5/10/15 miles, local-only changes (no re-fetch) - [x] Closest mode = whole country, distance picker disabled - [x] Delta/TOP baseline = cheapest-within-radius in both modes - [x] Three-layer price sanitisation (relay band 50–500p / app decode guard / title-case) - [x] Title-case station names (chunk-aware sanitizer) - [x] Native large-title navigation (Mail-style collapse) — `313fe84` - [x] E10/E5 bracket labels in picker + descriptions — `05f3ef0` - [x] Gitea remotes created + pushed (`apt/fuelboard`, `apt/fuelboard-relay`) - [x] Brand logos: proper 2x/3x assets, 75% smaller (315 KB → 79 KB) - [x] Security audit (see SECURITY.md) - [x] App Store approval gotcha review (see APPSTORE.md)