Skip to content

v0.12.0

Choose a tag to compare

@joszz joszz released this 17 Oct 15:14
· 103 commits to main since this release
Immutable release. Only release title and notes can be modified.
afb27ef

Upgrade Notes

  • The SAIC gateway moves to 0.13.0-rc3, a release candidate (its release notes). The all-in-one image ships it, and Compose pulls it on git pull and docker compose up -d --build. Nothing has to be done. What changes: a car only goes offline after three failed polls in a row instead of one, Home Assistant's charging sensors go unavailable while the car's charge data is stale, the charging cable lock is no longer reported on models that do not report it (such as the ZS EV; GarageStack hides the row within a week, once the old reading drops out), and stopping the container no longer ends in a forced kill after 10 seconds (#496)
  • Read-only API tokens no longer reach the export and the logs. GET /api/export and GET /api/logs now answer 403 token.sessionOnly to a token; sign in to use them (#489)
  • Behind a reverse proxy with no trusted proxies configured, sign-ins are capped at 30 per 5 minutes per proxy address, shared by everyone behind that proxy. This stops a device on your network from forging X-Forwarded-For to dodge the login limit. Set ForwardedHeaders__TrustedProxies__0 and __1 to the frontend container and your proxy to keep per-visitor limits only; that also switches the cap off (#489)
  • The Unraid template now really prefills AUTH_COOKIE_SECURE with auto, which the v0.11.0 notes already claimed, and its overview lists the newer features. An existing container keeps its value: set it to auto if you reach GarageStack over HTTPS (#489, #494)
  • Outside Docker only: the Worker's appsettings.json no longer carries the Docker connection string and broker host as a fallback. Set ConnectionStrings__DefaultConnection, as the API already needed; the broker host defaults to localhost. The API's CORS default is now the documented http://localhost:8080 (#494)
  • No database migrations in this release

Features

  • A real light theme. The light theme used to recolour nine tokens and leave the rest dark-on-white. Status text (Online, Trip in progress, tyre callouts, the charge pill, alerts, badges) went from about 2.2:1 to 5:1 contrast. Fields and secondary buttons are white with a border instead of grey slabs, switch knobs are white, buttons darken on hover, and the phone drawer no longer leaves a grey band along the edge. Charts follow the theme, including on a switch without a reload, and a light page no longer flashes dark while loading. Sliders, trip rows, tyre labels and info buttons get a visible focus ring. Dark mode is pixel-identical apart from the badges below (#490)

Bug Fixes

  • Readable badges in dark mode. White text sat on bright green, cyan and red at 2.3 to 3.8:1. Badges are now a tint of their colour with the colour as text (about 5:1 or better), and the solid green Live button, online toast and edit-mode badge get dark text (#491)
  • Escape closes one layer at a time, the newest first, instead of the mobile menu and the notification panel together (#492)
  • No slow-puncture alarm after a partial top-up. Topping up three tyres left the fourth behind the others, which read as a leak; a tyre now also has to have lost pressure itself. The tyre dialog and the alert use the same rule, so they can no longer disagree (#492)
  • Moved while parked compares with the right spot. The gateway publishes the engine stopping before that poll's GPS fix, so the parking spot was the previous fix, at speed hundreds of metres back. The parking poll's own fix now replaces it (#492)
  • Two-tap confirmations: deleting a maintenance log entry asks first instead of going on a single tap, and the token list's "Revoke?" times out like the other confirmations (#492)
  • Logs page: changing filters, searching and live mode could overlap, and an older answer could replace a newer one. The newest request wins now, and live mode pauses in a hidden tab (#495)
  • Quieter logs. Every successful request was an Information line (447 of 525 lines in a demo session, the log viewer's own polling included), and HttpClient added four lines per outgoing call. Successful requests are now Debug, refusals and requests over a second stay Information, and failures stay Error. A demo session through every page now writes 6 lines. DEBUG_LOGS=true still logs every request (#493)
  • A session no longer breaks behind a forward-auth proxy that passes its own Authorization: Bearer header: only a Bearer gs_... token selects token sign-in (#489)
  • The data export stops reading when the browser goes away, and a database error while noting a token's last use is logged instead of failing the request (#489)
  • All-in-one: the gateway reports its version again, in its log and to Home Assistant's gateway device, instead of "unknown" (#497)
  • The Worker no longer warns about the gateway's new drivetrain/chargingDataAvailable topic as unmapped (#496)
  • Screen readers: the revoke buttons name their token, the online/offline toast is announced, and error lines in dialogs and views are announced as alerts (#492, #495)
  • The demo panel's two OK buttons are translated (#492)

Security

  • Read-only tokens could download the whole history (/api/export) and read the logs (/api/logs); both are session-only now (#489)
  • Login limit: with no trusted proxies configured, a device on the LAN could forge X-Forwarded-For and never hit the limit; see Upgrade Notes (#489)
  • VINs in browser error reports are now redacted in the message and the stack too, not only in the page (#489)
  • No forged log entries. Text an entry quotes from outside, such as an identity provider's error description or a browser error report, could carry a line break and a timestamp and show up in the log viewer as an entry of its own. The log files now indent an entry's following lines, and older files still read as before (#493)

Performance

  • The log viewer reads 64 KB from the end of each log file and only reads further when the page is not yet full, instead of reading 8 MB per file on every request, every ten seconds in live mode (#493)

Documentation

  • The README lists every push alert, the tyre history, the car colour and the vehicle type override, and says the export and the logs stay session-only for tokens. The quick start no longer passes AUTH_COOKIE_SECURE=false (#494)
  • CONFIGURATION.md documents Serilog__MinimumLevel__Override__<category> (one source at Debug without DEBUG_LOGS) and Mqtt__ClientId (#494)
  • ARCHITECTURE.md covers API tokens, the log files, the log viewer and the export, and the all-in-one README its /data layout and logs (#494, #496)
  • The issue templates know the all-in-one image, Unraid and the newer components, and point questions to Discussions (#494)

Internal

  • Shared ViewHeader, StatusBadge and ConfirmFooter components and a useAsyncRequest composable replace copies across the views; the backend folds its cooldown checks and local-date helpers together (#495)
  • Frontend tests run in about 4 seconds instead of 21, with the same tests and the same coverage (#495)
  • The all-in-one image no longer prunes the gateway's virtual environment: the gateway now installs only its runtime packages itself (17 instead of 48) (#496)

Dependencies

  • SAIC gateway 0.12.0 to 0.13.0-rc3, which replaces gmqtt with aiomqtt and requires saic-ismart-client-ng 0.10.0 (#496)

Full Changelog

v0.11.0...v0.12.0: v0.11.0...v0.12.0