Breeze RMM v0.90.0 — live per-device automation progress, portable-device battery telemetry, and a broad reliability/security fixes wave.
Summary
- Automations — automation runs now record a structured per-device result (pass/fail/pending/skipped) with timing and output, and the UI shows it updating live as the run executes instead of only a final aggregate count (#2023).
- Devices — portable devices now report battery and power status (percent, charging state, plugged-in, time remaining) from the agent heartbeat (#2142).
- Software detection — new file-version (
>=) detection rule for identifying installed software by on-disk file version (#2089). - Reliability & security hardening — agent heartbeat now fails closed when its update-policy lookup fails (#2125), uptime scoring credits boot spans and stops a recovered-self double-dip (#2166), and the Windows MSI bootstrap token finally honors the device-enrollment limit set at build time (#2161).
Added
- Per-device automation results with live progress — each automation run seeds a row per targeted device and updates it running → success/failed/skipped as the concurrency loop finishes, giving a consolidated per-device breakdown with timing and captured output that a polling UI watches live (#2023)
- Battery & power status for portable devices — the agent heartbeat reports a power snapshot (present, percent, charging state, plugged-in, time-remaining) surfaced on the device (#2142)
- File-version (
>=) software detection rule — detect installed software by comparing an on-disk file version with a>=operator (#2089)
Improved
- Billing lists — shared list chrome and pill-role layering across billing surfaces, with follow-up test coverage (#2151)
Fixed
- Auth — a passkey is now accepted as an alternate MFA method when an authenticator app is the primary factor, instead of being rejected (#2153)
- Reliability scoring — boot spans are credited as uptime and a recovered-self credit double-dip is removed; fleet scores may shift after upgrade as new data accrues (#2166)
- Patching — update-ring category include/exclude filters are enforced at approval time, not just at scan time (#2117)
- Remote — Scheduled Tasks — the Scheduled Tasks tool is now theme-aware (#2136)
- Remote terminal — a manual Disconnect no longer triggers auto-reconnect (#2137)
- Web — idle logout — the partner's effective session-timeout is honored when logging out idle sessions (#2147)
- Web — device action bar — gated on
status !== 'online'rather than== 'offline', so actions render correctly for transitional states (#2078) - Config policies — org ownership badge + locked org-assignment target (#2167); org-only feature tabs are gated on partner-wide policies (#2101)
- Installer — the Windows MSI filename-bootstrap token honors the device-enrollment limit set when the installer was built; a multi-use token now enrolls up to its limit instead of silently 404-ing after the first machine (#2161)
Security
- Agents — fail closed on heartbeat update-policy lookup — if an agent's update-policy can't be resolved, the heartbeat no longer proceeds with a permissive default (#2125)
- Auth — fixed token lifetimes — the deliberate 15-minute access / 7-day refresh token design is unchanged; the phantom
JWT_EXPIRES_IN/REFRESH_TOKEN_EXPIRES_INvariables that falsely implied a tunable knob are removed so config no longer advertises a control that does nothing (#2146)
Self-hosters are encouraged to upgrade.
Self-Hosting / Upgrade Notes
Upgrade. Bump BREEZE_VERSION to 0.90.0, then:
docker compose pull api web && docker compose up -d
(If you build from source, run pnpm install first.)
Database — 3 migrations, idempotent, auto-apply on boot via autoMigrate (unless AUTO_MIGRATE=false):
- new
automation_run_device_resultstable (per-device automation results, org-scoped RLS on the device's org), devices.battery_statusnullablejsonbcolumn,installer_bootstrap_tokens.consumed_countinteger with a small guarded backfill of already-consumed tokens.
No table rewrites or large backfills — no long stall on boot.
No new required environment variables. Two variables are removed from the shipped compose/.env examples: JWT_EXPIRES_IN and REFRESH_TOKEN_EXPIRES_IN. They were never read by any code path (access/refresh TTLs are hardcoded at 15m/7d by design), so setting them never did anything — you can safely delete them from your .env and compose. No behavior change.
Behavior changes.
- Agent heartbeat now fails closed when the update-policy lookup fails (#2125) — an agent that can't resolve its update policy no longer falls through to a permissive default.
- Reliability scores may shift after upgrade — devices affected by the boot-span uptime credit or the recovered-self double-dip will re-score as new heartbeat data accrues (#2166).
- Remote terminal no longer auto-reconnects after you click Disconnect (#2137).
No breaking changes.
Full Changelog: v0.89.0...v0.90.0
What's Changed
- chore(skills): commit /release skill (sanitized) so worktree sessions load it by @ToddHebebrand in #2164
- docs: sync technical docs for v0.89.0 by @ToddHebebrand in #2165
- fix(config-policies): gate org-only feature tabs on partner-wide policies (#2101) by @ToddHebebrand in #2169
- Config policies: org ownership badge + locked org assignment target by @ToddHebebrand in #2167
- fix(web): gate device action bar on status!=='online' not =='offline' (#2078) by @ToddHebebrand in #2170
- fix(web): honor partner effective session timeout in idle logout (#2147) by @ToddHebebrand in #2171
- fix(remote-terminal): stop auto-reconnect after manual Disconnect (#2137) by @ToddHebebrand in #2172
- fix(config): remove phantom JWT_EXPIRES_IN / REFRESH_TOKEN_EXPIRES_IN env vars (#2146) by @ToddHebebrand in #2173
- fix(remote): make Scheduled Tasks tool theme-aware (#2136) by @ToddHebebrand in #2174
- fix(patch): enforce ring category include/exclude filters at approval time (#2117) by @ToddHebebrand in #2176
- fix(reliability): credit boot spans as uptime, stop recovered-self credit double-dip by @ToddHebebrand in #2166
- refactor(billing): shared list chrome, pill-role layering, plus follow-up tests (#2151) by @ToddHebebrand in #2177
- feat(software): file-version (>=) detection rule (#2089) by @ToddHebebrand in #2178
- feat(devices): battery and power status for portable devices (#2142) by @ToddHebebrand in #2180
- fix(agents): fail closed when heartbeat update-policy lookup fails (#2125) by @ToddHebebrand in #2181
- fix(auth): allow passkey as alternate MFA when authenticator is primary (#2153) by @ToddHebebrand in #2175
- feat(automations): per-device execution results with live progress (#2023) by @ToddHebebrand in #2179
- fix(installer): honor device-enrollment-limit on Windows MSI bootstrap token (#2161) by @ToddHebebrand in #2182
Full Changelog: v0.89.0...v0.90.0