- Reverts the schneespur/ subdirectory restructure (b8e426b)
- Restores package.json and vite.config.js (needed for npm build, were
removed in an earlier cleanup before the restructure)
- Updates public/build/ assets with current Vite output (new content hashes)
User-facing improvements
- Installer detects browser language from the Accept-Language header
on the very first request. de-* → Schneespur/DE, everything else
(en-*, zh, ja, ar, it, fr, …) → Wintertrace/EN.
- DE/EN switcher in the installer layout header for manual override.
The choice persists for the browser session.
- Step 5 (Config) now reflects the already-resolved locale instead of
detecting again client-side, eliminating a brief "wrong language"
flash between steps.
Under the hood
- New SetInstallerLocale middleware (Symfony's getPreferredLanguage
with strict top-preference, list order ['en','de'] so non-matching
browsers fall back to en/Wintertrace, not de/Schneespur).
- brand() helper resolves from the runtime locale when the app_brand
setting is absent (pre-install). Post-install behaviour unchanged.
- Composer now declares ext-sodium explicitly (required by the Ed25519
signature verification in the auto-update flow).
No DB migrations, no breaking changes, no config rewrites needed.
- Move all application code into schneespur/ subdirectory for cleaner
GitHub presentation (README, LICENSE, INSTALL guides stay in root)
- Fix German Umlaut encoding in INSTALL.de.md and README.md
(ae→ä, oe→ö, ue→ü throughout)
- ZIP download structure remains flat (code in root) for easy deployment
Schneespur — Open-source winter service documentation software (PWA + Admin).
GPS tracking via OwnTracks, weather data, photo evidence, and legally
compliant service records for winter maintenance operators.
License: AGPL-3.0-or-later