Manage multiple 3D printers from one dashboard
What a self-hosted multi-printer dashboard shows: live state for every machine of any brand, aggregate stats over prints, and where the numbers stop comparing.
Run one self-hosted app that connects to every printer over your own network, and you get a single list showing what each machine is doing right now, plus a statistics view that turns finished prints into totals for cost, filament, and hours. PrintStash does this across Moonraker, PrusaLink, OctoPrint, Bambu LAN, and Elegoo Centauri, which matters mostly when the machines are not all the same brand.
The honest caveat belongs up front, because it decides whether the numbers are worth anything: only Moonraker reports measured filament consumption. Every other provider falls back to the slicer’s estimate, so a fleet total mixes measured grams with predicted ones.
Live state for every machine
Every provider reports temperatures, progress, and state, so the printer list shows the same shape of information whether the machine is a Voron on Klipper, a Prusa MK4 on PrusaLink, a Bambu in LAN mode, or a Centauri Carbon. The transports differ underneath, since Moonraker streams over a WebSocket and the others are polled, but that difference stays out of the way.
What each provider will let you do from that view is not uniform, and PrintStash disables the actions a printer cannot perform rather than failing when you click. Pause, resume, cancel, start, and upload work everywhere. File inventory is missing on Bambu LAN and Elegoo Centauri. Raw G-code is Moonraker only. The compatibility matrix is the per-provider list, and it changes with releases.
Since v0.11.1, access is per printer: a user can hold view, print, control, or admin on each machine independently, so a shared instance can show everyone the status wall while letting only some people start jobs.
The statistics view
Completed prints roll up into a separate dashboard, which is superuser-only. It reports total cost, total prints, filament used, average filament per print, and total print time, with a cost, filament, and prints time series you can draw as an area, line, or bar chart. Alongside those are breakdowns for top collections and most-used filaments.
Two controls change what you are looking at: a period filter covering 7, 30, and 90 days, one year, or all time, and a display currency set in Settings under Design, which applies across every cost figure.
The number to treat carefully is cost. A print’s cost is resolved and frozen when the job completes, so it reflects the filament price at the time rather than today’s, which is what you want for a historical total. But on a mixed fleet, cost derived from measured grams on a Klipper machine sits in the same total as cost derived from a slicer estimate on a Bambu, and nothing in the chart distinguishes them. Print history covers which numbers are measured and which are estimated, per model and per revision.
How this differs from the tools you may already run
| Tool | Printers per view | Providers covered | Library | Aggregate cost and filament |
|---|---|---|---|---|
| PrintStash | Every connected printer in one list | Moonraker, PrusaLink, OctoPrint, Bambu LAN, Elegoo Centauri | Yes, with revisions and outcomes | Yes, superuser-only statistics view |
| Mainsail or Fluidd | Several instances, switched between | Moonraker only | No | No |
| OctoPrint | One instance per printer | Its own | Basic file list | Per-file print counts |
| Manyfold or STL Shelf | None, no printer connection | None | Yes | No |
Mainsail and Fluidd both handle several Klipper instances, and Fluidd’s documentation describes switching between printers in one browser tab, fully reinitializing on each switch, while Mainsail leads its feature list with multi-printer management. Both are strong at controlling a Klipper machine in depth, including things PrintStash deliberately does not do: console access, macro editing, bed mesh visualization, and tuning. Neither can see a printer that does not speak Moonraker. Checked August 19, 2026.
That is why PrintStash does not try to replace them. It sits above the fleet with the library and the cross-machine view, and you keep the per-printer UI for the deep work. Running PrintStash alongside OctoPrint, Fluidd, and Mainsail covers how the two layers coexist.
What it does not do
There is no camera wall and no failure detection, so PrintStash reports what the printer says rather
than noticing spaghetti itself. Routing a job is a separate concern from watching one, and
queueing and scheduling across a farm covers that side. For
infrastructure-level monitoring with alerting, the /metrics endpoint feeds
Prometheus and Grafana, which is a different job from
the built-in statistics view. None of it pins you to a desk either: checking the farm from a
phone covers the installed PWA and what makes the same
screens work away from home.
Questions that come up
Can I see every printer at once, or one at a time?
Every connected printer appears in one list with its current state, temperatures, and progress, so the answer to “is anything stuck” is one screen rather than one tab per machine. This is the part that per-printer control UIs are not built for: Fluidd connects to one printer at a time and reinitializes when you switch, and both it and Mainsail only speak to Klipper machines. Deep control of a single printer is still better in those tools, which is why running both is the normal arrangement rather than a compromise.
Do I need Mainsail or Fluidd as well?
For a Klipper fleet, usually yes, and PrintStash is designed on that assumption. Console access, macros, bed mesh, input shaper, and firmware restarts live in the per-printer UI, and PrintStash does not duplicate them. What it adds is the library the files come from, the record of which revision printed well, and the view across machines that a single-printer UI has no reason to provide. On Bambu, PrusaLink, or Elegoo hardware there is no equivalent local UI, so PrintStash is doing more of the job by default.
Who can see the cost and filament statistics?
Superusers only. The statistics dashboard aggregates the whole vault, including prints from collections a normal member may not have access to, so it is not exposed per user. Individual members still see print history on the models they can reach, which is where per-model and per-revision numbers live. If you need the aggregate view for someone else, that means giving them superuser, so decide with that in mind.
Are the cost totals comparable across different printer brands?
Not exactly, and the gap matters before you quote a number to anyone. Measured filament consumption comes back from Moonraker only, so a Klipper machine’s cost is based on grams the printer actually reported. Everything else falls back to the slicer’s estimated weight, which is usually close but is a prediction. Measured elapsed duration is separate and does come back from PrusaLink, OctoPrint, and Elegoo Centauri as well. If exact cost per print matters more than convenience, the Moonraker machines are the ones to trust, optionally with Spoolman wired in for real spool prices.
Sources
- PrintStash capabilities, the compatibility matrix, and the statistics dashboard section of the README in the repository for the metrics, period filters, and display currency. Checked August 19, 2026.
- Fluidd multiple printer support and the Mainsail documentation for how each handles more than one Klipper instance. Checked August 19, 2026.