Features

Everything BamDude does

A self-hosted command center for one printer or a whole farm - archive, queue, control, automation, integrations, all in one place.

Monitoring & Control

See and steer every printer in real time, from a single dashboard.

Confirmed actions across selected printers

Home axes, run supported calibrations, record maintenance, control queues, maintenance mode and lights for a selected set. Preview recipients and skips, confirm once, and see each result. Printers are checked again before their action; motion requires an empty-plate acknowledgement and fresh idle status.

Print parameters for each sliced model

Give each model in an order's print plan its own calibration, timelapse and preheat choices. New jobs retain the saved settings for their captured file, even when routed to a compatible printer. Existing jobs and operator profiles stay unchanged.

Prepared-file auto-ejection for orders

An experimental opt-in for operator-prepared hardware and finish G-code. New jobs keep their own mode and camera policy; fresh camera checks normally guard dispatch after successful ejection. BamDude adds no ejection motion. Explicit camera opt-out needs two warnings, while ordinary or failed previous prints still require manual plate confirmation.

Supervised camera process

Camera connections, snapshots, live views and video processing run in a supervised local worker. A failed camera worker can restart without blocking printing or queues, and the System page shows its health. Hardware acceleration and browser connection limits still depend on the host.

Status monitor for a second display

Printers and Queue use uniform tiles, ordered by attention, current-print ETA or queue ETA. Auto fits 50 printers on Full HD at normal zoom without grouping; smaller screens scroll. Use a signed-in window or a revocable TV token with operational status only, without cameras, job names or control.

Live status via WebSocket

Temperatures, fans, layers, AMS and current jobs arrive over WebSocket. Bounded fallback reads cover missed live updates; hidden tabs pause farm reads and catch up when shown.

Skip a failed part, keep the plate

One part comes loose on a plate of twenty and the usual answer is Stop, which throws away the nineteen that are fine. BamDude shows the plate from above with a numbered marker on every object, placed from the slicer's own pick data - click one and only that part is cancelled. Parts already skipped stay visible so nothing shifts under your cursor, and the archive's defective-part count follows the printer's own report rather than our command.

Motion control, the way Studio does it

A round pad for the toolhead with 10 mm and 1 mm rings and Home in the middle, the nozzle-bed gap beside it, and manual extrude / retract with the extruder drawn from Bambu Studio's own artwork. BamDude reads which axes the printer says are homed rather than guessing, and refuses a cold extruder below 170 degrees - grinding a flat onto the filament is not a mistake worth making twice.

Set temperatures, not just read them

Nozzle, bed and chamber, both nozzles on dual-nozzle machines, with the limits your printer actually reports. An X1 on 220 V mains accepts a lower bed temperature than one on 110 V, and the chamber ceiling differs per model - so the number in front of you is the number the machine will honour. Zero always means off.

Fan and air-duct control on every printer

Per-fan speeds, air-duct mode and filtration, each fan labelled the way your own machine names it. Printers that describe no air duct at all - P1S, P1P, X1C, A1 - used to show three read-only numbers; they now get the same working controls, built from what they do report.

A timelapse is never promised to a printer that cannot record it

The tick used to go to any printer, including one with no card in it - the request went nowhere and the print finished with no video and no explanation. Now a machine that cannot record is named when you pick printers, with which of three problems it has, and a queue whose printer has run out of room pauses instead of quietly dropping the recording. Printers with internal storage or a timelapse kit are never asked about the card at all.

Multi-printer dashboard

Resizable cards, group by location, jump to any printer in one click.

Print progress in the browser tab

Optional, per browser. The tab title carries the percentage of the print finishing soonest and the tab icon becomes a matching progress ring in your accent colour — a window parked on another screen tells you how the farm is doing without switching to it.

Custom sidebar links + drag-to-reorder

Admins add wiki / helpdesk / Grafana / external printer links directly into the sidebar, scoped to one of six nav groups (Operations / Workshop / Resources / Care / System / Links). Drag-and-drop reorder within a group or move whole groups as a block — never accidentally scramble the grouping.

Camera streaming

Live MJPEG and snapshots, plus optional RTSP/USB external cameras.

A plate-detection area that follows the bed

Use a rectangle or draw a polygon on the original camera image to exclude the surrounding frame and background. Move vertices or edit coordinates without replacing calibration photos. An unavailable polygon check pauses a normal print for inspection instead of declaring the plate empty.

Camera Wall

Flip the Printers page to Cam wall or open /camwall on a wall-mounted screen. Tiles start with snapshots; click one to make it the live camera, and click again to return to snapshots. Off-screen tiles pause, while visible snapshots keep their last good image and show when it arrived. Live viewing respects the browser connection limit: two streams on HTTP/1 or unknown transport, up to 16 on confirmed HTTP/2 or HTTP/3. Status overlays and HMS badges stay visible. A signed-out TV uses a Cam Wall token that reveals neither printer addresses nor print names.

In-app camera diagnostics

A Diagnose button on the camera viewer runs a staged check — network reachability then a real first-frame capture — and shows exactly which stage failed with a plain-language fix-it hint, so a 'camera broken' problem resolves on screen instead of in a support ticket.

Long-lived camera tokens

Mint multi-year tokens for Home Assistant / Frigate / kiosk dashboards instead of renewing per-session 60-min ones. Three separate scopes — camera stream, Cam Wall, streaming overlay — that never widen one another, so a token handed out for video can't enumerate your fleet or read what's on the bed.

OBS overlay

Drop a single URL into OBS for a clean live-stream overlay with progress, ETA, and AMS. OBS has no login session, so it authenticates with a Streaming Overlay token — one printer, nothing else.

Calibration UI

Bed leveling, vibration, motor noise, nozzle offset, high-temp heatbed - model-aware, from web or Telegram.

Printer Settings dialog

Bambu Studio parity — toggle ~15 print-time behaviours from the kebab menu: AI failure detections with Low/Medium/High sensitivity (spaghetti, pile-up, clumping, air-print, first-layer, monitoring), FOD + displacement, filament-tangle, nozzle-blob, open-door check (Off/Pause/Halt), purify air (Off/Inside/Outside), auto-recovery, prompt sound, snapshot, save-remote, plate marker + alignment. Per-model gating hides what your printer doesn't support; every change audited to printer_setting_audit.

HMS error decoding

Translates Bambu's numeric error codes to plain language with per-printer history — and surfaces the same fix-it buttons the printer's own screen offers (Resume, Stop, Ignore & Resume, Stop Drying…), one click straight to the printer.

