Files
fuelboard/BACKLOG.md
T
FuelBoard Contributor 2ed18d81a3 Backlog, tests, logo compression, security audit, App Store icon
- BACKLOG.md: P0-P3 roadmap incl. govuk API switch (blocked on credentials)
- APPSTORE.md: review-gate analysis (2 blockers: LAN data source, Always-location notes)
- SECURITY.md: audit - no secrets, no ATS holes, one MEDIUM (relay IP in binary, planned fix)
- FuelBoardTests/: SPM package, 28 tests on real Shared/ sources (sanitizer, price guard, RAG, sort, distance, brands)
- Logos: proper 2x/3x pairs, palette-quantized, 75% smaller (315KB -> 79KB)
- App icon: 1024px fuelpump on gradient (was missing entirely -> instant rejection)
- decodeStations(from:) exposed for testability; relay fetch reuses it
2026-08-11 23:14:28 +01:00

4.2 KiB
Raw Blame History

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 50500 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 + StaticConfigurationAppIntentConfiguration), 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)

  • England-wide full-UK dump, on-device filtering (relay 142061b, app cf9765b)
  • Cache-first, 12 h gate, pull-to-refresh only
  • Distance filter 5/10/15 miles, local-only changes (no re-fetch)
  • Closest mode = whole country, distance picker disabled
  • Delta/TOP baseline = cheapest-within-radius in both modes
  • Three-layer price sanitisation (relay band 50500p / app decode guard / title-case)
  • Title-case station names (chunk-aware sanitizer)
  • Native large-title navigation (Mail-style collapse) — 313fe84
  • E10/E5 bracket labels in picker + descriptions — 05f3ef0
  • Gitea remotes created + pushed (apt/fuelboard, apt/fuelboard-relay)
  • Brand logos: proper 2x/3x assets, 75% smaller (315 KB → 79 KB)
  • Security audit (see SECURITY.md)
  • App Store approval gotcha review (see APPSTORE.md)