Note
This is a daily beta build (2026-03-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:0.2.2b4-daily.20260313
or
docker pull maziggy/bambuddy:0.2.2b4-daily.20260313
**Tip:** Use [Watchtower](https://containrrr.dev/watchtower/) to automatically update when new daily builds are pushed.
New Features
- First Layer Complete Notification (#679) — Get notified with a camera snapshot when the first layer finishes printing, so you can check adhesion remotely without watching the whole print. Enable the "First Layer Complete" toggle on any notification provider. Fires once per print when layer 2 begins (confirming layer 1 is done), with a guard against spurious triggers on printer reconnect. Requested by community.
- Remote AMS Drying (#292) — Start, monitor, and stop drying sessions for AMS 2 Pro and AMS-HT directly from the Printers page. A flame icon appears on supported AMS cards; clicking it opens a popover to select filament type (PLA, PETG, TPU, ABS, ASA, PA, PC, PVA) with official BambuStudio temperature/duration presets, or set temperature manually. When drying is active, a status bar shows the time remaining with a live countdown and stop button. Supported on X1/X1C (fw 01.09+), P1P/P1S (fw 01.08+), H2D (fw 01.02.30+), H2D Pro, and X1E. Not supported on P2S, A1, A1 Mini, H2S, or H2C. Requires
printers:controlpermission when authentication is enabled.
Fixed
- AMS Fill Level Shows 0% for Non-Viewer Users (#676) — When authentication was enabled with advanced permissions, users with
inventory:view_assignmentspermission saw 0% fill level on AMS slots where inventory spool data had staleweight_usedvalues. The fill level fallback chain (Spoolman → Inventory → AMS remain) used nullish coalescing (??), which doesn't fall through on0— so a stale inventory fill of 0% permanently shadowed the correct real-time AMS remain value from the printer. Now, when inventory says 0% but the AMS hardware reports a positive remain, the inventory value is bypassed in favor of the live AMS data. Viewer users were unaffected because their group lackedinventory:view_assignments, so the inventory query never fired and the AMS remain was used directly. Reported by @cadtoolbox. - Virtual Printer Proxy Mode Always Shows X1C Model — Creating a virtual printer in Proxy mode always set the model to X1C regardless of the destination printer, because the frontend hides the model dropdown in proxy mode and the backend defaulted to X1C. Now auto-inherits the model from the target printer when creating or updating a proxy virtual printer (e.g. a proxy pointing at a P1S correctly presents itself as P1S to the slicer). The model also auto-updates when changing the target printer or switching to proxy mode.
- Cloud Profiles Shared Across All Users (#665) — When authentication was enabled, Bambu Cloud credentials were stored globally — one account per Bambuddy instance. If User A logged into Cloud, every other user saw User A's account and profiles. User B logging in would overwrite User A's credentials. Cloud credentials are now stored per-user: each user logs into their own Bambu Cloud account independently. When auth is disabled (single-user mode), behavior is unchanged. Also fixed cloud data endpoints (
/cloud/settings,/cloud/fields, preset CRUD) requiringsettings:read/settings:updatepermissions instead ofcloud:auth— users who had "Cloud Auth" enabled but "Settings" disabled couldn't load profiles after logging in. Reported by @cadtoolbox. - Local Profiles Not Shown in AMS Slot Configuration — Imported local filament profiles were hidden in the AMS slot configure modal when a printer model was set. The
compatible_printersfilter parsed the stored JSON array as a semicolon-delimited string, so the matching always failed and every local preset was silently skipped. Removed the filter entirely — user-imported profiles should be available on any printer. - Interface Aliases Not Shown in Virtual Printer Interface Select — Interface aliases (e.g.
eth0:1) added for multi-virtual-printer setups were invisible in the bind IP dropdown. The Docker image didn't includeiproute2, so theipcommand wasn't available and the code fell back to ioctl-based enumeration which can only return one IP per interface. Addediproute2to the Docker image. - P2S Camera Stream Disconnects After a Few Seconds (#661) — The P2S firmware drops RTSP sessions after a few seconds with an I/O error. The backend treated this as a fatal failure, ending the MJPEG stream and forcing the frontend through a full reconnection cycle (stop → start → brief connection → fail → repeat). Added transparent auto-reconnection: when ffmpeg's RTSP connection dies, it respawns immediately and continues streaming MJPEG frames to the browser without interruption. Reported by @ddetton, confirmed by @DMoenning.
- iOS/iPadOS Cannot Reposition Floating Camera (#687) — The floating camera viewer (embedded camera window on the dashboard) could not be dragged or resized on iOS/iPadOS because it only handled mouse events. Touch input scrolled the page underneath instead of moving the camera window. Added touch event support (
touchstart/touchmove/touchend) to both the header drag handle and the resize handle, withpreventDefaultto stop page scrolling during drag. Reported by @dsmitty166. - PA-CF / PA12-CF / PAHT-CF Not Treated as Compatible (#688) — Bambu Lab firmware treats PA-CF, PA12-CF, and PAHT-CF as interchangeable, but the print scheduler and filament override UI used exact string matching. If a 3MF required PA-CF but the AMS had PA12-CF loaded, the scheduler wouldn't assign the job and the filament override dropdown was empty/disabled. Added a filament type equivalence system so these PA variants are treated as compatible in scheduler assignment, AMS slot matching, force color match validation, and the filament override dropdown. Reported by @aneopsy.
- Force Color Match Toggle Click Target Too Large (#688) — In the Schedule Print modal, clicking anywhere on the "Force color match" row toggled the checkbox, not just the checkbox and its label. The click target now covers only the checkbox, icon, and label text. Reported by @aneopsy.
- HA Switch Badge Always Sends Turn On Instead of Toggle — Clicking a non-script Home Assistant entity (switch, light, input_boolean) on the printer card always sent
turn_on, which is a no-op when the switch is already on. Now sendstogglefor non-script entities so the badge click actually toggles the switch state. Script entities still useturn_on(stateless trigger). - Multiple Plugs Per Printer Crashes Auto-On/Off — When multiple smart plugs were assigned to the same printer (e.g., a Tasmota plug + an HA switch), the auto-on/auto-off handler called
scalar_one_or_none()which raisesMultipleResultsFound. Now fetches all plugs and returns the main (non-script) power plug, matching the API route behavior. - Multiple HA Switches Per Printer UNIQUE Constraint — The migration that removes the UNIQUE constraint on
smart_plugs.printer_id(to allow multiple HA switches per printer) used an exact string match to detect the constraint in the SQLite schema. Databases created with older SQLAlchemy versions expressed the constraint differently (e.g. quoted column names, table-levelUNIQUE(printer_id), or separate indexes), so the migration silently skipped them. Users hitIntegrityError: UNIQUE constraint failedwhen assigning a second HA switch to a printer. Now uses regex pattern matching and also checks for standalone UNIQUE indexes. - HMS Notifications for Unknown/Phantom Error Codes — Printers send many undocumented or phantom HMS error codes that don't correspond to real errors (e.g. calibration status codes after firmware updates). These triggered email/push notifications even though the printer card correctly filtered them out. Flipped the notification logic from "notify all, suppress specific codes" to "only notify for errors with known descriptions", matching the frontend behavior. Also fixed the log message reporting incorrect notification counts.
- Ethernet Badge Shown on WiFi Printers / MQTT Disconnecting (#585) — Three bugs in the ethernet badge feature: (1)
home_flagbit 18 is set on all printers regardless of connection type, so every ethernet-capable model showed the ethernet badge even when connected via WiFi. Replaced bit 18 detection with wifi_signal-based heuristic: printers on ethernet with WiFi disabled report a hardcoded-90 dBmsentinel, while real WiFi signals vary. (2) The lazy import usedfrom app.utils.printer_modelswhich crashes withModuleNotFoundErrorin paho-mqtt's background thread (correct path isbackend.app.utils.printer_models). This killed the MQTT thread entirely, causing all printers to go stale after 60s and repeatedly disconnect/reconnect. (3) WiFi-only models (A1, P1P, etc.) that don't have an ethernet port are excluded via model-based gating. Reported by @cadtoolbox. - Inventory Usage Tracker Missing External Spool Mapping (#677) — When all higher-priority slot-to-tray mapping methods failed (MQTT mapping, print command mapping, queue mapping, color matching), the internal inventory usage tracker fell back to
slot_id - 1which can never reach external spool IDs (254/255) or AMS-HT IDs (128+). Added position-based resolution using sorted available tray IDs from the printer's AMS state, matching the fix applied to Spoolman tracking in #686. Contributed by @shrunbr.