Air-duct fans on the P2S and X2D

The second auxiliary fan — an add-on kit on the P2S, factory-fitted on the X2D — is never reported as a plain speed field, so nothing could show it. It now appears as its own badge with its speed, and you can set that speed from the badge. Names come from Bambu Studio's own printer definitions, so the same position reads Left on a P2S and Right on an X2D.

AMS management

Slot config, RFID re-read, load / unload from the printer card, AMS Settings dialog (Bambu Studio parity — RFID auto-read on insert/power-on, remaining-capacity estimate, filament backup, air-print detection, AMS calibrate, A1 firmware FULL↔LITE switch, H2D AMS reorder), drying schedules, humidity tracking.

Tell the AMS that several spools are one

Per printer, off by default: a printer can be told to advertise manually assigned spools under one canonical colour and/or the Generic profile of their base material, so the firmware treats several compatible spools as one auto-refill group. Only what the printer is told changes — the real spool, its colour, brand and accounting stay exactly as they were, routing and dispatch keep matching the real spool, and RFID spools are never touched. The AMS Backup dialog gains an apply-to-assigned-slots action with a preview and a per-slot reason, and the same button rolls the slots back. The printer's own reported backup groups remain the only proof a group actually formed.

Printer file browser

Browse the printer's SD card and, on X2D / P2S / H2, its built-in storage - one switch between the two, with listing, download, plate previews, Save-to-Library and delete working on both. Save-to-Library promotes bare .3mf to .gcode.3mf when the bytes are already sliced.

Printing without an SD card

Printers that keep files internally no longer need a card to be sent a job: with no card in, the file goes to built-in storage over the printer's own file channel. A card that is in but unreadable still stops the print instead of being routed around.

Timelapses off whichever medium recorded them

The printer reports the full path of the recording it has just finished, so that file is attached by name instead of "the first one that was not there before". On built-in storage it also names the print each recording belongs to, matching the video to the right archive outright rather than guessing from timestamps.

The printer's storage stops filling up by itself

One file sent is several files on the machine: BamDude uploads the model, and the printer writes its own copy into the card's cache and, if you have it set that way, into built-in storage too. Cleanup after a print now clears all of them, on both media, and checks each file's contents before deleting it - the same name is what a print sent straight from Bambu Studio leaves behind, and that one is left alone. Timelapses can be cleared the same way once BamDude has them, though that stays off until you ask for it.

You choose where the timelapse is recorded

On a printer with both built-in storage and a card, the print dialog offers which one records it - the same choice Bambu Studio puts behind its folder icon. The pick travels with the queue item and is checked against the card again at dispatch, so a card removed in the meantime means the recording falls back to internal storage rather than the print failing. A job sent from a slicer to a Virtual Printer keeps the slicer's own pick.

LAN firmware updates

Fetch Bambu firmware from the CDN, push to the printer's SD card over LAN-mode FTP, apply from the printer screen — no cloud account. Update one printer or the whole farm at once: the Firmware page groups printers by model, downloads each firmware once, pushes in parallel, skips mid-print printers, and keeps a per-run update log. A durable local store keeps every version (so you can roll back even after Bambu pulls it). curl_cffi Chrome impersonation handles Cloudflare's JA3 gate; stale buildId self-heals.

Mobile / PWA install

Install BamDude as a PWA on iOS, Android, or desktop — standalone window, offline app shell, share-target uploads (Android), push notifications when HTTPS is on.

Scheduled AMS drying

Start now, after a delay, at a time, when the printer is free, or on selected weekdays with an optional latest-start window. Requires an AMS and printer that support remote drying; P1 printers remain screen-only.

Choose H2C rack nozzles

Pick R1–R6 for each rack filament group in the print dialog. Unsuitable positions explain why they cannot be used; automatic selection is available, and a manual choice is checked again before dispatch.

Print farm queue

Per-printer queues with parallel dispatch, staggered start, and built-in SWAP-mode support.

Drop a batch, not a file

As many files as you like onto a printer, its queue or the auto-queue. Anything that cannot print says why, by name. Unverified or incompatible assignments disable normal submission; queuing to wait requires explicit confirmation. A missing Auto-Queue target model has its own save-for-the-future action. Waiting work can hold up later jobs on a selected printer.

Queued work keeps its own verified file

Accepting a job stores one verified, immutable copy of its exact bytes in BamDude data. An SMB share can disconnect, a laptop can sleep, and the original library file or archive can move or be deleted without changing work already queued. Identical bytes use one copy until the last queued job releases it; portable backups carry the copies their database snapshot names.

Copy one printer's queue to others

Same model, choose the items and destinations. Copies keep their plate, order, grouping, and feed and color rules. Shared answers use one dialog per group; a manual mapping needs review for the destination, and file-specific channel choices open the next file for review.

Load a queue from the library

Browse, tick files across folders, send the lot. Only what can actually run on that printer is offered.

Parallel background dispatch

Send jobs to multiple printers simultaneously - startup-locked DB phase, parallel FTP and start.

Per-printer queues

Each printer has its own ordered queue with idle/printing/paused/error tracking.

Group, drag-reorder & sort by ETA

Tame a long queue: bundle items into a collapsible batch, drag a row by its grip handle to reorder, and sort the Printers page by ETA so the printer finishing next sits on top.

Put an urgent job next

Tick Run next in the Schedule dialog to place an ASAP job before a selected printer's pending work. A physical print is never interrupted; selected plates stay together, and Auto-Queue keeps its own routing order.

Auto-queue routing

The router checks the exact model and every used filament channel against each printer's AMS, external feeds, and nozzles. Choose automatic, AMS-only, or external-only feeds; require exact colors globally or per channel. The form separates AMS-connected, no-AMS, and unknown configurations, with compatible and ready counts. Multicolor stays supported; copy count never relaxes the rules. Ready printers take priority, with SJF and starvation protection for scheduling.

Route to compatible printer models

BamDude checks Bambu Studio's model compatibility data before assigning a sliced file to another printer. A manual compatible choice shows a warning; Auto-Queue can optionally use a ready compatible printer when no exact-model printer is ready. Nozzle and filament checks still apply.

Rebalancing across printer models

An order line's work is split between printer models when it is queued — and used to stay there: if the P1S machines freed up early, the X1C copies kept waiting in their own pile. With rebalancing on, idle printers of another model take a line's still-pending prints whenever that finishes the line sooner, and the plates and counts are recalculated for that model's bed: a 6-part plate becomes three 2-part prints on a mini, two parts become one print on a bigger bed with at most a plate's worth of surplus. Off by default; the line's Rebalance button and the auto-queue panel run it on demand. Prints already on a printer, scheduled, staged, pinned or aimed at a location never move.

