github maziggy/bambuddy v0.2.3b3

latest release: v0.2.3b3-daily.20260412
21 hours ago

Bambuddy v0.2.3b3

Highlights

This is the biggest Bambuddy beta yet. SpoolBuddy reaches its first official beta with a 7" touchscreen kiosk, NFC tag writing, and scale-based spool tracking. The core app gains scheduled local backups, optional PostgreSQL support, LDAP/Active Directory authentication, shortest-job-first queue scheduling, auto-print G-code injection for bed-clearing systems, printer search and filters amd direct printing from the project view.

New Features

  • Scheduled Local Backups (#884) — Settings → Backup now includes a "Scheduled Backups" card that automatically creates complete backup snapshots (database + all data directories) on an hourly, daily, or weekly schedule with configurable time-of-day and retention count. Backups are written as ZIP files to a configurable output directory (defaults to DATA_DIR/backups/), which Docker users can mount as a volume to their NAS or external storage. Each backup in the list can be downloaded, restored directly
    from the UI, or deleted individually. The manual backup download endpoint has also been optimized to stream directly from disk instead of loading the entire ZIP into memory. Works with both SQLite and PostgreSQL. Fully localized across all 7 UI languages.
  • Optional PostgreSQL Database Support — Bambuddy can now use an external PostgreSQL database instead of the built-in SQLite. Set the DATABASE_URL environment variable to connect to Postgres. SQLite remains the default. All features work with both backends including full-text archive search, backup/restore, health diagnostics, and cross-database restore (import a SQLite backup into PostgreSQL with automatic type conversion and FK handling).
  • LDAP Authentication (#794) — Users can now authenticate against an LDAP/Active Directory server. Configure the LDAP server URL, bind DN, search base, and user filter in Settings → Authentication → LDAP. Supports StartTLS, LDAPS (SSL), and plaintext connections. LDAP groups can be mapped to BamBuddy groups (Administrators, Operators, Viewers) for automatic role assignment. Auto-provisioning creates BamBuddy accounts on first LDAP login. Local admin accounts remain as fallback when the LDAP server is unreachable.
  • LDAP Default Fallback Group — Settings → Authentication → LDAP → Advanced now has a "Default group" selector. When an LDAP user authenticates but is not listed in any mapped LDAP group, they are automatically assigned to this fallback group instead of being left without permissions.
  • Shortest Job First Queue Scheduling (#879) — New SJF toggle badge on the queue page header. When enabled, the scheduler starts shorter print jobs before longer ones instead of FIFO order. A starvation guard ensures long jobs that get skipped once are protected from being skipped again. Print duration is cached on queue items at creation time from the 3MF metadata.
  • Auto-Print G-code Injection (#422) — Configure custom start and end G-code snippets per printer model in Settings (Workflow tab) for bed-clearing systems like Farmloop, SwapMod, AutoClear, and Printflow 3D. When adding a print to the queue, enable "Inject G-code" to have the scheduler inject the configured snippets into the 3MF before uploading. The original file is never modified — injection creates a temporary copy for upload only.
  • Print Files Directly from Project View (#930) — The project detail page now lists printable files from every linked library folder inline, with Print Now and Add to Queue action buttons on each sliced file. Prints triggered from the project view are automatically associated with the originating project. Contributed by @legend813.
  • Printers Page Search and Filters (#852) — The Printers page now has a live search bar and two filter dropdowns (status and location). Search matches printer name, model, location, and serial number. The status filter is reactive to WebSocket status updates. Contributed by @legend813.
  • Queue Timeline View (#823) — Production schedule view showing estimated print completion times, grouped by hour, with live progress bars. Filter by All/Printing/Queued and navigate between days.
  • Staggered Batch Start for Multi-Printer Jobs (#752) — Stagger print starts across multiple printers to avoid simultaneous bed heating power spikes. Configure group size and interval in the Print/Schedule dialog or set defaults in Settings → Queue.
  • Plate-Clear Confirmation Setting (#752) — New toggle in Settings → Queue to skip plate-clear confirmation for farm workflows where plates are verified physically.
  • Per-User Statistics Filtering (#730) — Admins can filter the Statistics page by user to see individual prints, filament usage, and costs.
  • Bulk Printer Actions (#825) — Select multiple printer cards and apply bulk Stop, Pause, Resume, Clear Notifications, or Clear Bed. Select by state or location.
  • Prefer Lowest Remaining Filament (#805) — Optional setting to prefer AMS spools with the least remaining filament during auto-matching, helping consume partial spools first.
  • REST/Webhook Smart Plug Type (#472) — New generic HTTP smart plug type for openHAB, ioBroker, FHEM, Node-RED, etc. Configure ON/OFF URLs, methods, headers, and optional status polling.
  • Configurable Default Print Options (#858) — Set default print options (bed levelling, flow calibration, vibration calibration, timelapse, etc.) in Settings → Workflow.
  • Batch Print Quantity (#342) — Print multiple copies of a file in one step with a quantity field in the Print/Schedule dialog.
  • GitHub Backup: Spool Inventory & Print Archives (#870) — Optional backup of spool inventory and print archive metadata to GitHub.
  • External Folder Subfolder Preservation (#890) — Scanning an external folder now mirrors the real directory structure into the file manager folder tree instead of flattening all files into the root.
  • SpoolBuddy Quick Menu (#893) — Swipe down from the top of the SpoolBuddy display to open a quick-access control panel. Toggle printer power via smart plugs directly from the display, and manage the system with restart daemon, restart browser, reboot, and shutdown controls.
  • SpoolBuddy Device Management Tab — Settings → SpoolBuddy now lists every registered device with live connection status, system details, hardware health flags, and an Unregister button. A yellow warning banner flags likely crash-duplicates when more than one device is registered.

Improved

  • SpoolBuddy Auto-Wake on NFC/Scale (#945) — The kiosk display now wakes automatically when a spool is placed on the scale or an NFC tag is scanned, without requiring a touch first. Thanks to @TravisWilder.
  • SpoolBuddy Kiosk LCD Now Powers Off on Idle (#937) — The "screen blank timeout" setting now actually powers off the HDMI panel's backlight via swayidle + wlopm instead of just painting a CSS overlay. Thanks to @TravisWilder.
  • AMS Drying Support for P2S — Remote AMS drying and queue auto-drying now work on P2S printers with firmware 01.02.00.00 or later.
  • AMS Drying Support for H2S (#886) — Remote AMS drying and queue auto-drying now work on H2S printers with firmware 01.02.00.00 or later.
  • Assign Spool Modal Filtering (#889) — Improved filtering logic for faster spool selection. Contributed by @Keybored02.
  • SpoolBuddy Spool Detail Card (#866) — Improved spool detail card UI with better layout and information density. Contributed by @Keybored02.
  • REST Smart Plug: Separate Power/Energy URLs (#472) — REST smart plugs can now use individual URLs for power and energy data with unit multipliers for conversion.
  • Standardized Webhook Notification Payloads (#871) — Webhooks now include structured event data fields alongside existing title/message fields for easier automation.
  • Database Engine Info on System Page — Shows the active database engine (SQLite or PostgreSQL) and its version.
  • Plate Number in Printer View (#881) — Printer cards now show the plate number alongside the filename for multi-plate 3MF prints.
  • Printer Name in Queue for Model-Based Jobs (#881) — Queue items assigned to a printer type now show the actual printer name once the scheduler assigns one.
  • Developer Mode Detection for A1/P1 Printers — Printers without the fun MQTT field now have developer mode detected via a probe command on reconnect.
  • Queue Page Visual Refresh — Compact stats bar, color-coded left borders, collapsible history section, and condensed history rows.
  • SpoolBuddy Kiosk Performance Optimizations — Reduced idle CPU from ~3.3 to ~0.9 on Raspberry Pi.
  • SpoolBuddy Inventory Page — New kiosk page with spool grid, search, filter pills, and tap-to-detail view.
  • SpoolBuddy Auto-Navigate on Tag Scan — Automatically navigates to dashboard and wakes screen when a tag is scanned.
  • SpoolBuddy Swipe to Switch Printers — Left/right swipe cycles through online printers on the touchscreen.
  • Settings Menu Layout — Improved settings page menu organization.

Fixed

  • H2C Nozzle Rack Slot Numbering Off When Slot 1's Nozzle Is Mounted (#943) — Rack slots shifted by one position when slot 1's nozzle was picked up into a hotend. The rack base is now hardcoded to match the fixed H2C rack ID layout. Thanks to @netscout2001.
  • Energy Snapshot Capture Crashes on PostgreSQL — The hourly energy snapshot loop failed on PostgreSQL because the tz-stripping hook didn't handle nested parameters from insertmanyvalues. Now recursively strips tzinfo at any depth.
  • Wrong Filament Color Name on AMS Popup (#857) — Colors outside a hardcoded list showed wrong names. Rewrote the resolver to use the color_catalog table as the single source of truth. Thanks to @lightmaster.
  • LDAP Auto-Provisioning Fails on Upgraded SQLite Installs (#794) — First LDAP login on an upgraded SQLite install hit a NOT NULL constraint. Migration now patches sqlite_master directly. Thanks to @DylanBrass.
  • Energy Statistics Empty for Date Ranges in Total Consumption Mode (#941) — Added persisted energy start column and hourly snapshot loop for accurate date-range totals. Per-print energy tracking is now restart-resilient. Thanks to @TheMadMike23.
  • Virtual Printer "Synchronizing device information" Times Out in Orca (#927) — MQTT command handling silently dropped requests when the slicer's cached serial didn't match. Both directions are now serial-adaptive.
  • External Sidebar Link Icon Not Showing (#878) — Custom icons returned 401 because the sidebar img tag didn't use a stream token.
  • SJF Toggle Disappears After Clicking (#879) — The toggle was inside the Pending section header which unmounted when the last pending item started. Moved to the page header.
  • Project Breadcrumb Shows i18n Key (#931) — Breadcrumb showed the raw translation key instead of translated text. Contributed by @legend813.
  • SpoolBuddy Update Fails in Docker — Multiple fixes for ssh failures under arbitrary UIDs. Entire update path is now subprocess-free (uses cryptography + asyncssh). Docker image now bakes .git/HEAD for correct branch detection.
  • Camera Stream Reconnect Counter Off-by-One + ffmpeg Log Flood (#925) — Counter could show "6 of 5", and failed ffmpeg spawns logged the full banner.
  • LDAP POSIX Primary Group Ignored — Users whose role came from their POSIX primary group landed without permissions.
  • Support Bundle Leaks Virtual Printer IP Address — Added _ip to the sensitive key filter for redaction.
  • "Build Plate Cleared" Button Unclickable After Second Print (#912) — React Query mutation state from the first confirmation persisted, blocking subsequent clicks.
  • Spoolman Location Not Cleared on Spool Removal from AMS (#921) — Auto-sync set locations for new spools but never cleared stale ones, causing double-booked slots.
  • Spool Weight Not Updated After Print (#839) — Filament usage tracking failed silently in five scenarios: fallback archives without 3MF, external/VT tray spools, notifications showing "Unknown", auto-archive disabled, and queue/reprint prints with auto-archive disabled. All five paths are now fixed.
  • Ghost Jobs From SQLite Lock on Print Completion (#897) — Queue status update could fail silently on SQLite lock, leaving jobs permanently stuck in "printing". Now retries with backoff.
  • Multi-Plug Automation Only Working for First Plug (#903) — When multiple smart plugs were assigned to a printer, only the first was automated. All automation paths now control every assigned plug.
  • SpoolBuddy Inventory Not Updating on Spool Changes (#905) — Spool CRUD endpoints now broadcast websocket events for instant updates.
  • AMS Slot Changes Fail Until Reconnect (#887) — After a keep-alive timeout, paho-mqtt auto-reconnects but silently ignores commands. Added probe timeout with retry and force-close.
  • Spool Manager Deducts Double Filament (#880) — Two independent deduction paths ran in the same event loop cycle. AMS weight sync now skips updates while a print session is active.
  • File Manager Stale UI After Deleting Folders/Files — Delete endpoints relied on auto-commit after response. Added explicit commit before returning.
  • Thumbnails Broken After Backend Restart — Stream tokens lost on restart. Frontend now auto-refreshes failed token-protected image loads.
  • SpoolBuddy Kiosk Screen Blanks on Boot — Added consoleblank=0 to kernel cmdline and immediate anti-blank loop.
  • Queue Widget Ignores Plate-Clear Setting (#752) — Button showed even when plate-clear confirmation was disabled.
  • WebSocket Crash on Printers Without fun Field (#873) — Race condition in developer mode probe caused repeating crashes on A1, P1, X1Plus.
  • Filament Hover Card Behind Sidebar — Hover card z-index conflicted with mobile sidebar.
  • Bed Cooled Notification Never Firing (#872) — Replaced polling-based monitor with event-driven approach.
  • Filament Color and Subtype Inconsistencies (#857) — Fixed generic color names, missing Silk+/Tough+ subtypes, and misclassified gradient/dual-color filaments.
  • External Spool Print Fails on Printers With AMS (#854, #859) — Fixed use_ams flag and ams_id mapping.
  • Wrong Filament Mapping (#851) — Contributed by @behrinml.
  • External Folder Scan 500 on 3MF Files (#846) — Crash from raw thumbnail bytes in JSON serialization.
  • Archives Capped at 50 Items (#843) — Removed hardcoded limit, added pagination.
  • Filament Usage Not Recorded When Auto-Archive Disabled — Tracking now runs before the archive check.
  • AMS History Cleanup Crash — Fixed naive/aware datetime mismatch.
  • SpoolBuddy NFC Write Fails on NTAG Tags — Multiple PN5180 state machine and CRC fixes for NTAG 213/215/216.
  • SpoolBuddy Scale First Reading Always Wrong — NAU7802 ADC stale first reading polluted the moving average.
  • Print Fails on Files With Spaces in Name (#824) — Spaces in MQTT url field caused firmware to ignore the print command.
  • Virtual Printer Proxy A1 Printing Fails (#757) — Ports 2024-2026 weren't proxied.
  • H2D External Spool Print Fails (#797) — "Failed to get AMS mapping table" on H2D external spool prints.
  • Spool Assignment on Empty AMS Slots (#784) — Assigning spools to truly empty slots created a stuck state.
  • Log Flood: "State is FINISH but completion NOT triggered" (#790) — Diagnostic message fired on every MQTT update in terminal state.
  • ffmpeg Process Leak Causing Memory Growth (#776) — Camera processes accumulated over time, consuming GB of RAM.
  • Database Connection Pool Exhaustion on Large Farms — Increased pool from 30 to 220 connections.
  • Sidebar Bottom Icons Cut Off With Smart Plugs (#862) — Fixed footer overflow.
  • Native Install Misdetected as Docker in LXC Containers — Fixed detection logic.
  • P1S/P1P Printer Card Showing "Printing" When Idle (#813) — Stale MQTT connection not triggering reconnect.
  • MQTT Connected/Disconnected UI Bouncing — Stale reconnect timer.
  • Rapid MQTT Disconnect/Reconnect Bouncing (#813) — Fixed rapid reconnect cycling.
  • SpoolBuddy Various Kiosk Fixes — Virtual keyboard layout, boot splash, settings layout, read tag diagnostics, assign spool modal clipping, low filament warning slot
    number, status bar updates, dashboard crash on null fields.

Security

  • Path Traversal in File Upload Endpoints — Archive upload endpoints used client-supplied filenames directly without stripping directory components. All upload endpoints now sanitize filenames. Reported by Sacha Vaudey.
  • Unauthenticated Bug Report Endpoints — Bug report endpoints had no authentication. Now require appropriate permissions. Reported by Sacha Vaudey.
  • API Key Empty Printer List Grants Full Access — An API key with [] was treated as global access. Now null = global, [] = no access. Reported by Sacha Vaudey.
  • Missing HTTP Security Headers — Added X-Content-Type-Options, X-Frame-Options, and Referrer-Policy. Reported by Sacha Vaudey.
  • Camera Snapshot Temp Files World-Readable — Switched to mkstemp with 0600 permissions. Reported by Sacha Vaudey.
  • Token-Based Auth for Media Endpoints — Camera streams, snapshots, thumbnails, and timelapse videos now require a stream token when auth is enabled.
  • Bump vite from 7.3.1 to 7.3.2 (#909)
  • Update aiohttp, cryptography, and Pygments for CVE fixes

Contributors

Thank you to the contributors who helped make this release possible:

Don't miss a new bambuddy release

NewReleases is sending notifications on new releases.