Added
- Camera, printer and monitor registries — printers (OctoPrint, Klipper, Bambu Lab) are
now registered once in their own registry, exactly like cameras, then picked from a list;
the registry is the only place to create or delete one. A monitor binds a registered
camera and an optional registered printer and carries the inference thresholds and
defect-response policy, so one printer connection can back several monitors and its
connection details are entered once instead of re-typed per printer. - Bambu Lab printers — link a printer over its local MQTT API alongside the existing
OctoPrint and Klipper services, with the same pause/cancel-on-defect response, job and
progress reporting, and inference gating. Enable LAN Only Mode and Developer Mode
on the printer, then link it with its IP, serial number and access code — the form links
Bambu's official setup guide. The protocol is MQTT over TLS, which needs a raw socket the
browser sandbox forbids, so Bambu Lab is offered in hub mode only — the same
constraint that already makes some notifiers hub-only. - Printer-exposed cameras — when a registered printer's service exposes a webcam,
PrintGuard registers it as a camera automatically (no stream URL to copy). A camera
attached to the printer later is picked up from the camera registry's new Printer
cameras tab with a Refresh button. Covers OctoPrint and Klipper (Moonraker) webcam
streams and the Bambu Lab chamber camera — RTSP on the X1/H2 series and the proprietary
port-6000 JPEG protocol on the A1/P1 series (hub mode). These cameras are managed by their
printer: they cannot be removed on their own and are dropped with it, and the REST and MCP
read surface strips the access codes their sources carry. - Setup guides in config forms — each printer service and notification channel now
shows a one-line setup hint and a link to its official setup docs, so steps taken
outside PrintGuard (API keys, CORS, bot tokens, webhooks, LAN mode) are spelled out
where you configure them. - Experimental tag — a reusable badge that flags new, not-yet-battle-tested features
and links to the issue tracker for reports. Bambu Lab carries it. - MCP server and REST API for hub mode — agents and developers can now drive the
same engine protocol the dashboard speaks. The Model Context Protocol server
(Streamable HTTP, at/mcp/) lets an agent read monitor, printer and camera status, fetch
the current camera frame as an image, and pause, resume or cancel a print; the versioned
REST API at/api/v1exposes the same operations to any HTTP client, with the frame
served asimage/jpeg. Both are thin transports over the existing engine commands, so
they never drift from the UI. See
docs/api.md. - Scoped access tokens, managed from the UI — capability is configurable per token
through cumulativeread⊂control⊂managescopes. Issue, name and revoke tokens
from the dashboard (Settings → API & MCP access); each secret (apg_…string) is
shown once and stored only as a SHA-256 hash, and tokens are managed over the dashboard's
own protocol, never over the API itself. With no token issued the surface is read-only
behind your existing auth proxy; issuing scoped tokens unlocks control and management, and
MCP hides any tool a token cannot use. - Update notifications — the hub checks the public GitHub releases once a day for a newer
version and flags it in the header. A dialog shows the changelog for every version above
the one you run and thedocker compose pull && docker compose up -dcommand to upgrade.
The check runs server-side with no telemetry and can be switched off in Settings →
Software updates; local mode, which is always the latest deployed build, never calls out.
Changed
- The dashboard entity is now a "monitor". What 2.0 called a printer — a camera bound
to a service with thresholds — is a monitor; the printer is the registered service
connection it points at. Upgrading from 2.0 preserves registered cameras, but printers
must be re-registered and their monitors re-created.
Fixed
- Klipper's API-reference link pointed at Moonraker's old
/web_api/page, which now
404s; repointed to the current reference.