Note
This is a daily beta build (2026-04-13). It contains the latest fixes and improvements but may have undiscovered issues.
Docker users: Update by pulling the new image:
docker pull ghcr.io/maziggy/bambuddy:daily
or
docker pull maziggy/bambuddy:daily
**Tip:** Use [Watchtower](https://containrrr.dev/watchtower/) to automatically update when new daily builds are pushed.
New Features
- Printer Card Status Badges & Quick Controls — The Printers page printer card now exposes four new at-a-glance controls inspired by the Home Assistant Bambu Lab integration:
- SD Card badge in the top status row (HardDrive icon, green when card present, red when missing).
- Enclosure Door badge in the top status row (DoorOpen/DoorClosed icons, green when closed, yellow when open). Detection uses the right MQTT field per printer family —
home_flagbit 23 on X1/X1C/X1E and the top-levelstathex string bit 23 on P1/P2/H2 — and falls through the existing WebSocket push (status-change dedup key now includes door state, so toggling the door alone triggers a live badge update without waiting for the 30 s REST poll). - Airduct Mode badge beside the print speed control (Snowflake/Flame icons, sky for Cooling and orange for Heating). One-click dropdown switches the printer between cooling and heating via the existing
set_airductMQTT command. Gated to P2S/H2D/H2C/H2S. - Force Refresh menu entry in the printer card kebab menu (RotateCw icon) that re-requests a full
pushallMQTT status report from the printer without forcing a reconnect.
- AI Print-Failure Detection via self-hosted Obico ML API (#172) — New Settings → Failure Detection tab wires Bambuddy to a self-hosted Obico
ml_apicontainer (no Obico account, no cloud, no WebSocket). While a print is running, the detection service periodically hands the printer's camera snapshot URL to the ML API, which returns YOLO failure-detection scores. Scores are smoothed over time using Obico's own EWM + short/long rolling-mean math (30-frame warmup, alpha = 2/13, short window ≈ 5 min at 10s/frame, long window ≈ 20 h) so a single noisy frame cannot trigger an action. Sensitivity (Low / Medium / High) scales the LOW/HIGH thresholds; when the smoothed score crosses HIGH, the configured action runs exactly once per print: Notify only, Pause print (MQTT pause command), or Pause and cut power (pause + turn off any smart plug linked to that printer). A per-printer toggle lets you monitor all connected printers or just a subset. The Status card shows whether the service is running, the active thresholds, each monitored print's current verdict (safe / warning / failure), and a live rolling detection history. Requires that the External URL setting (General tab) points to a hostname/IP reachable from the ML API container, since the ML API fetches snapshots by URL.
Fixed
- Clear Plate Confirmation Bypassed on Power Cycle (#961) — With Auto Off enabled and another job queued, the smart plug would cut power when a print finished and immediately re-power when the scheduler saw the queue, at which point the printer booted fresh into
IDLEand the next job auto-dispatched without the "Clear Plate & Start Next" confirmation. Root cause: the plate-cleared gate lived only in the in-memoryPrinterManager._plate_clearedset, and the scheduler's idle check treatedIDLEas always-idle regardless of whether a previous finish had been acknowledged — so the gate was lost across both Bambuddy restarts and the IDLE-on-boot state transition. The gate is now anawaiting_plate_clearcolumn on theprinterstable, set byon_print_completewhen a print finishes or fails, cleared by the/printers/{id}/clear-plateendpoint and by the scheduler when it dispatches the next job, and rehydrated from the DB intoPrinterManageron startup._is_printer_idlenow short-circuits to not-idle wheneverrequire_plate_clearis on and the printer is awaiting ack, regardless of the currently reported state — so the prompt survives Auto Off cycles, Bambuddy restarts, and the printer booting back intoIDLE. The clear-plate endpoint no longer requires the printer to currently reportFINISH/FAILED(it accepts the ack whenever the awaiting flag is set), and the Printers page widget prompts based on the flag rather than the reported state. Thanks to miaopas for reporting. - Insecure Temp File Creation in Backup Export — The manual backup download endpoint used
tempfile.mktemp(), which is vulnerable to a symlink race condition (CWE-377). Replaced withtempfile.mkstemp()which atomically creates the file, eliminating the TOCTOU window. - Spoolman Iframe Blocked After 0.2.3b4 Security Headers — The Spoolman page (Inventory → Spoolman iframe) failed to load when Spoolman was served from the same host as Bambuddy via a reverse proxy. The security-headers middleware added in 0.2.3b4 set
X-Frame-Options: DENYon every response, which blocked even same-origin iframing. Relaxed toSAMEORIGINso Spoolman (and any other same-origin tool behind the same reverse proxy) can be embedded again, while still preventing cross-origin clickjacking.