80 lines
4.4 KiB
Markdown
80 lines
4.4 KiB
Markdown
# 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.
|
||
|
||
---
|
||
|
||
## P1 — Soon
|
||
|
||
- [ ] **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
|
||
|
||
- [ ] **Production data mirror (GitHub)** — relay pushes the synced dump
|
||
(`stations.json` + `latest.json` version pointer) to a PUBLIC GitHub repo; the
|
||
app fetches `raw.githubusercontent.com` with the LAN relay as fallback source.
|
||
Public repo required for App Review (reviewer must fetch the data themselves);
|
||
HTTPS/ATS fine; plain JSON data is not "remote code" (2.5.2-safe); bundle a small
|
||
fallback dump so the app never demos empty. Needs GitHub PAT (aptonline account).
|
||
- [ ] **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.
|
||
- [ ] **Widget picker: dual-unit distance labels** — the Edit-Widget Distance row
|
||
label is cached by the system at sheet-render time and only re-resolves on
|
||
picker interaction, so "mirror the app unit" goes stale. Fix: label options
|
||
with both units ("5 miles (8 km)") so nothing can go stale; widget rows keep
|
||
mirroring the live unit.
|
||
|
||
## Done (recent)
|
||
|
||
- [x] Switch dataset to govuk API data — official Fuel Finder OAuth API via
|
||
relay-api :8789 (source: api, ~8,012 stations); app baseURL → :8789; credentials
|
||
live in relay `.env` only, never in the IPA
|
||
- [x] Unit test target for the app — FuelBoardShared XCTest target, 37 tests
|
||
(title sanitizer, decode price guard, RAG thresholds, cheapest/closest baseline,
|
||
miles↔km)
|
||
- [x] Backlog hygiene — implemented items marked DONE, obsolete pruned
|
||
- [x] Sync retry with exponential backoff — relay-api retries failed syncs
|
||
15s→15min cap; `/health` exposes retry state (`6a58275`)
|
||
- [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)
|