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

79 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` + `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 50500p / 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)