github maziggy/bambuddy v0.2.1

10 hours ago

Bambuddy v0.2.1

New Features

  • Multiple Virtual Printers — Run multiple virtual printers per installation, each with a dedicated bind IP and fully independent FTP, MQTT, SSDP, and Bind servers. Full CRUD API and React UI for creating, editing, and deleting instances. Supports all four modes, any of the 11 printer models, per-instance TLS certificates, and individual network interface override.
  • Background Print Dispatch (#112) — Printing from archives and the file manager now runs in the background. FTP uploads are decoupled from API request latency, so the UI responds immediately. Real-time progress via WebSocket with per-job upload bars, status badges, and a cancel button.
  • Filament Cost Tracking (#452) — Track per-spool filament costs and see cost breakdowns for every print. Archive cards display total cost, the print modal shows a real-time cost preview, and the inventory table includes a sortable cost/kg column. A global default filament cost setting provides a fallback. Contributed by @Keybored02.
  • Filament Override for Model-Based Queue (#486) — When scheduling to "any printer", you can now override the 3MF's original filament choices. The scheduler matches against overridden type and color, preferring printers with exact color matches.
  • Bulk Spool Addition & Stock Spools (#480) — Quick Add mode for inventorying filament without a slicer profile. Quantity field creates up to 100 identical spools in one transaction. Stock spools shown with an amber badge. New grouping toggle collapses identical unused spools into expandable rows.
  • Developer LAN Mode Detection — Automatically detects printers without Developer LAN Mode enabled and shows a persistent warning banner with affected printer names and a link to Bambu Lab's documentation.
  • Clear Plate Permission (#446) — New printers:clear_plate permission so users can confirm plate clears without needing full printers:control.
  • Full-Page Group Permission Editor (#446) — Replaced the cramped permission modal with a dedicated full-page editor featuring a 2-column grid, search/filtering, and bulk actions.
  • External Materials & Brands in Spool Form (#455) — The spool form now allows using custom materials and brands not in the Bambu filament catalog when adding or editing spools.
  • Energy Cost 3-Decimal Precision (#416) — Energy cost values now support 3 decimal places (e.g., €0.123/kWh) instead of 2, for more accurate cost tracking in regions with fractional energy pricing.
  • Include Beta Updates Setting — New toggle to opt in to beta/prerelease update notifications. Default: off (stable only).
  • Virtual Printer Dual Bind/Detect Ports (#445) — The slicer bind/detect handshake now listens on both ports 3000 and 3002 for compatibility across BambuStudio/OrcaSlicer versions.

Fixed

Print Queue & Scheduling

  • Queue Empty After Container Restart (#523) — SQLite WAL not checkpointed on shutdown. Now runs PRAGMA wal_checkpoint(TRUNCATE) before exit.
  • Queue Stuck on "Busy" for "Any Model" Jobs (#435) — Queue API now uses OR logic to also return unassigned items whose target_model matches the printer's model.
  • Queue "Any Model" Jobs Stuck in "Waiting" After Plate Clear (#435) — MQTT raw AMS data returned IDs as strings; fixed type casting.
  • "Queue to Any Printer" Ignores Filament Color Override (#486) — Now requires at least 1 color match when filament overrides specify colors.
  • "Clear Plate & Start Next" Ignores Filament Override Color (#486) — Frontend now checks override colors, mirroring the backend's color matching logic.
  • "Clear Plate & Start Next" Shown on Printers Without Correct Filament (#527) — Widget now filters queue items by filament compatibility.
  • Virtual Printer Queue Sends Wrong Plate ID (#529) — plate_id was always 1; now extracts plate index from 3MF's slice_info.config.
  • Virtual Printer Queue Ignores AMS Mapping (#529) — Scheduler now computes AMS mapping for all queue items that lack one.
  • Virtual Printer Queue Mode Doesn't Assign Printer (#518) — Now assigns the VP's target printer or falls back to model-based scheduling.
  • Unnecessary Target Model Selector on "Any" Tab (#528) — Dropdown hidden when sliced model is known.
  • Print Queue Shows UUID Hash Instead of Filename (#438) — Library files now display the original human-readable name.
  • SD Card Cleanup After Print Never Runs (#374) — Used wrong printer object type; fixed to use DB query.
  • Phantom Prints From Lingering SD Card Files (#477) — Fixed retry loop, added cleanup on start_print() failure.

AMS & Filament

  • AMS History Chart Shows Wrong Time Range (#535) — X axis now pinned to the full requested time range.
  • Manual Spool Weight Overwritten by AMS Auto-Sync (#525) — Added weight_locked flag for manual weight entries.
  • AMS Slot Auto-Config Falls Back to Generic Instead of Spool's Preset — Fixed PFUS*/P* custom preset handling and "sticky" generic ID reuse.
  • PCTG Filament Misidentified as PC (#478) — Reordered material parser; added PCTG to all material type arrays.
  • External Spool Mapping Inverted on H2C (#492) — Now uses active_extruder on dual-nozzle printers.
  • External Spool Assignments Lost on Restart (#493) — Now looks up external assignments in vt_tray data.
  • Filament Fill Level Wrong / Missing for External Spools (#496) — Fixed priority chain, removed misleading gray fallback bar, added AMS remain fallback for external spools.
  • Wrong AMS Unit Displayed With Dual AMS on P2S (#420) — Now cross-references tray_now with MQTT mapping field for multi-AMS printers.
  • H2D Tray Disambiguation Produces Bogus IDs for AMS-HT (#364) — Fixed AMS-HT global tray ID computation across multiple code paths.
  • Usage Tracking Wrong Spool on Multi-AMS Printers (#364) — Now decodes MQTT mapping field from snow encoding for universal spool resolution.
  • Spool Usage Lost When Spool Runs Empty Mid-Print (#459) — Snapshots assignments at print start; splits weight across trays using per-layer gcode data.
  • Spool Form Allows Empty Brand & Subtype (#417) — Brand and Subtype now mandatory.

Printing & Archives

  • Inconsistent Print Cost on Reprints (#505) — Removed redundant cost paths; now computes from current session only.
  • Finish Photo Not Captured When Archive Has No Source 3MF (#484) — Falls back to archive/{id}/ directory.
  • Finish Photo Not Shown for BambuStudio Prints (#474) — Fixed path resolution for empty file_path.
  • Archive Endpoints Crash With "Is a directory" (#475) — Replaced .exists() with .is_file() across 15 locations.
  • File Manager Rename Doesn't Update Displayed Name (#460) — Rename now also updates print_name in file metadata.
  • "Open in Slicer" Fails for Special Characters — Sanitizes /, \, ?, # to _ in slicer download URLs.
  • "Open in Slicer" Fails When Auth Enabled (#421) — Added short-lived, single-use download tokens with platform-specific URL formats.
  • Non-Actionable HMS Errors Triggering Notifications (#470) — Suppresses MQTT auth failures, cloud connection failures, and user cancellations.
  • ntfy Notifications Fail With "Illegal header value" (#466) — Escapes newlines in HTTP headers; retries without image when attachments disabled.
  • Print Bed Cooled Notification Never Triggers (#497) — Moved bed cooldown monitor before archive lookup early-return.
  • K-Profile Response Race Condition Crash (#462) — Fixed TOCTOU race between MQTT callback and asyncio thread.

Permissions & UI

  • "Power Off Printer" Not Gated by Control Permission (#500) — Checkbox now disabled for users without printers:control.
  • Created Admin Users Can't See Settings Button (#503) — Now uses hasPermission('settings:read') instead of hardcoded role check.
  • Settings Text Fields Reset While Typing — Removed stale state overwrite from auto-save handler.
  • Spool Form Profile Dropdown Truncates Long Names (#534) — Removed inline filament codes; widened modal.

Timestamps & Dates

  • Timestamps Off by Timezone Offset in Non-UTC Containers (#504) — Replaced datetime.now() / datetime.utcnow() with datetime.now(timezone.utc) across 16 files (~80 call sites). Fixed 13 frontend new Date() calls.
  • Inventory Date Format Ignores Settings (#463) — Now respects date format setting.
  • Inventory Location Shows Garbled Characters for AMS-HT Slots (#463) — Now uses shared formatSlotLabel() utility.

Docker & Infrastructure

  • FTP Proxy Cannot Bind to Port 990 in Dockercap_add: NET_BIND_SERVICE didn't reliably propagate with the user: directive. Now sets file capabilities via setcap in the Dockerfile.
  • Support Bundle Leaking Personal Data (#473) — Now queries DB for sensitive values; uses httpx auth parameter for smart plug credentials; redacts serial numbers fully.
  • IP Addresses Not Redacted From Support Bundle — Added IPv4 regex that preserves firmware version strings.

AMS Mapping & Dual-Nozzle (H2D/H2C)

  • 7 AMS Mapping Fixes — Hard nozzle filter, external spool extruder, ams_extruder_map race condition, group_id priority, dual-nozzle detection, AMS-HT globalTrayId, dropdown nozzle filter.
  • Nozzle Mapping Uses Wrong Source in 3MF — Now uses group_id as primary source instead of filament_nozzle_map.
  • H2D Tray Disambiguation Triggers on Single-Nozzle Printers — Now uses persistent _is_dual_nozzle flag.
  • Cancelled Print Usage Tracking Uses Stale Progress — Now captures last valid progress/layer during printing.
  • Developer Mode Detection Always Reports Null — Fixed int(value, 16) TypeError on integer MQTT field.

Other

  • Wrong Documentation Link for "Lubricate Carbon Rods" on P2S (#490)
  • "Unknown stage (74)" on H2D — Mapped stage 74 ("Preparing") and 77 ("Preparing AMS").
  • Color Tooltip Clipped Behind Adjacent Swatches — Added z-index.
  • PAUSED State Never Matched (#447) — Removed dead PAUSED checks; printer only sends PAUSE.

Improved

  • Queue API Returns More Print Metadata (#524) — Endpoints now include filament_type, filament_color, layer_height, nozzle_diameter, and sliced_for_model.
  • Filament Catalog API Renamed (#427) — /api/v1/filaments//api/v1/filament-catalog/ for clarity.
  • Clear Plate Dot Indicator on Sidebar — Yellow dot on Printers icon when plate clear is needed.
  • Inventory Sidebar Always Visible — Shows Spoolman iframe or internal inventory based on mode.
  • Queue Page Mobile Responsiveness — Improved layout for mobile devices.
  • Storage Size Formatting & Overdue Queue Items — UI polish and i18n fixes.
  • Brazilian Portuguese Translation — Full translation contributed by @wreuel.
  • H2D Pro Printer Image — Added H2D Pro image and model mapping. Contributed by @cimdDev.
  • Native Updater Script — Systemd-based updater with backup and safety checks. Contributed by @uefigs139.
  • Docker Install iptables Option — Option to add iptables port redirect during Docker install. Contributed by @wreuel.
  • Frontend Pre-Commit Hooks (#458) — TypeScript type checking and ESLint on staged frontend files.
  • Show Remaining Spool Weight — Displays remaining weight instead of used weight. Contributed by @Keybored02.

Community Contributors

Thank you to everyone who contributed to this release:

  • @Keybored02 — Filament cost tracking, remaining weight display, spool form fixes
  • @wreuel — Brazilian Portuguese translation, Docker iptables install option
  • @cimdDev — H2D Pro printer image
  • @uefigs139 — Native updater script
  • @aneopsy — Queue page mobile responsiveness, page refactoring, UI improvements

Don't miss a new bambuddy release

NewReleases is sending notifications on new releases.