Bambuddy 0.2.4.9
⚠ Upgrade Notes — Read Before Updating
0.2.4.9 is a fix-and-polish release on the same 0.2.4 code base — no schema breaks beyond auto-migrated column additions (dialect-branched for SQLite and Postgres), no Docker entrypoint changes. The in-app Apply Update button in Settings → System → Updates works for Docker and for any native install already on 0.2.4.x.
Behaviour-change callouts to know about before you upgrade:
- Plate-clear confirmation now correctly defaults to OFF (#1865). On installs that never explicitly saved the "Require plate-clear confirmation" setting, the scheduler was still enforcing the plate-clear gate even though the toggle and the printer card showed it disabled — so a queued print could sit "Waiting" forever on a FINISH-state printer with no UI control to release it. The scheduler now reads the setting with the same default the schema and UI use, so a finished printer dispatches the next queued job automatically. If you were relying on that gate to hold the queue until you physically clear the bed, explicitly turn on Require plate-clear confirmation after upgrading — the "Mark plate as cleared" button and plate badge reappear on the card when it's on.
- Filament Track Switch (FTS) now routes across nozzles for queued prints (#2186). On an H2C with an FTS installed, a queued print targeting one nozzle could be fed a same-type wrong-colour spool because dispatch hard-filtered candidate trays to the requested extruder. Dispatch now skips the per-nozzle filter when an FTS is present, so the correct spool is matched by colour and the FTS routes it. If you had worked around this by pre-loading duplicate spools per side, that's no longer necessary.
- Auto-drying now runs manual dries to their full configured duration (#1892). The previous humidity-based early-stop unreliably cut a dry after ~30 minutes (heated air reads low RH within minutes even with wet filament). Manual and preset-duration dries now run to completion; scheduled/queue-triggered stops are unchanged. If you relied on the early cut-off, dries will now take longer.
- WebSocket connections require the WEBSOCKET_CONNECT permission. A logged-in user whose group lacks WEBSOCKET_CONNECT previously triggered an endless token-mint reconnect loop; the client now degrades cleanly to REST polling instead. If live updates stopped for a non-admin group after upgrade, grant that group WEBSOCKET_CONNECT (the group editor now shows a hint explaining it).
- Administrators gain newly-added permissions automatically on upgrade. Upgraded Administrator groups now sync to every current permission on startup (additive only — custom permissions preserved). Most visibly this restores the Sensor History charts, which were 403'ing on a missing printer_sensor_history:read.
- Light theme contrast overhaul (#1909). If you run the light theme, a large number of previously washed-out status banners, badges, and form fields are now readable. Dark theme is pixel-identical.
Make a backup before upgrading via Settings → Backup → Create Backup. Native install with update.sh snapshots the database automatically and rolls back on failure. Docker and fully-manual paths don't.
Docker
docker compose pull
docker compose up -d
docker-compose.yml doesn't need refreshing for 0.2.4.9.
Native install — recommended path
sudo BRANCH=main /opt/bambuddy/install/update.sh
Snapshots the database first and rolls back on failure.
Native install — manual path
sudo systemctl stop bambuddy
cd /opt/bambuddy
sudo -u bambuddy git fetch --prune --tags --force origin
sudo -u bambuddy git checkout main
sudo -u bambuddy git reset --hard origin/main
sudo /opt/bambuddy/venv/bin/pip install -r requirements.txt
cd frontend && sudo npm i
sudo systemctl start bambuddy
Windows install
Download bambuddy-0.2.4.9-windows-x64-setup.exe from this release page (or the unversioned bambuddy-windows-x64-setup.exe alias for an always-latest link). This release fixes a fresh-install failure where the service reported "running" but nothing listened on port 8000 (#2474) — a missing C++ runtime DLL that greenlet needs is now bundled. Existing Windows installs upgrade in place via the in-app "Install Update" flow.
Highlights
0.2.4.9 is a stabilisation release — the headline is install robustness on Windows and macOS, a light-theme contrast pass, and a run of scheduler/dispatch correctness fixes that could silently feed the wrong filament, start a cancelled print, or freeze a queue.
Two dispatch fixes are the ones to know about: queued prints never dispatching to a FINISH-state printer when "Require plate-clear confirmation" was disabled (#1865 — see Upgrade Notes), and Filament Track Switch on H2C feeding a wrong-colour spool for a print on the other nozzle (#2186). A cancel-during-dispatch race that let a print start anyway is also fixed (#1853).
Install paths got hardened on both new platforms: the Windows .exe no longer starts a dead service on a clean Win10 box (#2474), and the macOS native install is now fully rootless (no more Homebrew/venv permission failures) with a fixed Virtual Printer bind-interface list.
Smaller-but-useful: a preheat / heat-soak scheduler stage with per-filament chamber targets and airduct-flap control for engineering filaments (#1468, opt-in, default off), thermal-printer-friendly spool-label QR codes with a black-and-white monochrome option (#1870), Indonesian Rupiah cost tracking (#1869), and an API-key can_manage_maintenance scope for Home-Assistant-style automations (#1832 follow-up).
A run of long-tail API-key permission gaps also closed this release — API keys can now manage Projects (#1893) and Archives (#1888) via dedicated per-key scopes that migrate off by default.
New Features
- Spool labels: scannable QR on 203 dpi thermal printers + monochrome mode for black-and-white printers (#1870, reported by @fireboyff, monochrome requested by @Geoff-S). Roomier QR layout (12 mm minimum, ERROR_CORRECT_L) so every template stays scannable; Monochrome option drops the colour swatch and carries colour via the hex-code line. All 11 locales.
- Preheat & heat-soak before queued prints (#1468). A new scheduler stage heats the bed (and chamber, on capable printers) and holds temperature before each queued print — per-item Inherit/On/Off, per-filament chamber targets, three hardware tiers (active heater / sensor-only / bed-only), and automatic airduct-flap switching. Opt-in, default off.
- API keys:
can_manage_maintenancescope for HA-style automations (#1832 follow-up). Lets an automation log maintenance ("cleaned nozzle") or reset a counter via an API key without granting broader printer control. Per-key scope + Settings toggle + badge; existing keys migrate to off. - Indonesian Rupiah (IDR) currency support (#1869). Adds IDR (Rp) under Settings → Cost Tracking.
Fixed
Print queue, scheduler & dispatch
- Queued prints never dispatched to FINISH-state printers when "Require plate-clear confirmation" was disabled (#1865). See Upgrade Notes.
- Cancel during queue dispatch didn't cancel — the print started anyway (#1853). Fixed with an atomic pending→printing CAS, an early re-check-and-bail, and committing before the FTP upload so cancels stop queueing behind the scheduler (also clears the "database is locked" contention).
- "Inject auto-print G-code" checkbox couldn't be ticked on single prints (#1852). A quantity≤1 effect reset it in create mode; the clause is dropped and the scheduler reads gcode_injection per item regardless of batch size.
- Smart plug cut power when a print restarted, ignoring per-plug cooldown (#1890). The queue "auto off after this job" trigger used a second inline implementation that powered off mid-print on a touchscreen reprint; consolidated into the plug's configured, cancellable strategy guarded by is_print_active().
- Editing a queue item assigned to "Any of model X" showed a blank printer selector. The model-mode props were gated behind !isEditing; the gate is dropped so the target model/location can be changed without delete + re-queue.
Filament, AMS & slicing
- Filament Track Switch (FTS) on H2C fed the wrong filament for prints on the "other" nozzle (#2186). See Upgrade Notes.
- PVA-for-support intent lost when re-slicing a source 3MF (#1881). Support-only slots were treated as unused and overwritten, support filaments were stripped from unsliced archive cards, and the picked process preset shipped enable_support=0 — all three fixed.
- Custom Bambu Cloud filament presets showed as "Generic" (#1815). The singular slicer-setting GET/DELETE calls omitted the ?version= param Bambu Cloud requires; it's now sent, restoring custom cloud-preset lookup.
- Slicer auto-pick could silently land an incompatible filament and hid the real CLI error (#1851). The real [error] line is now surfaced and incompatible presets are hard-skipped whenever a compatible one exists.
- Auto-drying stopped a manually started AMS dry after exactly 30 minutes (#1892). See Upgrade Notes.
- Spoolman didn't split mid-print usage across an AMS backup switch (#1793). Segment math is now shared by both inventory backends so mid-print switches attribute identically, and the remain-delta fallback skips trays the split path already covered.
Camera & photos
- External camera "connection lost" when the snapshot URL served a non-JPEG image (#1902). PNG/WebP/BMP stills are now transcoded to JPEG; genuine JPEGs keep a byte-for-byte fast path.
- Finish photo captured the wrong (swapped) plate on A1 / A1 Mini (#1867). A last-layer edge trigger now fires the pre-capture before the user's End G-code (e.g. a SwapMod plate swap) runs.
- First-layer notification photo showed pre-print calibration, not the actual print (#1837). It now waits for gcode_state == RUNNING before firing.
Virtual Printer
- Virtual Printer FTP uploads silently truncated under uvloop (#1896). Native launches now pin --loop asyncio, and a received .3mf must open as a ZIP before the VP replies 226 (truncated files answered 426, never archived or forwarded).
- Virtual Printer "bind interface" dropdown was empty on macOS. Interface enumeration now routes all non-Linux platforms through psutil.
- Bambu Studio couldn't see or reconnect to the VP after a Mac sleep/wake (#1872). On a drain timeout the zombie writer is now closed and evicted on the same tick, and TCP keepalive is tightened to ~2 min dead-peer detection.
- Non-proxy VP camera passthrough was dead for A1 / P1 targets (#1868). The passthrough now chooses port 322 (RTSPS) or 6000 (Bambu chamber-image) from the target printer's model instead of hardcoding 322.
Install & platform
- Windows installer: fresh install failed to start ("connection refused", nothing on port 8000) — the C++ runtime DLLs greenlet needs (vcruntime140_1.dll, msvcp140.dll) are now staged next to python.exe at build time (#2474, reported by @fangme).
- Native install script failed on macOS with Homebrew / venv permission errors — the macOS path is now fully rootless (refuses sudo, defaults to ~/bambuddy). Linux (service user + systemd) is unchanged.
Auth, API keys & permissions
- WebSocket auth failure caused an endless token-mint reconnect loop. Mint failures are now classified: 401/403 stop the hook (degrade to REST polling), network/5xx still reconnect. See Upgrade Notes.
- A transient load-time error could discard a valid stored login token (#1889). "Remember Me" validation now retries transient failures (up to 3 attempts) and only discards on a definitive 401.
- API keys could not manage Projects (#1893). New can_manage_projects per-key scope covers create/update/delete; existing keys migrate to off.
- API keys could not delete or edit Archives (#1888). New can_manage_archives per-key scope moves create/update/delete off the denylist (PURGE stays admin-only); existing keys migrate to off.
- Administrators didn't gain new permissions on upgrade + Pipelines runs-dashboard polish. seed_default_groups() now syncs Administrators to every current permission on startup (additive only), restoring the Sensor History charts; the runs dashboard's native filters are replaced with themed dropdowns. See Upgrade Notes.
UI & rendering
- Light theme: low-contrast washed-out text on status/warning banners, badges, and form fields, app-wide (#1909, reported by @AntonPalmqvist). Dark theme unchanged.
- Sponsor toast ignored its 14-day cooldown and re-fired on every fresh browser session (#2477, reported by @pchulpjoost). The toast is now recorded as shown the moment it renders, so being displayed arms the cooldown.
- Per-user Notifications page unreachable from the sidebar (#1901). A sidebar-ordering refactor dropped the nav entry and its permission mapping; both are restored.
- P1S / P1P showed a permanent "Door Closed" badge (#1866). The door-badge whitelist now covers only models that ship a door sensor (X1 family, X2D, P2S, H2 family).
- HMS wrong-plate "Ignore" didn't ignore, and the action buttons read as inert badges (#1869). The correct decimal-err ignore command is now sent, buttons have static styling with disabled/spinner states, and ack-detection no longer false-502s on the transient re-pause.
- Uncataloged HMS faults that carry firmware actions were hidden (#1840). Fault visibility now keeps cataloged-or-has-actions faults, with an "unknown HMS code" fallback label in all 11 locales.
Contributors
Reporters who drove the fixes in this release are credited inline next to each entry above. Thank you!
(No external code-contributor PRs are recorded in the 0.2.4.9 changelog)
Sponsors
Bambuddy is sustainable thanks to people who put their money where their use is. If this release saved you time or kept your farm running, the project runs on recurring contributions — there's no paid tier, no telemetry, no upsell, just sustainable maintenance.
- GitHub Sponsors (recurring, 5 tiers from $5/mo to $300/mo) — https://github.com/sponsors/maziggy
- Ko-fi (one-time or recurring) — https://ko-fi.com/maziggy