Breeze RMM v0.119.0: physical network topology and monitoring, Windows time sync, Xero accounting, multi-org report series, and brokered backup writes, plus a security hardening pass across the server, agent and Breeze Helper.
⚠️ Self-hosters on v0.118.x: TURN relaying stays broken until you edit your coturn configuration. The v0.118.0–v0.118.2 Compose files pass --denied-peer-ip=:: to coturn, which coturn reads as "every address". Every relayed (TURN) connection has been refused since v0.118.0. Delete that line (- '--denied-peer-ip=::' in the coturn command: of docker-compose.yml or deploy/docker-compose.prod.yml, or denied-peer-ip=:: in a standalone /etc/turnserver.conf), then restart coturn. guided-setup.sh --upgrade does not edit your Compose file, so this is a manual step on every install (#7536).
⚠️ S3 restores now need HTTPS end to end and an agent on v0.118 or later. Restores, test restores and verification from S3 or S3-compatible storage go only through a short-lived storage session, and there is no fallback. A plain-http:// MinIO endpoint, an API that agents reach over plain HTTP, or an unset or mismatched PUBLIC_API_URL refuses every S3 restore. Move to HTTPS before upgrading (#7237).
⚠️ Behaviour changes that need attention. See Self-Hosting / Upgrade Notes for details.
- Live device inspection (processes, services, scheduled tasks, event logs, files, registry and the live session list) now needs
devices:execute. Org Viewer, Partner Viewer and the seeded approver roles lose it (#7538, #7540). - On devices whose remote access policy is Require consent, VNC is refused, and desktop starts need a consent-capable agent. Two consent audit actions are renamed (#7288, #7390).
- Approver assurance becomes the platform default for high- and critical-risk approvals from 2026-11-05 (#7395).
- Notification channel and settings secrets are stored encrypted and returned masked. If you run a separate
workercontainer, roll it together withapi(#7533, #7254).
Security — action required
Self-hosted operators should upgrade to 0.119.0 and let agents update:
- GHSA-9qpw-p6rx-5f2h (High, agent 0.62.9–0.118.2): restoring a Windows backup as a Hyper-V VM could run code from that backup as SYSTEM on the Hyper-V host. Fixed in agent 0.119.0 (#7484).
- GHSA-c445-q84m-rph4 (Medium, server 0.108.0–0.118.2): on servers whose API runs in a non-UTC time zone, tokens issued shortly before a password change kept working and SSO re-authentication accepted stale sign-ins. Hosted and default Compose (UTC) were not affected (#7492).
- GHSA-vjq5-x2g3-pjhq (Low, server ≤ 0.118.2): AI file tools could read restricted folders through alternate path spellings (#7485).
Security — hardening
This release includes security hardening across:
- live device inspection permissions;
- site scoping of fleet security, threat and analytics reads;
- stored notification-channel and settings secrets;
- AI tools and AI sessions;
- remote-session consent enforcement;
- backup restore storage access;
- TURN relaying;
- request auditing and approvals;
- dependency updates for upstream advisories.
Self-hosters are encouraged to upgrade the server and let agents and Breeze Helper update to 0.119.0. (#7538, #7540, #7529, #7530, #7533, #7254, #7258, #7543, #7448, #7390, #7288, #7237, #7536, #7501, #7500, #7525, #7395, #7504, #7528)
Summary
- Network topology is complete. Physical links come from switch (LLDP/CDP/FDB) and UniFi evidence. The release adds interface history and link health, site monitoring policies, bounded traceroute, impact and recent-changes views, and an Explain this AI investigation whose claims must cite evidence. The one diagnostic it may propose runs only after a fresh passkey approval. Switch it on per partner in Settings → Partner → Modules (#7096, #7117, #7147, #7424).
- Windows time sync monitoring and enforcement. The agent reports W32Time configuration, time source, domain role, timezone and Time-Service events. There is a fleet Time page with 400-day evidence and CSV export, a
time_syncmonitor kind, and a Time sync tab in Configuration Policies that enforces NTP servers and timezone. Needs agent 0.119.0 (#7488, #7491, #7502, #7520, #7532). - Xero accounting. Connect a Xero organisation, map contacts and items, import customers, push and void invoices, and sync payments both ways. It stays hidden until
XERO_CLIENT_IDis configured (#7226, #7263, #7286, #7290, #7295, #7297, #7301, #7399). - Multi-org report series. One definition produces a report for every organization, or for the ones you choose, with recipient rules and internal CC. Every run records its delivery status. Opt-in Combine merges existing near-identical per-org reports into a series (#7451, #7458, #7459, #7483). There is also a new Backup status report (#7426).
- Backup. With the new agent, the backup helper uploads through short-lived server-issued signed URLs, and snapshots are attested after upload. S3 restores always use a storage session. A Windows rebuild host can rebuild a whole-machine snapshot into a VHDX and optionally create a Hyper-V VM. Cove-protected devices count in the customer portal (#7237, #7283, #7287, #7353, #7372, #7396, #7404, #7405, #7425, #7482, #7486).
- Compliance alerts. Configuration-policy compliance violations raise alerts on the first failing check. An alert stays open until the device is compliant and closes when its rule no longer applies (#7223, #7518, #7527).
Added
- Topology physical evidence (#7096). LLDP, CDP, FDB and UniFi evidence become physical links, or explicitly ambiguous attachments. A link can be hidden or restored per view. Manual cables can name ports (API only).
- Topology operations (#7117). Interface history and link health, site monitoring policies that need MFA to arm, bounded traceroute, impact and recent-changes views, and five MCP read tools.
- Topology "Explain this" (#7147). A site-pinned AI investigation whose claims must cite evidence. Its one proposed diagnostic runs only after a fresh passkey approval.
- Time sync (#7488, #7491, #7502, #7520, #7532):
- Device Info → Time.
- The
time_syncmonitor kind, with built-in monitors provisioned partner-wide but not attached. - Fleet page Devices → Time with a domain view and CSV exports of current status and daily history.
- Configuration Policies → Time sync tab: NTP servers, poll interval, expected or pinned timezone, auto-fix. Enforcement is domain-aware.
- Resync, Set timezone and Apply policy commands.
- Windows only; needs agent 0.119.0.
- Xero (#7263, #7286, #7290, #7295, #7297, #7301, #7399). OAuth connect with an organisation picker, a mapping workbench and customer import, invoice push and void, payment pull (webhook plus sweep), and payment push.
- Report delivery status (#7451). Every saved report and run shows its organization and delivery status. A scheduled run that reached nobody is recorded as
no_recipients. - Multi-org report series (#7458, #7459), set through the report's Covers control, and opt-in Combine (#7483).
- Backup status report (#7426), using Cove's "All devices" layout.
- Third-party backup in the portal (#7425). Devices protected by Cove count in the portal backup tile, the posture report and the org narrative. Gated by the portal enable backups setting.
- Windows rebuild hosts (#7283). A whole-machine snapshot is rebuilt into a VHDX, and a Hyper-V VM is optionally created.
- Brokered backup writes and snapshot attestations (#7353, #7372, #7396, #7482, #7486). This turns on automatically for S3 destinations over HTTPS once the 0.119 backup helper is on the device. A snapshot shows as attested about 21–26 minutes after its upload ends.
- AI Suggested Fixes, part 1 (#7275). Partner-wide fix memory with "Proven fix" badges, votes and a
find_proven_fixestool. Off by default (ml.remediation_suggestions.enabled). - AI tools (#7125, #7223). 42 more read-only tools are wired into chat and agents, and
manage_monitor_definitionsis available in chat. - Approval Security (#7395). An org or partner can choose Platform default, Required or Not required for approver assurance.
- Unassigned Devices holding area (#7397). This ships dark, behind
PRE_ASSIGNMENT_ENROLLMENT_ENABLED=false. - Roles (#7334).
force_mfais editable in Settings → Roles and the Roles API, and cloning a role copies it. - Patch jobs tab (#7375). AI- and API-created patch jobs are listed with per-device results.
- Mobile (#7198). A Reboot now button on reboot-pending alerts.
- M365 tenant panel (#7402). A Read access step then an Admin actions step, with a consent pre-flight.
- Command palette (#7403). Recents and browser tabs show item names, and create actions have keyboard chords.
guided-setup.sh --upgrade [VERSION](#7351) for digest-pinned installs. A version-mismatch warning appears in Administration → System → Connections./healthreportsbinariesVersion(#7234).- Passwordless SSO accounts can rotate recovery codes, delete passkeys and disable MFA after an IdP re-authentication (#7371).
Improved
- Anomaly episodes: persistence and novelty gates cut episode noise by about 87%, and the device badge and fleet findings count open episodes (#7166, #7160).
- Metric history retention works by dropping per-bucket partitions, which gives disk space back. Day-level rollups are re-derived hourly instead of every 5 minutes (#7535, #7383).
- Backup storage-session traffic has its own rate limits (600 per session, 1,200 per device, 20,000 per org per minute), so heartbeats are never starved (#7405).
- Large topology maps lay out within the 3-second budget (#7424).
- macOS remote desktop uses a persistent capture stream, for a much higher frame rate on macOS 14 and later (#7232).
- Software installs show Sent to agent, Downloading or Installing, and a stale warning, instead of a silent Pending (#7370).
- "Heartbeating but no logs" is a queryable device condition (Logs silent) (#7259).
- Restore and verification screens show device names and reasons instead of IDs and JSON. Large restores journal their resume state instead of rewriting it per file (#7354, #7339).
- Backup cleanup skips redundant bucket listings. The readiness score no longer counts a missing restore test twice (#7330, #7328).
- Vulnerability Remediate: overlapping replays collapse into one, and the response reports findings that are already queued (#7368).
- AI:
- tool schemas state the constraints the server enforces;
run_scriptrefusals give actionable reasons;- fleet-health top issues survive compaction;
- web chat uses tool search, which cuts first-call context by about 71% (
AI_TOOL_SEARCH); - AI file tools check the resolved path, not the spelling.
(#7222, #7221, #7242, #7224, #7430, #7485)
- AI surfaces say "AI isn't configured" when no model provider is usable. Failed desktop starts show their reason (#7522, #7344).
- Audit Trail shows fallback rows as readable operations (#7382). Accessibility fixes: select names, icon-only controls and sidebar contrast (#7250, #7247, #7243, #7229).
- Mobile and 1024 px layout fixes across tab rows, headers, breadcrumbs, tables, the report builder, invoice and quote lines, and the device overview strip (#7225, #7227, #7228, #7230, #7233, #7238, #7239, #7240, #7241, #7245, #7249).
- Write actions are hidden from roles that lack the permission. Software Inventory and Software Policies get nav entries (#7342, #7338).
- 39 English strings damaged by an earlier extraction are restored. Built-in alert rules are kept out of Needs conversion (#7377, #7359, #7261).
- Quick Support copy follows whether the served Windows agent is signed. The SSO provider form defaults correctly in the All-organizations view (#7231, #7343).
Fixed
- TURN relaying on self-hosted stacks had been refused for every peer since v0.118.0. See the coturn step above (#7536).
- Breeze Assist on macOS and Linux had been stuck on "agent is still setting up" since v0.118.0. The fix ships as a Helper update (#7534).
- Billing contact. The Billing tab's Billing contact overwrote the org's primary contact, and invoices followed the primary instead of the contact with the Billing role (#7519). See Upgrade Notes.
- Compliance alerts now alert on the first failing check, no longer auto-resolve while the device still fails, and close when their rule no longer applies. The automation-policy path is fixed (#7518, #7527).
- Convert to monitor for a single rule returned 500 on every call (#7524).
- PAM: approvals that the server refused were stored or shown as approved. Critical-tier approvals now collect the re-authentication they require (#7500, #7525, #7374, #7220).
- Windows: an elevated administrator can enroll again (a v0.118.0 regression). Remote-desktop clicks land on target on mixed-DPI monitors (#7421, #7391).
- macOS: the agent keeps its
/usr/local/binlocation when that path is safe, so Full Disk Access survives the upgrade. WebRTC desktop at the login window is refused and points to VNC Relay (#7262, #7332). - Agent reliability:
- Commands: a command's completed state commits together with its per-type records. Queue and agent hand-offs wait until the transaction commits (#7366, #7348, #7364).
- Helper updates stop untracked helpers first and never overwrite a kept rollback backup (#7356, #7373).
- Backup capture:
- Backup restore:
- Backup jobs:
- Timestamps stored without a UTC offset were misread on API hosts not running in UTC, affecting report schedules, discovery intervals and other time-based checks (#7492).
- Billing: a quote or invoice sent with "no footer" later printed a newly added footer. Bulk invoice push did nothing in manual push mode (#7341, #7253).
- Integrations:
- AI: the script builder had no tools, and full-profile agent runs logged an error on every run (#7392, #7437).
- A failed Add Device attempt no longer leaves a live 30-day enrollment key (#7346).
- Pre-release sweep fixes: org settings pages use the organization in the URL, plus report, billing and backup copy and states (#7218, #7355, #7514).
Self-Hosting / Upgrade Notes
Upgrade command. Check how your install pins its images: grep '^BREEZE_API_IMAGE_REF=' .env.
- Digest-pinned (the value ends in
@sha256:…, which is everyguided-setup.shinstall for v0.112.0 or later). Fetch the current installer, then run the upgrade:It verifies the release's signed image inventory, then rewritescurl -fsSLO https://raw.githubusercontent.com/lanternops/breeze/main/scripts/guided-setup.sh bash guided-setup.sh --upgrade 0.119.0
BREEZE_VERSIONand all fourBREEZE_*_IMAGE_REFdigests together, pulls and restarts. It refuses targets older than 0.112.0, which have no signed inventory, and refuses a downgrade unless--allow-downgradeis passed. - Fresh installs with
guided-setup.shnow also refuse a release older than 0.112.0, or a version that is not an exact release (such aslatest), unless you pass--allow-unverified-release(#7544). - Tag-form (the value ends in
:${BREEZE_VERSION}). SetBREEZE_VERSION=0.119.0in.env, then rundocker compose pull api web portal && docker compose up -d, pluspnpm installif you build from source. If you run the split worker, include it withdocker compose --profile worker-split pull worker && docker compose --profile worker-split up -d worker. - Do not upgrade by only editing
BREEZE_VERSION. On a digest-pinned install that pulls the images you already run, so nothing upgrades. If you did that on an earlier upgrade, runguided-setup.sh --upgrade 0.119.0now. It re-pins the digests even when the version already matches. - Delete the
APP_VERSION:line from your owndocker-compose.yml(the API environment block). The shipped Compose files no longer set it, because the image carries its own version. Until you remove it,/healthkeeps reportingBREEZE_VERSIONinstead of the running image, and the new version-mismatch warning cannot fire (#7351). - Coming from v0.117.x or earlier: read the v0.118.0 notes first (legacy alerting retirement, macOS paths, DR plan steps).
- Full guide: Upgrade Guide.
Database: 50 migrations, applied automatically on first boot. They are idempotent and run through autoMigrate unless AUTO_MIGRATE=false. All of them run before the API starts serving, so a slow migration lengthens the upgrade outage but cannot race live traffic. They were exercised with a non-superuser migration role, as used on managed Postgres. Take a database backup first, and don't run pg_dump or long psql sessions while the new API is booting, because migrations wait on their locks.
- One backfill scales with your backup history.
2026-11-08-120000-backup-snapshot-id-reservationswrites one reservation row per existingbackup_snapshotsrow. A local test took about 13 s per 300,000 snapshots; expect longer on slower storage. CheckSELECT count(*) FROM backup_snapshots;before upgrading if you have a large backup history. The rest are quick: on the same test database, which held 500,000 alerts, they took under 7 s combined. One of them clears an unused password hash from portal logins that sign in with Entra ID (#7543). notification_channels.configis dropped (#7258). v0.118.0 moved channel configuration to its own table and kept this column for one release. Rollback limit: on a v0.118.x image, alert delivery keeps working, but creating or editing a notification channel fails until you roll forward again. Do not roll back below v0.118.0.- Metric history storage (#7535). The migration only reshapes empty future months. Months written before this release keep their old layout until the nightly maintenance job rewrites each one, and gives its disk space back, once that month's 5-minute data has expired (90 days by default). To reclaim space sooner, set
METRIC_ROLLUP_5M_RETENTION_DAYS=30(the minimum). Add it to.envand to theapiservice'senvironment:block (andworker, if split), because the shipped Compose files do not map it. Then restart. The migration creates ametric_rollups_stagingschema; if your database role cannot runCREATE SCHEMA, the migration only warns. In that case create the schema by hand (CREATE SCHEMA metric_rollups_staging AUTHORIZATION <migration role>;), or old months cannot be rewritten.
No new required environment variables. The API boots on an unchanged .env. New optional settings:
XERO_CLIENT_ID,XERO_CLIENT_SECRET,XERO_REDIRECT_URI,XERO_WEBHOOK_KEY,XERO_DAILY_CALL_LIMIT(default 1000). Unset keeps Xero hidden. An invalidXERO_DAILY_CALL_LIMITrefuses boot. Already mapped in both Compose files.AI_TOOL_SEARCH(autoby default,on,off).offrestores the previous behaviour. Mapped indocker-compose.yml; add it yourself if you usedeploy/docker-compose.prod.yml.APPROVER_ASSURANCE_DEFAULT_ENFORCE_FROM(default2026-11-05T00:00:00Z). Moves the approver-assurance date; an unparseable value refuses boot.PRE_ASSIGNMENT_ENROLLMENT_ENABLED(defaultfalse). Keeps the Unassigned Devices holding area dark.METRIC_ANOMALY_EPISODE_MIN_BUCKETS(default2). Not mapped in Compose.- Removed:
METRIC_ROLLUP_MAX_DELETE_BATCHESis no longer read. - Never set
BREEZE_BINARIES_VERSIONin.envor Compose. It is baked into the image.
Behaviour changes.
- Live device inspection needs
devices:execute(#7538, #7540). Process, service, scheduled-task, event-log, file and registry reads, and the live session list, need it./devices/:id/sessions/livealso acceptsremote:access. Org Viewer, Partner Viewer and the two seeded approver roles lose live inspection, and custom roles that should keep it needdevices:execute. MCP/API keys with onlyai:readcan no longer trigger live reads.analyze_disk_usageno longer scans on its own; passrefresh: true. - Site scoping (#7529, #7530). Fleet security posture, threats, the executive summary and OS distribution respect site-restricted access.
- Remote consent (#7288, #7390):
- On devices whose policy is Require consent, VNC tunnels, viewer-to-VNC fallback and VNC tickets return
409 CONSENT_REQUIRED_TRANSPORT_UNAVAILABLE. Technicians use the remote desktop viewer, which can ask. - Consent-mode desktop starts need an agent that supports the consent prompt; otherwise they return
409 CONSENT_UPGRADE_REQUIRED. Update agents on devices under a consent policy before upgrading the server. - An unreadable prompt policy refuses the start with
503 REMOTE_PROMPT_POLICY_UNAVAILABLE. To fix it, re-save the device's remote access policy. - The AI screenshot, screen-analysis and computer-control tools, and
POST /devices/:id/diagnose, are refused on consent-mode devices. The refusal is audited asscreen_access_consent_blocked. - Audit actions are renamed. An unanswered prompt is now
session_consent_blocked_unanswered(wassession_consent_denied). A prompt that could not be shown is nowsession_consent_blocked_unavailable(wassession_consent_bypassed). Update saved audit filters, SIEM rules and exports. Rows written before the upgrade keep the old names.
- On devices whose policy is Require consent, VNC tunnels, viewer-to-VNC fallback and VNC tickets return
- S3 restores (#7237) need HTTPS end to end and an agent on v0.118 or later, with no fallback. Agents older than v0.118 get a 409 "Update the Breeze agent on this device". Keep MinIO's host and port when you switch to HTTPS; only the scheme may change, or earlier backups cannot be restored. Guide: https://docs.breezermm.com/backup/https-restores/. Local and NAS destinations, and backups themselves, are not affected.
- Approver assurance (#7395). Partners that never saved an Approval Security choice need a registered approver device for high- and critical-risk approvals from 2026-11-05. A saved choice is kept. Move the date with
APPROVER_ASSURANCE_DEFAULT_ENFORCE_FROM. - Secrets are encrypted and masked (#7533, #7254):
- Notification secrets in partner, org and site settings (Slack webhook URL, webhook entries, Pushover tokens) are encrypted by an idempotent background sweep after the API's first boot. It uses the existing
APP_ENCRYPTION_KEY, and there is no SQL migration. - Settings responses return secrets as
********. Integrations that GET and then PUT settings must send the marker back unchanged. - Changing a log-forwarding or Elasticsearch endpoint to a different origin needs the secret re-entered. A blank org Event Logs key now keeps the stored key instead of clearing it.
- If you run a separate
workercontainer (--profile worker-split), roll it together withapi. An older worker would send the encrypted value. - If you ever roll back past this release, re-enter the partner Pushover defaults and the Slack URL, and re-add saved webhook entries.
- Notification secrets in partner, org and site settings (Slack webhook URL, webhook entries, Pushover tokens) are encrypted by an idempotent background sweep after the API's first boot. It uses the existing
- Billing contact (#7519). An organization's invoice and quote recipient is now the org-level contact with the Billing role, with no fallback to the primary contact. The Billing tab is read-only and links to Contacts. No data is rewritten on upgrade. To find organizations whose invoices went to the primary contact because of the old behaviour, run the read-only detection query in PR #7519 with RLS bypassed (superuser or BYPASSRLS role). Then fix each organization in Contacts by giving the right contact the Billing role.
- Compliance alerts (#7518, #7527). The built-in compliance alert templates switch to no-auto-resolve. Duplicate rule set names within one policy are now refused (
400 DUPLICATE_COMPLIANCE_RULE_SET_NAME); PR #7527 has a query to find existing duplicates. - Built-in monitors. On first boot, every partner gets the built-in time-sync monitors. They are provisioned but not attached, so nothing alerts until you attach them. Opt out with
BREEZE_BUILTIN_MONITORS_AUTOSEED=false. - AI configuration. Without a usable model provider, chat and the script builder answer
503 ai_not_configuredinstead of showing a false "ready" (#7522). - Non-UTC API hosts (#7492). Report schedules, discovery intervals and other time-based checks were shifted by the host's UTC offset. They are corrected with no action needed.
Agent and Breeze Helper: update to 0.119.0. These changes take effect on a device only once it runs the 0.119 agent or Helper:
- time sync;
- brokered backup writes and attestations;
- the macOS Full Disk Access and login-window fixes;
- mixed-DPI clicks;
- wake from sleep and credential-rotation fixes;
- helper-update fixes;
- Restore-as-VM and instant-boot changes;
- Assist on macOS and Linux (Helper update; users outside the
breezegroup see a "contact your administrator" message).
Devices under a Require consent policy need a consent-capable agent before the server upgrade (see above).
Macs moved by 0.118.0–0.118.2 stay in /Library/Breeze/bin, and a Full Disk Access grant already made there keeps working. Macs still on a stock, root-owned /usr/local/bin no longer move (#7262).
Breaking changes: none that remove an API or a setting. The soft-breaking changes above need attention before you upgrade:
- TURN (manual coturn edit);
- S3 restores over plain HTTP;
- live inspection permission;
- consent-mode VNC and the renamed audit actions;
- masked settings secrets for GET-then-PUT integrations;
- the approver-assurance date.
Known issues in this release:
- Restore as new VM and instant boot create a Gen 2 VM with no EFI system partition, so the restored OS does not boot yet. File-level data in the VM is intact (#7493). Instant boot can also report success when
bcdbootfails (#7494). - Topology explorer stays on "preparing" for sites without a topology-capable agent until an operator backfill runs (#7513).
- Backup Status report preview tiles don't render, and its edit page shows the Devices builder (#7506).
- Org Viewer sees a hydration error on every page, plus 403s from partner-only requests (#7498).
Full Changelog: v0.118.2...v0.119.0
What's Changed
- Sweep v0.117.0 → v0.118.1: restore-as-VM routes, device-list badge fields, and copy/state fixes by @ToddHebebrand in #7218
- fix(alerts): compliance violations raise alerts; manage_monitor_definitions in chat (#6669) by @ToddHebebrand in #7223
- fix(reliability): age out pre-#6696 message-derived hardware stamps, expose reliability inputs to AI (#7132) by @ToddHebebrand in #7224
- fix(web): pair prose typography with dark:prose-invert (#7177) by @ToddHebebrand in #7225
- fix(ai): split run_script's proposal_context_missing into actionable reasons (#7129) by @ToddHebebrand in #7221
- fix(web): keep org settings Name/Type Save buttons inside their tiles (#7152) by @ToddHebebrand in #7227
- fix(web): only shadow the Help panel while it's open (#7150) by @ToddHebebrand in #7228
- fix(web): raise sidebar section heading contrast to AA (#7157) by @ToddHebebrand in #7229
- fix(web): stop the Overview stat strip overflowing under the Activity panel (#7153) by @ToddHebebrand in #7230
- fix(web): Quick Support copy follows whether the served Windows agent is actually signed (#7185) by @ToddHebebrand in #7231
- feat(accounting): Xero W02A: connection foundation (columns, pending_tenant, env vars, unregistered Xero provider) by @ToddHebebrand in #7226
- docs(billing): Xero W03 contacts, items and import plan by @ToddHebebrand in #7236
- feat(api): pair server image with a binaries release (server-only hotfix groundwork) by @ToddHebebrand in #7234
- fix(web): stack mobile page headers instead of clipping title/buttons (#7151) by @ToddHebebrand in #7241
- fix(web): mobile tab-row overflow across 9 surfaces (#7148) by @ToddHebebrand in #7233
- fix(web): keep breadcrumb crumbs from overflowing on mobile (#7178) by @ToddHebebrand in #7238
- fix(ai-agent): surface enforced constraints in chat tool schemas (#7130) by @ToddHebebrand in #7222
- fix(web): stop report builder grids overflowing at 1024px/390px (#7154) by @ToddHebebrand in #7239
- fix(web): style Decline on behalf as destructive on quotes (#7176) by @ToddHebebrand in #7244
- docs(billing): Xero W04 invoice push and void plan by @ToddHebebrand in #7248
- fix(web): stop the org board table forcing the whole page to scroll sideways at 1024px (#7149) by @ToddHebebrand in #7249
- fix(web): stack invoice/quote line tables below sm instead of silent horizontal scroll (#7175) by @ToddHebebrand in #7240
- fix(web): correct ARIA misuse on ticket composer, config-policy tabs, script sections and execution rows (#7179) by @ToddHebebrand in #7243
- fix(api): bulk invoice push runs in manual push mode (#7251) by @ToddHebebrand in #7253
- feat(mobile): Reboot now on reboot-pending alerts by @bdunncompany in #7198
- fix(ai-agent): keep get_fleet_health topIssues bounded through compaction, not dropped (#7131) by @ToddHebebrand in #7242
- fix(web): keep mobile tables, filters and charts inside their cards (#7155) by @ToddHebebrand in #7245
- docs(billing): Xero W05 payments plan by @ToddHebebrand in #7257
- fix(alerts): drop legacy notification_channels.config — contract step of #6379 (#7028) by @ToddHebebrand in #7258
- fix(web): add accessible names to icon-only links/buttons and unlinked labels (#7158) by @ToddHebebrand in #7247
- feat(topology): M2 physical discovery and evidence reconciliation (W03) by @ToddHebebrand in #7096
- fix(monitors): keep built-in anchor rules out of Needs conversion (#7206) by @ToddHebebrand in #7261
- fix(dns-security): page Umbrella under Cisco's offset cap and checkpoint per slice (#7207) by @ToddHebebrand in #7260
- fix(agents): make heartbeating-but-no-logs a queryable device condition (#7067) by @ToddHebebrand in #7259
- fix(backup): S3 restores always use a storage session by @ToddHebebrand in #7237
- fix(settings): report whether a settings secret is set instead of returning it by @ToddHebebrand in #7254
- feat(accounting): Xero W02B: OAuth connect, organisation picker, targeted disconnect by @ToddHebebrand in #7263
- fix(web): give form/filter selects accessible names (axe select-name) (#7156) by @ToddHebebrand in #7250
- ci: path-gate integration-test on pull_request only (#5936) by @ToddHebebrand in #7282
- test(agent): fake-clock the backup stall-timeout tests (#7255) by @ToddHebebrand in #7274
- feat(backup): helpers report storage protocol versions; snapshots record their key layout by @ToddHebebrand in #7287
- fix(remote): consent-mode devices refuse VNC and starts that cannot show the prompt by @ToddHebebrand in #7288
- fix(accounting): audit owed deletes on re-parked pending-row cancel; reaper keeps it (#7289) by @ToddHebebrand in #7291
- feat(accounting): Xero W03a — contacts, items and import (server; capabilities still off) by @ToddHebebrand in #7290
- feat(accounting): Xero W04a — invoice push and void (server; capability off) by @ToddHebebrand in #7295
- feat(accounting): Xero W05a — /webhooks/xero and If-Modified-Since payment pull by @ToddHebebrand in #7297
- feat(accounting): Xero W05b — payment push and delete with adoption by @ToddHebebrand in #7301
- fix(accounting): classify Xero's refusal to delete a batch-payment member (#7300) by @ToddHebebrand in #7303
- fix(accounting): stamp push_payments_since from the DB clock (#7293) by @ToddHebebrand in #7304
- feat(topology): M3 interface monitoring, scheduled checks, traces and impact (W04) by @ToddHebebrand in #7117
- test(topology): browser performance gate for the topology explorer (M1) by @ToddHebebrand in #7284
- fix(backup): Windows whole-machine capture — VSS root path, hives from the shadow copy (Closes #5397) by @ToddHebebrand in #7294
- fix(backup): skip the rooted GC re-list when every listed key is provably live (#6843) by @ToddHebebrand in #7330
- fix(remote-desktop): refuse WebRTC desktop at the macOS login window, point to VNC Relay (#7047) by @ToddHebebrand in #7332
- feat(roles): expose force_mfa in the Roles API and Settings → Roles UI (#5317) by @ToddHebebrand in #7334
- fix(backup): stop double-charging missing restore proof in readiness score (#3970) by @ToddHebebrand in #7328
- feat(topology): M4 scoped AI investigation and approved diagnostics (W05) by @ToddHebebrand in #7147
- fix(agent/backup): record skipped junctions and mount points in the job Warning (#7051) by @ToddHebebrand in #7327
- fix(web): add Software Inventory and Software Policies nav entries (#7123) by @ToddHebebrand in #7338
- fix(billing): freeze "no footer" at quote send and invoice issue (#7216) by @ToddHebebrand in #7341
- fix(web): hide write actions from roles that lack the permission (#7215) by @ToddHebebrand in #7342
- fix(web): failed start_desktop surfaces its reason; accurate unsupported_os copy (#7335, #7331) by @ToddHebebrand in #7344
- fix(sso): don't default to an org-owned provider in the All-organizations view (#7252) by @ToddHebebrand in #7343
- fix(enrollment): failed Add Device attempts leave no live key; failed short-link downloads keep their use (#7217) by @ToddHebebrand in #7346
- fix(test): topology-merge-concurrency polls for wait_event_type='Lock' instead of asserting on first sample (#7174) by @ToddHebebrand in #7350
- fix(automation): enqueue/send only after the transaction commits — triggers, ai_triage, deploy_software (#7187) by @ToddHebebrand in #7348
- fix(backup): journal restore resume state instead of rewriting it per file (#7333) by @ToddHebebrand in #7339
- fix(api): exempt QuickBooks webhook from partnerGuard (#7296) by @ToddHebebrand in #7340
- feat(backup): record and verify snapshot attestations (dark) by @ToddHebebrand in #7353
- fix(backup): name the device, show reasons, drop raw UUIDs/JSON on restore + verification screens (#7213) by @ToddHebebrand in #7354
- fix(self-host): guided-setup --upgrade for digest-pinned installs; /health reports the running image (#7024) by @ToddHebebrand in #7351
- fix(monitors): conversion polish after legacy alerting retirement (#7212) by @ToddHebebrand in #7359
- fix(agent): stop untracked helpers before a helper update and verify the rollback backup (#7113) by @ToddHebebrand in #7356
- fix(web): device-page pre-release sweep paper cuts (#7214) by @ToddHebebrand in #7355
- fix(backup): per-file deadline cap, publish-stall reporting, backup_run timeout tier, reaper without Redis (#7105) by @ToddHebebrand in #7360
- fix(agent,api): close the credential-rotation stranding paths (#2773) by @ToddHebebrand in #7362
- fix(api): enqueue/push only after the transaction commits — automation trigger, software deploy routes, policy remediation, deploy scheduler, install remediation (#7347) by @ToddHebebrand in #7364
- fix(agent,watchdog): don't restart the agent on wake from sleep (#6762) by @ToddHebebrand in #7361
- test(agent): securefs concurrency test classifies absences against a publish log (#6176) by @ToddHebebrand in #7352
- fix(vulnerabilities): collapse overlapping Remediate replays and report already-queued findings (#3750) by @ToddHebebrand in #7368
- fix(software): show in-flight stage for software installs instead of a silent Pending (#3578) by @ToddHebebrand in #7370
- feat(backup): brokered backup writes, server side (dark) by @ToddHebebrand in #7372
- fix(auth): SSO re-auth road for recovery codes, passkey delete and MFA disable on passwordless accounts (#4045) by @ToddHebebrand in #7371
- feat(backup): W06d — Windows rebuild hosts, drive-absolute paths, optional Hyper-V VM creation (Closes #7183) by @ToddHebebrand in #7283
- fix(api): commit a command's terminal state only with its per-type persistence (#3530) by @ToddHebebrand in #7366
- fix(agent): never overwrite a kept helper backup on the next update (#7357) by @ToddHebebrand in #7373
- fix(pam): collect L4 re-auth on critical-tier approvals in web and mobile (#4052) by @ToddHebebrand in #7374
- fix(patches): add Jobs tab so AI/API-created patch jobs are visible (#2606) by @ToddHebebrand in #7375
- fix(web): render fallback audit rows as operations, not route templates (#3991) by @ToddHebebrand in #7382
- fix(approvals): pass approval scope from the inbox; record grace assurance downgrades by @ToddHebebrand in #7220
- test(agent): fake-clock the storagesession slow-transfer idle test (#7380) by @ToddHebebrand in #7381
- fix(api): re-derive day-level metric rollups once an hour, not every 5 minutes (#4276) by @ToddHebebrand in #7383
- fix(agent): resubmit a command result the server parked as result_processing_failed (#7365) by @ToddHebebrand in #7378
- chore(deps): bump @aws-sdk/s3-request-presigner from 3.1096.0 to 3.1140.0 by @dependabot[bot] in #7322
- chore(deps): bump nanoid from 6.0.0 to 6.0.1 by @dependabot[bot] in #7320
- chore(deps): bump tailwind-merge from 3.6.0 to 3.7.0 by @dependabot[bot] in #7319
- chore(deps): bump @googleapis/admin from 36.0.0 to 37.0.1 by @dependabot[bot] in #7318
- chore(deps): bump the drizzle group with 2 updates by @dependabot[bot] in #7314
- chore(deps): bump eslint from 10.10.0 to 10.11.0 in the linting group by @dependabot[bot] in #7315
- chore(deps): bump the anthropic group with 2 updates by @dependabot[bot] in #7316
- chore(deps): bump tsx from 4.23.13 to 4.23.15 in /e2e-tests by @dependabot[bot] in #7307
- chore(deps): bump dotenv from 18.0.2 to 18.0.3 in /e2e-tests by @dependabot[bot] in #7308
- chore(deps): bump the expo-sdk group with 7 updates by @dependabot[bot] in #7309
- chore(deps): bump the astro group with 2 updates by @dependabot[bot] in #7311
- chore(deps): bump @types/node from 26.6.1 to 26.6.2 in /e2e-tests by @dependabot[bot] in #7306
- chore(deps): bump vitest from 5.0.1 to 5.0.2 in /e2e-tests by @dependabot[bot] in #7305
- fix(web,i18n): recover original English copy lost to #2340 humanized-key extraction (#2649) by @ToddHebebrand in #7377
- feat(web): Xero W02c — connect UI, organisation picker, settings step, lab checklist by @ToddHebebrand in #7286
- fix(agent): give python3 cold-start headroom in paramrefs test (#7384) by @ToddHebebrand in #7385
- fix(accounting): request Xero accounting.settings so Items can be written (Xero W03, lab X16) by @ToddHebebrand in #7387
- fix(ai): screen capture and input tools honour the remote access consent policy by @ToddHebebrand in #7390
- chore(deps): bump stripe from 22.3.2 to 22.6.2 by @dependabot[bot] in #7321
- feat(backup): brokered write continuation, current-job publication, transfer margin (dark) by @ToddHebebrand in #7396
- fix(anomalies): persistence + novelty gates cut episode noise ~87% (#6650) by @ToddHebebrand in #7166
- chore(deps): bump office-addin-manifest from 3.0.0 to 3.0.1 by @dependabot[bot] in #7317
- chore(deps): bump @tauri-apps/plugin-shell from 2.3.5 to 2.3.6 by @dependabot[bot] in #7323
- chore(deps): bump @tanstack/react-query from 5.103.1 to 5.103.2 in the tanstack group by @dependabot[bot] in #7312
- docs(release): stop teaching "bump BREEZE_VERSION + pull" as the only upgrade path by @ToddHebebrand in #7389
- feat(accounting): Xero W03b–W05c — mapping/import, invoice push and payment sync go live (lab gates passed) by @ToddHebebrand in #7399
- fix(anomalies): device badge and fleet findings read open episodes (#6650) by @ToddHebebrand in #7160
- chore(deps): bump the typescript-tooling group across 1 directory with 2 updates by @dependabot[bot] in #7398
- chore(deps): bump hono from 4.13.8 to 4.13.9 in the hono group across 1 directory by @dependabot[bot] in #7313
- fix(web): de-flake RolesPage.forceMfa test (#7400) by @ToddHebebrand in #7401
- feat(web): M365 tenant panel — read → admin-actions ladder with consent pre-flight by @ToddHebebrand in #7402
- feat(web): catalog dropdown fix, item names in recents, create chords + numbered Cmd+K by @ToddHebebrand in #7403
- feat(backup): storage sessions report remaining lease lifetime by @ToddHebebrand in #7404
- feat(approvals): approver assurance on by default for high-risk approvals by @ToddHebebrand in #7395
- docs(topology): intelligent network topology explorer, monitoring and AI by @ToddHebebrand in #7273
- fix(ai): script builder writes code into chat instead of the editor — restore its tools by @ToddHebebrand in #7392
- fix(backup): accept browse-tree paths for Windows selective restore (#7210) by @ToddHebebrand in #7219
- feat(ai): W01 — tool-exposure contracts + wire read-only tools into chat and agents (#6755) by @ToddHebebrand in #7125
- fix(agents): storage-session traffic has its own rate limits and never starves heartbeats by @ToddHebebrand in #7405
- fix(agent): ship per-monitor-v2 DPI manifests so remote-desktop clicks land on mixed-scale monitors by @ToddHebebrand in #7391
- test(topology): make interface-sample suites independent of the UTC day (#7409) by @ToddHebebrand in #7420
- feat: AI Suggested Fixes W1 — partner-wide fix memory foundation (#7141) by @ToddHebebrand in #7275
- fix(agent): macOS capture via persistent SCStream instead of per-frame screenshots (#5928) by @ToddHebebrand in #7232
- fix(web): clear AddDeviceModal copy-reset timers on unmount (#7422) by @ToddHebebrand in #7423
- fix(agent): keep safe macOS installs in /usr/local/bin so FDA survives upgrades (#7211) by @ToddHebebrand in #7262
- feat(e2e): ui-audit — screenshot every page, flag layout bugs mechanically, triage with Opus by @ToddHebebrand in #7138
- fix(topology): lay out V500/V1000 inside the 3 s worker budget (#7285) by @ToddHebebrand in #7424
- feat(ai): W04 — tool search for web chat, explicit per-session policy, Helper onlyTools (#6151) by @ToddHebebrand in #7430
- feat(backup): W04 — third-party backup in the client portal, posture report and org narrative (#6012) by @ToddHebebrand in #7425
- feat(reports): backup status report (Cove email layout) (#6013) by @ToddHebebrand in #7426
- fix(agent): let an elevated administrator enroll on Windows again (#7394) by @ToddHebebrand in #7421
- fix(m365): let executors bind RFC 6598 shared-space addresses by @ToddHebebrand in #7434
- fix(ai-agents): full-run exposure only names tools the SDK server declares (#7427) by @ToddHebebrand in #7437
- feat(ai): tool-capture tenant tools + tool-search cache and gateway measurements (#7429) by @ToddHebebrand in #7446
- fix(ai): stop the SDK child loading the host's Claude Code memory (#7444) by @ToddHebebrand in #7448
- feat(ai): agent-profile tool-search eval — measured, search stays off for headless runs (#7428) by @ToddHebebrand in #7445
- feat(reports): org visibility + delivery status (multi-org report series W01) by @ToddHebebrand in #7451
- feat(devices): partner holding area for devices awaiting assignment (dark) by @ToddHebebrand in #7397
- docs(reports): multi-org report series spec + W01–W04 plans (#7438) by @ToddHebebrand in #7449
- feat(reports): multi-org report series backend (W02) by @ToddHebebrand in #7458
- feat(reports): multi-org report series UI (W03) by @ToddHebebrand in #7459
- docs: time sync monitoring & management — spec, plan index and five PR plans (#7452) by @ToddHebebrand in #7465
- chore(deps): bump the aws-sdk group in /agent with 5 updates by @dependabot[bot] in #7462
- chore(deps): bump the go-minor-patch group in /agent with 3 updates by @dependabot[bot] in #7463
- fix(backup): confirm multipart encryption when the storage provider omits it at create by @ToddHebebrand in #7481
- fix(backup): commit on-demand SQL Server and Hyper-V backup jobs before dispatch by @ToddHebebrand in #7480
- fix(backup): treat a blank warning as absent when queueing backup results (#7466) by @ToddHebebrand in #7473
- feat(reports): multi-org report series W04 — Combine by @ToddHebebrand in #7483
- fix(ai): AI file tools check the resolved path, not the spelling by @ToddHebebrand in #7485
- fix(agent): Restore-as-VM drops the offline driver step; Hyper-V tools run from host System32 by @ToddHebebrand in #7484
- fix(backup): verify snapshot attestations as soon as snapshots are published by @ToddHebebrand in #7486
- feat(backup-helper): signed-URL uploads and snapshot attestations by @ToddHebebrand in #7482
- feat(time-sync): W01a — API + web visibility for Windows time sync (#7453) by @ToddHebebrand in #7488
- fix(api): read offsetless timestamps as Drizzle returns them (UTC) on non-UTC hosts by @ToddHebebrand in #7492
- feat(agent): W01b — Windows time sync collector (#7453) by @ToddHebebrand in #7491
- fix(deps): raise undici floors past GHSA-rfgv-xxqx-mfg5 / GHSA-w293-vg96-wgc3 by @ToddHebebrand in #7504
- feat(time-sync): W02 — time sync alerts, fleet page and evidence export (#7454) by @ToddHebebrand in #7502
- fix(pam): record and show a refused approval as refused by @ToddHebebrand in #7500
- fix(api): record audit rows for partner-scope requests that target an organization by @ToddHebebrand in #7501
- fix(backup): wait for a new device's capability report before dispatching backups by @ToddHebebrand in #7503
- test(api): pin the clock in the time-suggestion unit and RLS integration tests by @ToddHebebrand in #7523
- fix(deps): brace-expansion 5.0.11 + nodemailer 10.x for new HIGH advisories by @ToddHebebrand in #7528
- feat(time-sync): W03a — time sync policy, delivery and commands (API + web) (#7455) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7520
- feat(agent): W03b — Windows time sync enforcement and commands (#7455) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7532
- fix(notifications): store channel secrets encrypted and mask them in responses by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7533
- fix(analytics): scope executive summary and OS distribution to the caller's sites by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7530
- fix(helper): Assist starts on macOS and Linux using the token the agent delivers by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7534
- fix(compliance): alert on the first failing check and keep the alert open until compliant by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7518
- AI readiness requires a usable model provider; surfaces show "AI isn't configured" by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7522
- fix(billing): the Billing contact setting edits the billing contact, not the primary contact by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7519
- fix(security): scope fleet security posture and threat reads to the caller's sites by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7529
- fix(coturn): stop refusing every relay peer; refuse IPv4-mapped and NAT64 peers by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7536
- Per-rule "Convert to monitor" manages its own DB context by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7524
- fix(devices): live file, registry, process and service reads require execute permission by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7538
- fix(approvals): a refused approval is stored as not approved by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7525
- test(release): v0.118.2 → main sweep, with fixes found along the way by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7514
- fix(compliance): close alerts when their rule no longer applies; fix the automation-policy path by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7527
- fix(devices): remaining live device reads require execute permission; live list actions need write-tier AI keys by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7540
- fix(metrics): enforce metric_rollups retention by partition drop, per bucket size (#7531) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7535
- fix(portal): clear unused portal passwords on single-sign-on identities by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7543
- fix(self-host): guided setup refuses releases before 0.112.0 unless --allow-unverified-release by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7544
- chore(web): What's New for 0.119.0 by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/7545
Full Changelog: v0.118.2...v0.119.0