diff --git a/SPECS.md b/SPECS.md
index e03021b..8185669 100644
--- a/SPECS.md
+++ b/SPECS.md
@@ -23,27 +23,34 @@ car ──live telemetry───▶ car.k8s.stinnesbeck.com (Go)
- **Server:** `server/`, Go 1.26, API only — see `server/README.md` for endpoints, configuration
and the storage layout. Replaced the Next.js app from upstream (`web/`, removed 2026-10-17).
-- **Dashboards:** Grafana, provisioned from `k8s/grafana/`: Live (stats, SoC/range, power/speed,
- route map, temperatures, tyres), Consumption (period totals, lifetime, SoH, per-day energy,
+- **Dashboards:** Grafana, provisioned from `k8s/grafana/`, reading with a read-only token: Live
+ (stats, SoC/range, power/speed, route map, temperatures, tyres), Consumption (period totals, lifetime, SoH, per-day energy,
distance and efficiency) and Charging (totals, session table, curves). Prices in euro.
- **Pairing:** the car shows a QR code, a phone approves it with the approval password, and the car
- gets its own token (RFC 8628-style; `server/README.md`). The shared `INGEST_TOKEN` still works.
-- **Car app:** Server tab (URL, pairing by QR, ingest token, installation id, config import); live telemetry
- every 15 s while driving or charging; consumption chunks and charging sessions as before.
+ gets its own token, bound to its installation id (RFC 8628-style; `server/README.md`). The
+ shared `INGEST_TOKEN` still works. The same QR flow carries settings typed on the phone.
+- **Car app:** tabs Overview, Consumption, Charging, Live data (on/off, ABRP credentials,
+ frequency), Server (URL, pairing, token, installation id, config import), Settings (display,
+ voice key, tyre unit, accent colour, battery, charging price, Wi-Fi), Logs. Live telemetry every
+ 15 s while driving or charging, to the server and straight to ABRP; consumption chunks and
+ charging sessions to the server.
- **Deployment:** `k8s/`, plain manifests. **Nothing is ever applied to the cluster by us** —
Nils applies them (`k8s/README.md`). TLS comes from Traefik's default certificate.
### Status
-- [x] Go server 2.0.0: tests and govulncheck clean; image builds (about 11 MB).
-- [x] End-to-end in podman (server + InfluxDB 2.7.12 + Grafana 13.2.3): every endpoint, retry
- idempotency, all 25 dashboard queries return data, dashboards rendered and checked.
-- [x] Manifests validated offline (including Traefik CRDs). **Not applied.**
-- [x] Car app 2.4.0 (pairing by QR): unit tests pass; **not yet tried on the car**.
-- [x] Image `mg4-server:2.1.0` (with pairing) pushed to git.stinnesbeck.com (public; pinned by
- digest `sha256:e5f6e2d2…` in `k8s/server.yaml`).
+Current: app 2.14.2, server 2.5.0 (pinned by digest in `k8s/server.yaml`).
+
+- [x] On the car: QR pairing, values on the Overview, voice-key double press, full screen
+ without black bands.
+- [x] Go server: tests and govulncheck clean; end to end in podman against InfluxDB 2.7.12
+ (telemetry, consumption, charging, pairing, settings from the phone) and Grafana 13.2.3 (all
+ dashboard queries return data).
+- [x] Manifests validated offline (kubeconform, with Traefik CRDs). **Applied by Nils only.**
- [ ] Check Grafana's host in `k8s/ingress.yaml` (placeholder `car-grafana.k8s.stinnesbeck.com`).
-- [ ] First pairing and drive with 2.4.0: telemetry arrives in InfluxDB, Grafana and ABRP.
+- [ ] Not yet tried on the car: live data straight to ABRP (2.11), Enter on phone (2.12), accent
+ colours and the car-colour probe on the Logs tab (2.14; a photo of its list decides whether
+ the accent can follow the paint automatically), right-aligned values (2.14.1).
### Signals the car does not provide
@@ -63,10 +70,6 @@ tyre pressures, GPS (lat, lon, elevation, heading) and the is_* flags. It does *
## To do
-- [ ] **About dialog link and QR code → https://git.stinnesbeck.com/nils/mg4.**
- Both come from `REPOSITORY_URL` in `app/src/main/java/com/evsuite/abrp/MainActivity.java`
- and `about_repository` in `app/src/main/res/values/strings.xml`. They still point to Fatih's
- GitHub repository.
- [ ] **Re-enable OTA updates against our own releases.** `RELEASES_API` in
`app/src/unstable/java/com/evsuite/abrp/OtaUpdater.java` points at `updates.invalid` on purpose,
so checks fail. The updater speaks the GitHub releases API and only allows GitHub hosts
@@ -113,6 +116,8 @@ tyre pressures, GPS (lat, lon, elevation, heading) and the is_* flags. It does *
INGEST_TOKEN) into git and pushed it. Commit amended and force-pushed; both values regenerated in
the now gitignored `k8s/secrets.yaml` (since moved to `k8s/secrets/secrets.yaml`, outside
`kubectl apply -f k8s/`). Filled-in secrets live only there from now on.
+- 2026-10-18 — About dialog: link and QR code point to https://git.stinnesbeck.com/nils/mg4
+ (were Fatih's GitHub). Status section brought up to date.
- 2026-10-18 — App 2.14.2: "Range, 5-min average", like the usage and power cards (was "Range at 5-min average").
- 2026-10-18 — App 2.14.1: Overview values and their notes right-aligned, with tabular
(equal-width) digits, so 9 → 10 → 100 no longer shifts the text; labels stay left.
diff --git a/app/build.gradle b/app/build.gradle
index da384c1..e9e9959 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -34,8 +34,8 @@ android {
applicationId "com.stinnesbeck.nilsmg4"
minSdk 27
targetSdk 36
- versionCode 80
- versionName "2.14.2"
+ versionCode 81
+ versionName "2.14.3"
// Nothing about the server ships in the APK: its URL and ingest token are entered in
// the app's Server tab (ServerConfig), and the database is only reachable by the server.
diff --git a/app/src/main/java/com/evsuite/abrp/MainActivity.java b/app/src/main/java/com/evsuite/abrp/MainActivity.java
index d86d2ce..2e21606 100644
--- a/app/src/main/java/com/evsuite/abrp/MainActivity.java
+++ b/app/src/main/java/com/evsuite/abrp/MainActivity.java
@@ -37,7 +37,7 @@ public class MainActivity extends AppCompatActivity {
/** Shared with {@link AbrpUploadService}, which reads it on every tick. */
static final String WIFI_AUTO_KEY = "wifi_auto_connect";
- private static final String REPOSITORY_URL = "https://github.com/fatihdonmezdev/FatihsMG4";
+ private static final String REPOSITORY_URL = "https://git.stinnesbeck.com/nils/mg4";
/** Navigation destinations in page order. Parallel to {@link #panes}. */
private static final int[] TAB_IDS =
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ab25183..dfeaeef 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -208,7 +208,7 @@
About Nils\' MG4
Version %1$s
Fork of fatihdonmezdev / FatihsMG4,\nmalys / EVABRPUploader\nand Leon Kernan / ABRP_Uploader
- github.com/fatihdonmezdev/FatihsMG4
+ git.stinnesbeck.com/nils/mg4
MG4 EH32 · SWI69
Nils\' MG4 logo
QR code for the project repository