Rename the web app from FatihsMG4 to Nils' MG4

Browser title, login heading, hidden password-manager username, session
cookie (nilsmg4_session) and package name. The README keeps the credit
to fatihdonmezdev/FatihsMG4. Server version 1.1.1; the manifests pin it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QLJfZQZeAKAwSqViTmLzki
This commit is contained in:
2026-10-17 14:34:16 +02:00
co-authored by Claude Opus 5.5
parent e39d9cdcf9
commit 818442db08
8 changed files with 14 additions and 15 deletions
+2 -3
View File
@@ -74,7 +74,7 @@ car ──live telemetry───▶ car.stinnesbeck.com ──▶ ABRP api.ite
- [x] Manifests in `k8s/`, validated offline. **Not applied** — that is Nils' step (`k8s/README.md`). - [x] Manifests in `k8s/`, validated offline. **Not applied** — that is Nils' step (`k8s/README.md`).
- [x] Car app 2.3.0: Server tab with config import, live telemetry upload, cadence controls. - [x] Car app 2.3.0: Server tab with config import, live telemetry upload, cadence controls.
Unit tests and lint pass; **not yet tried on the car**. Unit tests and lint pass; **not yet tried on the car**.
- [ ] Push the image to git.stinnesbeck.com (needs a registry login on the build machine). - [ ] Push the image (`mg4-server:1.1.1`) to git.stinnesbeck.com (needs a registry login on the build machine).
- [ ] Check the Traefik ingress class in `k8s/ingress.yaml` (placeholder `traefik-external`). - [ ] Check the Traefik ingress class in `k8s/ingress.yaml` (placeholder `traefik-external`).
- [ ] First drive with 2.3.0: telemetry arrives in InfluxDB and at ABRP. - [ ] First drive with 2.3.0: telemetry arrives in InfluxDB and at ABRP.
@@ -92,8 +92,7 @@ car ──live telemetry───▶ car.stinnesbeck.com ──▶ ABRP api.ite
`NilsMG4-unstable-<version>.apk` with a `.sha256` sidecar (`build-car` writes both). `NilsMG4-unstable-<version>.apk` with a `.sha256` sidecar (`build-car` writes both).
- [ ] **Charging currency.** Prices and costs are shown in Turkish lira (`₺/kWh`, `₺`) in - [ ] **Charging currency.** Prices and costs are shown in Turkish lira (`₺/kWh`, `₺`) in
`pane_charging.xml` and `MainActivity.java`. `pane_charging.xml` and `MainActivity.java`.
- [ ] **Dashboard language and branding.** The `web/` pages are still Turkish, say "FatihsMG4" and - [ ] **Dashboard language.** The `web/` pages are still Turkish and show prices in lira.
show prices in lira.
- [ ] **Telemetry queue survives restarts.** Unsent live samples are kept in memory only. - [ ] **Telemetry queue survives restarts.** Unsent live samples are kept in memory only.
- [ ] **Translate the rest.** The docs (`CHANGELOG.md`, `OTA.md`'s - [ ] **Translate the rest.** The docs (`CHANGELOG.md`, `OTA.md`'s
message table, comments in `mise.toml`/`app/build.gradle`) are still Turkish or French. message table, comments in `mise.toml`/`app/build.gradle`) are still Turkish or French.
+1 -1
View File
@@ -9,4 +9,4 @@ resources:
- ingress.yaml - ingress.yaml
images: images:
- name: git.stinnesbeck.com/nils/mg4-server - name: git.stinnesbeck.com/nils/mg4-server
newTag: "1.1.0" newTag: "1.1.1"
+1 -1
View File
@@ -2,7 +2,7 @@
Next.js app, self-hosted at car.stinnesbeck.com: the ingest API the car writes to, the ABRP Next.js app, self-hosted at car.stinnesbeck.com: the ingest API the car writes to, the ABRP
forwarder, and a phone-shaped dashboard for reading the history back. Data lives in forwarder, and a phone-shaped dashboard for reading the history back. Data lives in
InfluxDB 2. Based on upstream's Vercel/MongoDB app in FatihsMG4. InfluxDB 2. Based on upstream's Vercel/MongoDB app in fatihdonmezdev/FatihsMG4.
``` ```
car ──live telemetry───▶ server ──▶ ABRP api.iternio.com/1/tlm/send car ──live telemetry───▶ server ──▶ ABRP api.iternio.com/1/tlm/send
+4 -4
View File
@@ -1,12 +1,12 @@
{ {
"name": "fatihsmg4-web", "name": "nilsmg4-web",
"version": "1.1.0", "version": "1.1.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "fatihsmg4-web", "name": "nilsmg4-web",
"version": "1.1.0", "version": "1.1.1",
"dependencies": { "dependencies": {
"@influxdata/influxdb-client": "^1.35.0", "@influxdata/influxdb-client": "^1.35.0",
"next": "^15.5.4", "next": "^15.5.4",
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "fatihsmg4-web", "name": "nilsmg4-web",
"version": "1.1.0", "version": "1.1.1",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
+1 -1
View File
@@ -2,7 +2,7 @@ import type { Metadata, Viewport } from "next";
import "./globals.css"; import "./globals.css";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "FatihsMG4", title: "Nils' MG4",
description: "MG4 tüketim ve şarj geçmişi", description: "MG4 tüketim ve şarj geçmişi",
}; };
+2 -2
View File
@@ -13,7 +13,7 @@ export default async function LoginPage({
return ( return (
<div className="login"> <div className="login">
<form className="login-card" action="/api/session" method="post"> <form className="login-card" action="/api/session" method="post">
<h1 className="title">FatihsMG4</h1> <h1 className="title">Nils&apos; MG4</h1>
<p className="subtitle">Tüketim ve şarj geçmişi</p> <p className="subtitle">Tüketim ve şarj geçmişi</p>
{/* {/*
A hidden username so password managers will offer to save this. A hidden username so password managers will offer to save this.
@@ -24,7 +24,7 @@ export default async function LoginPage({
<input <input
type="text" type="text"
name="username" name="username"
value="fatih" value="nils"
autoComplete="username" autoComplete="username"
readOnly readOnly
hidden hidden
+1 -1
View File
@@ -11,7 +11,7 @@ import crypto from "node:crypto";
* Reading the history needs the dashboard password, which never leaves the browser's * Reading the history needs the dashboard password, which never leaves the browser's
* cookie jar and is never compiled into anything. * cookie jar and is never compiled into anything.
*/ */
export const SESSION_COOKIE = "fatihsmg4_session"; export const SESSION_COOKIE = "nilsmg4_session";
const SESSION_TTL_SECONDS = 60 * 60 * 24 * 30; const SESSION_TTL_SECONDS = 60 * 60 * 24 * 30;
/** Constant-time compare that does not leak length through an early return. */ /** Constant-time compare that does not leak length through an early return. */