Breeze RMM v0.96.0 — distributor ordering, the M365 control-plane foundation, and a hardened backup pipeline.
Summary
- Distribution — a live TD SYNNEX distributor lookup and a new PAX8 safe-ordering / billing-truth workflow bring purchasing into Breeze (#2559, #2501).
- Microsoft 365 — the control-plane foundation lands, plus an opt-in customer Graph-read consent flow (both dark by default) (#2495, #2511).
- Backups — a broad reliability pass: Windows system-image (system state) works end-to-end, integrity/test-restore now actually detects corruption, restores preserve file mode + mtime, and per-device "Run backup now" arrives (#2581, #2564, #2554, #2556, #2558).
- Quotes — cloning, a polished editor/PDF/email pipeline, customer bill-to, and per-table subtotals (#2535, #2549, #2584).
- Extensions — a versioned runtime extension contract for building on Breeze (#2548).
Added
- PAX8 safe ordering + billing-truth workflow — order through PAX8 from Breeze with quantity-evidence snapshots and an authorized baseline so billed quantities stay reconciled against what was actually ordered (#2501).
- Live TD SYNNEX distributor lookup — a new
lookup_distributor_productMCP/AI tool queries real-time distributor pricing and availability (#2559). - M365 control-plane foundation — canonical Microsoft 365 connection metadata (profiles, auth modes, credential domains, permission-manifest versioning) that existing direct connections migrate into transparently as
legacy-direct(#2495). - M365 customer Graph-read consent — an opt-in, per-organization consent flow for read-only customer Graph access. Dark by default; enabled per rollout (#2511).
- Quote cloning — duplicate an existing quote, optionally selecting the target company/contact and reassigning a draft's company (#2535, #2584).
- Versioned runtime extension contract — a stable, versioned contract for runtime extensions built against Breeze (#2548).
- Per-device "Run backup now" — trigger an on-demand backup from a device's Backup tab, with a timezone-correct next-run display (#2558).
Improved
- Quotes editor/PDF/email — editor and generated-PDF polish, customer bill-to details, per-table subtotals, and tidier header actions (#2549).
- Enrollment keys — the create form now includes a Site selector so keys enroll devices into the right site (#2557).
- "Run all backups" — resolves each device's own backup profile instead of a single shared config (#2555).
Fixed
- Windows system-image (system state) backup was broken end-to-end; it now completes and restores correctly (#2581).
- Backup integrity & test-restore now genuinely detect corruption instead of checking presence only; restores preserve file mode + mtime, and the
breeze-backuphelper is installed alongside the agent (#2564). - Backup / verify / restore now actually execute on real agents — config is delivered to the verify/restore paths, agent results are recorded, and failed backups surface in the UI (#2554, #2556).
- Windows helper lifecycle durability — fixes helper-process accumulation under RDS/multi-session hosts (#2520).
- Security & Compliance Posture report produced incorrect figures; corrected (#2518).
- Update Rings tab SSR hydration mismatch — the scope-gated tab now defers to post-mount (#2583).
- macOS installer keeps the bootstrap token in the bundle filename, fixing an App Translocation enrollment regression (#2545).
- Dev Docker image now copies the extension SDK into the dev API image (#2582).
Security
- Forced
websocket-driver >= 0.7.5to resolve GHSA-xv26-6w52-cph6. Self-hosters are encouraged to upgrade (#2547).
Self-Hosting / Upgrade Notes
1. Upgrade command. Bump BREEZE_VERSION=0.96.0 in /opt/breeze/.env, then:
docker compose pull api web && docker compose up -d(If you build from source, run pnpm install first.)
2. Database — 6 idempotent migrations, auto-applied on boot via autoMigrate (unless AUTO_MIGRATE=false). They add the pax8_* and M365 consent tables and reshape m365_connections into the new control-plane model. No large-table rewrites or backfills — m365_connections and the new pax8_* tables are small, so this is a fast upgrade. Existing direct M365 connections are backfilled to legacy-direct in place and keep working. Every new NOT NULL column ships with a DEFAULT, so a previously-deployed API can still write during the rollout window.
3. New required environment variables — none for standard deployments. Several new M365_CUSTOMER_GRAPH_READ_* / M365_GRAPH_READ_EXECUTOR_* variables exist, but they are only required when you enable the customer Graph-read rollout (M365_CUSTOMER_GRAPH_READ_ONBOARDING_ENABLED=true). Left at its default (false), boot requires nothing new and existing M365 flows are untouched. If you do enable it, the config validator fails closed until those keys are set — and remember to map any new keys in the api service environment: block of your compose, not just .env.
4. Behavior changes & feature flags.
M365_CUSTOMER_GRAPH_READ_ONBOARDING_ENABLED— defaultfalse(dark). Customer Graph-read consent initiation is off unless you turn it on, per-org.- No existing defaults changed; existing M365 (
M365_ENABLED) and connection flows behave exactly as before.
No breaking changes.
Full Changelog: v0.95.1...v0.96.0
What's Changed
- docs(skill): capture v0.95.0 migration traps in the release skill by @ToddHebebrand in #2546
- fix(security): force websocket-driver >=0.7.5 (GHSA-xv26-6w52-cph6) by @ToddHebebrand in #2547
- chore: gitignore .githooks (LFS-managed hooks) by @ToddHebebrand in #2542
- docs(readme): AI-native rebrand and em-dash sweep by @ToddHebebrand in #2540
- docs: Breeze M365 foundation + control-plane design by @ToddHebebrand in #2541
- chore(deps): bump softprops/action-gh-release from 3.0.1 to 3.0.2 in the github-actions group by @dependabot[bot] in #2524
- chore(deps): bump actions/setup-node from 6 to 7 by @dependabot[bot] in #2525
- fix(agent): make backup, verify, and restore actually execute on real agents by @ToddHebebrand in #2554
- fix(installer): keep macOS bootstrap token in the bundle filename (App Translocation regression, #2544) by @ToddHebebrand in #2545
- feat(quotes): add quote cloning by @ToddHebebrand in #2535
- fix(ci): remove duplicate websocket-driver override breaking pnpm-lock by @ToddHebebrand in #2561
- fix(backup): record agent results, deliver config to verify/restore, surface failed backups by @ToddHebebrand in #2556
- fix(backup): resolve each device's profile in "Run all backups" by @ToddHebebrand in #2555
- feat(web): per-device "Run backup now" + timezone-correct next-run on the device Backup tab by @ToddHebebrand in #2558
- fix(web): add a Site selector to the enrollment key create form by @ToddHebebrand in #2557
- feat(ai): live TD SYNNEX distributor lookup as an MCP tool (lookup_distributor_product) by @ToddHebebrand in #2559
- fix(agent): Windows helper lifecycle durability (RDS accumulation) by @ToddHebebrand in #2520
- feat(m365): establish Breeze control plane foundation by @ToddHebebrand in #2495
- feat(pax8): add safe ordering and billing-truth workflow by @ToddHebebrand in #2501
- fix(quotes): fix stale mock in cloneQuote test after pax8 select insertion by @ToddHebebrand in #2563
- fix(ci): raise Type Check heap to avoid tsc OOM on heavy branches by @ToddHebebrand in #2565
- feat(quotes): editor/PDF/email polish + customer bill-to + per-table subtotals by @ToddHebebrand in #2549
- fix(reports): correct the Security & Compliance Posture report by @ToddHebebrand in #2518
- feat(extensions): add versioned runtime extension contract by @ToddHebebrand in #2548
- feat(m365): add customer Graph Read consent by @ToddHebebrand in #2511
- ci(agent): gate Go vet + lint, race the full agent tree by @ToddHebebrand in #2512
- fix(backup): integrity/test-restore detect corruption; restore preserves mode+mtime; install breeze-backup helper by @ToddHebebrand in #2564
- chore(deps): bump cloud.google.com/go/storage from 1.63.0 to 1.63.1 in /agent by @dependabot[bot] in #2567
- chore(deps): bump tauri-plugin-single-instance from 2.4.2 to 2.4.3 in /apps/viewer/src-tauri by @dependabot[bot] in #2566
- chore(deps): bump github.com/fsnotify/fsnotify from 1.9.0 to 1.10.1 in /agent by @dependabot[bot] in #2568
- chore(deps): bump the hono group with 2 updates by @dependabot[bot] in #2574
- chore(deps): bump react-native-screens from 4.26.0 to 4.26.1 in the mobile group by @dependabot[bot] in #2572
- chore(deps): bump autoprefixer from 10.5.2 to 10.5.3 in the tailwind group across 1 directory by @dependabot[bot] in #2573
- chore(deps): bump pg from 8.21.0 to 8.22.0 by @dependabot[bot] in #2579
- chore(deps): bump turbo from 2.9.17 to 2.10.5 by @dependabot[bot] in #2577
- chore(deps): bump @react-navigation/bottom-tabs from 7.16.2 to 7.18.8 by @dependabot[bot] in #2578
- chore(deps): bump react-hook-form from 7.78.0 to 7.81.0 by @dependabot[bot] in #2575
- chore(deps): bump office-addin-dev-certs from 2.0.9 to 2.0.10 by @dependabot[bot] in #2576
- fix(backup): Windows system_image (system state) broken end-to-end by @ToddHebebrand in #2581
- fix(docker): copy extension-sdk into the dev API image (#2548 follow-up) by @ToddHebebrand in #2582
- fix(web): defer scope-gated Update Rings tab to post-mount (SSR hydration mismatch) by @ToddHebebrand in #2583
- perf(ci): shard integration tests 4 ways + run migrations once per run by @ToddHebebrand in #2585
- feat(quotes): clone with company/title selection, draft company reassignment, tidier header actions by @ToddHebebrand in #2584
- fix(release): API image can't resolve @breeze/extension-sdk + executor image ref must be lowercase by @ToddHebebrand in #2587
Full Changelog: v0.95.1...v0.96.0