Defects where the operator stands

Scrap used to be typed in one place — the archive editor, three screens away from the plate. Now every completed print card on an order page shows what came off the plate and how many went in the bin, and offers Defects…; on the printer card the finished print's counters sit beside Clear plate and Repeat, and either answer carries them; in Telegram the completion message offers Defects…, and both plate answers lead to a one-tap-per-part prompt. Statistics gain Defects by printer — printed, defective and the rate. A print that was already counted into free stock has its shelf corrected when defects are recorded later, in either direction, with the correction in the stock journal.

Quantity that says what it means

The Print dialog's number used to mean «on each printer you picked» — three printers at 4 made twelve prints while the field said four. Now a line under the field states the outcome, and a toggle offers Per printer or Total: a total is dealt round-robin across the picked printers in the order they are listed, 13 on three becoming 5 / 4 / 4, with the line naming who gets what. Your choice is remembered in the browser; the auto-queue's field was always a total.

Auto-pause on failure

When a print fails, the queue stops on that printer so you can decide what's next.

Cancel-during-dispatch pauses (not errors)

Cancelling during the upload/start window moves the queue to paused (not error) and the item to cancelled (not failed) — nothing failed, you just changed your mind. A Restart button on the cancelled item puts it back at the end of the queue with one click.

Staggered start

Limit concurrent heating across the farm - per electrical phase or room when you split the cap by printer tags or locations, with a cap of its own for any group that needs one; a bed-temp watchdog prevents brownouts.

Reprint with filament mapping

Reprint the selected plate using the destination's current AMS or external feeds. Saved feed and color rules survive repeats; physical slot choices need review for a different printer. Routing is checked again immediately before start.

Swap mode (A1 plate-swappers)

Built-in support for Kit / STL / JobOx swappers with macro-driven plate changes.

G-code macros with ACK

Send macros from the printer card; MQTT-confirmed completion, real-time status.

Quick vibration check toggle

Per-job toggle that comments out M970 in 3MF gcode and recalculates MD5 sidecars.

G-code injection per print

Per-printer-model snippet library; toggle Inject G-code on a job to splice start/end snippets directly into the plate gcode.

Slice settings

Save a slice setup once — printer + process + per-slot filament presets + bed type — then load all four back into the Slice dialog with a single pick instead of choosing them again. A preset that has since been deleted is never applied silently: the affected slot keeps its automatic pick and is named in a warning, so you never slice with something you did not choose. Printing a batch is the auto-queue's job, not the pipeline's.

Preheat & heat-soak

Hold the bed — and, on chamber-equipped printers, the chamber — at temperature before an engineering-filament job starts: the soak ABS / ASA / PA / PC need that Bambu firmware won't wait for. The chamber target derives per print from the loaded AMS filament types (editable map), and three hardware tiers are handled automatically — active M141 heater (H2 series / X2D / X1E), sensor-only radiant wait (X1C / P2S), or a soak timer (P1S / A1). Off by default, with a per-print override in the Print dialog.

Print archive

Every print kept locally with the source 3MF and full metadata. Searchable forever.

Automatic 3MF archiving

Every print stored with metadata, thumbnail, gcode hash, and runtime data.

Three.js 3D viewer

Inspect every plate in-browser with multi-color preview before reprinting.

Build-plate icon on archive cards

Every card shows an OrcaSlicer-style bed icon next to the printer / model name reflecting the plate the 3MF was sliced for (Cool / SuperTack / Engineering / High Temp / Textured PEI / Smooth PEI). Hover tooltip carries the full name — no need to open the source 3MF in a slicer just to read the bed setting before a re-print.

Full-text search & dedup

Source-hash chain-of-custody so patched files (e.g. M970-disabled) still dedup correctly.

Photo attachments & notes

Attach failure photos, post-process pics, freeform notes per archive.

Side-by-side compare

Compare 2–5 prints (settings, filament, time, weight) in one view.

Timelapse editor

Trim, speed, add music - export ready-to-share clips from raw camera footage.

Auto-cleanup retention

Drop the .3mf after N days idle, keep the metadata, thumbnail, energy, and notes.

Library + Archive Trash bins

Soft-delete with restore window, scheduled retention, and reference-aware delete that refuses to drop bytes still pinned by an active archive.

Printed / Not Printed filters

One-click chips on the archive page split first-time prints from reprints — fast path to find never-printed files.

Big files archive too

A print's 3MF is read back over the same SD card the print is reading from, so it arrives slowly — a 22 MB file measured over eight minutes on a busy P1S. The FTP timeout now bounds a stalled connection rather than the whole transfer, so a large plate lands complete instead of as a bare row with no thumbnail, no 3D preview and no metadata.

3MF download recovery

Failed FTP at print start? Recovery retries on startup, reconnect, print-end, or manually.

Save a printed file back into the library

Pick a folder and the archive's 3MF is read in the way an upload is — metadata, thumbnail, per-plate detail and badges already filled in. Saving the same print twice keeps the copy already there instead of making a second one.

Failure analysis dashboard

Retrospective analytics across the archive — failure rate by printer, material, time-of-day, and print duration. Drill into the offending archives in one click.

CSV / XLSX export

Filter-aware bulk export of archives + stats for billing, QA logs, or BI pipelines. UTF-8 BOM CSV, multi-sheet XLSX.

Correct an archived print’s filament weight

Edit Filament used (g), including for a print whose 3MF could not be recovered. Statistics, cost and order figures use it; no spool is debited by this edit.

File Library

Upload, organize, and print directly - no slicer round-trip required.

The same file is never stored twice

Every way a file can arrive is checked by content hash first - uploads, drops, the API, product imports, your slicer, and linked NAS folders.

Upload & folder organize

Drag-and-drop folder structure with duplicate detection on hash.

Per-plate gallery

Multi-plate sliced 3MFs show every plate with its own stats, filament, and object list.

STL thumbnails

Thumbnail-render STL on upload so you see the part, not a filename.

STEP thumbnails

STEP and STP models get a picture of their shape too, made in the background by the Open CASCADE kernel behind sliced files and STL previews. A model too large or only partly readable says why instead of showing half a part. The Docker image and the Windows installer carry the CAD component; on a native install it is your choice.

External folder mounting

Mount a NAS share or USB drive read-only into the library.

