Circuit Breaker v0.2.8 — Release Notes¶
Target release: March 2026
Previous release: v0.2.5
Branch: hotfix/performance
Highlights¶
v0.2.8 is the largest feature release since v0.2.0. It delivers six major new surfaces — multi-map views, an interactive rack editor, built-in network monitoring, a redesigned IPAM center, a certificate manager, and a notifications center — alongside foundational platform work: a full business intelligence engine, tenant management, masquerade sessions, Proxmox observability, and a Uptime Kuma Socket.IO upgrade. Nine new database migrations (0059–0067) are included; all are backward-compatible with existing data.
Feature Areas in This Release¶
Multi-Map Support¶
You can now create up to 10 named topology maps and switch between them using a compact dropdown pill in the map toolbar. Each map is independently scoped — nodes, positions, and layout are per-map.
- Create, rename, reorder, and delete named maps from the toolbar.
- Assign any entity (hardware, service, network, cluster) to a specific map via the entity detail drawer or right-click context menu.
- Pin entities to all maps as an escape hatch for core shared devices (firewalls, core switches, etc.).
- New entities default to Map 1 (the default map), preserving existing behavior for existing users.
- Inactive maps consume zero resources — no polling, no timers, no animation frames.
- Maximum of 10 maps enforced with a clear error response.
Backend: GET/POST/PATCH/DELETE /api/v1/maps, entity assignment at POST /maps/{id}/entities, global pin at POST /maps/pin. Built on existing Topology/TopologyNode tables (schema from 0026) — no new tables needed.
Interactive Rack Editor (Phase 1)¶
The read-only rack diagram has been replaced with a fully interactive 3-panel editor.
- Left panel — Hardware Inventory: Lists all unracked hardware for the current rack. Drag any device directly into an open U-slot on the canvas.
- Center panel — Rack Canvas: Renders the full rack as a U-slot grid. Empty slots are droppable targets. Mounted devices are draggable (drag back to inventory to unrack). Changes are auto-saved on drop.
- Right panel — Inspector: Click any mounted device to see its details. Remove it from the rack with a single button.
- Cable Overlay: SVG cable visualization layer showing physical connections between ports on mounted devices.
- All colors use CSS variables — zero hardcoded hex values — for full theme compatibility.
- Hardware now supports
mounting_orientation(horizontal/vertical) andside_railfields for accurate physical representation.
Tech: @dnd-kit/core + @dnd-kit/utilities for accessible, DOM-native drag and drop.
Native Built-in Monitoring¶
Circuit Breaker can now monitor your hardware and services directly — no external monitoring tool required.
- Probe types: ICMP ping, HTTP health check (up if HTTP status < 400), TCP port check.
- Probes are configured per-monitor with a target address, optional port, and a configurable interval (default 60s).
- Monitor results flow through the same integration sync worker as Uptime Kuma, so status badges, uptime percentages, and status-change events all work identically.
- Auto-monitor on discovery: A new settings toggle automatically creates native probes for any hardware discovered via network scan.
- Annotate status-change events with a reason and user attribution for operational context.
Backend: NativeProbePlugin — a full IntegrationPlugin implementation. No external dependencies; uses httpx for HTTP probes and stdlib socket for TCP.
Uptime Kuma — Socket.IO Enrichment¶
The Uptime Kuma integration now uses the Socket.IO API (Uptime Kuma 2.0+) for richer monitor data, with graceful fallback to the public HTTP API for earlier versions.
- Heartbeat history: Fetches the last 2 hours of heartbeat records per monitor, enabling trend-line visualization.
- Certificate expiry: Pulls
daysRemainingfrom Uptime Kuma's cert info and surfaces it directly in Circuit Breaker. - Response times:
avg_response_msnow populated from real Socket.IO data instead of estimated. linked_hardware_id: Monitors can now be linked to a hardware entity for topology correlation.- A new background
integration_sync_workerhandles all integration polling with PostgreSQL advisory locking, preventing duplicate runs. It also emitsIntegrationMonitorEventrows on every status transition for audit history.
Business Intelligence & Analytics¶
Circuit Breaker now includes a backend analytics engine for capacity planning and operational intelligence.
- Capacity forecasting: OLS linear regression over telemetry time series. Predicts when CPU, RAM, and storage will exceed a threshold based on the trailing trend. Results available at
GET /api/v1/intel/capacity-forecasts. - Resource efficiency: Classifies hardware as over-provisioned, right-sized, or under-provisioned based on utilization patterns. Available at
GET /api/v1/intel/resource-efficiency. - Blast-radius analysis: BFS traversal of the dependency graph to identify all assets impacted by a given node going down. Critical DOWN events from the status worker are now automatically enriched with blast-radius data. Available at
GET /api/v1/intel/blast-radius/{entity_type}/{entity_id}. - Flap detection: Identifies services that repeatedly oscillate between up and down states. Flap incidents are stored with duration and flip counts.
- Telemetry retention (hot/warm/cold): Background worker downsamples telemetry data on a configurable schedule — raw (hot) → hourly aggregates (warm) → daily aggregates (cold) — to keep storage bounded at scale.
- All analytics jobs use PostgreSQL advisory locks for safe concurrent execution without an external scheduler.
New tables: capacity_forecasts, resource_efficiency_recommendations, flap_incidents. Retention configuration in AppSettings.
TLS Certificate Management¶
A new Certificates page gives you full visibility into your homelab's TLS certificates.
- Add and track certificates by domain — supports self-signed and Let's Encrypt types.
- Visual expiry status: Shield icons indicate health at a glance — green (valid), amber (expiring within 30 days), red (expired), grey (unknown).
- Paste PEM directly or leave blank to auto-generate a self-signed certificate.
- Auto-renew toggle per certificate.
- Certificate detail drawer shows full metadata including SANs, issuer, and days remaining.
IPAM — Unified 4-Tab Layout¶
The IPAM page has been redesigned from a flat IP address list into a unified network management center with four tabs. The separate Networks page has been absorbed as the first tab, reducing navigation clutter and keeping everything subnet-related in one place.
Networks tab (replaces the standalone Networks page) - Full network/prefix CRUD with inline search and a new VLAN filter. - Subnet and gateway fields visible at a glance in the table; click any row to open the detail drawer.
IP Addresses tab - Filter chips — All / Manual / Discovered — let you quickly separate hand-entered addresses from IPs pulled in via network discovery scans. - Network filter dropdown to scope the list to a single prefix. - Conflict detection: adding an address already tracked returns a clear 409 response rather than silently duplicating. - Hardware and service linkage visible per row — click through directly to the linked entity.
VLANs tab - Manage VLAN IDs, names, and descriptions alongside network membership. - VLAN filter on the Networks tab cross-links back here for quick navigation.
Sites tab - Logical site definitions (data center, lab room, off-site) that group networks and hardware for documentation and discovery scoping.
Backend: No new API routes — the existing /api/v1/ipam, /api/v1/networks, /api/v1/vlans, and /api/v1/sites endpoints are unchanged. This is a pure frontend reorganization.
Notifications Management¶
A new Notifications page manages your alerting pipeline end-to-end.
- Notification sinks: Configure delivery destinations for Slack, Discord, Microsoft Teams, or Email. Enable/disable per sink. Test delivery before going live.
- Routing rules: Route alerts by severity (info / warning / critical / all) to specific sinks. Multiple routes per sink.
- Provider icons in the UI for quick visual identification.
- The webhook Dead Letter Queue (DLQ) from v0.2.5 is now surfaced in the UI — review and retry failed deliveries.
Tenant Management¶
v1.0 note: This historical v0.2.8 section is superseded by the v1.0 support contract and ADR 0003. Circuit Breaker 1.0 does not support true multi-tenancy; use separate deployments for separate trust boundaries.
In v0.2.8, Circuit Breaker shipped early multi-tenant foundations for operators managing shared homelab environments or multiple logical environments. These foundations are not a supported v1.0 security boundary.
- At the time, operators could create, rename, and delete tenants from the Tenants admin page.
- At the time, member management could add or remove users from tenants with per-tenant roles.
- At the time, active tenant context was stored in
localStorageand sent asX-Tenant-ID. - At the time, CRUD was admin-only and regular users saw only tenants they belonged to.
Historical backend behavior: CRUD existed at /api/v1/tenants, with member management at
/api/v1/tenants/{id}/members. In v1.0 these legacy paths return a stable unsupported-tenancy
response.
User Management Enhancements¶
Masquerade (Login-As)¶
Admins can now impersonate any user to troubleshoot permission issues or verify dashboard configurations.
- Clicking "Masquerade" on a user row issues a short-lived (15-minute) JWT with
is_masquerade: trueclaims. - A persistent amber banner appears at the top of every page: "Viewing as user@example.com — your admin session is preserved."
- "Return to Admin" button in the banner instantly restores the original admin session.
OAuth Invite Flow¶
- Invite links now carry an
invite_tokenthrough the OAuth provider redirect, enabling seamless new-user onboarding via SSO without requiring a separate registration step. accepted_attimestamp recorded on invite rows for audit purposes.
Proxmox Reliability & Observability¶
Proxmox is Circuit Breaker's primary data pipeline for the topology map, but sync failures were previously invisible. This release adds per-config health state.
- Two new columns on
integration_configs:last_sync_errorandlast_poll_error. - Every scheduled sync will write its outcome —
ok,partial(some entities failed), orerror(unreachable) — to the DB. Partial failures include the specific per-entity error strings. - Telemetry poll failures (node poll, VM poll, RRD poll) are tracked per-config and independently surfaced.
- The Proxmox tab in the integrations UI will show: last-sync time, a colored status badge (green/amber/red), and an expandable error block when failures occur.
- The perpetual "Not synced" badge goes away once the first sync completes.
Note: Migration 0063 is included. The service wiring (9 implementation steps) will land in a follow-on commit on this branch.
Security Hardening¶
- Legacy auth token deprecated: The pre-v0.2 static token auth path has been removed. All authentication flows through JWT.
- Password reset token enumeration (SEC-001): Reset tokens are now SHA256-hashed before being used as Redis keys. An attacker with Redis
SCANaccess can no longer enumerate live reset tokens directly. The token value returned to users is unchanged. - CORS wildcard filter (SEC-002): The CORS origin guard now filters wildcards per-element rather than exact-matching
["*"]. Mixed lists like["*", "https://legit.com"]no longer pass a wildcard through alongsideallow_credentials=True. - CSP
'unsafe-inline'removed (SEC-003):'unsafe-inline'has been removed fromscript-src.'strict-dynamic'already supersedes it in modern browsers; the keyword only created a legacy-browser XSS bypass. - HSTS preload directive (SEC-004):
Strict-Transport-Securityheader now includes; preload, enabling domain submission to browser HSTS preload lists. - Default client hash salt warning (SEC-005):
client_hash_password()now callsget_client_salt()to respect the fullenv → DB → defaultpriority chain. If neitherCB_CLIENT_SALTnor a DB-stored salt overrides the public default, aWARNINGis emitted at startup. - OIDC nonce validation (SEC-006): The OIDC authorization flow now generates and stores a
noncealongside the PKCE verifier. The callback verifies the nonce claim in the returnedid_token, preventing captured ID tokens from being replayed into an active authorization flow. Migration 0067 adds a nullablenoncecolumn tooauth_states. - Docker install automation: Docker installation is now optional and detected automatically on upgrade, eliminating silent skips when
--dockerwas passed in upgrade mode.
Installer Improvements¶
- Debian 13 (Trixie) compatibility: The native installer now supports Debian 13 with fallback UID assignment when preferred UIDs are taken. Errors during install surface loudly. Post-install directory ownership verified with a check loop.
- DB address fallback: Native installer is more resilient when detecting the PostgreSQL address across different distro conventions.
- NATS version pinning: Build pipeline now pins NATS server version to avoid unexpected upgrades breaking the embedded message bus.
- Distro-agnostic preflight: The version whitelist in
stage0_preflighthas been removed. The installer now detects the distro family (Debian/Ubuntu, Fedora, RHEL/Rocky/AlmaLinux, Arch) rather than requiring a specific version. If the required packages are available, the install proceeds — no artificial gate. - Dynamic PGDG repo URLs: The PostgreSQL repo URL for Fedora and RHEL-family distros is now fully dynamic — arch and major version are derived at runtime rather than hardcoded. Correct on aarch64, fresh Fedora releases, and RHEL 10 when it ships.
- Idempotent re-runs: Running the installer a second time on an existing system is now safe. PostgreSQL, pgbouncer, Redis, and NATS configuration stages detect already-initialized, running services and skip re-initialization. No service disruption on accidental re-run.
- Inline debug hints for novice users: When any major stage fails, the installer now prints 3-5 numbered next steps directly in the terminal — the exact log path, service status command, port check, and retry invocation. No need to hunt for documentation.
- SHA256 checksum is now a hard failure: A checksum mismatch aborts the install instead of silently continuing. Use
--skip-checksumonly for air-gapped deployments or local bundle installs.
Proxmox LXC Helper (cb-proxmox-deploy.sh)¶
- Operation timeouts: Template download, container creation, and the in-container install/upgrade are now wrapped with
timeout— 5 min, 2 min, and 10 min respectively. Previously these could hang indefinitely on network or storage issues. - Stale lock pre-clear:
pct unlockruns proactively before bothpct createandpct startto clear locks leftover from failed previous attempts. - IPv4 CIDR validation: The static IP input dialog now validates
x.x.x.x/prefixformat and re-prompts with a clear error message until a valid address is entered. - Richer failure output: When the in-container install fails, the output now includes a 5-step debug block: enter the container, tail the full install log, check service status, view all CB logs, and re-run the installer command.
Bug Fixes¶
- Proxmox first-scan node stacking: On a fresh Proxmox discovery, all nodes spawned at position (0, 0) because the radial force-simulation layout was used for Proxmox graphs — with no edges yet, forces couldn't spread nodes apart. The map now always defaults to dagre on first load, which positions nodes correctly regardless of edge count.
- TelemetryPanel form pre-population (BUG-009): Opening the Telemetry panel on a hardware node with an existing config no longer shows blank fields. The backend now returns a password-redacted
configobject inTelemetryResponse, and the panel pre-fills profile, host, username, SNMP community, poll interval, and enabled state from it. - Multi-U rack diagram spans (BUG-011): Devices taller than 1U now fill every slot they occupy in the rack diagram. Continuation rows display a
│marker instead of repeating the device name. - IPAM network scan CIDR limit (BUG-005): The
/scan/{network_id}endpoint now correctly caps at 1022 hosts (the actual maximum for a /22) rather than 1024, and the error message reflects the correct limit. - Poll Now button state (BUG-008): The Poll Now button in TelemetryPanel is now disabled while a save operation is in progress, preventing a race condition where a poll could read stale config immediately after a save.
- Silent async telemetry publish failure (BUG-006): When the telemetry dispatcher runs in a sync context with no event loop, the Redis cache/publish step is now logged at DEBUG level instead of failing silently.
Database Migrations¶
Eight new migrations apply automatically on upgrade (or via make migrate):
| Migration | Summary |
|---|---|
| 0059 | Uptime Kuma monitor enrichment — response time, cert expiry, hardware link, last heartbeat |
| 0060 | Hardware mounting orientation and side-rail fields |
| 0061 | OAuth invite token threading + invite accepted_at timestamp |
| 0062 | Native monitoring probe config, event annotations, auto-monitor-on-discovery setting |
| 0063 | Proxmox sync and poll health columns on integration_configs |
| 0064 | Integrations base_url made nullable |
| 0065 | Multi-map — activates Topology/TopologyNode for named-map support |
| 0066 | IPAM notes field + network site association |
| 0067 | OIDC nonce column on oauth_states for token replay protection |
All migrations use ADD COLUMN IF NOT EXISTS / additive-only patterns. No data loss, no column drops.
Upgrade Notes¶
- Mono Docker image: migrations run in
/docker/entrypoint-mono.shbefore supervisord; the image setsCB_AUTO_MIGRATE=falseso multiple Uvicorn workers do not each invoke Alembic. Bareuvicorn/ dev installs still defaultCB_AUTO_MIGRATE=trueunless you set it tofalse. - Legacy databases (PostgreSQL with
usersbut noalembic_versionrow): the app stamps Alembic toa3b4c5d6e7fc(0015) once, then upgrades to head. SetCB_DISABLE_LEGACY_ALEMBIC_STAMP=trueif you must block that behavior and stamp manually instead. - TimescaleDB: optional at runtime; set
CB_REQUIRE_TIMESCALE=trueto fail startup when the extension is not installed on the server.GET /api/v1/healthand admin Database status includetimescaledb_available. - No manual steps required for standard upgrades.
CB_AUTO_MIGRATE=true(default outside the mono image) applies pending migrations on API startup when enabled. - If running the native installer, run
cb upgradeor re-run the install script. Re-running is now safe — initialized services are detected and skipped. - The legacy static auth token path has been removed. Ensure all API clients and scripts use JWT-based authentication.
- Uptime Kuma Socket.IO enrichment requires Uptime Kuma 2.0.0-beta.2 or later. Earlier versions fall back to the public HTTP API automatically — no action needed.
- Air-gapped or local-bundle installs should use
--skip-checksumto bypass the new hard SHA256 check.
Recommended Next Steps After Upgrade¶
- Open Settings → Notifications and configure at least one notification sink.
- Open Settings → Certificates and register any TLS certificates you're managing manually.
- If you use Uptime Kuma, verify your integration is running 2.0.0-beta.2+ to get heartbeat history and cert expiry data.
- Create a second map (e.g., "DMZ" or "Lab Network") to try multi-map scoping.
- Visit the IPAM page — your existing networks, VLANs, and IP addresses are now in the tabbed layout. Use the "Discovered" filter chip to review any IPs pulled in via scan.
- For Proxmox users: trigger a manual discovery run and confirm the Proxmox tab now shows a green "Connected" badge.