-
Notifications
You must be signed in to change notification settings - Fork 0
User en Privacy Profiles Sync

Sparkilo is privacy-first. Concrete meaning:
- No Google Play Services. No Firebase. No Google Analytics.
-
No third-party tracking SDKs. Check
pubspec.yamlin the source — zero analytics dependencies. - No account required. The app works fully without sign-up.
- No data collection. Nothing leaves your phone unless you explicitly enable sync or tap "Report issue".
- GDPR consent on first launch. A dedicated screen explains every permission before the app proceeds.
- Open source. MIT license. Verify the privacy claim yourself.
Everything the app uses is stored locally in encrypted Hive databases:
| Box | Contents | Encrypted? |
|---|---|---|
settings |
App configuration, country, language, units | Yes (AES) |
profiles |
Your search profiles | Yes |
favorites |
Saved stations + their data | Yes |
cache |
Cached API responses, itineraries | Yes |
priceHistory |
30-day local price records | Yes |
alerts |
Your price alert rules | Yes |
obd2Baselines |
Per-vehicle consumption baselines | No (non-PII) |
obd2TripHistory |
OBD2 + GPS trip logs | No (non-PII) |
API keys (Germany, OpenChargeMap, Supabase) are stored in the Android Keystore (hardware-backed) on Android or the iOS Keychain, not in Hive.
| Permission | Why | Can I refuse? |
|---|---|---|
| Location (while in use) | Nearby search, route start, trajet recording | Yes — use postal code instead |
| Bluetooth Scan + Connect | OBD2 adapter pairing | Yes — OBD2 is optional |
| Notifications | Price alerts | Yes — alerts won't fire |
| Camera | OCR pump display scan | Yes — type manually |
| Internet | API calls for prices | Required |
The app never requests background location.
A profile is a bundle of preferences: country, default fuel type, radius, landing screen, units, preferred amenities, vehicle, approach radius. Use profiles if you switch contexts often:
- "Home" — Germany, E10, 10 km radius, favorites as landing
- "Work commute" — France, Diesel, 25 km radius, cheapest as landing
- "Holiday" — Spain, E10, map landing, Apple Pay filter on
Switch profiles from Settings → Profiles or via the profile chip in the top-right.
You always have at least one profile — the app creates a default one on first launch.
Profiles also carry the approach overlay preferences (radius in km + nearest vs cheapest-in-radius). See Consumption & OBD2 → Approach overlay.
Settings → Privacy Dashboard is the one place where you see everything the app holds about you, and where the diagnostics surfaces live.
The error-log button is labelled Save (it used to say "Copy"). When tapped, the app writes the recent error traces — sanitised, no PII, no GPS, no API keys — to a single file in your public Downloads folder via the system share / save sheet. From there you can attach it to a GitHub issue when reporting a bug.
A clipboard fallback is used on platforms where the save fails, so the action never silently does nothing.
A button labelled Test approach overlay pushes a synthetic in-radius state for 30 seconds. If a trajet is being recorded (or you start one), the PiP tile flips to the price layout for that test station, lets you verify it renders, and clears automatically.
Use this to confirm the approach overlay works on your device — no need to actually drive past a real station to test it.
Beyond the Save button, all data exports (full backup JSON, price-history CSV, trip GPX) now write to the public Downloads folder so any file manager can pick them up. The on-screen snackbar confirms the save and shows the filename.
TankSync is an optional Supabase backend that mirrors selected data between your devices. It is opt-in. Disabled = nothing leaves your phone. The entire UI is translated across all 23 supported locales.
- Community instance — a shared Supabase project maintained by the community. Anonymous auth. Simple setup.
- Self-hosted — deploy your own Supabase instance (the SQL schema + Edge Functions are in the repo). You keep full ownership of the data and there's no third-party at all.
Settings → TankSync → Enable. Then:
- Community: scan the QR code from the wiki or paste the URL + anon key manually.
- Self-hosted: paste your project URL + anon key.
Anon key is stored in the Android Keystore.
- Favorites (stations)
- Price alerts
- Ignored stations
- Ratings (with per-rating privacy flag: local / private-synced / shared publicly)
- Trajets — OBD2 + GPS trips. Trajet sync is opt-in even after TankSync is enabled — flip the toggle in Settings → TankSync → Sync trajets if you want them mirrored. Off by default; if you turn it on later, only future trips sync until you also tap Backfill.
Local always wins. If you change a favorite on two phones simultaneously, the last write to each phone is canonical for that phone. Sync adds/changes but never silently deletes — only your explicit delete action triggers a server delete.
Settings → Data:
- Export all data → single JSON saved to Downloads
- Export price history → CSV saved to Downloads
- Reset app → wipes every local box and clears secure storage. Irreversible.
Since no personal data leaves the app by default, the GDPR right-to-erasure is satisfied by uninstalling or by Reset app. If you use TankSync, go to Settings → TankSync → Delete account to wipe your server-side data before uninstalling. There's also a Forget all synced trajets action that scrubs only the trajet rows while leaving the rest intact.
See PRIVACY.md for the full privacy policy.
See also: Getting Started (GDPR consent on first launch) · Consumption & OBD2 (approach overlay) Next: Troubleshooting & FAQ →
👤 User Guide
🛠️ Developer Guide
Architecture
Code patterns
Quality
Deep dives
Reference
Workflow