Print directly or queue

Pick a file, pick a printer (model-filtered), print now or add to queue.

Schedule a whole selection

Tick any number of sliced files and press Schedule: the usual scheduling window opens for the first, marked 1/3, then the next. Each file keeps the full set of choices — printers or the auto-queue, plates, filament mapping, options, quantity, when to start. Close it at any point and whatever you did not get to stays selected.

Label-objects metadata

Skip-objects support detected at upload - button only enables when the slicer's profile actually emits it.

MakerWorld URL import

Paste any MakerWorld model URL, pick a plate, BamDude downloads the 3MF straight into your library — provenance badge keeps the link back to the original.

MakerWorld History tab + per-variant dedupe

Server-paginated 4-column grid of every MakerWorld import with locally-cached cover images, search across filename/title/author, sort by date/title/author, and a per-variant 'already imported' badge with a one-click View-in-Library deep-link on the resolve preview — never pay a duplicate download.

MakerWorld Re-download

Author pushed an update? Re-download overwrites the 3MF bytes + cover + metadata in place. library_file_id stays stable so queue items, project links, and archives keep resolving to the same row.

MakerWorld design metadata captured

Title, author, license, sliced-for printer, full compatibility list, materials, AMS requirement, and a deep-link back to the original — all written to a child meta table on import and used to drive the History grid.

Server-side slicing

Send STL/3MF to a containerised OrcaSlicer or BambuStudio sidecar and get a printable .gcode.3mf back without leaving the app.

Re-slice for any printer

Re-slice a saved 3MF for a different printer — even across nozzle classes (single ↔ dual-nozzle H2D/H2C/X2D). Pick the target profile and BamDude arranges the objects for the new bed; 'slice all plates' merges a multi-plate project into one file.

Keep the designer's print settings

MakerWorld models often deviate from the stock profile on purpose — five walls, 100% infill, a 0.1 mm first layer — and a re-slice used to throw all of it away. The Slice dialog now lists exactly which settings the author changed, with a checkbox each: design intent ticked, machine-tuned values (speeds, accelerations, temperatures) listed but not. Bambu Studio writes that list into the 3MF itself, so nothing is guessed.

Slicer Preset Bundles (.bbscfg)

Import a BambuStudio Printer Preset Bundle once and reference its triplets (printer + process + filament) by name on every slice — bypasses the cloud / local / standard tier resolution entirely. Idempotent re-uploads keyed on bundle hash; per-bundle Settings panel for delete.

Per-user Bambu Cloud

Each user signs into their own Bambu Cloud account with their own region — no shared credentials, no single-region lock-in. Tokens encrypted at rest, sliding refresh, OIDC-style flow.

Orca Cloud profile sync & push

Pair once with a device code — under BamDude's own registered app identity, so the approval card names who is actually asking — and your synced printer / process / filament profiles show up in the slice modal and AMS-slot picker, ranked above Bambu Cloud, local, and standard. Full metadata inline, so filament type and colour pre-fill for free. Authored filament families push back to Orca Cloud too, with explicit conflict resolution when a profile changed in the cloud. Per-user tokens, just-in-time refresh.

Local OrcaSlicer presets

Drop .orca_filament / .bbscfg / .bbsflmt / ZIP bundles directly — BamDude resolves preset inheritance from upstream OrcaSlicer when needed. Cloud-free path for shops without Bambu accounts.

A printed file can go back into the library

Asked for by a user. Pick a folder and the archive's 3MF is copied in, read the same way an upload is — metadata, thumbnail, per-plate details and badges already filled in, rather than an anonymous file. Saving the same print twice does not make a second copy: the library recognises identical content, keeps the one already there, and says so.

File preparation has its own health panel

Uploads and mounted-folder scans prepare 3MF metadata in a supervised local worker. Slow reads stay outside the web server; System reports file preparation separately from model previews, cameras and filament analysis.

Telegram bot

Full bot for control and queue management. Multi-chat, role-based.

Full printer control

Pause, resume, stop, light, speed, camera snapshot - all from chat.

Skip an object from the chat

The bot sends the plate seen from above with a numbered pin on each part and a keyboard of those numbers. Press one, confirm by name, and the rest of the plate carries on - the markers come from the same code the browser uses, so a number means the same part in both.

Controls under the camera snapshot

You pull a snapshot, see a print failing, and act in the same message. Pause, resume, stop and skip ride along with the photo, from the button and from /camera - no VPN, no browser. Stop asks first.

Send the bot a file

Throw a 3MF into the chat and it lands in the library with the same checks, thumbnails and duplicate detection as a web upload, then offers to print it or queue it right there.

Multi-chat with roles

Each Telegram chat gets a role with granular per-resource permissions.

Actionable buttons

Clear plate, mark maintenance done, pause/stop on progress - straight from the notification.

Print from Library

Browse files, pick a printer (model-filtered), Print Now or Add to Queue.

Queue management

Paginated list, detail view, move up/down, cancel - with MarkdownV2 formatting.

Add Printer via SSDP

Enter IP → bot auto-detects serial / name / model → enter access code → done.

Calibration from chat

Trigger bed leveling, vibration, nozzle offset, motor noise, high-temp heatbed.

Per-chat quiet hours

Daily digest, event filtering, and quiet-hour windows - independent per chat.

Notifications

Eight channels, one editor, one routing config.

An inbox in the app, before any channel is set up

Every event the farm raises — a failed print, a filament runout, an AMS alarm, queue trouble, a sensor past its limit — lands in the Bell in the sidebar, in the inbox of each person subscribed to it: live unread count, read/unread kept per person, filters by level, printer and period. It fills on a farm with no external provider configured at all, which is the point — an alarm about hardware used to have nowhere to go until somebody had set up a bot or a mail server. Each person picks their own events, warnings and errors by default; history retention is a farm setting, 30 days out of the box. The per-user e-mail switches that used to be the whole Notifications page are now one tab inside the centre.

10 delivery channels

Telegram, Discord, Email (SMTP), Pushover, ntfy, Bark, CallMeBot, Signal CLI API, Home Assistant, custom webhooks.

Printer scope on every channel

All, one, or several printers — per provider, and per Telegram chat, where the scope also limits the bot itself: printer lists, cameras, queue view and controls. The admin's chat watches the whole farm while a partner's chat on the same bot sees only their machines.

Progress milestones only for long prints

Mute the 25/50/75% messages for prints estimated shorter than N minutes — per Telegram chat and per provider, so a chat that wants every half-hour job and one that only cares about overnight prints coexist on one bot.

