[1.4.14] — 2026-05-09
Added
- Admin-Bereich nach Sektionen aufgeteilt. Statt einer monolithischen
/admin-Seite mit Anker-Sprüngen hat jede Sektion jetzt ihre eigene
Route:/admin/system-status,/admin/services,
/admin/integrations,/admin/feedback,/admin/reminders,
/admin/users,/admin/api-tokens,/admin/login-overview,
/admin/backups,/admin/danger-zone. Sidebar bekommt eine
ausklappbare Admin-Gruppe; Status-Cards verlinken direkt auf die
passende Unterseite. Alte/admin#section-…-Pfade werden serverseitig
weitergeleitet.
The admin area is split into per-section pages instead of one
monolithic dashboard with anchor jumps. Each section has its own URL
(/admin/system-status,/admin/services,/admin/integrations,
/admin/feedback,/admin/reminders,/admin/users,
/admin/api-tokens,/admin/login-overview,/admin/backups,
/admin/danger-zone); the sidebar grows an expandable Admin group;
status cards link to the relevant sub-page; legacy
/admin#section-…paths are redirected server-side. - Neue Backups-Sektion unter
/admin/backupsmit Tabelle aller
bisherigen Sicherungen (Größe, Typ, Erstellungszeit) und einem
„Backup jetzt erstellen“-Button, der einen Ad-hoc-Job auf der
pg-boss-Queue auslöst.
New/admin/backupsview with a table of all stored backups (size,
type, timestamp) and a “Backup now” button that enqueues an ad-hoc
pg-boss job. - Neue User-Verwaltung unter
/admin/usersmit Filter-Pills
(alle / nur Admins / nur Standardnutzer) und einer
„Force-Logout“-Aktion pro Nutzer hinter einem Bestätigungsdialog
(löscht alle aktiven Sessions des Ziels und schreibt einen
Audit-Log-Eintrag). Selbst-Logout ist gesperrt.
New/admin/usersview with role filter pills (all / admins only /
users only) and a per-row force-logout action behind a confirmation
dialog (deletes every active session of the target and writes an
audit-log entry). Self-target is disabled. - „Gespeicherten KI-Schlüssel entfernen“ in Settings → KI: ein
klar betitelter Knopf mit Bestätigungsdialog löscht den
gespeicherten OpenAI- bzw. lokalen Provider-Key, ohne Settings
ansonsten anzufassen.
New “Remove saved AI key” button in Settings → AI: a clearly
labelled button behind a confirmation dialog clears the stored
OpenAI or local provider key without touching anything else. CODEX_MODEL-Env-Var als Operator-Override für das Codex-
Modell-Slug, damit alternative Modelle ohne Rebuild getestet werden
können (z. B. wenn dein ChatGPT-Plan ein anderes Default-Modell
bevorzugt).
NewCODEX_MODELenv var lets operators override the Codex model
slug without a rebuild — useful for testing alternate slugs against
different ChatGPT plan tiers.
Changed
- Trend-Pfeil-Farben sind jetzt metrik-bewusst. Steigende Tendenz
bedeutet je nach Messwert etwas anderes: Blutdruck und Gewicht ↑ =
orange (Warnung), Stimmung ↑ = grün (positiv), Puls ↑ = neutral
(kontextabhängig). Die Pfeil-Richtung selbst bleibt unverändert.
Trend-arrow colors are metric-aware: BP and weight rising = orange
(warning), mood rising = green (positive), pulse rising = neutral
(context-dependent). Arrow direction itself is unchanged. - Wipe-all-data deckt jetzt auch Notification-Channels und Web-Push-
Subscriptions ab. Verschlüsselte Telegram-Bot-Tokens und
Web-Push-Endpoints überleben einen vollständigen Account-Wipe nicht
länger. Feedback und Audit-Log bleiben erhalten (wie bisher).
Bestätigungstext im UI nennt den neuen Umfang explizit.
“Wipe all data” now also clears notification channels and web-push
subscriptions: encrypted Telegram bot tokens and web-push endpoints
no longer survive a full account wipe. Feedback and audit log stay
untouched (unchanged). The confirmation copy spells out the new
scope. - i18n-Schlüssel im Admin-Bereich unter
admin.section.<slug>.*
reorganisiert (EN + DE-Parität).
Admin-area i18n keys reorganised underadmin.section.<slug>.*
(EN + DE parity).
Fixed
- Codex/ChatGPT-Modell-Slug korrigiert. Der Codex-Backend-Endpoint
lehnt sowohlgpt-5-codexals auchgpt-5für ChatGPT-Account-
Auth ab; das tatsächliche, codex-optimierte Slug für die Plus/Pro-
Tarife heißtgpt-5.3-codex. v1.4.14 verdrahtet den richtigen
Default. „Verbindung testen“ in Settings → KI und der Insight-
Generator laufen damit beide gegen dein ChatGPT-Abo durch.
Codex/ChatGPT model slug corrected: the Codex backend rejects both
gpt-5-codexandgpt-5when authenticated via a ChatGPT account;
the codex-optimised slug for the Plus/Pro tiers isgpt-5.3-codex.
v1.4.14 wires the correct default. Settings → AI “Test connection”
and the insight generator now both succeed against your ChatGPT
subscription. - Sommerzeit-Wechsel verschiebt keine Tageswerte mehr. Die
Cross-Metric-Tagespaarung in den Insight-Buckets rechnete früher in
reinem UTC und verlor an den Berliner DST-Grenzen einen Tag. Die
neue HelperdayOffsetToBerlinDayKey()arbeitet DST-immun (Anker
über Berliner Y-M-D, dann Subtraktion in 86_400_000-ms-Schritten);
die Tagespaarung über Blutdruck, Gewicht und Stimmung ist jetzt
über DST-Wechsel hinweg konsistent.
DST transitions no longer shift daily values. The cross-metric
daily bucket pairing previously did naive UTC math and dropped a
day at the Berlin DST boundary. A newdayOffsetToBerlinDayKey()
helper anchors at Berlin Y-M-D and subtracts in 86_400_000-ms
steps; bucket pairing across blood pressure, weight, and mood is
now DST-safe. - KI-Provider-Fehler werden korrekt klassifiziert.
/api/insights/generateantwortet auf 401/403-Fehler des Providers
jetzt mit 422 („KI-Anbieter hat den Request abgelehnt — bitte
API-Key in Settings → KI prüfen“), auf 5xx mit 503 („KI-Anbieter
vorübergehend nicht erreichbar“) und auf 429 mit 429. Vorher kam
pauschal 500. Volle Fehlerdetails landen weiter im Wide-Event-Log.
AI provider errors are now correctly classified by
/api/insights/generate: provider 401/403 → 422 (“AI provider
rejected the request — check your API key in Settings → AI”),
provider 5xx → 503 (“AI provider temporarily unavailable”), 429 →
429. Previously everything returned 500. Full error context still
lands in the structured logs. - Logging-Redactor schluckt keine harmlosen Wörter mehr. Der
Secret-Redactor maskierte zuvor jedes Vorkommen vonsk-…— auch
intask-force,risk-management,disk-io. Die neue Regex
verlangt eine Wortgrenze und mindestens 8 Folgezeichen, das Padding
bleibt für echte API-Keys (sk-…,sk-ant-…) intakt.
The structured-logging secret redactor no longer mangles innocent
words. The previous regex matched anysk-…substring and masked
fragments insidetask-force,risk-management,disk-io. The
new pattern requires a word boundary and at least 8 trailing
characters, while still scrubbing real API keys (sk-…,
sk-ant-…).
Performance
- Insights-Seite startet schneller. Die Recharts-Symbole für die
Korrelations-Scatter-Plots werden jetzt bedarfsweise per
next/dynamicgeladen statt eager mitausgeliefert; das spart
ca. 108 KiB initiales JavaScript auf der Insights-Seite. Die
Chart-Optik bleibt unverändert.
Bundle-size improvements on the insights page: Recharts symbols
for the correlation scatter plots are now loaded on demand via
next/dynamicinstead of being shipped eagerly, saving roughly
108 KiB of initial JavaScript on/insights. Chart visuals are
unchanged. - Dashboard fragt die Onboarding-Checkliste nicht mehr ab, wenn
sie schon abgeschlossen ist. SobaldonboardingCompletedAt
gesetzt ist, entfallen diewithings/status- und
notifications/preferences-Calls beim Dashboard-Aufruf. Spart
rund 950 ms Netzwerkzeit bei wiederkehrenden Nutzern.
The dashboard skips the onboarding-checklist API requests once
onboarding is complete. WithonboardingCompletedAtset, the
withings/statusandnotifications/preferencesqueries no longer
fire on dashboard load — saves about 950 ms of network time for
established users.
Tests & A11y
- Erweiterte End-to-End-Suite. Neue Playwright-Specs decken den
authentifizierten Dashboard-Render, den „Messung anlegen“-Flow,
den Doctor-Report-PDF-Download, einen gemockten Codex-Connect-
Flow, einen gemockten Insights-Generate-Flow und einen
Mobile-Viewport-Smoketest (Pixel 5) ab.
Extended end-to-end suite. New Playwright specs cover the
authenticated dashboard render, the “add measurement” flow, the
doctor-report PDF download, a mocked Codex connect flow, a mocked
insights-generate flow, and a mobile-viewport smoke test (Pixel 5). - Axe-core-Audit auf allen Schlüsselrouten grün. Die ernsten
und kritischen Verstöße auf/dashboard,/settings/integrations
und/admin(inkl./admin/system-statusund/admin/users)
wurden behoben — fehlendearia-labels an Icon-Buttons, fehlende
Namen am Mobile-User-Menü-Trigger, leere<dd>-Platzhalter,
Login-Link nur durch Farbe erkennbar, Quick-Add-Menü-Items mit
doppeltem Namen.
Axe-core accessibility audit now clean of serious/critical
violations on/dashboard,/settings/integrations, and/admin
(incl./admin/system-status,/admin/users). Fixes: missing
aria-labels on icon-only buttons, unnamed mobile user-menu trigger,
empty<dd>placeholders, sign-up link distinguishable only by
color, quick-add menu with two indistinguishable items.
Docs
- Dokumentations-Site auf v1.4.14 aktualisiert — Codex-Device-
Code-Pfad neu beschrieben, neue Admin-Sektionen (Backups, Users)
dokumentiert,CODEX_MODEL-Env-Var aufgenommen,
Dashboard-Performance-Hinweis ergänzt, Codex-Troubleshooting-Block
überarbeitet.
Documentation site brought up to date with v1.4.14 — Codex
device-code flow rewritten, new Admin sections (Backups, Users)
documented,CODEX_MODELenv var added, dashboard performance note
added, Codex troubleshooting block revised.