Important
v0.97.1 replaces v0.97.0 — upgrade straight from 0.96.0 to 0.97.1 and skip 0.97.0.
v0.97.0's migrations defined database functions with SET breeze.* = ... function attributes. Setting a custom GUC that way requires a privilege most managed-Postgres admin roles do not have, so on databases where Breeze migrates as a non-superuser (DigitalOcean, RDS, and similar managed Postgres), the API failed on boot with permission denied to set parameter "breeze.scope" (42501) and crash-looped. Self-hosted deployments using the bundled docker-compose Postgres migrate as a superuser and were not affected.
v0.97.1 moves the scope elevation into the function bodies (set_config with save/restore — the runtime form any role may use) and adds a CI guard that rejects the superuser-only attribute form in any future migration. There are no other changes; everything below is the v0.97.0 feature content, which ships here.
Breeze RMM v0.97.1 — Linux remote desktop, contract-backed quotes, incremental backups, and the partner reconstruction API.
Summary
- Linux remote desktop actually works — a pure-Go X11 mirror ships in the
CGO_ENABLED=0release agent for the first time (#2602). - Quotes → contracts — rich-text contract templates, executed-document snapshots, and a real send/branding/portal experience (#2596).
- Backups — incremental backups plus checkpoint/resume, a stalled-job reaper, and progress tracking (#2599).
- PAM — Path B token-launch elevation actuator, secure-desktop dialog, a redesigned console, and requester-session privacy fixes (#2588, #2591).
- M365 — a closed, typed catalog of 12 Microsoft Graph read actions surfaced as six
m365_query_*AI tools (#2615). - Partner reconstruction API — a 13-resource export API with DB-enforced tenant integrity, backing Weavestream-style integrations (#2506).
- Org context, round three — a unified switcher with an explicit per-route scope contract (#2595).
Added
- Linux remote desktop (X11 mirror, pure-Go) — capture now works in shipped agents; earlier builds only ever contained the
ErrNotSupportedstub because the sole capturer required cgo (#2602). - Contract-backed proposals — versioned rich-text contract template library (partner-wide gated), contract blocks + PDF cover pages in quotes, variable substitution with an unresolved-variable send gate, contract-aware acceptance hash, and an atomic accept-time executed-document snapshot linked to the billing contract (#2596).
- Incremental backups — agent checkpoint journal + resume across restart/VSS, plus incremental mode on top of the existing full-backup path (#2599).
- PAM Path B actuator + secure-desktop dialog — the elevation prompt renders on the Winlogon secure desktop, stays in the target session, and uses a custom Win32 dialog (shield, signer/user/command-line grid, live expiry countdown); redesigned PAM web console (#2588).
- M365 typed Graph read tools — 12-action Zod-typed read catalog on the
customer-graph-readconnection, exposed as sixm365_query_*tools in in-app chat and the Breeze MCP; read-only, T1, no manifest bump, no DB migrations (#2615). - Partner reconstruction integration API — partner service principals, scoped API keys with rotation + rate limiting, a 13-resource reconstruction API with stable cursor pagination and incremental material watermarks, and bounded export auditing (#2506).
Improved
- Org context switcher (round three) — pill removed; "All organizations" is a pinned, distinct fleet row with type-ahead search; a two-layer model separates your context from each route's scope contract so neither misrepresents the other (#2595).
- Backup reliability & controls — API ingests
backup_progress(bytes/files/last_progress_at); a reaper fails stalled/orphaned/over-cap jobs; an undeliverable-result outbox flushes on reconnect so a dropped terminal result never strands a job as "running" (#2599).
Fixed
- PAM consent shown in the requester's session — consent UI, approval, denial, and dismissal now route through the helper in the exact interactive session that requested elevation, attributed to the recent trusted
consent.exe; invalid sessions fail closed to the documented physical-console fallback (#2591). - Persistent-login failure over plain HTTP — the refresh cookie's
Secureflag is now derived from the real transport (X-Forwarded-Proto→ request URL) instead ofNODE_ENV, so an HTTP-reachable deployment stops silently discarding the refresh cookie and 401-ing every reload (#2612, #1618). - Software-report FK violation (23503) — the
device_vulnerabilities → software_inventoryFK is nowON DELETE SET NULL(addedNOT VALID, validated separately to avoid an exclusive lock); vuln findings re-link to the replacement inventory row after a wipe-and-reinsert (#2613). - Patch all-orgs approval status persists on reload (#2597).
Security
- PAM remote-session privacy fixes — elevation attribution and consent rendering are pinned to the requester session and fail closed on partial process enumeration, closing cross-session exposure paths (#2588, #2591).
- DB-level tenant & reference integrity for the partner reconstruction paths — configuration, backup, OneDrive, assignment, and custom-value ownership are enforced by database triggers/constraints, not app-layer checks alone (#2506).
- Self-hosters are encouraged to upgrade.
Self-Hosting / Upgrade Notes
No breaking changes to existing behavior — but there is one new required environment variable (below) that will block boot in production if unset.
-
Upgrade command. Bump
BREEZE_VERSION=0.97.1, thendocker compose pull api web && docker compose up -d(addpnpm installif you build from source). -
Database — 33 idempotent migrations auto-apply on boot via
autoMigrate(unlessAUTO_MIGRATE=false). They create the contracts, partner-service-principal, and partner-export/config-policy integrity machinery. No large-table rewrite or blocking backfill — thedevice_vulnerabilitiesFK is validated with a low-lockVALIDATE CONSTRAINT(SHARE UPDATE EXCLUSIVE), the big backfill UPDATE is intentionally avoided in favor ofON DELETE SET NULL, and new indexes are on new/empty tables (the two composite uniques ondevices/sitesare PK-covered and fast). Abackup_jobstimestamp column is converted totimestamptz(small table). -
New required environment variable —
PARTNER_API_CURSOR_SIGNING_KEY. In production the config validator now refuses to boot without it. It must decode from canonical base64 to ≥32 bytes of random key material and must not reuseJWT_SECRET. Generate one withopenssl rand -base64 48. As with any required var, add it to.envand map it in theapiserviceenvironment:block of your compose — a value in.envalone is not enough. (No other new required vars.AUTH_COOKIE_FORCE_SECURE/AUTH_COOKIE_SAME_SITEare optional overrides for the cookie-transport fix and default to auto-detected behavior.) -
Behavior changes & feature flags. The refresh-cookie
Secureflag now follows the real request transport rather thanNODE_ENV— correct for HTTPS deployments, and it fixes (rather than changes) behavior for HTTP-reachable ones. No feature flags flipped default.
What's Changed
- fix(migrations): non-superuser custom-GUC elevation by @ToddHebebrand in #2622
v0.97.0 changes (shipped here for anyone upgrading from 0.96.0)
What's Changed
- feat(partner-api): add reconstruction integration API by @ToddHebebrand in #2506
- docs: v0.96.0 release sweep (PAX8, M365, quotes, backups) by @ToddHebebrand in #2586
- fix(agent): keep PAM consent in requester session by @ToddHebebrand in #2591
- Quotes: contract-backed proposals + real-world send experience (composer, MSP branding, portal polish) by @ToddHebebrand in #2596
- feat(web): org context round three — unified switcher, scope contract, consistency sweep by @ToddHebebrand in #2595
- feat(backup): job reliability & controls + incremental backups by @ToddHebebrand in #2599
- fix(patches): persist all-orgs approval status on reload (#2597) by @ToddHebebrand in #2601
- feat(agent): Linux remote desktop (X11 mirror, pure-Go) + Phase 0 bugfixes by @ToddHebebrand in #2602
- chore(deps): bump actions/setup-go from 6 to 7 by @dependabot[bot] in #2569
- chore(deps): bump actions/setup-dotnet from 5 to 6 by @dependabot[bot] in #2570
- chore(deps): bump the expo-sdk group across 1 directory with 10 updates by @dependabot[bot] in #2571
- PAM: Path B actuator, secure-desktop dialog, console redesign, and remote-session privacy fixes by @ToddHebebrand in #2588
- fix(auth): derive cookie Secure flag from real transport, not NODE_ENV (#1618) by @ToddHebebrand in #2612
- fix(api): software report FK failure + BullMQ enqueue inside held DB context by @ToddHebebrand in #2613
- feat(m365): typed Graph read tools on the customer-graph-read connection by @ToddHebebrand in #2615
- fix(guided-setup): keep DATABASE_URL_APP empty, harden .env encoding & proxy trust by @ToddHebebrand in #2616
Full Changelog: v0.96.0...v0.97.1