Bark, for the failure at 3 a.m.

The free iOS push app that needs no account — install it, paste the device key. Its Critical interruption level is delivered through Silent mode and through Focus, so the print that stopped in the night actually wakes somebody; Time Sensitive breaks through scheduled summaries without going that far. Public relay or your own bark-server.

Home Assistant push options

A Data (JSON) field that goes straight into the service call, the same place an automation would put it — priority: high and ttl: 0 to arrive immediately rather than whenever the phone next wakes, channel to give printer alerts their own sound. Checked when you save it and again when it is sent.

MarkdownV2 template editor

Formatting toolbar, per-event template, live preview before saving.

Print-finish photo

Camera snapshot attached to the success notification, with filament usage details.

HMS + bed-cooled alerts

Get pinged when an HMS error fires or when the bed cools enough to remove the part.

Queue events

Notifications for waiting, skipped, failed - only the events you opt into.

Per-event ntfy priority

Pick the ntfy priority (default / high / urgent) per event type, so finished prints don't shout but failures do.

Pause / Resume with classified reason

RUNNING↔PAUSE transitions fire dedicated notifications carrying a normalised reason (door / filament runout / presence-check / file-pause / AI defect / plate-objects / user / HMS-other) and a paused-for counter on resume. Printer cards render a live PauseChip with the same reason + mm:ss ticker while paused — so you can tell at a glance whether the operator already knows.

Orders & Products

What was ordered and for whom, what each product is made of, and what to print next to finish it.

An order lists what was asked for, not a folder of files

Each line is product × quantity - for a customer, at a price, with a due date and a priority on the order itself. Material on a line is a hard requirement and colour is a note beside it. Progress is counted in finished units from the parts the prints actually produced, and the scarcest part says how many units could be assembled today. Customers are a list of their own, gathering every order somebody placed and the totals across them. An order keeps its cover picture and its link out to MakerWorld, Printables or a repo.

A product says how the thing is made

Which printed and purchased parts make one unit, and which sliced plates produce them. Link a library file or a whole folder to a product and the plates and parts fill themselves in from what is inside the file - an object name the product has not met yet becomes a part of it. A plate's yield is read again on every look rather than cached, so re-slicing a file changes what it makes instead of leaving a stale number behind. One product lives in many orders, and the product is the template - there are no separate ones to keep in step.

Every part has its own picture

Each printed part of a product gets a picture rendered on the server from the sliced G-code, in the colours of its filament - not the whole plate, the part itself. A part sliced on several plates can show the instance you pick, and any part can show your own photo instead. The pictures sit beside part names on the product, in an order's lines and plan, in stock and in dispatch, and the Docker image and the Windows installer bring the pinned Node.js the renderer needs.

What to print next, worked out per line

Under every line sits a plan: the plates that would cover what it still needs, ranked by useful parts per hour, with everything already printed, running, queued or taken from stock subtracted first - so a plan you have half sent stops asking for the prints you already sent. Each row shows time, filament and cost per print beside a count you can change, and the surplus and the totals follow that number as you type it. Send one row to the auto-queue, send the whole plan at once, or open the usual print dialog to put a row on one named printer. The actual plate and every used channel are validated before queueing; the selected file, quantity, and order line stay intact.

Two printer models, two files, one plan

A part sliced for two machines is two library files with the same yield, and a plan that picks one of them makes the other invisible to half the farm. Every row carries a File switch instead, labelled with the printer model each file was sliced for: choosing one re-does that row's time, filament and cost while the count stays exactly where it was. Split across files shares one row's count between them - the auto-queue routes each item by the model its file names, so this is one way to share an order line between printer models, and a split whose numbers do not add up refuses to be sent rather than quietly sending the wrong one.

A print started anywhere is filed under the order that needs it

Printing or queueing a library file - from the File Manager, a printer card, the queue page or the auto-queue - shows an Order field: the open orders still short of that plate, how many prints each of them is short, and the product each is for, with the first one already chosen. Choosing nothing files nothing. A print started from the printer's own screen is attributed afterwards from the order page, and a plate carrying parts of two products feeds every line that matches, not just the first one it finds.

Extra parts go on a shelf, not in the bin

A plate makes four lids and the order needed three. Bank the surplus and the fourth lid moves onto that product's free stock: how many whole kits are on the shelf, the balance of every part, and a ledger of how each one got there. A print that finishes under no order is credited automatically, and filing it under an order afterwards takes the credit back. Ordering the same product again is where it pays - From stock reserves kits for the line, and the need, the progress bar and the plan all count them as done, so a line covered from the shelf asks for no prints at all.

Finished goods and free parts, in one stock section

Stock is its own section under Projects. Finished-goods positions track each product configuration: on hand, reserved, available and minimum. Receive and stocktake units, assemble them from free parts, reserve them for orders, and issue them with numbered dispatch notes. Free parts have their own shelf with kit counts per configuration; a paged journal records movements in both ledgers.

Defective parts count against the order

An order needing forty usable parts is not finished because forty came off the plates. Skipping an object mid-print attributes the scrap to that part by itself, and the archive editor lets you mark exactly which parts came out bad instead of typing one number for the whole plate. What the order counts is what is left.

The model card was inside the 3MF all along

The description, the designer, the licence, where it came from, the pictures, the bill of materials and the assembly guide the designer shipped - a product reads all of it from any file linked to it, and never writes a byte back into the library file. The pictures become a gallery you can reorder and open full-size, one of them the product's cover. And a product exports to a ZIP - card, composition, attachments, cover and every file linked to it - that another BamDude imports, matching files it already has by content rather than duplicating them.

Re-order in one click

Duplicating an order brings its lines, customer, price, notes and attachments across under a new name, and opens the copy as active. History never travels with it - that stays with the prints that actually happened - and a reorder reserves nothing from stock, because a copy must not quietly empty the shelf.

A catalog of configurations

Products have SKUs, versions, categories and variant groups. Each order line keeps its selected configuration; finished stock and dispatch notes identify that configuration too.

Five order views, one workflow

Cards, table, kanban, workspace and deadlines show the same orders. Stages, responsible operators, quality-check counts and readiness estimates help decide what needs attention; incomplete forecasts say what is missing.

Add a library file to an order

Open Add to order… from a file or its plate gallery, choose an active order and create a one-off line with that file preselected. Orders, Products, Customers and Stock each have their own permissions.

Reserve loose stock components

Take from stock can reserve individual parts even when there is no complete kit. The print plan asks only for missing components; receipts combine allocated stock and printed parts without counting stock twice.

