A small local dashboard for a farm of Snapmaker U1 printers. From your phone or any browser on the same network you can:
- Browse a folder of sliced G-code and see the colors each job needs.
- See every machine's loaded colors and live status (idle / printing %) at a glance.
- Push a job to any machine — and optionally pre-map each color to the head you want it to print from, so the machine's mapping screen comes up already correct.
- Watch an upload progress bar while a file is sent, so a big push isn't a silent wait.
- Pause, resume, or cancel a running print from any card.
- Skip a single object mid-print from a tap-to-skip plate map — salvage the rest of a plate when one part fails instead of scrapping the whole bed.
- Set the bed temperature per machine.
It talks straight to each printer's built-in Moonraker API. Nothing leaves your network.
Grab the build for your OS from the Releases page, put it in its own folder, and run it — a browser opens to the dashboard.
- Windows (
U1-Print-Hub-Windows-x64.exe): SmartScreen may warn "unknown publisher" (the app isn't code-signed). Click More info -> Run anyway. - macOS (
U1-Print-Hub-macOS-AppleSilicon/-Intel): right-click -> Open the first time to clear Gatekeeper, or runxattr -dr com.apple.quarantine <file>once. You may need tochmod +xit. - Linux (
U1-Print-Hub-Linux-x64):chmod +xthen run it.
config.json and a gcode/ folder are created next to the executable on first run.
Use Settings in the page to add your printers.
Already running on port 4545? Only one copy can use the port. If a launch flashes and closes, something else (often a second copy) already has 4545 — close it first.
For always-on hosts, run the hub in a container. It serves the same dashboard.
git clone https://github.com/dlgambill/u1hub.git
cd u1hub
cp config.example.json config.json # a writable config the hub persists to
mkdir -p gcode # point your slicer here, or mount your real folder
docker compose up -dThen open http://<this-host-ip>:4545.
About auto-discovery: the "Discover on network" scan only works with host
networking, which docker-compose.yml enables by default (Linux hosts). On Docker
Desktop (macOS/Windows) host networking behaves differently — comment out
network_mode: host, uncomment the ports: block, and just add printers by IP in
Settings (that always works, container or not).
Edit the volumes in docker-compose.yml to point at your real Orca output folder.
You need Node.js 18 or newer — get the LTS build from https://nodejs.org and run the installer (defaults are fine). Then:
- Unzip this folder somewhere permanent, e.g.
C:\u1-print-hub. - Start it:
- Windows: double-click
start-windows.bat - Mac / Linux: run
./start-mac-linux.shin a terminal
- Windows: double-click
The first launch installs what it needs (takes a minute) and then opens http://localhost:4545 in your browser.
Use it from your phone: find the IP of the computer running the hub and open
http://THAT-IP:4545on your phone — e.g.http://192.168.1.20:4545. Keep the hub running on a computer that stays on (or set the launcher to run at startup).
The Settings panel opens automatically the first time. Three steps:
- Add your printers. Click Discover on network to scan your LAN and list any Snapmaker U1s it finds — click Add on each. (Or Add manually and type an IP.)
- Set your G-code folder. Point it at the folder Snapmaker Orca saves sliced files to.
- Save.
Reopen Settings anytime with the gear button.
- Pick a file from the left to see the colors it needs.
- Each machine card shows its four heads with the colors currently loaded, plus status and bed temp. When a job is selected, you get a per-color "Send each color from" picker (defaulted to the best match) and Upload / Print buttons.
- Press Print to send to that machine; a progress bar tracks the upload, then the print starts with your color mapping already applied.
- While a machine is printing, the card shows Pause / Resume and Cancel, plus a Plate button that opens a live map of the bed. Tap any object to skip it — the rest of the plate keeps printing. (Skipping is irreversible.) The map's bottom edge is the front of the bed.
Open Network inventory at the bottom — it lists every machine's MAC address. In your router, add a DHCP reservation binding each MAC to its current IP. After that, addresses never move and you won't have to touch anything.
- Toolhead mapping is set the same way Snapmaker Orca does it: the hub uploads the
file, sends the
SET_PRINT_EXTRUDER_MAPmacros for your chosen head assignment, then starts the print. The dropdowns pick which physical head prints each color. - Per-head colors are read from Moonraker's
print_task_configobject; the live plate map and skip feature use the standard Klipperexclude_objectmodule. - LAN only, no password. Anyone who can reach the hub can push prints — and it controls real ~300 C hardware. Keep it on your home/shop network; don't expose it to the internet or forward a port to it, and don't leave prints unattended.
Buy me a beer -> https://venmo.com/u/dgambill (Venmo @dgambill). No pressure, all appreciated.
MIT — see LICENSE. Free to use, change, and share.
capture-proxy.js sits between Snapmaker Orca and ONE real printer, forwards
everything (so Orca works normally), and logs every request — so you can see the
exact call that carries the head mapping.
- Find the IP of the machine running this (Windows:
ipconfig; Mac/Linux:ifconfig). - Run, pointing at the printer you're testing:
node capture-proxy.js http://<printer-ip> 7125 - In Orca, edit that printer's connection host to
http://<this-machine-ip>:7125(keep type = Klipper/Moonraker). Slice, set your toolhead mapping, hit Send. - Everything lands in
capture-<timestamp>.log— the upload and any mapping call will be in there in plain text. - When done, point Orca's host back at the real printer IP.
Single-file executables are built by @yao-pkg/pkg
on native runners (each OS builds on its own runner — no cross-compiling). To cut a
release, bump the version in package.json and the VERSION constants in server.js
and public/index.html, then tag and push:
git tag v1.5.2
git push origin v1.5.2
.github/workflows/release.yml builds Linux, Windows, and Apple-Silicon macOS binaries
and publishes them to a GitHub Release. The Intel-Mac build is a best-effort job:
GitHub's free macos-13 runners are often unavailable, so it must not block the release —
it attaches its binary afterward if/when a runner frees up. To build locally instead:
npm install && npm run build (output in dist/).