Fixes (non-admin users)
- Dashboard was silently broken for non-admin users. An undefined `$chStats` variable (only set inside the admin-only Row 3 block) was referenced further down in the pie-chart JS guard. On PHP 8 that triggered a Whoops error page injection right into the middle of an inline `<script>` tag — the stray `` and `</script>` tags broke JS parsing, which killed Chart.js, the Bootstrap dropdown handlers, and all polling loops. Non-admins saw an empty Jobs (24h) chart and a non-working profile dropdown.
- Jobs (24h) chart rendered at 0px for non-admin users even after the above fix. Non-admins get the chart alone at `col-12` with no siblings to define the row height, so `h-100` + `maintainAspectRatio: false` collapsed the canvas to 0. Wrapped it in a `min-height: 200px` container.
- Daily backup report exposed Remote Storage section (Hetzner / rsync.net quotas) to non-admin users. That's infrastructure detail — now gated behind the admin check that was already computed in the renderer.
❤️ Sponsor this project if you find it useful.