Plan a saved percentage of spare parts

Printed BOM parts can add an extra percentage, rounded up once for the order line. A line keeps its saved setting when the catalog changes. The base kit composition stays unchanged; extras are planned, received and issued separately, and customer orders must deliver them before closing.

Spools & Filament

Track filament inventory - from the reel on the shelf to the gram in the print.

Built-in spool inventory

Add spools with brand, color, weight, cost; AMS slot assignment per printer.

Mass actions on the Filament tab

Tick the spools you mean - a row, a whole group, the visible page, or everything matching the current filter - then Edit, Print labels, Reset usage, Archive, Restore or Delete them in one go. Works the same in built-in and Spoolman modes. Destructive actions confirm first, and the selection clears itself whenever the filter or tab changes, so a bulk delete can never land on rows you are no longer looking at.

Auto consumption tracking

Filament used per print is deducted from the assigned spool - no manual math.

The whole farm's filament ledger, in one list

A History view beside Table and Cards: every consumption record there is - what was printed, off which spool, on which printer, how many grams and what it cost. Search, filter by printer, material, brand, outcome, a date range or the spool's own state, sort by any column, and page - all computed by the server, so a year of prints costs the browser nothing. The running total is for the whole filter, not the page on screen, so what a month cost you is one date range away. Spools you archived or deleted keep their rows, marked rather than hidden: the grams they carry were still printed.

Cost & lot tracking

Per-spool cost, purchase date, filament diameter, and lot number for inventory bundles.

Spoolman sync + first-class inventory UI

Two-way sync with Spoolman for shops that already keep inventory there. Plus a full BamDude-side inventory experience on Spoolman-mode installs: structured slot assignments per (printer, AMS, tray) survive reboots, K-profiles per spool round-trip across BamDude installs that share one Spoolman, and the storage_location column shows on every spool card.

Color catalog

Manufacturer-aware color name resolution (Bambu wins for matching hex).

Multi-colour filament gradients

Dual-colour spools render as hard-split bars (not a smooth blend), Multicolor renders as a conic colour-wheel pie, gradient stays a 135° linear blend, and Sparkle / Wood / Marble / Glow / Matte / Silk overlays paint visibly on inventory cards. Live preview in the spool form so you see the effect before save.

Draw your own spool labels

A label is a list of boxes with millimetre positions, not a layout baked into the code — so you draw it with the mouse under Settings → Filament → Marking. Text, QR, barcode (EAN-13, Code 128, Code 39, EAN-8, UPC-A, ITF) and a block of the spool's colour as a rectangle, circle or rounded rectangle. Content is written with placeholders — {brand}, {remaining_pct}, {deeplink} — the same vocabulary as your spool-naming setting. Boxes snap to each other and to the label's edges and centre, and the picture in the middle is not a drawing of your label: it comes from the renderer that produces the printed file, so what you see is what comes out. The designs BamDude ships are a starting point you can redraw, not a fixed set.

Any label on any paper

Sheets are a separate thing from designs: a sheet states the page size, the grid, the margins and the gaps, and nothing about what goes in a cell. So you pick the paper, then pick the design — one label per page, an Avery layout, or a page geometry you measured yourself on A4, A5 or US Letter. Preview the page lays a design into every cell before anything reaches adhesive stock, a grid that runs off its paper is refused when you save it, and a design too big for the cells is offered greyed out with both measurements rather than quietly shrunk — a label shrunk to fit is a label whose barcode no longer scans.

Print to a label printer on your desk

A server in a container cannot reach a USB printer on somebody's machine, so BamDude does not try: it renders the label, queues it, and the BamDude Bridge app on that desktop comes and takes it. Nothing is exposed and no port is opened. Designs declare which kind of printer they are drawn for — a colour block is offered on the ones going out as PDF, where they may be landing on an inkjet or a laser, and not on the ones going to a one-bit thermal head where it could never print. A printer whose loaded stock is smaller than the design says so before you press it.

Copy Spool

Duplicate a spool in one click: pre-fills the form with everything except weight_used (reset to 0). Source row untouched; the new row gets its own id. Works in both local and Spoolman modes.

Pre-load assignment (weigh-then-assign)

Assign a fresh spool to an AMS slot before loading the filament. The assignment persists immediately; the printer-side configuration auto-fires the moment the slot transitions to loaded (keyed on the AMS load state, so 3rd-party spools without readable RFID trigger the replay too). The toast tells you the configuration is pending, not lying about success — Bambu firmware silently drops filament-setting commands for unloaded slots.

Assign full stock spools on loading

Opt in per printer and choose an exact filament group from built-in inventory. Loading a new full, untagged reel into an empty AMS slot assigns the oldest eligible unused spool; RFID and manual assignments take priority. External holders require a confirmed runout and your resume. Returning the old partial reel after runout needs manual assignment first.

Stock forecasting + Logistics view

Per-SKU reorder intelligence on top of the real consumption history. Exponentially-weighted daily-rate (30-day half-life), 95%-service-level safety stock, days-left projection, reorder-by date, and a top-5 stacked-area chart with ROP reference lines. Inline editors for lead-time, safety-margin (days|grams), alert snooze. Companion Shopping List tracks SKUs through pending → purchased → received and auto-creates stock spools on receipt. New notification toggles for reorder and stock-break alerts (currently UI-only). Hidden in Spoolman mode.

Filament families, the way the slicers model them

One identity behind every filament - a built-in catalog distilled from Bambu Studio and OrcaSlicer, plus your own cloud presets mirrored in the background. Spools, AMS slots, K-profiles and slicing all key on the family, so a custom filament finally matches its own calibration instead of collapsing onto Generic.

Create your own filament, push it to Bambu Cloud

Vendor + type + serial, exactly like Bambu Studio's Create Filament dialog, with a Bambu-Studio-compatible identity and a preset cloned per printer profile you tick. Push it to your Bambu account and the desktop slicer sees it on its next sync - or create it from the Bambu Cloud tab and it is born in the cloud.

Runouts close the books at exactly zero

A filament runout is the one moment reality reports an exact figure: 0 g. BamDude splits the print at the runout layer between the spent spool and its replacement (per-layer G-code accuracy, AMS backup switches and same-slot refills included), then closes the spent spool at exactly its label weight - drift can no longer accumulate. Jams are never mistaken for runouts, a runout notification prompts you to assign the replacement, and the printer card shows filament-so-far live while a print runs.

Per-spool category + low-stock

