Bug fixes, infrastructure cleanup, and a couple of small UX additions.
Bug fixes
- Test SMTP now actually sends a test message. The previous behaviour only validated the connection + authentication handshake (EHLO, STARTTLS, AUTH LOGIN, QUIT) without issuing MAIL FROM / RCPT TO / DATA, so "Success" could be reported even though end-to-end delivery was never tested. The button now sends a small
[BBS] SMTP Testmessage to the email address of the user who clicked it, and surfaces the specific server response code if any step is rejected. (#249) - BorgBase API verification on existing storage configs no longer throws
ReferenceError: escapeHtml is not definedwhen the modal renders verification results.escapeHtmlis now defined once at the top of the storage-locations view, outside any section-conditional block. (#267) - Windows agent installer refuses to run on unsupported Windows versions instead of producing a confusing partial install. Cutoff is NT kernel 10.0 build 14393 (Windows 10 1607 / Server 2016). Older versions including Server 2012 / 2012 R2, Windows 7 / 8 / 8.1, and Server 2008 R2 are now rejected with a clear error message naming what was detected and what's required. The install one-liner also forces TLS 1.2 in the PowerShell session before downloading the installer script, so users on pre-2016 Windows reach the friendly OS gate instead of dying at the download step with an opaque SSL/TLS handshake error. (#274, follows #269)
Docker
- ClickHouse no longer launches with
--daemon. The Docker entrypoint now runsclickhouse-serverin the foreground and backgrounds it from the entrypoint shell. The previous--daemonmode redirected ClickHouse's own stdout/stderr to/var/log/clickhouse-server/stderr.loginside the container, which could grow unbounded over long uptimes when Poco's log rotation got into a bad state, and also drove elevated CPU even when the system was idle. With foreground launch, Docker's log driver captures output directly and handles rotation. Bare-metal installs (already running under systemd in the foreground) were never affected — verified on a long-running install with multiple clients, 100+ jobs/day, and 43 days of continuous uptime. The cron-based truncation and entrypoint self-heal from v2.52.2 are kept as safety nets and will clean up legacystderr.logfiles on first boot of the new image. (#266)
UI / UX
- Stat card styling unified across the app. Dashboard, Queue, Clients, Client Detail, and Archive Detail all used to have subtly different visual treatments for their metric tiles (different layouts, colors, hover treatments). They now share the same icon-on-left card pattern. Anchored dashboard hero tiles keep a small hover lift to indicate they're clickable.
- Duration formatting centralized. A single
TimeHelper::duration()PHP helper andBBS.formatDuration()JS helper now handle all elapsed-duration labels site-wide. Fixes the long-standing rendering quirk where the client page's "Avg Duration last 30 jobs" tile could show values like75m 3sinstead of the compact1h 15m. (#268) - "Borg pattern syntax" help link added to the Exclude Patterns field on plan create and edit forms. Opens the official borg patterns reference in a new tab. (#255)
- Legacy
/dashboard-legacyroute removed along with its backing view file. The v2 dashboard has been the default for months; the legacy escape hatch was creating ongoing maintenance friction (contributors had to update the backup view in parallel with the live one), and it hadn't tracked any of the recent dashboard work anyway.
Internal
- Recent Activity rows on
/clients/{id}are clickable and navigate to the queue detail for the corresponding job. - Recent contributions from external contributors merged: BorgBase quota integration (#256), upgrade summary mobile scrolling (#260), duration formatting refactor (#268), BorgBase verify-API helper scope (#267).
Notes
- Agent and server versions remain synchronized at
2.53.2. - Docker image rebuilds automatically via GitHub Actions.
- No database migrations in this release.