Bug fixes and UI polish.
Fixes
- Windows installer failed with "Missing closing brace" parse errors (#165): the
.ps1script contained UTF-8 em-dashes inside double-quoted strings. Windows PowerShell reading the file without a BOM defaults to the legacy code page (usually cp1252), where the UTF-8 byte sequence for—includes0x94— interpreted there as a right curly quote — which prematurely terminated strings and derailed parsing into the brace errors users saw from lines much later in the file. Bothinstall-windows.ps1anduninstall-windows.ps1are now pure ASCII. - Borg/agent updates failed on offline clients (#144): scheduled
update_borgandupdate_agentjobs were being auto-failed the moment the agent's heartbeat timed out. Those task types now stay queued until the client next polls, so laptops asleep at the scheduled update hour quietly receive the update when they come back. A 7-day safety valve expires management jobs that have been abandoned. - Missed-schedule spam (no issue): each cron tick was incrementing
occurrence_countand resettingread_aton the same unresolved missed-schedule row, so agents offline for days accumulated thousands of occurrences and the notification refused to stay marked read. Deduped at the scheduler level, plus a one-time cleanup migration clamps any existing inflated counts back to 1.
UI
- Clients page (#141): "Backup Activity" renamed to "Activity". Failed jobs split into red "Backup Failed" (real data risk) and amber "Other Failed" (update jobs, plugin tests, etc.), so a laptop that was offline at update time no longer paints the chart the same color as an actual backup failure.
- Archive detail page redesign (#132, #133): stat row rebuilt with the
metric-tilepattern from the dashboard and card headers use the signature blue gradient. "Files" is now "Files in Archive" with a tooltip explaining the pre-scan vs manifest difference. Status Breakdown footer is now readable with a proper "Grand Total" row that includes directories/symlinks. Excluded-file badges swapped to a readable subtle variant. Largest Files no longer shows excluded entries (node_modules etc. that weren't backed up). - Archive detail page load time: deferred the "deleted vs previous archive" anti-join to a background fetch, and rewrote it as
LEFT ANTI JOIN— page renders immediately even on multi-million-file archives. - Dashboard tweaks: Server Health progress bars switched to Bootstrap's standard
.progresswith an always-visible centered % overlay. File Catalog stats table uses hairline row separators, gets a transparent background, and expands to full width on mobile. Doughnut tooltips escape the 110×110 canvas as HTML overlays on<body>and show size + rows. - Notifications page: tightened row heights, removed the redundant "Notifications" H4 (already labeled in the nav).
- Mobile bottom nav: 5-tab layout (Home / Clients / Queue / Settings / More) with a bottom-sheet submenu for Schedules, Log, Users, Storage, Logout. Active state highlights More when the current page is one of the inner items. Lighter top border + stronger upward shadow for definition.
- Badge styling: site-wide consistency — medium weight (not bold), Title Case.
- Client detail header: hostname uses a signpost icon so the globe icon clearly belongs to the IP.
❤️ Sponsor this project if you find it useful.