Tag spools by category (PETG / ABS / TPU…) and override the global low-stock threshold per spool.

Archive a spool after a proven runout

An optional, default-off setting archives a spool once its runout is closed and the printer has moved to a backup or replacement. Works with built-in inventory and Spoolman; a reel reinserted to keep printing stays active.

Use the rest of a label sheet

Choose the first free label on a partially used sheet. The first page starts there, later pages start at the top, and the labels keep their designed size.

Sort grouped filament

Column headers order groups and their expanded spools by ID, lot, purchase date, location, label weight, net weight and remaining percentage. Groups sort before pagination; group weight columns use totals.

Filament Calibration

A Bambu Studio-parity calibration wizard built right in — no other Bambu management tool runs the calibration tests for you.

Guided calibration wizard

Open it from any printer card's kebab menu: Pressure Advance (PA Line / PA Pattern / PA Tower), the Temperature / Volumetric Speed / VFA / Retraction towers, and the two-pass Flow Rate test — all walked through step by step with Bambu Studio parity. Lidar-driven Auto calibration is rolling out separately. A sibling Calibration History modal lists every stored result.

Sliced against your own presets

Not a canned, pre-sliced 3MF. For every mode the wizard slices the calibration scaffold against your active printer / process / filament presets through a connected OrcaSlicer or Bambu Studio sidecar — exactly as the BS desktop wizard does — applying per-mode preset overrides (wall loops, line width, spiral mode, initial-layer speed) first. The sliced 3MF is FTP'd to the printer and run as a real print through the normal dispatch pipeline, so plate-change macros and chamber-light MQTT actions fire for calibration prints too.

Pressure Advance, end to end

PA Line / Pattern / Tower are wired slice → FTP → print → save dialog → K-profile. PA Pattern's comb + K-digit g-code and PA Line's numbered row stack are regenerated for the operator's own start/end/step via Python ports of BS's `CalibPressureAdvancePattern::generate_custom_gcodes` / `CalibPressureAdvanceLine::print_pa_lines`. The measured K is written to a calibration row, pushed to the printer's 16-slot K-profile history over MQTT, and bound to the AMS slot so the next print uses it automatically.

Temperature, Speed, VFA & Retraction towers with a result calculator

