Breeze RMM v0.92.0 — a big quotes/deposits release: up-front deposit invoicing, a reworked quote editor, a fleet-wide vulnerability triage queue, permanent alert dismissal, and headless third-party (winget) patching.
Summary
- Quotes — charge an up-front deposit at acceptance (a percentage, or the total of specific selected lines) and invoice the balance afterward, plus a substantial quote-editor UX overhaul with two-way markup pricing, line images, quote titles, and AI-styled catalog copy (#2245, #2227).
- Vulnerabilities — the
/vulnerabilitiesfleet page becomes a fix-first triage queue: findings grouped by remediation unit, clickable stat cards, and per-finding ticket linking (#2225). - Alerts — a new terminal
dismissedstatus that makes an alert go away for good and is honored by the warranty-expiry evaluator, so the same condition is never re-alerted (#2226). - Patching — third-party (winget) patching now works on servers, logged-out, and headless machines via a SYSTEM-context machine-scope path, plus a wave of ring/scan/reboot correctness fixes (#2224, #2223, #2222, #2221, #2220).
- MCP / AI — the Breeze MCP server is now self-describing (server instructions + five guided workflow prompts), and partner-owned ("all orgs") config policies are finally visible to AI/MCP tools (#2214, #2213).
Added
- Quote deposits — charge a deposit up front at quote acceptance, computed as either a percentage of the quote or the total of specific selected lines, with the balance invoiced afterward (deposit-first invoicing). Percent deposits that round to zero cents are rejected; a per-category breakdown shows what the deposit covers (#2245)
- Quote editor overhaul — two-way markup pricing on the add-line form (cost + markup → price, or price + cost → markup, whichever you typed last stays authoritative), visible labels on every field, auto-fill-from-web that also prices the line, line images, quote titles, moving lines between pricing panels, and AI-styled catalog copy per partner (#2227)
- Vulnerabilities fleet triage UI — the read-only
/vulnerabilitiespage becomes a work queue: findings grouped by remediation unit (one Chrome update is one row, not 30 identical CVE rows), four clickable stat cards (Critical open · KEV exposure · Patch ready · Accepted), fleet-level triage (previously per-device only), and linking a finding to a ticket (#2225) - Billing tab in org settings — the per-org tax identity + billing address page (previously reachable only by typing the URL) now has a proper Billing tab in the Organization settings nav (#2228)
- MCP server instructions + guided prompts — the MCP server advertises
instructionsoninitialize(tenant hierarchy, tool-selection strategy, safety guardrails) and apromptscapability with five argument-templated MSP workflows (fleet triage, etc.) so connecting clients (Claude, ChatGPT) are oriented automatically (#2214)
Improved
- Permanent alert dismissal — a terminal
dismissedstatus, distinct fromresolved, valid from any status (including already-resolved). Dismissed alerts are hidden from list views by default and honored by the warranty-expiry evaluator, so a "make this go away for good" action actually sticks instead of the synthetic alert being re-created (#2226) - Compliance table reboot state — a stale "pending reboot" flag on an offline device is now qualified as stale instead of shown as an active pending-reboot (#2220)
Fixed
- Headless third-party (winget) patching — third-party scanning and installs previously only worked when a user-helper session was connected, so servers, logged-out workstations, and headless boxes never scanned or patched. Winget now runs in SYSTEM context at machine scope with proper WindowsApps path resolution (#2224)
- Patch-ring correctness — ring auto-approve now actually approves third-party patches (#2222); the ring patches endpoint reports correct per-source counts and derived OS (#2221); full-scan tombstoning is scoped to only the sources the scan actually covered, so a partial scan no longer tombstones patches from sources it didn't see (#2223)
- Partner-owned config policies in AI/MCP tools —
list_configuration_policies(and the other config-policy AI/MCP tools) filtered on the org axis only, so a partner-owned ("all orgs",org_id NULL) policy was invisible to a partner-scoped MCP caller. Now uses the shared dual-axis reader, matching the HTTP routes and web UI (#2213) - Passkey MFA metadata persistence —
POST /auth/mfa/passkey/verifywrote the WebAuthn signature counter +last_used_atwith a bare DB call that silently matched 0 rows under forced RLS (passkey MFA runs before the user is authenticated). "Last used" stayed "Never" and the signature counter never advanced; both now persist under a system DB context (#2211)
Security
- Passkey signature counter — the WebAuthn authenticator signature counter now advances correctly (it was silently frozen), restoring clone/replay detection for passkey MFA (#2211).
Self-hosters are encouraged to upgrade.
Self-Hosting / Upgrade Notes
Upgrade. Bump BREEZE_VERSION to 0.92.0, then:
docker compose pull api web && docker compose up -d
(If you build from source, run pnpm install first.)
Database — 7 migrations, idempotent, auto-apply on boot via autoMigrate (unless AUTO_MIGRATE=false). All are lightweight DDL — no table rewrites or large backfills, no long stall on boot:
- Quote deposits:
deposit_type/deposit_percent/deposit_amountonquotes,deposit_eligible/item_typeonquote_lines,deposit_dueoninvoices, plus a follow-up CHECK-constraint migration (NOT NULL DEFAULTadds are metadata-only) (#2245), - Quote editor: nullable
titleonquotes,image_idFK + index onquote_lines, andcatalog_ai_styleonpartners(#2227), - Vulnerabilities: nullable
ticket_id+ index ondevice_vulnerabilities(#2225), - Alerts:
dismissed_at/dismissed_bycolumns onalertsplus a newdismissedenum value (added in its own transaction) (#2226).
No new required environment variables.
Behavior changes.
- Alerts can now be permanently dismissed. Dismissed alerts are hidden from the default alert list and are no longer re-created by the warranty-expiry evaluator — this is the durable opt-out for recurring synthetic alerts. Nothing changes for existing alerts until a technician dismisses one (#2226).
- Third-party (winget) patching now runs on headless/server/logged-out machines. Devices that previously never scanned for third-party patches (no user-helper session) will begin scanning and can be patched via the machine-scope SYSTEM path. If you rely on third-party patch approvals, expect these devices to start reporting findings after upgrade (#2224).
No breaking changes.
Full Changelog: v0.91.0...v0.92.0
What's Changed
- docs: sync technical docs for v0.91.0 by @ToddHebebrand in #2212
- fix(auth): persist passkey MFA metadata under system DB context (#2210) by @bdunncompany in #2211
- fix(mcp): surface partner-owned config policies in AI/MCP tools by @ToddHebebrand in #2213
- feat(mcp): server instructions + guided workflow prompts by @ToddHebebrand in #2214
- fix(web): qualify stale pending-reboot on compliance table for offline devices (#2219) by @ToddHebebrand in #2220
- fix(patches): ring view source counts + derived os in ring patches endpoint (#2215) by @ToddHebebrand in #2221
- fix(patches): let ring auto-approve actually approve third-party patches (#2218) by @ToddHebebrand in #2222
- fix(patching): scope full-scan tombstoning to sources the scan covered (#2217) by @ToddHebebrand in #2223
- fix(agent): SYSTEM-context machine-scope winget patching with WindowsApps path resolution (#2216) by @ToddHebebrand in #2224
- feat(alerts): permanent 'dismissed' status + warranty re-alert suppression by @ToddHebebrand in #2226
- chore(dev): drop stale tailwind.config.mjs bind-mounts from dev compose override by @ToddHebebrand in #2208
- feat(web): vulnerabilities fleet triage UI by @ToddHebebrand in #2225
- chore(deps): bump @types/node from 26.0.1 to 26.1.0 in /e2e-tests by @dependabot[bot] in #2231
- chore(deps): bump tsx from 4.22.4 to 4.23.0 in /e2e-tests by @dependabot[bot] in #2233
- chore(deps): bump @anthropic-ai/sdk from 0.106.0 to 0.110.0 in /e2e-tests by @dependabot[bot] in #2234
- chore(deps): bump the typescript-tooling group with 2 updates by @dependabot[bot] in #2237
- chore(deps): bump the hono group with 2 updates by @dependabot[bot] in #2240
- chore(deps): bump nodemailer from 9.0.1 to 9.0.3 by @dependabot[bot] in #2242
- feat(web): add clickable Billing tab to org settings by @ToddHebebrand in #2228
- fix(deps): repair broken pnpm-lock.yaml (duplicate hono key) blocking all CI (#2246) by @bdunncompany in #2247
- feat(quotes): editor UX overhaul + move lines between pricing panels by @ToddHebebrand in #2227
- feat(quotes): deposits — percent or selected-line, deposit-first invoicing by @ToddHebebrand in #2245
- test(invoices): fix stale idempotency-key assertion breaking main after #2245 (#2252) by @bdunncompany in #2253
- fix(quotes): revert deposit type select when the deposit PATCH is rejected by @ToddHebebrand in #2257
Full Changelog: v0.91.0...v0.92.0