Note
This is a daily beta build (2026-03-28). 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
- Queue Timeline View (#823) — The queue page now has a production schedule view showing when each print is estimated to finish. Events are sorted chronologically and grouped by hour, with cards showing the file name, printer, estimated completion time, and time remaining. Active prints show a live progress bar. Filter by "Show All", "Printing", or "Queued", and navigate between days. Click any event to edit or stop it. Toggle between List and Timeline views with the button group above the queue. Requested by sanjay2409.
- Staggered Batch Start for Multi-Printer Jobs (#752) — When sending a print to multiple printers via the queue, you can now stagger the starts to avoid power spikes from simultaneous bed heating. Enable "Stagger printer starts" in the schedule options to define a group size (how many printers start at once) and interval (minutes between groups). For example, 10 printers with group size 2 and interval 5 min will start in 5 waves over 25 minutes. Default group size and interval are configurable in Settings → Queue. Works with both ASAP and Scheduled timing — ASAP starts the first group immediately, subsequent groups get computed scheduled times. Requested by maziggy.
- Settings Queue Tab — New dedicated Queue tab in Settings consolidates queue-related settings: staggered start defaults and auto-drying configuration (moved from the Filament tab).
Improved
- Queue Page Visual Refresh — Compact stats bar replaces the five summary cards (saves vertical space), color-coded left borders on all queue items for instant status scanning, collapsible history section (collapsed by default), and condensed single-line rows for history items showing more prints at a glance.
Fixed
- Filament Usage Not Recorded When Auto-Archive Disabled — When a printer had "Auto-archive completed prints" turned off, filament consumption was silently lost. The
on_print_completecallback returned early before reaching the usage tracking code, so neither the internal inventory (AMS remain% deltas) nor Spoolman received usage data. Moved filament tracking to run before the archive check so usage is always recorded regardless of the auto-archive setting. - H2D External Spool Uses Wrong Nozzle (#836) — Prints sent from Bambuddy to dual-nozzle printers (H2D, H2D Pro) with external spools always routed to the wrong nozzle. The old
ams_mapping2format used a sharedams_id: 255withslot_id: 0/1to differentiate external slots, but the firmware interpreted slot_id as the nozzle index (0=main/right, 1=deputy/left), routing filament to the opposite nozzle. Already fixed by the #797ams_mapping2format change (per-trayams_idinstead of shared unit), but users on older builds still experience this. Printing the same file directly from the slicer worked correctly. Reported by NoahTingey. - SpoolBuddy "Add to Inventory" Failed Silently — The quick-add button on the SpoolBuddy kiosk did nothing when tapped. The scale weight was sent as a float but the backend requires an integer, causing a Pydantic validation error. The error was silently caught with no user feedback, leaving the confirmation modal stuck open. Fixed by rounding the weight before sending, moving the modal close to a
finallyblock, and adding an error toast with the actual API message. - SpoolBuddy Dashboard Crash on Null Spool Fields — Viewing a spool with null
subtype,brand,rgba, orcolor_nameon the SpoolBuddy dashboard crashed the UI (black screen). The spool prop construction useddisplayedSpool?.subtype ?? sbState.matchedSpool!.subtype— when the field wasnull, the??operator fell through tosbState.matchedSpoolwhich could also be null, causing a TypeError. Fixed by picking one source object instead of mixing per-field fallbacks. Added a global React error boundary so future crashes show the error instead of a black screen. - Plate Thumbnails 401 in Print Modal — Multi-plate 3MF plate thumbnails in the print modal returned 401 Unauthorized when authentication was enabled. The backend returns bare URL paths for plate thumbnails, but the
PlateSelectorcomponent used them directly in<img src>without appending the stream token. Fixed by passing the URL throughwithStreamToken(). - Schedule Calendar Picker Opens Off-Screen — Clicking the calendar icon in the print modal's scheduled mode opened the native date picker at the bottom of the viewport instead of near the date field. The hidden
datetime-localinput usedsr-onlypositioning which anchored the picker off-screen. Fixed by positioning the hidden input inside the date field's container. - SpoolBuddy Kiosk Display Blanking and Crashes — The kiosk Chromium flags added in 0.2.2.2 caused display instability:
--js-flags=--max-old-space-size=128crashed the V8 renderer when heap exceeded 128 MB,--enable-low-end-device-modeaggressively killed GPU rendering surfaces, and resettingCHROMIUM_FLAGSdiscarded the Pi's GPU defaults (--enable-gpu-rasterization, ANGLE/GLES) creating an unstable mixed CPU/GPU rendering path. Fixed by removing both flags, appending kiosk flags to Pi defaults instead of replacing them, adding awlr-randrkeep-alive loop to prevent display blanking, and adding<screenBlankTimeout>0</screenBlankTimeout>to the labwc config.