MartinNYHC d6bf494c0b Merge pull request #721 from maziggy/0.2.2
**# Bambuddy v0.2.2**

**## Highlights**
- **Remote AMS Drying** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — Start, monitor, and stop drying sessions for AMS 2 Pro and AMS-HT directly from the Printers page. Select filament type with official BambuStudio temperature/duration presets, or set temperature manually. Supported on X1/X1C, P1P/P1S, H2D, H2D Pro, and X1E.
- **Queue Auto-Drying** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — Automatically dry filament between scheduled queue prints when AMS humidity exceeds the configured threshold. Uses conservative parameters for mixed filament types, with optional "block queue" mode to delay prints until drying completes.
- **Ambient Drying** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — Automatically keep filament dry on idle printers based on humidity, even without queued prints. Enable "Ambient drying" in Settings → Print Queue.
- **Virtual Printer Queue Auto-Dispatch Toggle** ([#587](https://github.com/maziggy/bambuddy/issues/587)) — Added an "Auto-dispatch" toggle to virtual printers in Queue mode. When disabled, prints are added to the queue but wait for manual dispatch instead of starting automatically.
- **Queue All Plates** ([#530](https://github.com/maziggy/bambuddy/issues/530)) — Multi-plate 3MF files can now be queued in one action. A "Queue All N Plates" toggle adds every plate as a separate queue entry, each individually editable.
- **AMS Info Card & Custom Labels** ([#570](https://github.com/maziggy/bambuddy/pull/570)) — Hovering an AMS label shows serial number, firmware version, and an editable friendly name. Slot numbers now display inside each filament color circle. Contributed by @cadtoolbox.
- **In-App Bug Reporting** — A floating bug report button lets users submit reports directly from the UI, including description, optional screenshot, and automatically collected diagnostic data with full sensitive-data redaction.

**## New Features**

- **First Layer Complete Notification** ([#679](https://github.com/maziggy/bambuddy/issues/679)) — Get notified with a camera snapshot when the first layer finishes printing, so you can check adhesion remotely. Enable the "First Layer Complete" toggle on any notification provider.
- **Remote AMS Drying** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — Start, monitor, and stop drying sessions for AMS 2 Pro and AMS-HT directly from the Printers page. Select filament type with official BambuStudio temperature/duration presets, or set temperature manually. Supported on X1/X1C, P1P/P1S, H2D, H2D Pro, and X1E.
- **Queue Auto-Drying** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — Automatically dry filament between scheduled queue prints when AMS humidity exceeds the configured threshold. Uses conservative parameters for mixed filament types, with optional "block queue" mode to delay prints until drying completes.
- **Configurable Drying Presets** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — Customize temperature and duration for each filament type in Settings → Print Queue. Defaults match BambuStudio presets, with separate presets for AMS 2 Pro and AMS-HT.
- **AMS PSU Detection** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — The drying button is disabled with a tooltip when the AMS lacks sufficient power for drying. Reads `dry_sf_reason` from firmware and surfaces HMS error codes for power issues.
- **Ambient Drying** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — Automatically keep filament dry on idle printers based on humidity, even without queued prints. Enable "Ambient drying" in Settings → Print Queue.
- **Assign Spool to Empty AMS Slot** ([#717](https://github.com/maziggy/bambuddy/issues/717)) — The "Assign Spool" option now appears on empty (unconfigured) AMS slots. Selecting a spool auto-configures the slot with the correct filament profile, color, and K-profile in one step.
- **Home Assistant Notification Provider** ([#656](https://github.com/maziggy/bambuddy/issues/656)) — Send persistent notifications to the HA dashboard. HA automations can forward them to mobile apps, WhatsApp, or any other service.
- **Virtual Printer Queue Auto-Dispatch Toggle** ([#587](https://github.com/maziggy/bambuddy/issues/587)) — Added an "Auto-dispatch" toggle to virtual printers in Queue mode. When disabled, prints are added to the queue but wait for manual dispatch instead of starting automatically.
- **Queue All Plates** ([#530](https://github.com/maziggy/bambuddy/issues/530)) — Multi-plate 3MF files can now be queued in one action. A "Queue All N Plates" toggle adds every plate as a separate queue entry, each individually editable.
- **Malaysian Ringgit Currency** ([#634](https://github.com/maziggy/bambuddy/issues/634)) — Added MYR (RM) to the list of supported currencies for filament cost tracking.
- **ETA Variable in Notifications** ([#638](https://github.com/maziggy/bambuddy/issues/638)) — Added `{eta}` template variable to print start/progress notifications. Shows estimated wall-clock completion time based on the user's configured time format (12h/24h).
- **Bulk Delete Spool and Color Catalog Entries** ([#646](https://github.com/maziggy/bambuddy/issues/646)) — Added checkbox selection and bulk delete to both the Spool Catalog and Color Catalog in Settings > Filament.
- **Force Color Match** ([#625](https://github.com/maziggy/bambuddy/pull/625)) — Added a "Force Color Match" option for "Print to Any" queue scheduling, requiring strict color matching when assigning prints to printers. Contributed by @cadtoolbox.
- **Israeli New Shekel Currency** — Added ILS to the list of supported currencies for filament cost tracking.
- **AMS Info Card & Custom Labels** ([#570](https://github.com/maziggy/bambuddy/pull/570)) — Hovering an AMS label shows serial number, firmware version, and an editable friendly name. Slot numbers now display inside each filament color circle. Contributed by @cadtoolbox.
- **In-App Bug Reporting** — A floating bug report button lets users submit reports directly from the UI, including description, optional screenshot, and automatically collected diagnostic data with full sensitive-data redaction.
- **SpoolBuddy NFC Tag Writing (OpenTag3D)** — Write NFC tags for third-party filament spools using the OpenTag3D format on NTAG213/215/216 stickers. Supports writing for existing spools, creating new spools, or replacing damaged tags.
- **SpoolBuddy On-Screen Keyboard** — Added a virtual QWERTY keyboard for the SpoolBuddy kiosk UI since the Raspberry Pi has no physical keyboard. Auto-shows when text inputs are focused.
- **SpoolBuddy Inline Spool Cards** — Placing an NFC-tagged spool on the reader now shows spool info directly in the dashboard panel instead of a modal overlay, with action buttons for AMS assignment, weight sync, and more.
- **SpoolBuddy AMS Page: External Slots & Slot Configuration** — The SpoolBuddy AMS page now displays external spool slots and AMS-HT units. Clicking any slot opens the configuration modal for filament type and color.
- **SpoolBuddy Dashboard Redesign** — Redesigned with a two-column layout showing device connection status and printer badges on the left, spool card on the right. Removed the separate inventory page in favor of main Bambuddy UI.
- **SpoolBuddy Kiosk Auth Bypass via API Key** — The `/auth/me` endpoint now accepts API keys, and the install script includes the API key in the kiosk URL for automatic authentication on boot.
- **Daily Beta Builds** — Added a release script for daily multi-arch Docker beta builds pushed to GHCR and Docker Hub. Beta images are never tagged as `latest`.
- **Inventory Scale Weight Check Column** — Added a "Weight Check" column (hidden by default) to the inventory table that compares each spool's last scale measurement against its calculated gross weight.

**## Fixed**

- **Library Upload Doesn't Show New File Until Page Reload** ([#704](https://github.com/maziggy/bambuddy/issues/704)) — The upload endpoint used `db.flush()` instead of `db.commit()`, so the file list was stale until page reload. Fixed the same race condition in folder create/update and file update endpoints.
- **Printer File Manager Doesn't Auto-Refresh** ([#704](https://github.com/maziggy/bambuddy/issues/704)) — The printer SD card browser only fetched files once when opened. Now auto-refreshes every 30 seconds.
- **Database Connection Pool Exhaustion Under Load** ([#704](https://github.com/maziggy/bambuddy/issues/704)) — Background tasks held database sessions during slow network I/O, exhausting the pool. Doubled the pool to 30 connections.
- **Block Mode Skips Humidity Auto-Stop** ([#292](https://github.com/maziggy/bambuddy/issues/292)) — When "Wait for drying to complete" was enabled, drying sessions that reached humidity target continued indefinitely. Block mode now only prevents starting new drying, not stopping completed sessions.
- **AMS Fill Level Shows 0% for Non-Viewer Users** ([#676](https://github.com/maziggy/bambuddy/issues/676)) — Stale inventory fill of 0% permanently shadowed the correct real-time AMS remain value due to nullish coalescing not falling through on `0`. Now bypasses inventory when it says 0% but AMS hardware reports positive remain.
- **Virtual Printer Proxy Mode Always Shows X1C Model** — Now auto-inherits the model from the target printer when creating or updating a proxy virtual printer.
- **Cloud Profiles Shared Across All Users** ([#665](https://github.com/maziggy/bambuddy/issues/665)) — Bambu Cloud credentials were stored globally instead of per-user. Each user now logs into their own Cloud account independently. Also fixed cloud endpoints requiring wrong permissions.
- **Local Profiles Not Shown in AMS Slot Configuration** — The `compatible_printers` filter parsed JSON as semicolon-delimited, silently skipping all local presets. Removed the filter entirely.
- **Interface Aliases Not Shown in Virtual Printer Interface Select** — Interface aliases (e.g. `eth0:1`) were invisible because the Docker image lacked `iproute2`. Added it to the image.
- **P2S Camera Stream Disconnects After a Few Seconds** ([#661](https://github.com/maziggy/bambuddy/issues/661)) — GnuTLS rejected TLS behaviors some printer firmwares rely on. Added a local TLS termination proxy using OpenSSL. Also reduced reconnect delay and fixed choppy external camera streams.
- **iOS/iPadOS Cannot Reposition Floating Camera** ([#687](https://github.com/maziggy/bambuddy/issues/687)) — The floating camera viewer only handled mouse events. Added touch event support for drag and resize.
- **PA-CF / PA12-CF / PAHT-CF Not Treated as Compatible** ([#688](https://github.com/maziggy/bambuddy/issues/688)) — Added a filament type equivalence system so PA variants are treated as compatible in scheduler assignment, AMS slot matching, and filament override dropdowns.
- **Force Color Match Toggle Click Target Too Large** ([#688](https://github.com/maziggy/bambuddy/issues/688)) — The click target now covers only the checkbox, icon, and label text instead of the entire row.
- **HA Switch Badge Always Sends Turn On Instead of Toggle** — Now sends `toggle` for non-script entities so the badge click actually toggles the switch state.
- **Multiple Plugs Per Printer Crashes Auto-On/Off** — `scalar_one_or_none()` raised `MultipleResultsFound` when multiple smart plugs were assigned. Now fetches all plugs and returns the main power plug.
- **Multiple HA Switches Per Printer UNIQUE Constraint** — The migration to remove the UNIQUE constraint on `smart_plugs.printer_id` now uses regex matching and also checks standalone UNIQUE indexes.
- **HMS Notifications for Unknown/Phantom Error Codes** — Flipped notification logic from "notify all, suppress specific" to "only notify for errors with known descriptions", matching the frontend behavior.
- **Ethernet Badge Shown on WiFi Printers / MQTT Disconnecting** ([#585](https://github.com/maziggy/bambuddy/issues/585)) — Three bugs: wrong detection method (bit 18 vs wifi_signal heuristic), bad import path crashing MQTT thread, and WiFi-only models not excluded.
- **Inventory Usage Tracker Missing External Spool Mapping** ([#677](https://github.com/maziggy/bambuddy/issues/677)) — Fallback `slot_id - 1` could never reach external spool IDs. Added position-based resolution using sorted available tray IDs. Contributed by @shrunbr.
- **Spool Assignment Applies Wrong Filament Profile** ([#681](https://github.com/maziggy/bambuddy/issues/681)) — Cloud API returns only the base `filament_id` for versioned setting IDs, ignoring variants. Added a cross-check that corrects the filament ID via reverse lookup.
- **Debug Logging Endpoint 500 Error** — Duration calculation mixed timezone-aware and naive datetimes. Now strips timezone info when reading stored timestamps.
- **Bed Cooled Notification Never Fires** ([#497](https://github.com/maziggy/bambuddy/issues/497)) — Partial MQTT updates didn't include `bed_temper`, so cached temperature never dropped. The monitor now sends periodic `pushall` commands to force fresh data.
- **Notification Provider Missing Event Toggles on Create** ([#497](https://github.com/maziggy/bambuddy/issues/497)) — The create endpoint omitted 8 event toggles (`on_bed_cooled` and 7 queue events), so they always defaulted to false regardless of user selection.
- **Clear Plate Prompt Shown for Staged Queue Items** — The prompt now only appears when there are auto-dispatchable items that the scheduler will actually start.
- **Ethernet Badge Shown on WiFi-Only Printers** ([#585](https://github.com/maziggy/bambuddy/issues/585)) — WiFi-only models (A1, P1P, etc.) are now excluded via model-based gating.
- **GitHub Backup Required Cloud Login** ([#655](https://github.com/maziggy/bambuddy/issues/655)) — Removed the cloud auth gate so GitHub backup can be configured and used without Bambu Cloud login.
- **GitHub Backup Log Timestamps Off by 1 Hour** — Timestamps were displayed in UTC instead of the user's local timezone. Now uses `parseUTCDate` for correct conversion.
- **H2D AMS Units Shown on Wrong Nozzle** ([#659](https://github.com/maziggy/bambuddy/issues/659)) — Three bugs in AMS `info` field parsing: decimal instead of hex, wrong bit extraction, and partial updates overwriting full map. All fixed.
- **SD Card Error After FTP Upload** ([#645](https://github.com/maziggy/bambuddy/issues/645)) — The FTP upload skipped the server's 226 "Transfer complete" response, sending the print command before the file was flushed to disk. Now waits for confirmation.
- **P2S Shows Carbon Rod Maintenance Tasks** ([#640](https://github.com/maziggy/bambuddy/issues/640)) — The P2S uses steel shafts, not carbon rods. Added a new `steel_rod` category with appropriate maintenance tasks.
- **Dispatch Toast Stuck After Second Print** — The dedup guard was never reset between batches, leaving the progress toast stuck. Now resets on dismiss and new batch start.
- **Archive Card Buttons Overlapping at Narrow Widths** ([#641](https://github.com/maziggy/bambuddy/issues/641)) — Buttons now clip cleanly with ellipsis instead of overlapping at narrow viewport widths.
- **Debug Logging Banner Timer Shows Negative Time** — Mixed local/UTC timestamps caused negative duration display. Now stores and compares all timestamps in UTC.
- **Non-Bambu Lab Spools Can't Link/Unlink to Spoolman** ([#653](https://github.com/maziggy/bambuddy/pull/653)) — Generates a fallback tag from printer/AMS/tray IDs for spools without RFID identifiers. Also added an "Unlink" button. Contributed by @shrunbr.
- **Spoolman Location Not Updated on Link/Unlink** ([#669](https://github.com/maziggy/bambuddy/pull/669)) — Linking now sets the Spoolman location to printer name, AMS name, and slot number; unlinking clears it. Contributed by @shrunbr.
- **Print Dispatch Toast Disappears Instantly on Fast Uploads** ([#615](https://github.com/maziggy/bambuddy/issues/615)) — The dispatch toast now stays visible for 3 seconds after completion showing a success message before auto-dismissing.
- **Print Modal Shows Busy Printers as Selectable** ([#622](https://github.com/maziggy/bambuddy/issues/622)) — The printer selector now shows live state badges and grays out busy printers in reprint mode. Queue mode still allows selecting busy printers.
- **PWA Install Not Available in Chrome** ([#629](https://github.com/maziggy/bambuddy/issues/629)) — Fixed incorrect icon dimensions, split the `"any maskable"` purpose, and added required screenshots to the manifest.
- **Project Statistics Count Archived Files as Printed** ([#630](https://github.com/maziggy/bambuddy/issues/630)) — Only files with `status="completed"` (actually printed) now count toward completion stats, excluding archived files.
- **Python 3.10 Compatibility** — Added a compatibility shim for `enum.StrEnum` which was added in Python 3.11.
- **Bug Report Bubble Overlapping Toasts** — Moved toast notifications and upload progress above the bug report bubble.
- **Virtual Printer: Bind-TLS Proxy Handshake Failure on OpenSSL 3.x** — Added RSA key exchange ciphers to the client SSL context for compatibility with Bambu printers.
- **Windows: Server Shuts Down After 60 Seconds** ([#605](https://github.com/maziggy/bambuddy/issues/605)) — ffmpeg cleanup broadcast `CTRL_C_EVENT` to the entire process group. Now spawns ffmpeg in its own process group.
- **Multi-Printer Filament Mapping Shows Wrong Nozzle Filaments on Dual-Nozzle Printers** ([#624](https://github.com/maziggy/bambuddy/issues/624)) — The multi-printer filament mapping path was missing the `nozzle_id` filter that the single-printer path already had.
- **Filament Mapping Dropdowns Missing Subtypes** ([#624](https://github.com/maziggy/bambuddy/issues/624)) — Now shows `tray_sub_brands` (e.g. "PLA Basic", "PLA Matte") in all filament dropdowns, with separate dedup entries for different subtypes.
- **Archive Card Shows "Source" Badge for Sliced .3mf Files** — Now checks `total_layers` and `print_time_seconds` metadata to determine if a `.3mf` file is sliced. Also passes the original filename when creating archives.
- **AMS Slot Shows Wrong Material for "Support for" Profiles** — The name parser returned the first material match ("PLA") instead of the one after "Support for" ("PETG"). Both frontend and backend parsers now detect the naming pattern.
- **Firmware Check Shows Wrong Version for H2D Pro** ([#584](https://github.com/maziggy/bambuddy/issues/584)) — Added all known SSDP model codes to the firmware check mapping so raw device codes resolve to the correct firmware track.
- **Spurious Error Notifications During Normal Printing (0300_0002)** — HMS error codes with low 16 bits below `0x4000` are status indicators, not faults. Now skips them in both parsers.
- **Spool Auto-Assign Fails With Greenlet Error** ([#612](https://github.com/maziggy/bambuddy/issues/612)) — SQLAlchemy lazy-loaded `spool.assignments` outside the async greenlet. Now initializes the collection on new spools and eagerly loads it for existing ones.
- **SpoolBuddy Link Tag Missing tag_type** — Now uses the dedicated `linkTagToSpool` endpoint with proper `tag_type` and `data_origin` values.
- **SpoolBuddy AMS Page Missing Fill Levels for Non-BL Spools** — Now fetches inventory assignments and computes fill levels from weight data, falling back to AMS remain when no assignment exists.
- **SpoolBuddy AMS Page Ext-R Slot Falsely Shown as Active When Idle** — Guards against `tray_now=255` (idle sentinel) before ext slot active check.
- **Printer Card Loses Info When Print Is Paused** ([#562](https://github.com/maziggy/bambuddy/issues/562)) — Print progress info now shows for both `RUNNING` and `PAUSE` states. Status label correctly reads "Paused".
- **SpoolBuddy "Assign to AMS" Slot Shows Empty Fields in Slicer** — Fixed version suffix handling in cloud API calls, correct `filament_id` resolution, and `SlotPresetMapping` saving.
- **Virtual Printer Bind Server Fails With TLS-Enabled Slicers** ([#559](https://github.com/maziggy/bambuddy/issues/559)) — Port 3002 now uses TLS for slicer compatibility, while port 3000 remains plain TCP.
- **Queue Returns 500 When Cancelled Print Exists** ([#558](https://github.com/maziggy/bambuddy/issues/558)) — Normalizes `"aborted"` status to `"cancelled"` before storing. A startup fixup converts existing bad rows.
- **Tests Send Real Maintenance Notifications** — Tests now cancel spawned background tasks before mock context exits.
- **Virtual Printer Config Changes Ignored Until Toggle Off/On** — `sync_from_db()` now compares critical fields and restarts VPs when config changes are detected.
- **Sidebar Navigation Ignores User Permissions** — Each nav item is now hidden when the user lacks the corresponding read permission. Also added missing `inventory:*` permissions to the frontend type definition.
- **Camera Button Clickable Without Permission & ffmpeg Process Leak** ([#550](https://github.com/maziggy/bambuddy/issues/550)) — Camera button now requires `camera:view` permission. Added proper process cleanup with background disconnect monitoring and periodic orphan scanning.
- **Windows Install Fails With "Syntax of the Command Is Incorrect"** ([#544](https://github.com/maziggy/bambuddy/issues/544)) — Removed redundant hash verification block that used unparseable multi-line `for /f` syntax.
- **Queue Badge Shows on Incompatible Printers** ([#486](https://github.com/maziggy/bambuddy/issues/486)) — The badge count now applies the same filament compatibility filter as the queue widget.
- **SpoolBuddy Daemon Can't Find Hardware Drivers** — Added `scripts/` to `sys.path` at daemon startup and moved imports inside try/except blocks. Demoted hardware-not-available logs to INFO.
- **SpoolBuddy Scale Tare & Calibration Not Applied** — Fixed five bugs in the tare/calibration chain including missing API endpoints, stale values overwriting new ones, and self-referential factor computation.
- **A1 Mini Shows "Unknown" Status After MQTT Payload Decode Failure** ([#549](https://github.com/maziggy/bambuddy/issues/549)) — Non-UTF-8 MQTT payloads now fall back to `decode(errors="replace")` instead of being silently dropped.
- **H2C Dual Nozzle Variant (O1C2) Not Recognized** ([#489](https://github.com/maziggy/bambuddy/issues/489)) — Added `O1C2` to all model ID maps across backend and frontend, fixing camera protocol, display names, and more.
- **Support Package Leaks Full Subnet IPs and Misdetects Docker Network Mode** — Masks subnet octets, correctly detects Docker network mode, and parses `fun` field from top-level MQTT payload.
- **SpoolBuddy Scale Calibration Lost After Reboot** — Device ID generation now sorts network interfaces alphabetically for deterministic selection across reboots.
- **SpoolBuddy NFC Reader Fails to Detect Tags** — Fixed PN5180 polling state corruption with full hardware reset before each idle poll, and RF cycle before each active poll. Added auto-recovery after consecutive errors.

**## Improved**

- **Shorter Inventory Location Labels** — Location column now shows compact labels like "H2D-1 B3" instead of "H2D-1 AMS-B Slot 3".
- **Higher FTP Timeout Options for Large Files** ([#660](https://github.com/maziggy/bambuddy/issues/660)) — Added 180s and 300s FTP timeout options. The previous 120s max was insufficient for large 3MF files during active printing.
- **Separate Permission for AMS Spool Assignments** ([#635](https://github.com/maziggy/bambuddy/issues/635)) — New `inventory:view_assignments` permission lets users see AMS spool assignments without accessing the full Inventory page.
- **Prometheus Build Info Metric** ([#633](https://github.com/maziggy/bambuddy/pull/633)) — Added `bambuddy_build_info` gauge metric exposing version, Python version, platform, and architecture. Contributed by @sw1nn.
- **i18n: Settings, Smart Plugs, Notifications, Backup/Restore** — Replaced all hardcoded English strings with translation keys across Settings, Smart Plug, Notification, and Backup/Restore components. Added ~600 new keys to all 7 locales.
- **Install Script: Branch Selection** — The native install script now supports a `--branch` option and interactive branch prompt for beta testers.
- **Print Queue Scheduler Diagnostics** ([#616](https://github.com/maziggy/bambuddy/issues/616)) — Added diagnostic logging showing skip summaries and per-printer state details to help diagnose why queued prints aren't starting.
- **SpoolBuddy Settings Page Redesign** — Redesigned with a tabbed layout (Device, Display, Scale, Updates) including brightness slider, screen blank timeout, step-indicator calibration wizard, and update checker.
- **SpoolBuddy Language & Time Format Support** — The kiosk now respects Bambuddy's configured UI language and time format, with full translations for all 6 languages.
- **SpoolBuddy Kiosk Stability** — Disabled swipe-to-navigate gesture and added `video` group for DSI backlight access.
- **SpoolBuddy Touch-Friendly UI** — Enlarged all interactive elements across the kiosk UI for comfortable finger use on the 1024×600 touchscreen, meeting 44px minimum tap targets.
- **Ethernet Connection Indicator** ([#585](https://github.com/maziggy/bambuddy/issues/585)) — Printers on ethernet now show a green "Ethernet" badge with cable icon instead of WiFi signal strength.
- **SpoolBuddy AMS Page Single-Slot Card Layout** — AMS-HT and external spool cards now use a responsive grid aligned with regular AMS card columns.
- **SpoolBuddy Scale Value Stabilization** — Suppresses redundant scale reports (only sends on ≥2g change), increased moving average window, and added frontend 3g display threshold.
- **SpoolBuddy TopBar: Online Printer Selection** — Printer selector now only shows online printers and auto-selects the first available. Auto-switches if selected printer goes offline.
- **SpoolBuddy Assign to AMS Redesign** — Full-screen overlay reusing AMS page components with one-click slot assignment via a single API call.
- **Filament ID Conversion Utility** — Extracted filament_id/setting_id conversion into a shared utility. The `assign_spool` endpoint now correctly sends both `tray_info_idx` and `setting_id`.
- **Updates Card Separates Firmware and Software Settings** — Split into labeled "Printer Firmware" and "Bambuddy Software" sections.
- **SpoolBuddy Test Coverage** — Added 21 backend integration tests and 20 frontend component tests covering all SpoolBuddy API endpoints and main components.
- **Cleanup Obsolete Settings** — Startup migration now deletes orphaned settings keys no longer used by the application.
- **Added HUF Currency** ([#579](https://github.com/maziggy/bambuddy/issues/579)) — Added Hungarian Forint (HUF, Ft) to supported currencies.
- **FTP Upload Progress & Speed** — Reduced chunk size from 1MB to 64KB for smoother progress reporting. Removed post-upload wait that caused 30+ second hangs on H2D. Added transfer speed logging.
- **Wider Print & Schedule Modals** — Increased modal width from 512px to 672px to accommodate long filament profile names.

**## Changed**

- **CI: Node.js 20 → 22** — Updated GitHub Actions workflows to Node.js 22 LTS ahead of GitHub's Node 20 deprecation.
- **Daily Builds Falsely Trigger Update Notification** — The version parser misclassified daily build tags as full releases. Now strips the daily suffix before parsing.
- **License changed from MIT to AGPL-3.0** — To prevent unauthorized redistribution of Bambuddy as a closed-source product. Community contributions and usage are unaffected.

**## Security**

- **Stored XSS via Project Notes** — Project notes rendered with `dangerouslySetInnerHTML` without sanitization. Now sanitized with DOMPurify.
- **Stored XSS via 3MF Description (Sanitizer Bypass)** — Hand-rolled HTML sanitizer allowed attribute injection via quote break-out. Replaced with DOMPurify.
- **Unauthenticated Auth Toggle via Setup Endpoint** — The `/api/v1/auth/setup` endpoint could disable authentication without being authenticated. Now returns 403 when auth is already enabled.
- **PyJWT ≥2.12.0** — Bumped minimum version to address CVE-2026-32597.
- **flatted ≥3.4.0** — Updated transitive ESLint dependency to address GHSA-25h7-pfq9-p65f (unbounded recursion DoS).
- **Access Code Redacted from Support Logs** — Printer access codes in RTSP URLs were not redacted in support bundles. Extended sanitizer to cover `rtsps://` URLs and added access codes to exact-match redaction.

**## Merged Pull Requests**

- [#508](https://github.com/maziggy/bambuddy/pull/508) — feat(queue): show spool grams left in filament slot mapping (@cimdDev)
- [#531](https://github.com/maziggy/bambuddy/pull/531) — Add customizable low stock threshold, add low stock filter (@Keybored02)
- [#561](https://github.com/maziggy/bambuddy/pull/561) — Statistics page: timeframe filtering, new widgets & fix success rate (@aneopsy)
- [#569](https://github.com/maziggy/bambuddy/pull/569) — Printer Page: print button & drop zone on printer card (@aneopsy)
- [#570](https://github.com/maziggy/bambuddy/pull/570) — Feature AMS Info Card (@cadtoolbox)
- [#573](https://github.com/maziggy/bambuddy/pull/573) — Add energy cost to archive card (@Keybored02)
- [#578](https://github.com/maziggy/bambuddy/pull/578) — Fix AMS slot modal infinite scroll loop on Windows (@aneopsy)
- [#580](https://github.com/maziggy/bambuddy/pull/580) — Fix AMS slot modal infinite scroll loop on Windows (@aneopsy)
- [#581](https://github.com/maziggy/bambuddy/pull/581) — Refactor frontend utility functions to reduce duplication (@aneopsy)
- [#625](https://github.com/maziggy/bambuddy/pull/625) — Feature: Force Color Match (@cadtoolbox)
- [#627](https://github.com/maziggy/bambuddy/pull/627) — Sync i18n locales: add 655 translated keys, remove 127 stale keys (@aneopsy)
- [#633](https://github.com/maziggy/bambuddy/pull/633) — feat(metrics): add bambuddy_build_info metric (@sw1nn)
- [#653](https://github.com/maziggy/bambuddy/pull/653) — Non-Bambu Lab Spools: fully link/unlink to Spoolman (@shrunbr)
- [#669](https://github.com/maziggy/bambuddy/pull/669) — Update Spoolman location when linking/unlinking (@shrunbr)
- [#686](https://github.com/maziggy/bambuddy/pull/686) — Properly track filament usage data in Spoolman (@shrunbr)
- [#700](https://github.com/maziggy/bambuddy/pull/700) — Allow SMTP to be configured before auth is enabled (@shrunbr)
- [#710](https://github.com/maziggy/bambuddy/pull/710) — SMTP testing uses saved database settings (@shrunbr)
- [#711](https://github.com/maziggy/bambuddy/pull/711) — Ensures AMS-HT devices are properly identified in Spoolman (@shrunbr)

**## Community Contributors**

- **@shrunbr** — Spoolman integration improvements: non-Bambu spool linking/unlinking, location updates, filament usage tracking, AMS-HT identification, SMTP configuration and testing fixes.
- **@aneopsy** — Statistics page enhancements with timeframe filtering and new widgets, printer card print button and drop zone, AMS slot modal scroll fix, frontend utility refactoring, i18n locale sync, and print dispatch toast fix.
- **@cadtoolbox** — AMS Info Card with custom labels and slot numbers, Force Color Match for queue scheduling, and multiple bug reports for AMS/permission/ethernet issues.
- **@Keybored02** — Customizable low stock threshold with filter, and energy cost display on archive cards.
- **@cimdDev** — Spool grams remaining display in queue filament slot mapping.
- **@sw1nn** — Prometheus `bambuddy_build_info` metric for version tracking and alerting.
2026-03-16 13:02:26 +01:00
2026-03-16 12:29:55 +01:00
2026-01-31 14:31:10 +01:00
2026-03-06 07:27:05 +01:00
2026-02-19 09:59:23 +01:00
2026-02-27 14:53:45 +01:00
2025-12-14 09:36:19 +01:00
2026-03-16 12:29:55 +01:00
2025-12-30 10:58:34 +01:00
2026-03-15 16:02:43 +01:00
2026-02-05 10:28:06 +01:00
2026-02-19 16:32:44 +01:00
2026-02-05 10:28:06 +01:00
2026-03-01 18:28:31 +01:00
2026-03-10 10:31:18 +01:00
2026-02-20 15:28:47 +01:00
2026-02-16 10:57:39 +01:00
2026-02-27 09:48:31 +01:00
2026-02-05 10:28:06 +01:00
2026-02-04 15:54:34 +01:00

Bambuddy Logo

Bambuddy

Self-hosted print archive and management system for Bambu Lab 3D printers

Release License Stars Issues Discord Ko-fi

Features • Screenshots • Quick Start • Documentation • Discord • Contributing


🌐 NEW: Remote Printing with Proxy Mode

Proxy Mode Architecture

Print from anywhere in the world — Bambuddy's new Proxy Mode acts as a secure relay between your slicer and printer:

  • 🔒 TLS-encrypted control channels — MQTT and FTP control fully encrypted
  • 🛡️ VPN recommended — Use Tailscale/WireGuard for full data encryption (details)
  • 🌍 No cloud dependency — Direct connection through your own Bambuddy server
  • 🔑 Uses printer's access code — No additional credentials needed
  • ⚡ Full-speed printing — FTP and MQTT protocols proxied transparently

Perfect for remote print farms, traveling makers, or accessing your home printer from work.

👉 Setup Guide →


Why Bambuddy?

  • Own your data — All print history stored locally, no cloud dependency
  • Works offline — Uses Developer Mode for direct printer control via local network
  • Full automation — Schedule prints, auto power-off, get notified when done
  • Multi-printer support — Manage your entire print farm from one interface

✨ Features

📦 Print Archive

  • Automatic 3MF archiving with metadata
  • 3D model preview (Three.js)
  • Duplicate detection & full-text search
  • Photo attachments & failure analysis
  • Timelapse editor (trim, speed, music) with automatic AVI-to-MP4 conversion for P1-series printers, manual upload & remove
  • Re-print to any connected printer with AMS mapping (auto-match or manual slot selection, multi-plate support, nozzle-aware matching for dual-nozzle H2D/H2D Pro)
  • Plate thumbnail browsing for multi-plate archives (hover to navigate between plates)
  • Archive comparison (side-by-side diff)
  • Tag management (rename/delete across all archives)
  • Print Log — Chronological table view of all print activity with columns for date/time, print name, printer, user, status, duration, and filament. Filterable by search, printer, user, status, and date range. Pagination with configurable page size. Clear button removes log entries without affecting archives.

📊 Monitoring & Control

  • Real-time printer status via WebSocket
  • Live camera streaming (MJPEG) & snapshots with multi-viewer support
  • Streaming overlay for OBS - Embeddable page with camera + status for live streaming (/overlay/:printerId), configurable FPS (?fps=30), status-only mode (?camera=false)
  • External camera support (MJPEG, RTSP, HTTP snapshot, USB/V4L2) with layer-based timelapse
  • Build plate empty detection - Auto-pause print if objects detected on plate (multi-reference calibration, ROI adjustment)
  • Fan status monitoring (part cooling, auxiliary, chamber)
  • Printer control (stop, pause, resume, chamber light)
  • Resizable printer cards (S/M/L/XL)
  • Skip objects during print
  • AMS slot RFID re-read
  • AMS slot configuration (model-filtered presets, K profiles, color picker, pre-population for configured slots)
  • AMS info card (hover for serial number, firmware version) with custom friendly names that persist across printers
  • AMS remote drying — Start, monitor, and stop drying sessions for AMS 2 Pro and AMS-HT directly from the Printers page with filament-based temperature/duration presets; automatic PSU detection and HMS power error reporting
  • Queue auto-drying — Automatically dry filament between scheduled prints when humidity exceeds threshold; configurable presets per filament type, optional blocking mode
  • Ambient drying — Automatically keep filament dry on idle printers based on humidity, regardless of whether prints are queued
  • Configurable drying presets per filament type (temperature & duration for AMS 2 Pro and AMS-HT)
  • Dual external spool support for H2D (Ext-L / Ext-R)
  • HMS error monitoring with history and clear errors
  • Print success rates & trends
  • Filament usage tracking
  • Cost analytics & failure analysis
  • CSV/Excel export

⏰ Scheduling & Automation

  • Background print dispatch — FTP uploads and print-start commands run in the background with real-time WebSocket progress toasts (per-job upload bars, status badges, cancel button)
  • Print queue with drag-and-drop
  • Multi-printer selection (send to multiple printers at once)
  • Model-based queue assignment (send to "any X1C" for load balancing) with location filtering
  • Filament override for model-based queue (swap filament colors/types before scheduling)
  • Filament validation (only assign to printers with required filaments)
  • Per-printer AMS mapping (individual slot configuration for print farms)
  • Scheduled prints (date/time)
  • Queue Only mode (stage without auto-start)
  • Clear plate confirmation between queued prints
  • Smart plug integration (Tasmota, Home Assistant, MQTT)
  • MQTT smart plugs: Subscribe to Zigbee2MQTT, Shelly, or any MQTT topic for energy monitoring
  • Energy consumption tracking (per-print kWh and cost)
  • HA energy sensor support (for plugs with separate power/energy sensors)
  • Auto power-on before print
  • Auto power-off after cooldown

📁 File Manager (Library)

  • Upload and organize sliced files (3MF, gcode, STL)
  • STL thumbnail generation - Auto-generate previews for STL files on upload or batch generate for existing files
  • ZIP file extraction with folder structure preservation
  • Option to create folder from ZIP filename
  • Folder structure with drag-and-drop
  • Rename files and folders via context menu
  • Print directly to any printer with full options
  • Add to queue without creating archive upfront
  • Plate selection for multi-plate 3MF files
  • Duplicate detection via file hash
  • Mobile-friendly with always-visible action buttons

📁 Projects

  • Group related prints (e.g., "Voron Build")
  • Track plates (print jobs) and parts separately
  • Auto-detect parts count from 3MF files
  • Color-coded project badges
  • Bulk assign archives via multi-select toolbar
  • Import/Export projects as ZIP (includes files) or JSON

🔔 Notifications

  • WhatsApp, Telegram, Discord
  • Email, Pushover, ntfy
  • Home Assistant persistent notifications
  • Custom webhooks
  • Quiet hours & daily digest
  • Customizable message templates with per-filament usage details
  • Print finish photo URL in notifications
  • Filament usage and progress in failed/cancelled print notifications
  • HMS error alerts (AMS, nozzle, etc.)
  • Build plate detection alerts
  • First layer complete alert (with camera snapshot)
  • Bed cooled alerts (configurable threshold)
  • Queue events (waiting, skipped, failed)

🧵 Spool Inventory

  • Built-in spool inventory with AMS slot assignment, usage tracking, and remaining weight management
  • Automatic filament consumption tracking: 3MF slicer estimates for all spools (primary), AMS remain% delta as fallback
  • Per-layer gcode accuracy for partial prints (failed/cancelled), with linear scaling fallback
  • Per-spool cost tracking — Set cost/kg on each spool; costs are automatically calculated at print completion and aggregated to archives. Print modal shows real-time cost preview. Configurable default cost and currency in Settings.
  • Bulk spool addition — Add multiple identical spools at once (quantity 1–100) with a single form submission. Quick Add mode for stock spools that only need material, color, and weight.
  • Spool catalog, color catalog, PA profile matching, and low-stock alerts

🔧 Integrations

  • Spoolman filament sync with per-filament usage tracking and fill level display
  • MQTT publishing for Home Assistant, Node-RED, etc.
  • Prometheus metrics - Export printer telemetry for Grafana dashboards
  • Bambu Cloud profile management
  • Local Profiles - Import OrcaSlicer presets (.orca_filament, .bbscfg, .bbsflmt, .zip, .json) without Bambu Cloud
  • K-profiles (pressure advance)
  • GitHub backup - Schedule automatic backups of cloud profiles, k profiles and settings to GitHub
  • External sidebar links
  • Webhooks & API keys
  • Interactive API browser with live testing

🖨️ Virtual Printer & Remote Printing

  • 🌐 Proxy Mode (NEW!) — Print remotely from anywhere via secure TLS relay
  • Emulates a Bambu Lab printer on your network
  • Send prints directly from Bambu Studio/Orca Slicer
  • Configurable printer model (X1C, P1S, A1, H2D, etc.)
  • Archive mode, Review mode, Queue mode, or Proxy mode
  • SSDP discovery (same LAN) or manual IP entry (VPN/remote)
  • Network interface override for multi-NIC/Docker/VPN setups
  • Secure TLS/MQTT/FTP communication

🛠️ Maintenance & Support

  • Maintenance scheduling & tracking
  • Interval reminders (hours/days)
  • Print time accuracy stats
  • File manager for printer storage
  • Firmware update helper with version badge (LAN-only printers)
  • Debug logging toggle with live indicator
  • Live application log viewer with filtering
  • Support bundle generator with comprehensive diagnostics (privacy-filtered)
  • In-app bug reporting — Submit bug reports directly from the UI with optional screenshot (upload, paste, or drag & drop), automatic diagnostic log collection (30s debug capture with printer push), and system info. Reports create GitHub issues via a secure relay. Privacy-first: all logs are sanitized and sensitive data (IPs, serials, credentials) is never included.

🔒 Optional Authentication

  • Enable/disable authentication any time
  • Group-based permissions (80+ granular permissions)
  • Default groups: Administrators, Operators, Viewers
  • JWT tokens with secure password hashing
  • Comprehensive API protection (200+ endpoints secured)
  • User management (create, edit, delete, groups)
  • User activity tracking (who uploaded archives, library files, queued prints, started prints)
  • Per-user Bambu Cloud accounts — Each user has their own independent Cloud login for profiles
  • Advanced Auth via Email — SMTP integration for automated user onboarding and self-service password resets
  • Admin creates users with email — system sends secure random password automatically
  • Users can reset their own password from the login screen (no admin needed)
  • Customizable email templates (welcome email, password reset)

Plus: Configurable slicer (Bambu Studio / OrcaSlicer) • Customizable themes (style, background, accent) • Mobile responsive • Keyboard shortcuts • Multi-language (EN/DE/JA/IT) • Auto updates • Database backup/restore • System info dashboard


🎬 Demo

Bambuddy Demo Video
Click to watch the demo on YouTube


📸 Screenshots

Click to expand screenshots

Printers
Real-time printer monitoring with AMS status

Archives
Print archive with 3D preview and project assignment

Reprint AMS Mapping
Re-print with AMS filament mapping preview

Timelapse Editor
Built-in timelapse editor with trim, speed, and music

Projects
Group related prints into projects

Project Detail
Project detail view with assigned archives

Project Detail Timeline
Project timeline and print history

Queue
Print scheduling and queue management

Schedule Print
Schedule prints for specific date and time

Statistics
Customizable statistics dashboard

Maintenance
Maintenance tracking per printer

Maintenance Settings
Configure maintenance types and intervals

Cloud Profiles
Bambu Cloud filament profiles

Cloud Profiles Edit
Edit filament preset settings

K-Profiles
Pressure advance (K-factor) profiles

K-Profiles Edit
Edit K-factor profile settings

Settings
General configuration and integrations

Smart Plugs
Smart plug control and energy monitoring

Notifications
Multi-provider notification system

API Keys
API keys and webhook endpoints

Virtual Printer Settings
Virtual printer configuration

Slicer Virtual Printer
Virtual printer appears in Bambu Studio/Orca Slicer

MQTT Debug Log
MQTT debug logging for troubleshooting

Quick Power Plug
Quick power plug control in sidebar


🚀 Quick Start

Requirements

  • Python 3.10+ (3.11/3.12 recommended)
  • Bambu Lab printer with Developer Mode enabled (see below)
  • "Store sent files on external storage" enabled in Bambu Studio/OrcaSlicer
  • Same local network as printer

Installation

Option A: Pre-built image (fastest)

mkdir bambuddy && cd bambuddy
curl -O https://raw.githubusercontent.com/maziggy/bambuddy/main/docker-compose.yml
docker compose up -d

Option B: Build from source

git clone https://github.com/maziggy/bambuddy.git
cd bambuddy
docker compose up -d --build

Open http://localhost:8000 in your browser.

Multi-architecture support: Pre-built images are available for linux/amd64 and linux/arm64 (Raspberry Pi 4/5).

macOS/Windows users: Docker Desktop doesn't support network_mode: host. Edit docker-compose.yml: comment out network_mode: host and uncomment the ports: section. Printer discovery won't work - add printers manually by IP.

Linux users: If you get "permission denied" errors, either prefix commands with sudo (e.g., sudo docker compose up -d) or add your user to the docker group.

Docker Configuration & Commands

Environment Variables:

Variable Default Description
TZ UTC Your timezone (e.g., America/New_York, Europe/Berlin)
PORT 8000 Port BamBuddy runs on (with host networking mode)
DEBUG false Enable debug logging
LOG_LEVEL INFO Log level: DEBUG, INFO, WARNING, ERROR

Data Persistence:

Volume Purpose
bambuddy.db SQLite database with all your print data
archive/ Archived 3MF files and thumbnails
logs/ Application logs

Updating:

# Pre-built image: just pull the latest
docker compose pull && docker compose up -d

# From source: rebuild after pulling changes
cd bambuddy && git pull && docker compose up -d --build

Daily Beta Builds:

Beta builds with the latest fixes are pushed regularly to the same beta version tag:

# Pull the current beta
docker pull ghcr.io/maziggy/bambuddy:0.2.2b1
# or from Docker Hub
docker pull maziggy/bambuddy:0.2.2b1

Use Watchtower to automatically update when new daily builds are pushed.

Note: Beta builds use version tags like 0.2.2b1 — they are never tagged as latest. Your stable installation won't auto-update to a beta unless you explicitly pull a beta tag.

Useful Commands:

# View logs
docker compose logs -f

# Stop/Start
docker compose down
docker compose up -d

# Shell access
docker compose exec bambuddy /bin/bash

Custom Port:

ports:
  - "3000:8000"  # Access on port 3000

Reverse Proxy (Nginx):

server {
    listen 443 ssl http2;
    server_name bambuddy.yourdomain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 86400;
    }
}

Note: WebSocket support is required for real-time printer updates.

Network Mode Host (required for printer discovery and camera streaming):

services:
  bambuddy:
    build: .
    network_mode: host

Note: Docker's default bridge networking cannot receive SSDP multicast packets for automatic printer discovery. When using network_mode: host, Bambuddy auto-detects your network subnet and can discover printers via subnet scanning in the Add Printer dialog.

Windows (Portable Launcher)

The easiest way to run Bambuddy on Windows - no installation required:

git clone https://github.com/maziggy/bambuddy.git
cd bambuddy
start_bambuddy.bat

Double-click start_bambuddy.bat and it will:

  • Download Python and Node.js automatically (portable, no system changes)
  • Install dependencies and build the frontend
  • Open your browser to http://localhost:8000

Everything is stored in the .portable\ folder. Use start_bambuddy.bat reset to clean up.

Custom port: set PORT=9000 & start_bambuddy.bat

Manual Installation (Linux/macOS)

# Clone and setup
git clone https://github.com/maziggy/bambuddy.git
cd bambuddy
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# Run
uvicorn backend.app.main:app --host 0.0.0.0 --port 8000

Open http://localhost:8000 and add your printer!

Need detailed instructions? See the Installation Guide

Enabling Developer Mode

Developer Mode allows third-party software like Bambuddy to control your printer over the local network.

  1. On printer: Settings → Network → LAN Only Mode → Enable
  2. Enable Developer Mode (appears after LAN Only Mode is enabled)
  3. Note the Access Code displayed
  4. Find IP address in network settings
  5. Find Serial Number in device info

Note: Developer Mode disables cloud features but provides full local control. Standard LAN Mode (without Developer Mode) only allows read-only monitoring.

Slicer Settings

In Bambu Studio or OrcaSlicer, enable "Store sent files on external storage" so that print files (3MF) are saved to the printer's SD card. Bambuddy needs these files to extract thumbnails and 3D model previews.

  1. Open Bambu Studio or OrcaSlicer
  2. Go to the Device tab for your printer
  3. In Print Options, enable Store Sent Files on External Storage

📚 Documentation

Full documentation available at wiki.bambuddy.cool:


🖨️ Supported Printers

Series Models
X1 X1, X1 Carbon, X1E
H2 H2D, H2D Pro, H2C, H2S
P1 P1P, P1S
P2 P2S
A1 A1, A1 Mini

🛠️ Tech Stack

Component Technology
Backend Python, FastAPI, SQLAlchemy
Frontend React, TypeScript, Tailwind CSS
Database SQLite
3D Viewer Three.js
Communication MQTT (TLS), FTPS

🤝 Contributing

Contributions welcome! Here's how to help:

  1. Test — Report issues with your printer model
  2. Translate — Add new languages
  3. Code — Submit PRs for bugs or features
  4. Document — Improve wiki and guides
# Development setup
git clone https://github.com/maziggy/bambuddy.git
cd bambuddy

# Backend
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
DEBUG=true uvicorn backend.app.main:app --reload

# Frontend (separate terminal)
cd frontend && npm install && npm run dev

See CONTRIBUTING.md for guidelines.


📄 License

AGPL-3.0 License — see LICENSE for details.


🙏 Acknowledgments

  • SpoolEase by yanshay — early inspiration for NFC-based spool tracking and AMS inventory concepts
  • Bambu Lab for amazing printers
  • The reverse engineering community for protocol documentation
  • All testers and contributors

If you like Bambuddy and want to support it, you can buy Martin a coffee.


Made with ❤️ for the 3D printing community

Join our Discord • Report Bug • Request Feature • Documentation

S
Description
Your Bambu Lab. No Cloud. Your Rules. Self-hosted command center for Bambu Lab — from one A1 to an entire print farm.
Readme AGPL-3.0
853 MiB
Languages
Python 40%
TypeScript 34.8%
JavaScript 24.5%
Shell 0.5%
HTML 0.1%