The Temperature tower steps the nozzle down 5 °C every 10 mm band (start/end seeded from the loaded filament's material); the Volumetric Speed and VFA towers ramp outer-wall speed up a spiral tower; the Retraction tower lengthens retraction every 1 mm of height up a two-pillar stringing test. The per-layer ramp is post-patched into the sliced g-code — it is a GUI-only engine flag the slicer sidecar can't carry. These are print-and-eyeball tests, so the finish step gives you a calculator: enter the measured height and BamDude applies the per-mode formula and shows the value to copy into your slicer. Save records it to the calibration history as a per-printer farm record.

Two-pass Flow Rate calibration

Calibrates the filament's flow ratio — the multiplier behind every extrusion move. Pass 1 prints 9 patches at modifiers ±20 % around your filament preset's current `filament_flow_ratio` (auto-prefilled from the picked preset; can be overridden to test from a fresh 1.0 without editing the slicer profile). You pick the smoothest patch and BamDude automatically slices, FTPs and runs pass 2 — 10 finer patches centred on the coarse pick. The two-pass dispatch is end-to-end; you never leave the wizard. The final ratio = `coarse × (100 + fine modifier) / 100` is saved to the calibration history as a per-(printer, filament, nozzle) record for the operator to copy into their slicer.

Per-printer cache, auto-bind, H2D dual-extruder

Results are keyed per (printer, filament, nozzle, extruder) — two identical X1Cs in a farm carry independent K values. The active calibration auto-binds on every print start by re-matching the printer's live cali_idx through stable identity, so AMS slot reorders and RFID re-taps can't silently fall back to the wrong K. H2D / H2D Pro calibrate each extruder on its own tab. The Calibration History modal does set-active / delete / refresh-from-printer per row.

Maintenance

Per-printer counters, model-aware tasks, mark done from anywhere.

Per-printer Maintenance Mode

Park a printer 'out of service' without deleting it — it drops out of queue dispatch, scheduling, auto-drying and metrics and shows an amber Maintenance pill until you bring it back. Toggle it from the printer's ⋮ menu.

Archive a printer

Retired a printer — sold, decommissioned, swapped out? Archive it instead of deleting: it vanishes from the Printers page, every picker, queues, dispatch and MQTT while its full print history is kept. Archiving is blocked mid-print and cancels the printer's pending queue items; restore it (or delete for good) under Settings → Printing. Distinct from Maintenance Mode, which only parks a printer temporarily.

Model-aware task types

Each printer model gets the maintenance items it actually has (e.g. carbon-rod wipe on X1).

Counters with overdue alerts

Hours-based + calendar-based reminders; UI badges and notifications.

Mark done from bot

Tap an actionable Telegram button to log the task - counters reset instantly.

History & Excel export

Every maintenance event logged with operator, date, hours; export to spreadsheet.

Automation

Smart plugs, virtual printer, AI failure detection - opt in to what you need.

Smart plug control

Zigbee, Tasmota, Home Assistant, MQTT, REST/webhook plugs - auto power on/off with prints.

Zigbee plugs, no bridge required

BamDude drives a Zigbee dongle itself - no Home Assistant, no Zigbee2MQTT, nothing running alongside. Pair a plug from the interface, bind it to a printer, and per-print energy comes from the plug's own meter.

Environment sensors on the same radio

Pair a Zigbee temperature/humidity sensor to the dongle already driving your plugs. Readings show in the sidebar and beside the printers standing in that place, with a week of history to chart.

Alerts when a room leaves its limits

Set a lowest and/or highest value for anything a sensor measures, including its own battery. You are told when a reading leaves those limits and again when it returns; a margin stops a value hovering on the line from ringing repeatedly. A sensor that stops reporting is reported too - otherwise a flat battery looks exactly like a quiet room.

Accessory plugs know their place

Mark which plug actually powers the printer. Switch off a chamber filter, a light or a dryer and the printer stays online and keeps taking work from the queue.

Energy tracking

Per-print kWh capture from the plug, plus date-range farm-wide totals.

Virtual printer modes

File Manager (review queue), Print Queue (slicer → fixed printer), Auto-Queue (slicer → router chooses by complete filament and feed requirements), Proxy (TLS relay). A fixed-target queue VP can retain the slicer's physical AMS choices, with validation before start; automatic routing resolves sources for the selected printer.

Slicer-as-remote in non-proxy modes

When the VP has a target printer, the slicer sees real AMS / FTS / nozzle / k-profile state and streams the live camera through the VP — full slicer-as-remote without giving up BamDude's queue / archive / dispatch.

Live print progress in the slicer

The slicer's Device tab shows the target printer's real stage, percentage, layer and time remaining — and the Send button stays enabled throughout, so you can queue the next job while the current one prints.

Proxy mode for remote prints

Send from anywhere via TLS relay - no VPN, no port-forward, end-to-end encrypted.

Tailscale-aware VP card

Surfaces the host's tailnet IPs + MagicDNS hostname for paste-into-slicer when you reach BamDude over Tailscale; copy-to-clipboard in one click.

VP archive name source toggle

Choose whether VP-routed archives take their print_name from 3MF metadata or the upload filename — per-install setting.

Obico AI failure detection

Optional ML-based failure detection with notify / pause / pause-and-power-off responses. Every printer card carries an AI badge — grey while nothing is watched, then green, amber or red as a monitored print is classified — so you can follow it without leaving the Printers page.

Home Assistant and shared sensor bindings

Bind numeric or binary HA sensors to printers or spool storage, with independent alerts and history. One Zigbee sensor can serve several places too. Optional printer alert rules hold queued starts; stale or unavailable HA readings release the hold, so this is an operational rule rather than a safety interlock.

Auth & Integrations

Always-on auth with MFA, OIDC, LDAP, plus REST/MQTT/Prometheus for everything else.

Granular permissions

80+ resource:action permissions, three default groups (Admin / Operator / Viewer).

TOTP + Email OTP + Backup codes

Multi-factor auth with backup codes; per-user enrollment, admin-resettable.

MFA + OIDC secrets encrypted at rest by default

Auto-bootstrapped Fernet key (env → file → generated, mode 0600) — every TOTP secret + OIDC client_secret encrypted on disk without a manual env-var step. Status dashboard shows key source, encrypted vs legacy plaintext counts, and decryption-broken alerts. Backup ZIP packages the key alongside the DB so a restored install on a fresh host keeps decrypting.

OIDC SSO incl. Azure Entra ID

PKCE + state + nonce + JWKS, SSRF guards on issuer URL, configurable email_claim (preferred_username / upn) for Microsoft 365 / Entra ID.

SSO declared in environment variables

For compose / Helm / GitOps installs where clicking through Settings once is not part of the deployment. Set four BAMDUDE_OIDC_* variables and the provider is created on startup and reapplied on every restart — shown read-only in Settings, because an edit would be accepted and then silently undone. Removing the variables disables it rather than deleting it, so linked accounts keep their link.

LDAP / Active Directory

Group-mapped LDAP login for shops with existing identity.

Sliding-session refresh

Rotating refresh tokens, OWASP reuse detection, HttpOnly cookie + 1h access JWT.

API keys with cloud-access scope

Per-user `bd_*` tokens scoped to a subset of the owner's permissions. Opt-in cloud-access scope reaches Bambu Cloud routes. X-API-Key or Authorization: Bearer — both supported. Hashed at rest, last_used_at surfaced for audit.

REST + WebSocket API

Full REST API with API keys, plus WebSocket for live status integrations.

Prometheus metrics

Dedicated /metrics endpoint with farm-level and per-printer counters.

Per-request trace IDs

Every HTTP request gets an X-Trace-Id header echoed in logs so you can correlate one user action across HTTP / MQTT / scheduler lines.

BamDude Cloud link (opt-in)

Pair the farm to the cloud.bamdude.top portal and it reports outward: which of the printers you chose to publish are running, how far along, the events worth knowing, and a single camera frame on request. One-way by design — nothing prints from the portal, the request list is fixed in the version you installed, and the link can be cut from either side, with a month of link history so "when did this farm go dark" has an answer.

MQTT publishing

Forward printer state to your home MQTT broker for Home Assistant / Node-RED.

Git backup

Schedule automatic config backups to GitHub, GitLab, Gitea, or Forgejo — restore from any commit. Per-backend `git_providers/` package handles the API shape divergences (Forgejo plays Gitea-shape; GitHub uses Issues vs GitLab Issues, etc.).

OrcaSlicer preset import

Drop your local Orca filament profiles into BamDude in one click.

In-app bug report

Floating Bug button on every page — describe the issue, optionally drop a screenshot, click Start Debug Logging, reproduce, then Stop & Submit. Sanitized logs (printer names / serials / IPs / passwords / emails / API keys redacted) + screenshot + structured support snapshot get posted to the bamdude.top relay, which creates a GitHub issue. The relay holds the PAT, BamDude never does.

In-app updater with stable + beta channels

Settings → System → Install Update does the full sequence (git fetch --tags, reset --hard to the tag, pip install, npm build) without leaving the UI. Optional Include beta updates toggle surfaces `vX.Y.ZbN` releases too — beta detection is dual-signal (version-name convention OR GitHub prerelease flag). Docker installs aren't auto-applied (running git/pip/npm in a live container would corrupt the image), but the UI shows both image-pull and source-build commands with the resolved tag pre-filled — including a beta-specific hint that `:latest` doesn't track betas, so explicit `image: kainpl/bamdude:0.4.5b1` pinning is required.

Printer-scoped API keys and private media

Restrict an API key to selected printers across reads, controls and their queues; a restricted key cannot use Auto-Queue. Thumbnails and timelapses require permission-aware access, separate from camera tokens. Finished-print photos linked by notifications remain public.

Deployment

Runs where your printers are — a container, a Windows service, or a plain Linux box.

One Docker container

SQLite out of the box; when you outgrow it, PostgreSQL either bundled (BamDude runs it for you) or your own server. `--network host` keeps SSDP printer discovery working.

Native Windows installer

A signed-in-place `.exe` for Windows 10/11 — no Docker, no WSL, no separate Python. Bundles an embedded Python and ffmpeg, registers BamDude as a Windows Service that starts on boot, and keeps your data in `C:\ProgramData\BamDude` across upgrades and uninstalls.

Linux and macOS natively

An install script that sets up systemd or launchd, for when a container is one layer too many.

Reverse proxy and HTTPS

Sits behind nginx, Caddy or Traefik; secure cookies follow the scheme automatically.

Installs as an app on your phone

PWA — add the dashboard to the home screen and it opens like a native app, no store involved.

Get started in 5 minutes

Free, open source, AGPL-3.0 licensed. No cloud lock-in. Ever.