MartinNYHC caea50f2ca Merge pull request #2840 from maziggy/1.2.5.3
**Bambuddy 1.2.5.3**

**What this is**

A feature-and-fix release on top of 1.2.5.2, with four things carrying most of it: the slice dialog gains OrcaSlicer's full process-parameter set, the G-code and model previews are rebuilt on the slicer's own renderer, the H2C's six-hotend nozzle rack can finally be aimed rather than guessed at, and selected categories can be restored from a Git backup commit. Around it are 39 fixes, a heavy run of them on AMS drying, slicing and the queue. Five of the features come from outside contributors. No breaking changes. Several table and column additions are applied automatically on both SQLite and PostgreSQL.

If you are coming from 1.2.5 or earlier, read the 1.2.5 release notes first — all of its upgrade callouts apply to you as well.

**Docker**

docker compose pull
docker compose up -d

**Native install — recommended path**

sudo BRANCH=main /opt/bambuddy/install/update.sh

**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-1.2.5.3-windows-x64-setup.exe from this release page (or the unversioned bambuddy-windows-x64-setup.exe alias). Existing Windows installs upgrade in place via the in-app Install Update flow.

**New**

- Billing and cost centres, with per-print charging and budgets (#1448, contributor @behrinml) — Bambuddy could tell you what a print cost but could not hold anyone to it. There is now a finance layer behind the print flow: cost centres with budgets, per-user wallets, and a transaction for every print. A cost centre can be picked in the print dialog, travels with the queue item and the archive, and is reserved against before the job is dispatched rather than after it finishes, so a print that would take a budget past its limit does not start. Charges settle on real filament usage at completion, and a print that aborts part-way is charged for the part that ran instead of being written off or billed in full. Every user gets a personal cost centre and wallet on first sign-in, including the first sign-in through LDAP, so a directory-backed install does not need them created by hand. A monthly reset day and timezone decide when budgets roll over. The whole feature is behind a billing toggle and is off by default, and an optional printer kill switch stops dispatch entirely once a budget is exhausted. Cost-centre management has its own permissions rather than riding on the settings ones, so a farm can let someone spend against a budget without letting them change it. Ships with a Finance page, migrations for both SQLite and PostgreSQL, and translations in all locales.

- One queue item, several printer models — whichever frees up first (#671, reporter @brainomite; also delivers most of #2570, reporter @NeighborGeek) — With an H2S and an H2C, a job you don't care which machine runs still had to be queued twice: the two printers need different slices, a queue item held exactly one file, and "any H2S" and "any H2C" were separate jobs competing for the same plastic. Whichever started first, you deleted the other by hand. Select both sliced files in the File Manager and press **Print** and you now get **one** queue item carrying both — the scheduler walks them in the order you arranged and takes the first whose model has an idle printer. The many-to-many never leaves the scheduler's selection loop: the moment a candidate wins, its file, plate and nozzle mapping are folded onto the queue row, so the upload, archive creation, print history and reprint all see an ordinary single-file job and behave exactly as they always have. Order is yours to set, because "both are free right now" has to resolve the same way every time rather than following whichever match the matcher happened to see first. Candidates are otherwise tried least-attempted first, so a printer that accepts the file and never starts hands the job to the other machine on the next lap instead of spending the item's whole retry budget on the one - **Billing and cost centres, with per-print charging and budgets (#1448, contributor @behrinml)** — Bambuddy could tell you what a print cost but could not hold anyone to it. There is now a finance layer behind the print flow: cost centres with budgets, per-user wallets, and a transaction for every print. A cost centre can be picked in the print dialog, travels with the queue item and the archive, and is reserved against before the job is dispatched rather than after it finishes, so a print that would take a budget past its limit does not start. Charges settle on real filament usage at completion, and a print that aborts part-way is charged for the part that ran instead of being written off or billed in full. Every user gets a personal cost centre and wallet on first sign-in, including the first sign-in through LDAP, so a directory-backed install does not need them created by hand. A monthly reset day and timezone decide when budgets roll over. The whole feature is behind a billing toggle and is off by default, and an optional printer kill switch stops dispatch entirely once a budget is exhausted. Cost-centre management has its own permissions rather than riding on the settings ones, so a farm can let someone spend against a budget without letting them change it. Ships with a Finance page, migrations for both SQLite and PostgreSQL, and translations in all locales.

- One queue item, several printer models — whichever frees up first (#671, reporter @brainomite; also delivers most of #2570, reporter @NeighborGeek) — With an H2S and an H2C, a job you don't care which machine runs still had to be queued twice: the two printers need different slices, a queue item held exactly one file, and "any H2S" and "any H2C" were separate jobs competing for the same plastic. Whichever started first, you deleted the other by hand. Select both sliced files in the File Manager and press **Print** and you now get **one** queue item carrying both — the scheduler walks them in the order you arranged and takes the first whose model has an idle printer. The many-to-many never leaves the scheduler's selection loop: the moment a candidate wins, its file, plate and nozzle mapping are folded onto the queue row, so the upload, archive creation, print history and reprint all see an ordinary single-file job and behave exactly as they always have. Order is yours to set, because "both are free right now" has to resolve the same way every time rather than following whichever match the matcher happened to see first. Candidates are otherwise tried least-attempted first, so a printer that accepts the file and never starts hands the job to the other machine on the next lap instead of spending the item's whole retry budget on the one that is wedged. The set is validated as a set: one file per printer model (two slices for the same machine are not alternatives, and picking between them arbitrarily would look like a bug the first time it chose your draft profile), every file gated against the model it is offered as, and at least one model that actually has a printer — grouping the H2C slice before the H2C arrives is fine, queueing a job nothing can ever run is not. A cross-model item deliberately holds no file of its own, so deleting one alternative leaves the job and its sibling intact; deleting or trashing every candidate holds it with an explanation instead of failing deep in the upload. Filament overrides offer everything loaded across **all** the candidate models rather than just the first — a spool loaded on only one of them is still a legitimate choice, it simply narrows which candidates can match — while AMS slot mapping is absent exactly as it is on an ordinary "Any [model]" job, because no printer has been picked yet and the scheduler derives the mapping against whichever one it takes. In the queue the job reads **Any H2D / X1C**, naming every model it is waiting on rather than filing itself under one it may never run on, and its waiting reason is given per model (`H2D: Busy: H2D-1; X1C: No matching material/color`), collapsing to a plain busy message — and no notification — when every model is merely printing. The alternatives are fixed once queued: the schedule, quantity and print options stay editable, but assigning a specific printer or narrowing to one model is refused by both the dialog and the API, since an item holding alternatives *and* a printer would dispatch down the fixed-printer path with no file to send. Cancel and re-queue to change the set. Files can also be grouped permanently with **Group as versions**, after which printing any one of them offers the others without re-selecting — this is the grouping and the print-time file matching asked for in #2570, minus its nested File Manager listing. An existing library arrives with its groups already built, from slice provenance Bambuddy has been recording since the Slice button shipped and had never read back. Translated in all locales; wiki updated. Covered by backend and frontend tests.

- Batch orders: a quantity per plate, and an order that knows what it still owes (#342, reporter @cimdDev) — Printing a multi-plate file in different quantities per plate meant queueing each plate separately and tracking the counts yourself, because one shared **Quantity** field cannot say "plate 1 once, plate 2 twice, plate 3 three times". Each selected plate of a multi-plate file now carries its own quantity, and the submission becomes a **batch order** on a new **Batches** tab of the Print Queue page. What that buys is the distinction the old batch could not express: the order records how many runs of each plate were *wanted*, separately from what was queued. A run that fails, is cancelled or is skipped does not satisfy a target, so the order goes on saying it owes a print instead of quietly under-delivering — and a **Queue remaining** action re-queues exactly what is missing, for the whole order or one plate. Those new items are copied from the most recent run of that plate, so they inherit the printer or model target, AMS mapping, filament overrides and print options already chosen, and they are appended to the end of the relevant printer's queue rather than jumping ahead of work already lined up. Orders show progress against target, per-plate breakdown, and cost. Cost is measured rather than estimated: each finished run's material and energy are attributed through the queue item that produced them, so an unrelated reprint of the same file never lands in an order's total, and a multi-plate order gets each plate's own cost rather than the whole file's. Before any run has completed there is no honest figure, so cost reads as unknown instead of a fabricated `0.00`. An order becomes **completed** the moment its last run lands rather than whenever someone next opens the page, and raising a target on a finished order reopens it. Targets stay editable while the order runs, since production requirements change mid-job. The default flow is unchanged — creating an order still queues all of it immediately, and a single-plate file still has one Quantity field. Batches created before this release keep working and are labelled **Grouping only**: they only ever knew what was queued, not what was wanted, so they report progress but have nothing to dispatch. They also get closed out on the first start after upgrading — `completed` was not a reachable status before now, so every batch created since grouping shipped is still marked active however long ago its last print finished, and without that pass the new tab would open on months of accumulated history. Only batches with nothing queued or printing are touched: those whose runs all completed become completed, and groupings whose items were all cancelled become cancelled, which is what they are — calling them completed would claim output that never happened. Batches with neither queue items nor targets are no longer listed at all; those are empty shells left behind when a grouping's items were deleted with their source archive. Translated in all locales; wiki upd
ated. Covered by backend and frontend tests.

- Nest projects under a master project and roll their figures up (#1264) — Projects were flat. The `parent_id` column and the sub-project list already existed but nothing outside the API could set a parent, and a master project's statistics only ever covered its own prints. The project dialog now has a parent picker, and a project with sub-projects gets a second card covering the whole tree: jobs, parts, time, filament, cost, and progress against every target in the tree added together. That card is deliberately separate from the project's own stats, which keep their existing meaning — widening them would have restated the figures of anyone who had already nested projects over the API. Each listed sub-project carries its own branch's roll-up, so the rows add up to the card above them. On the Projects page a sub-project is drawn inside its parent's group rather than as another card in the grid, because two cards columns apart cannot show that they belong together whatever the caption says. Translated in all locales; wiki updated.

- Keep the chamber warm between prints and skip a soak that is not needed (#2727, contributor @ticfinack) — Back-to-back prints in chamber-heated materials — ASA, ABS, PA, PC — each paid a full heat soak from cold, even when the print that just finished had left the chamber at temperature. Two changes remove that cost. While a printer sits in FINISH waiting for plate-clear and the next queued item needs chamber heat, the bed is held hot so the chamber does not cool during the bed-clearing window. The bed is the chamber's heating element here rather than a print surface, so the hold runs at the new **Keep-warm bed temperature** (90 °C by default, which also satisfies the aftermarket chamber heaters that trigger off a bed threshold) and rises to the item's own bed temperature when that is higher. It is gated on the keep-warm setting, on plate-clear being required, and on the next item actually needing the heat, and it is capped by a maximum duration so a queue that stalls does not leave a bed hot indefinitely. A follow-up closed the two dispatch exits that could drop the hold without releasing it — a claim failure returns before the rollback opens, and a vanished row left the printer id unset, which the rollback guards on — either of which left a bed hot with nothing tracking it, reachable whenever a cancel or delete landed between selection and the claim.
- Restore selected categories from a Git backup commit — Bambuddy has pushed backups to GitHub, GitLab, Gitea and Forgejo for a while; now it can read one back. Pick a commit, preview what it holds, choose which categories to restore (#2656, contributor @jmoore-skild).
- Edit the full print-parameter set from the slice dialog — the dialog now carries OrcaSlicer's own process tree, with its pages, groups, tooltips and ranges, and evaluates the slicer's own enable/disable rules. Slicing no longer means taking a preset exactly as it comes.
- A new G-code and model preview — the vendored PrettyGCode iframe is gone, replaced by libvgcode, the renderer OrcaSlicer draws its own preview with. Real occlusion instead of screen-space lines, and it is themed and translated like the rest of the app. The model preview was rebuilt alongside it, with proper framing and lighting.
- Choose which rack nozzle each filament prints from on an H2C (#1784) — the Vortek rack holds six hotends and the choice is not recorded in the 3MF, so plates went out with no assignment and the printer picked for itself. Every rack-bound filament now has a position picker showing all six and the nozzle each holds.
- Home Assistant sensors on the printer card, with an optional print interlock (#1148, reporter @bsaunder; #448, reporter @baudneo) — surface HA entities on the card, and optionally block a print from starting when one of them says not to.
- The Print Log shows how much filament a run used, and lets you choose its columns (#2636, reporter @ajbastien).
- Auto-orient and auto-arrange when slicing server-side (#2548, reporter @ceokingcobra).
- Open a File Manager model in your desktop slicer, and pick which one from the 3D preview (#2725, contributor @pascalheidmann).
- Server-side slicing on an ARM64 host (#1900, contributor Felix Reissmann) — an override pins the sidecar to amd64 and runs it under emulation, with the binfmt requirement and the three-to-six-times slowdown stated up front. A separate x86_64 machine is still the recommendation.
- Temperatures on the streaming overlay, and a builder for its URL (#1422, reporter @SMAW).
- Open a multi-plate sliced file on the plate you asked for — the viewer gains a plate switcher and keeps the choice in its URL, and filament colours follow it instead of always coming from the first plate.
- Show the plug that actually powers the printer in the card's Power row (#2830) — which plug filled that row was previously decided by nothing at all, so it could land on an enclosure fan and offer to switch the printer off by cutting it.
- The Printers page remembers its status and location filters (#2833) — the only two preferences on that page that were not persisted.
- The external spool can be hidden from the printer card (#1782, reporter @Arn0uDz).
- Uploaded archives can be named after the filename you sent (#2610, contributor @Person2099).
- The chamber temperature limit is raised from 60 to 65 °C (reported on Discord).
- The Spool Inventory can be sorted by colour rather than by colour name (#2729, reporter @macwhiz).
- API keys can read and run slicer pipelines (#1425) — every pipeline endpoint answered 403 to a key whatever scopes it carried. Running a pipeline requires the queue and library-manage flags together, and a 403 now names every flag the key is short of.
- API clients can resolve user ids to names (#1894) — archives, the queue and statistics report ownership as a numeric id, and nothing let a key discover whose id was whose without an admin listing.
- Forgejo tokens scoped to a single repository are accepted (#2775) — a repository-scoped v15 token was rejected for failing a user lookup it does not need to pass.
- The MQTT debug log records the commands sent to a printer, not only what it reports back.
- Queue items created from the Library's bulk Add to queue and through the webhook API now record who created them, so own-work permissions can see them.

**Fixes**

**H2C and multi-nozzle:**

- An H2C levelled on one hotend and printed with another, several millimetres above the plate (#2800). A print command names the rack nozzle by physical position rather than by extruder index, and Bambuddy only ever had that position for jobs arriving through the Virtual Printer — everything else omitted the field and let the firmware choose. Two hardware-derived values were then corrected by the reporter's own A/B on real hardware, and the fixed/rack carriage assignment turned out to be inverted.
- An H2C refused a multi-colour print outright with HMS 0500-4047, a hotend mismatch: on a rack machine the slicer writes a filament group per nozzle rather than per carriage, so a three-group plate lost a filament against a two-entry map.
- The H2C nozzle rack card sizes itself to its contents instead of claiming several hundred pixels and leaving them empty, numbers its slots 1 to 6, and scales its chips with the card size.

**AMS, drying and filament:**

- AMS drying was torn down and restarted once per scheduler tick while a plate sat unacknowledged — about 2000 state changes over ten days, with no cycle ever running long enough to remove moisture, and hand-started cycles on other units of the same printer torn down with them (#2801).
- Auto-drying re-armed into a threshold it could never reach (#2770) — an AMS reads a higher humidity warm than cold, so the reading at the moment a cycle ended always armed the next one. Five twelve-hour cycles inside four hours.
- A drying cycle the printer abandons now says so, and says what the printer reported (#2770, reporter @tchavei).
- A drying cycle no longer reports itself finished a minute after it starts (#2759).
- The drying badge invented a temperature on a uniformly loaded AMS, showing the spools' RFID recommendation rather than the temperature that was picked (#2759 follow-up).
- The drying popover no longer starts a cycle under a material you did not pick (#2774).
- The nearest filament colour is picked instead of the first eligible one in tray order, and the ranking is perceptual — RGB distance overweights blue badly enough to invert the answer (#2804, #2823, contributor @grolmus). Filament type matching also agrees between the interface and the scheduler now.
- Spoolman no longer charges a Bambu Studio print to the wrong spool (#2768).
- "Any X2D" works on a printer that feeds from external spools instead of an AMS (#2771, reporter @Nick-C130).
- AMS Filament Backup no longer charges a whole print to the substitute spool — everything needed to split the filament across the trays it actually came from lived only in memory, so a print that outlived a restart lost it.
- The print dialog pools AMS Filament Backup spools in its filament check, instead of refusing a job against one slot while an identical full spool sat in the next one.
- A refused AMS filament setting now says so in the log (#2756, reporter @Jostxxl).
- Configuring an AMS slot shows up on the printer card straight away, without a page reload.

**Queue and dispatch:**

- A completion for one print closed another print's queue item, marking it completed while the printer was still working and stranding the rest of its batch (#2829). The check that fixes it also had to learn that the printer rewrites the name it echoes back, which had left queues stopped until someone cancelled by hand.
- Deleting a library file destroyed the jobs queued against it — silently on PostgreSQL, and as "Library file not found" days later on SQLite (#2819).
- A library-backed job was dispatched onto a spool that could not finish it: 20.5 g needed, 9 g loaded, no deficit reported (#2779). Slicer pipeline jobs and everything from the Library's bulk add were affected.
- A job queued to a printer class never powered a printer on, while the same file pinned to a specific printer did (#2786).
- A print that never starts now says AMS drying was running, instead of blaming the SD card (#2758).

**Slicing and previews:**

- A slice failed on a model whose name contains a slash — a MakerWorld title arrives with its punctuation and was used verbatim as a folder name (#2832).
- A slice of a file on a network share was written to managed storage instead, showing up in the right folder in the interface and never reaching the share (#2810).
- A 3MF no longer switches off supports its process preset turned on (#2820) — the carry that lets a project's support configuration survive was running in both directions.
- An oversized model reads as an oversized model, not a slicer crash (#2802). The advice to update the sidecar was wrong too: it named a bare compose pull, which skips the profile-gated sidecar silently.
- A preview slice no longer gives up on custom G-code the sidecar cannot parse — the silent fallback to guessing from painted faces was dropping a whole filament slot.
- Bundled presets resolved their start G-code to a generic block: all 56 instantiable BBL machine presets, producing a print that heats the bed, moves the toolhead and extrudes nothing.
- The process-settings panel shows the preset's own values instead of the compiled-in defaults, and names which of four causes applied when it cannot read them.
- Server-side slicing is no longer offered for STEP files, which neither slicer can load from its command line. Open in Slicer still hands them to the desktop application.

**Printers, archives and connection:**

- Archives arrived empty from printers whose file service could not answer (#2780). Two faults: H2-series and P2S firmware can keep the sliced file on internal storage, which port 990 cannot reach — the print command says which, and we discarded it and swept anyway, around 110 doomed connections per print. And a printer whose FTPS handshake wedges now gets a five-minute cool-off instead of being retried hundreds of times a minute; one reporter's log carried 1813 identical failures, another's 3511.
- Photos and filament accounting on archives that arrive without a 3MF, which on an H2S is any job started from the printer's own library (#1820). Photos were written in one place and looked for in another, and the fallback that stands in for a missing 3MF could charge nothing without a word.
- The printer card thumbnail is back after navigating away and returning (#2826) — a cache hit raced the mount effect, which is why it reproduced every time for the reporter and never here.
- Live updates stopped arriving while the Bambuddy tab was in the background (#2754, reporter @mic4rd).
- A print stage Bambuddy cannot name is now logged at INFO, once per stage number per session, with the context needed to name it afterwards.

**Interface:**

- Interactive controls show a pointer cursor again (#2791) — Tailwind v4 dropped the base rule and only 15 of 934 buttons had it written by hand.
- The Spool Inventory header no longer scrolls the whole page sideways on a phone (#2813).
- The Virtual Printer card header wraps instead of painting outside its border (#2808).
- A refused frame no longer leaves the browser's own error page inside Bambuddy's layout, and says which header blocked it (#2787).
- Form controls follow the page's colour scheme — steppers, calendar buttons, dropdowns and scrollbars were drawn light on every theme.
- The L and XL printer cards scale their text and icons, not just their width (#1848, reporter @misterff1).
- The bug-report button no longer covers the controls in the bottom-right corner (#2750, reporter @goodjaltman).
- Error and warning toasts stay up twice as long.
- The Print Log is reachable again once you have no archives, and its cost and energy figures reach the browser at all.
- The Docker update command is copyable, and knows where your compose file lives (#2664, reporter @pchulpjoost).
- The Slicer Bundles notice is gone from Settings — bundle import was withdrawn in 0.2.5 and the panel had been sitting there since, unactionable.

**Login, deployment and integrations:**

- LDAP login works again on directories that define no POSIX group class (#2769, reporter @peterskotte).
- A hand-written systemd service left the Virtual Printer unable to start, with nothing obvious to blame (#2549, reporter @Ru3ck3).
- Bambu Cloud's anti-robot challenge is explained instead of repeated back as a bare error with nothing to click (#2790).
- Home Assistant notifications carry nested data through unchanged (#1441).

**Security (dependencies)**

- Cleared every remaining npm audit and pip-audit finding. react-router and react-router-dom move to 7.18.2, which retires the documented CSRF exception in the CI audit gate — upstream backported the fix, so the exemption lapsed on its own and the allowlist is now empty. dompurify moves to 3.4.13 (shipped, but on a path this app never reaches: no hooks registered, in-place mode unused). js-yaml and nanoid are overridden, both development-only via eslint and postcss.
- Patched two build-time frontend dependencies flagged by npm audit (GHSA-r28c-9q8g-f849, GHSA-mh99-v99m-4gvg, GHSA-rgw5-rvv9-x895).

---
**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
2026-08-15 16:13:31 +02:00
…
2026-08-15 15:39:03 +02:00
…
2026-08-09 10:00:53 +02:00
2026-08-15 10:41:03 +02:00
2026-08-15 16:04:05 +02:00
2026-08-11 12:46:12 +02:00
…
…

Bambuddy Logo

Bambuddy

Your printers. No cloud. Your rules.
Self-hosted command center for Bambu Lab — from one A1 to an entire print farm.

Release License Stars Issues Discord GitHub Sponsors Sponsors Portal Ko-fi

Backed by
North Pole 3D Printing

🎮 Try the Live Demo • Features • Screenshots • Quick Start • Documentation • Discord • Contributing

Live Demo
Spin up your own private Bambuddy in ~10 seconds — no install, no signup, 30-minute session.


"Bambuddy is the companion app that Bambu Lab should have built from day one." — Adam Conway, XDA-Developers

Hackaday XDA-Developers How-To Geek MakeUseOf Fabbaloo It's FOSS Igor's Lab 3Druck FastBlinker

Two leading 3D-printing publications independently concluded that Bambuddy's feature set already exceeds Bambu's own cloud:

"The features seem to exceed those provided by Bambu Lab's own cloud." — Fabbaloo

"The list of functions seems so extensive that it even goes beyond what Bambu Lab offers in its own cloud." — 3Druck.com

📄 See all press coverage →


🌐 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:

  • 🔒 End-to-end TLS encryption — FTP, file transfer, and camera are transparently proxied with the printer's real TLS certificate
  • 🛡️ Optional Tailscale integration — per-VP toggle + Docker socket mount surface the host's Tailscale IP on the VP card, so you know which 100.x.x.x to paste into the slicer when you want a virtual printer reachable over your tailnet (setup). Bambuddy's self-signed CA import is still required on the slicer side: Bambu Studio / OrcaSlicer validate printer TLS against a bundled BBL CA (not the system trust store), and their Add Printer dialog is IP-only (no hostname to match an LE cert against), so a publicly-trusted cert can't help on either dimension. Tailscale's role is the private tunnel (reachability from anywhere, no port forwarding), not cert-import elimination.
  • 🌍 No cloud dependency — Direct connection through your own Bambuddy server
  • 🔑 Uses printer's access code — No additional credentials needed
  • ⚡ Full-speed printing — Transparent TCP proxy, only MQTT is decrypted for IP rewriting

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

👉 Setup Guide →


🍰 NEW: Integrated Slicing — Slice & Print, All In One Place

No desktop slicer required. Drop an STL or 3MF into Bambuddy's File Manager, hit Slice, and the result lands as a ready-to-print .gcode.3mf in the same folder — without ever opening Bambu Studio or Orca Slicer.

  • 🍰 One-click slicing — Slice from any browser. The job runs server-side in a tiny sidecar container, progress streams back as a toast, and the sliced file appears in your library when it's done.
  • 📱 Slice from your phone or tablet — Bambuddy's PWA + the new server-side slicer means you can drop an STL in from mobile and queue a print without ever touching a desktop.
  • 🎒 Bring your own profiles — Import a Printer Preset Bundle (.bbscfg) exported from Bambu Studio: pick a curated printer + process + filament triplet from a dropdown in the Slice dialog, no more juggling JSON files.
  • 🔄 Re-slice for a different printer in one click — Open any sliced archive in Bambuddy and re-slice it for any printer, including across the single-nozzle ↔ dual-nozzle (H2D / H2D Pro) boundary that BambuStudio's CLI would normally reject. Bambuddy detects the class change and auto-arranges objects laid out for the source bed (e.g. X1C 256×256) so they land safely on the target (e.g. H2D 350×320 with its per-nozzle dead zones).
  • 🍱 Slice all plates at once — Multi-plate projects (parted statues, multi-part kits) get a "Slice all N plates" toggle in the Slice dialog. One click produces a single .gcode.3mf containing every plate's gcode, ready for the printer. The toast shows "Plate 2 of 5 — Generating G-code (47%)" as the loop runs.
  • 🔁 Same dispatch as the rest of Bambuddy — The sliced output flows into the existing queue / plate-picker / AMS-mapping path, so all the regular conveniences (multi-printer dispatch, AMS routing, scheduled prints) just work.

Optional but recommended — drop the slicer-api/ Compose stack next to your Bambuddy install and the Slice button lights up everywhere.

👉 Slicer Integration Guide →


🧩 NEW: Slicer Pipelines — Save a Recipe, Reuse in One Click

Stop re-picking the same printer + process + filament + bed-type combination every slice. Save a Slicer Pipeline once from the Slice dialog, then apply the whole bundle to any file with a single click — from File Manager, Archives, or MakerWorld imports.

  • 🧩 One-click reuse — A pipeline captures the entire Slice modal selection (printer + process + per-AMS-slot filaments + bed type) and surfaces as Run with pipeline → <name> on every sliceable row.
  • 🎯 Specific printer or printer class — Pin a pipeline to one printer, or to a class (e.g. any X1C) and let the queue scheduler pick the first available match. Identical-fleet farms get a single recipe instead of one-per-printer.
  • 🪢 Multi-copy fanout — Slice once, dispatch up to N copies. With class targeting the copies fan out across the matching printers in parallel — Spread (fastest wall-clock), Single printer (minimise colour-change overhead), or First N (one to each).
  • 📊 Runs dashboard — A new Pipelines tab on the Print Queue page lists every run with colour-coded status badges (queued / slicing / dispatching / in-progress / completed / partial-failure / failed / cancelled), per-copy detail on expand, filter dropdowns (Pipeline / Status / Target), and a Retry failed button that re-runs only the copies that didn't complete — successful copies are never re-printed.
  • 🔒 Permission-gated — Three permissions (pipelines:read / pipelines:write / pipelines:run) let you split authoring the recipe from spending filament with it.

👉 Slicer Pipelines 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, Filament Track Switch (FTS) support — when the FTS accessory is installed the per-nozzle filter is suppressed since the FTS routes any AMS slot to either extruder)
  • 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)
  • Per-archive print history — Each archive card shows an N prints badge whenever a model has been printed more than once (reprint + failed retries all counted). Click the badge for the full per-archive Print Log — every individual run with date, status, duration, filament used, cost, and failure reason. Reprints contribute new rows so a failed retry never overwrites the source archive's data — the original 100 g successful print stays visible alongside the 10 g failed reprint, and Quick Stats add up to 110 g across both events.
  • 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
  • Print progress in the browser tab — optional (off by default, toggle under Settings → Appearance): shows the soonest-finishing print's percentage in the tab title and a progress-ring favicon in your theme accent colour
  • Live camera streaming (MJPEG) & snapshots with multi-viewer support — most Bambu printers only allow one upstream connection, so Bambuddy fans out a single shared stream to all browser tabs / cards / overlays
  • Cam Wall view — Toggle the Printers page from cards into a responsive grid of camera tiles for at-a-glance monitoring across the whole farm. On-screen tiles stream live up to a configurable cap (default 4) so RPi installs stay sustainable; the rest fall back to periodic snapshot polling, and off-screen tiles pause entirely. Per-user settings (live cap, snapshot interval); click any tile to open the floating viewer or the dedicated camera window depending on your existing camera-view preference
  • Long-lived camera tokens for Home Assistant / Frigate / kiosks — mint a token from Settings → API Keys, paste it once, capped at 365 days, revocable at any time (no infinite tokens — leaked permanent tokens are unsafe by design)
  • 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 monitoring and speed control for part-cooling, auxiliary, and chamber fans (0–100% with customizable quick-select presets)
  • Printer control (stop, pause, resume, chamber light, print speed, airduct mode for P2S/H2*, temperature setpoints for nozzle / bed / chamber heater on H2C/H2D/H2DPro/H2S/X2D, Z-jog / XY-jog / extruder jog, customizable temperature & fan presets under Settings → Workflow)
  • Status badges on printer card: SD Card (green / red), Enclosure Door (green / yellow — X1/P1S/P2S/H2*), Airduct Mode (cooling / heating)
  • Force Refresh menu item — request a full status push from the printer without reconnecting
  • Maintenance Mode — put a printer "out of service" without removing it. Toggle from the card's three-dot menu, the in-card amber banner, or the Edit Printer dialog; the printer disconnects MQTT, drops out of queue dispatch, the scheduler, model-based filament lookups, metrics, and notifications until you take it out again. The card stays visible (amber wrench banner + Exit button) so the printer never disappears from your dashboard. Useful for parallel Bambuddy installs sharing the same hardware, printers under repair or awaiting parts, and temporary suspension.
  • Bulk printer actions (multi-select cards, then stop/pause/resume/clear all — select by state or location)
  • Printer search and filters — live search by name/model/location/serial plus status and location dropdown filters (WebSocket-reactive, mobile-friendly)
  • Resizable printer cards (S/M/L/XL)
  • Skip objects during print
  • AMS slot RFID re-read
  • AMS slot Load / Unload from the printer card — Hover any AMS slot or external spool, click the menu button, and load that tray or unload the currently-loaded one without going to the touchscreen; supports dual-extruder H2D (Ext-L / Ext-R drive their own nozzle)
  • AMS Filament Backup status + control with pair view — Mirrors BambuStudio's per-printer "AMS Filament Backup" auto-switch (when a spool runs out, the printer rolls over to a same-preset, same-colour spool in another slot). A small badge in the Filaments section header on each printer card shows the live state (blue circular-arrow icon = ON, dim = OFF, "?" = A1 family with no cfg field yet); click to open the AMS Filament Backup modal — a BambuStudio Auto Refill-style ring graphic per backup pair, with the filament colour as the ring fill and member slot labels (e.g. A·1, B·3) on contrast-aware pills around the band. Dual-extruder printers (H2D / H2C / X2D) carry an R / L badge per ring because the firmware can't cross extruders. State syncs in real time whether you toggled from Bambuddy, BambuStudio, or the printer's touchscreen. Bambuddy's "insufficient filament" check is backup-aware: when Backup is ON, the deficit check pools remaining grams across same-(preset, colour) spools on the printer, so the warning doesn't fire spuriously when the firmware will swap to a peer mid-print (#1762). Bambuddy's Prefer Lowest Remaining Filament sort also respects the toggle — when Backup is OFF the dispatcher skips the prefer-lowest sort entirely so it won't reach for a near-empty spool the printer can't roll off of.
  • 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, optional spool rotation; automatic PSU detection and HMS power error reporting. Rotate-spool toggle is disabled per-AMS when any tray has filament threaded into the feed tube (the AMS mechanism is locked there — rotating would jam the filament)
  • 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
  • Continue drying while printing — On capable hardware (H2D 01.03.00.00+, H2C / H2S / P2S / H2D Pro 01.02.00.00+, X2D / A2L 01.01.00.00+, X1C 01.11.02.00+), auto-drying can keep running during a print. Default off, opt-in toggle in Settings → Print Queue. Drying temperature is automatically capped 5°C below the idle preset (floor 40°C) to protect spools inside the hot enclosure
  • Configurable drying presets per filament type (temperature & duration for AMS 2 Pro and AMS-HT)
  • Per-filament humidity threshold — Set a different humidity trigger per filament type (e.g. Nylon at 20%, PLA at 60%, ASA at 30%) instead of one global value. Mixed-material AMS units use the most-restrictive threshold across the loaded spools so a single PLA + Nylon unit triggers at Nylon's level. Drives both the auto-drying scheduler and the hourly humidity alarm so the two can never disagree on whether a unit is "too humid"
  • Dual external spool support for H2D (Ext-L / Ext-R)
  • HMS error monitoring with one-click actions — Live HMS error log with history and the same Resume / Stop / Continue / Retry / Check Assistant / Don't Remind Me action buttons BambuStudio shows. Click and the matching MQTT command goes back to the printer — no more walking to the device just to dismiss a paused-print dialog. Catalog covers every Bambu model (X1 / P1 / A1 / H2 series); buttons are translated in all 13 supported locales
  • Heater history charts — Bambuddy logs nozzle, bed, and chamber readings every minute and surfaces them via a tiny chart icon on each heater tile in the printer card. Click for a per-heater modal with current / average / min / max stats, target overlay, and a 6h / 24h / 48h / 7d time range — works on read-only chamber sensors (X1C / P2S) too. AMS humidity and temperature get the same treatment (already shipped).
  • Print success rates & trends
  • Filament usage tracking
  • Cost analytics & failure analysis
  • AI print-failure detection — Optional integration with a self-hosted Obico ML API: watches each running print's camera feed, smooths scores over time (30-frame warmup + EWM + rolling means), and fires a configurable action once per print (notify / pause / pause-and-off)
  • Per-user statistics filtering (admin permission gated)
  • CSV/Excel export

⏰ Scheduling & Automation

  • Unified dispatch through the queue — Every print Bambuddy starts (File Manager, archive reprint, printer-card upload-and-print, scheduled queue items) flows through the same queue scheduler, so each print is visible on the queue page, attributable to the user that started it, deficit-checked, and cancellable from one place. FTP uploads and print-start commands run in the background with real-time WebSocket progress toasts (per-job upload bars, status badges, cancel button). Installations with custom groups or API keys: the immediate-print actions now require the queue:create permission alongside the existing printers:control — see the permissions guide if you've granted control without queue-create
  • Print queue with three tabs (Queue / History / Timeline), multi-select drag-and-drop, batch grouping, and a Gantt-style timeline
  • Multi-printer selection (send to multiple printers at once)
  • Batch grouping — multi-plate prints auto-group into a collapsible row; any 2+ selected items can be grouped manually via "Group as batch", with ungroup on the batch parent
  • Batch print quantity (print multiple copies — set quantity in the print/schedule dialog, first copy prints immediately, rest are queued)
  • Staggered batch start (start printers in groups with configurable interval to avoid power spikes — works in both Print and Queue dialogs)
  • Configurable default print options (bed levelling, flow/vibration calibration, first layer inspection, timelapse) in Settings → Workflow
  • 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)
  • Prefer lowest remaining filament (consume partial spools first when multiple match)
  • Per-printer AMS mapping (individual slot configuration for print farms)
  • Scheduled prints (date/time)
  • Shortest Job First scheduling (SJF toggle on queue page — scheduler picks shorter prints first, with starvation guard)
  • Queue Only mode (stage without auto-start)
  • Clear plate confirmation between queued prints (can be disabled in settings for farm workflows)
  • Auto-print G-code injection (per-model start/end snippets for Farmloop, SwapMod, AutoClear, Printflow 3D — toggle per queue item)
  • Preheat & Heat Soak before queued prints — Heat the bed (and the chamber, on supported printers) and hold at temperature between FTP upload and print start. Per-print Inherit / On / Off override in the Print Options panel; per-filament chamber-target map under Settings → Workflow so PA wants 50°C, ABS 45°C, PETG-CF 40°C, PLA 0°C (skips chamber phase automatically). Hardware-aware: H-series / X2D / X1E actively heat the chamber via M141; X1C / P2S rely on bed radiation with a chamber-sensor wait; P1S / P1P / A1 family have no chamber sensor so only the soak timer applies. The cooling/heating airduct flap on H-series / X2D / P2S auto-switches to match the resolved chamber target — preheat for ABS opens nothing and recirculates warm air; preheat for PLA opens the exhaust and vents — so engineering filaments actually reach target instead of fighting the open flap, and PLA prints don't inherit a previously-hot recirculation. M191 (wait-for-chamber-temp) isn't honoured by Bambu firmware, so doing this at the orchestration layer is the only place it works
  • Smart plug integration (Tasmota, Home Assistant, MQTT, REST/Webhook)
  • REST smart plugs: Control any device with an HTTP API (openHAB, ioBroker, FHEM, Node-RED) with separate power/energy URLs and unit multipliers
  • MQTT smart plugs: Subscribe to Zigbee2MQTT, Shelly, or any MQTT topic for energy monitoring
  • Energy consumption tracking (per-print kWh and cost) — restart-resilient: mid-print backend restarts no longer lose per-print energy
  • Energy statistics by date range (Today / Week / Month / …) in total-consumption mode via hourly lifetime-counter snapshots
  • 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)
  • External folder mounting - Mount host directories (NAS, USB, network shares) without copying files. Operator-controlled via the BAMBUDDY_EXTERNAL_ROOTS env var (colon-separated allowlist of host paths users are permitted to register; empty by default to disable the feature). See Docker → External library folders.
  • 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
  • Server-side Slice button (optional) — slice STL/3MF without a desktop slicer when the slicer-api/ Compose stack is running; the result lands as a new .gcode.3mf in the same folder, with progress shown via a toast tracker that follows the job to completion. Supports importing Bambu Studio Printer Preset Bundles (.bbscfg) so a curated printer + process + filament triplet can be picked in the Slice dialog without re-uploading JSON profiles (details)

🌍 MakerWorld Integration

  • Paste any makerworld.com/models/… URL → preview, plate picker, and import without leaving Bambuddy
  • Per-plate Save or Save & Slice in Bambu Studio / OrcaSlicer (your preferred slicer from Settings)
  • Import all plates button for multi-plate models
  • Auto-creates a "MakerWorld" folder in File Manager; override with any existing folder via the picker
  • Per-plate image gallery with keyboard-navigable lightbox
  • Recent imports sidebar — last 10 MakerWorld imports with one-click jump to File Manager or slicer
  • Remove-from-library for imported plates with confirm modal (no LAN cookie paste, no browser extension)
  • Reuses your existing Bambu Cloud login — no separate OAuth flow or browser extension to install

📁 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
  • Project URL + cover photo — paste a MakerWorld/Printables/Thingiverse link and upload a hero image so each card is immediately recognisable; the URL renders as a one-click link beside the project name
  • Bulk assign archives via multi-select toolbar
  • Import/Export projects as ZIP (includes files) or JSON
  • Print or queue files from linked library folders directly in the project view (resulting archive auto-linked to the project)

🔔 Notifications

  • WhatsApp, Telegram, Discord
  • Email, Pushover, ntfy (with per-event priority — Min / Low / Default / High / Urgent)
  • 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
  • Missing spool assignment warning — Toast and push notification when a print starts with unassigned AMS trays
  • 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
  • Mid-print spool reassignment support: uses live assignment if changed during print, snapshot otherwise
  • 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
  • Multi-colour gradients, transparency, and visual effects — Paste a comma-separated hex list (e.g. from 3dfilamentprofiles.com) to render a spool as a gradient or conic colour wheel; transparency shows through a checkerboard so the alpha you set is the alpha you see; pick a visual effect (sparkle, wood, marble, glow, matte) for the swatch overlay. Same fields are editable on the colour catalog so combos can be reused across spools.
  • Printable spool labels — Generate PDF labels for any selection of spools in four pre-built sizes: AMS holder (30×15 mm), box label (62×29 mm), Avery L7160 sheet (A4, 21 per page), and Avery 5160 sheet (US Letter, 30 per page). Each label shows the colour swatch, brand, material, name, the spool ID (for at-a-glance identification across many similar spools), and a QR code that deep-links straight back to the spool's row in Bambuddy when scanned with a phone. Pick from the inventory page — search, filter by material, multi-select spools, then print or save to PDF.

🔧 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
  • Orca Cloud profile sync — read your OrcaSlicer 2.4.0+ cloud-synced profiles directly in Bambuddy, usable for slicing alongside Bambu Cloud / local / standard presets. Four sign-in providers (Google / Apple / GitHub / email+password)
  • 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
  • Scheduled local backups - Automatic backup snapshots on hourly/daily/weekly schedule with retention management and NAS-mountable output
  • External sidebar links
  • Webhooks & API keys
    • Per-user ownership — each key acts on behalf of its creator
    • Optional cloud-access scope — opt in to let an API key read its owner's Bambu Cloud + Orca Cloud presets / filament catalogue / device list (off by default)
  • Interactive API browser with live testing

🖨️ Virtual Printer & Remote Printing

  • 🌐 Proxy Mode — Print remotely from anywhere via secure TLS relay
  • 🪞 Live target-printer mirror in non-proxy modes (NEW!) — Immediate / Review / Queue VPs now mirror their target printer's live state to the slicer: AMS slot contents, FTS / dual-extruder routing, k-profiles, AMS load / dry / calibration commands, and the camera stream all flow through the VP. Use the slicer as a full remote for the printer behind the VP without giving up Bambuddy's queue / archive / dispatch features.
  • 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
  • Queue mode: optional force-color-match so the scheduler refuses to dispatch onto a printer with the wrong filament loaded
  • 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) — lists all announced versions with Usable/Unavailable/Installed badges and supports rollback to older firmware
  • 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), interactive debug log capture (start logging, reproduce at your own pace, stop & submit), 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)
  • Two-Factor Authentication (TOTP + Email OTP) — Per-user opt-in 2FA compatible with Google Authenticator, Authy, 2FAS and any standard TOTP app, or a 6-digit code delivered by email. Each user gets 10 single-use backup codes. Brute-force-protected (per-user + per-IP rate limits), replay-protected (same code cannot be accepted twice in the same 30 s window), and the pre-auth token is a single-use DB-backed challenge bound to the browser session via an HttpOnly cookie.
  • Single Sign-On (OIDC / SSO) — Log in via PocketID, Authentik, Keycloak, or any standards-compliant OIDC provider. PKCE (S256) for public clients, email_verified gating, issuer & aud/nonce validation, opt-in account linking via verified email, optional auto-provisioning of new BamBuddy accounts, and strict SSRF hardening on every URL pulled from the OIDC discovery document (scheme + private/loopback/link-local IP checks).
  • Per-user email notifications — Users receive email alerts for their own print jobs (start, complete, failed, stopped) with individual toggle controls

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

Live Demo
Spin up your own private Bambuddy with simulated printers and pre-loaded print history. Click around freely — it's your sandbox. ~10 seconds to spawn, 30-minute session, no signup.

Prefer a video walkthrough?

Bambuddy Demo Video
Click to watch the demo on YouTube


📸 Screenshots

Refreshed printer card in 1.2.5b2 — tighter layout, popovers for all controls (temperature setpoints, fan speeds, jog), and a bottom-aligned power row. The screenshots below predate the refresh.

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

Windows (Native Installer)

Self-contained .exe — no Python, Node, Docker, or Git required on the target machine. The installer bundles Python 3.13, the React frontend, ffmpeg, and registers Bambuddy as a Windows service.

Download the latest installer:

https://github.com/maziggy/bambuddy/releases/latest/download/bambuddy-windows-x64-setup.exe

Run it (one-time UAC prompt — admin install) → Bambuddy starts as a Windows service and the dashboard opens at http://localhost:8000 automatically. Data lives at C:\ProgramData\Bambuddy\, install at C:\Program Files\Bambuddy\. To update, just run a newer installer over the existing install — your database and archives are preserved.

SmartScreen warning: until our SignPath OSS code-signing approval lands, you'll see "Windows protected your PC" on first run. Click More info → Run anyway.

See the Windows Installer Guide for service management, logs, and troubleshooting.

Docker (Linux / macOS / Windows via Docker Desktop)

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 (not used with PostgreSQL)
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.

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 (--loop asyncio avoids a uvloop TLS bug that can truncate VP FTP uploads)
uvicorn backend.app.main:app --host 0.0.0.0 --port 8000 --loop asyncio

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

Need detailed instructions? See the Installation Guide

Windows Native Installation

Windows PowerShell (run as Administrator — the installer self-elevates via UAC if not):

powershell -ExecutionPolicy Bypass -Command "iwr -useb https://raw.githubusercontent.com/maziggy/bambuddy/main/install/windows-installer.ps1 -OutFile windows-installer.ps1; .\windows-installer.ps1"

Installs Bambuddy natively on Windows using Git, Python, a virtual environment, separate data/log directories, and optional NSSM Windows Service registration. See the Windows Installer Guide for parameters and unattended-install options.

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
X2 X2D
H2 H2D, H2D Pro, H2C, H2S
P1 P1P, P1S
P2 P2S
A1 A1, A1 Mini
A2 A2L

🛠️ Tech Stack

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

🤝 Contributing

Contributions welcome! Ways to help:

  1. 📝 Document — Improve the wiki and guides (urgently needed!)
  2. Test — Report issues with your printer model
  3. Translate — Add new languages
  4. Code — Submit PRs for bugs or features
  5. 🔒 Security review — (specifically wanted, see below)

Not sure where to start? Reach out on Discord or email martin@bambuddy.cool — I'll help you find something that fits.

🔒 Looking for a security-focused contributor

I'm bringing on a contributor whose specific focus is keeping an eye on Bambuddy's security.

Concretely:

Track the dev branch and flag changes touching auth, permissions, token handling, or the CI security backstops. Async post-merge — no gating of in-flight PRs.

What matters more than formal qualifications: fail-closed thinking by default, comfortable reading the auth layer (FastAPI + SQLAlchemy on the backend, a small React surface), willing to push back on except Exception shapes in security-sensitive code.

No fixed time commitment. If you're interested — or know someone who fits — email martin@bambuddy.cool or DM on Discord.

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

💖 Support Bambuddy

Bambuddy stays independent because real people support it directly. If Bambuddy makes your printers more useful, please consider:

  • GitHub Sponsors — five recurring tiers from $5/mo (Backer) to $300/mo (Corporate). Supporter+ ($15/mo) get access to a private sponsors space with a monthly newsletter and early release notes. Patron+ ($35/mo) vote on the quarterly roadmap. Sustaining Sponsor+ ($150/mo) get a direct async email line for technical questions (~2-3 business days). Corporate ($300/mo) get priority email response (next business day), README header logo, sitewide footer logo on bambuddy.cool, and Press page placement.
  • Ko-fi — one-time tip or recurring.

Sponsors get listed in BACKERS.md. Need commercial support (SLA, multi-printer consulting)? Email martin@bambuddy.cool.


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
855 MiB
Languages
Python 39.4%
TypeScript 34.1%
JavaScript 25.8%
Shell 0.5%
HTML 0.1%