Skip to content

v2.9.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 05:21
· 3 commits to main since this release

v2.9.0 — the spools & beta-fleet release

The Hub now knows what's on your shelf. Stick a tag on a spool, scan it once with your phone, and from then on one tap loads it into a printer slot — head color, Spool Match, and mix planning all follow automatically. And for the first time, the Hub manages printers beyond the U1.

📶 Spool registry — scan with your phone

Stick an NTAG RFID sticker on a spool (or use the vendor RFID tag many spools already ship with — the Hub reads the tag's serial number only, nothing proprietary is decoded) and scan it with Android Chrome over the Hub's HTTPS tunnel. An unknown tag asks once what's on the spool — search ~2,266 colorimeter-measured swatches from [FilamentColors.xyz](https://filamentcolors.xyz), sample the color already loaded on a head, or describe it yourself — then resolves instantly forever after.

  • No phone NFC? Print QR labels from the Hub and scan those with any camera — iPhone included.
  • One spool can carry both its vendor tag and a Hub sticker: attach the second tag to the same identity with a tap, no duplicates.
  • Full identities, including the weird filaments: manufacturer, material (PLA/PETG/ASA/…), variant (Matte, Silk, Glow, CF…), print temps — and real multi-color support. Dual- and tri-color silks render as segmented swatches, gradients blend smoothly, everywhere the spool appears. Multi-color spools are automatically excluded from mix recipes, since their extruded color depends on position.

🎯 Scan-to-load

Tap a head's color swatch on any printer card — the picker now has "📶 Scan spool → load here." Hold the spool's tag to your phone: the Hub records that spool is now in that slot and pushes its measured color onto the head in one motion. Spool Match instantly treats it like an official RFID roll. Works the other direction too: scan a spool in the Spools tab and pick a printer + slot from its card. A brand-new tag scanned at a printer bounces to the bind panel, then loads itself into the slot you started from. Loadout state survives restarts.

🧮 "What should I load?"

The FS Mix Planner's inverse solve: drop a 3MF and the base-set recommender ranks 4-spool sets from your bound-spool shelf by worst-case ΔE across every color the print needs — recommendations name your actual physical rolls, not theoretical colors. An ideal-CMYW benchmark row shows how close your shelf gets to the ceiling.

Also in the mixer: 3MF analysis is now near-instant over the tunnel. The browser extracts the two tiny config files locally and sends ~300 bytes instead of uploading the whole project — no more timeouts on big multi-plate files.

🔧 Orca-alignment for FS mixes

The Hub's mix serialization is byte-exact against the FS fork in both directions — and a real bug got fixed on the way: pair-style mix definitions in sliced G-code were silently missing from the FS preview. A reconciliation view shows the fork's decoded mixes next to the Hub's predictions, side by side.

🖨 Other printers, in beta

Add a printer type in Settings — it gets its own folder, accent color, and switcher tab (U1 keeps its flat base folder) — then add any Klipper/Moonraker machine into it. The Hub detects capabilities per printer: single-extruder machines get a clean single-head card, and a class guard refuses multi-color jobs dropped on machines that can't print them. Non-U1 types wear a BETA chip: fully harness-verified against mock printers; real-hardware reports are how they graduate.

🩺 Diagnostics bundle

⚙ Settings → Download diagnostics produces one JSON: Hub version, printer types + detected capabilities, the recent Hub log, and the tail of each printer's klippy.log/moonraker.log. IPs are replaced with aliases and tokens are scrubbed before the file is written; auth and tunnel secrets are never read at all. Nothing is sent anywhere — you review the file and attach it to a [GitHub issue](https://github.com/dlgambill/u1hub/issues/new/choose). The Hub still has zero telemetry.

📱 A UI worth using on a phone

Higher-contrast theme, sticky nav bar, bottom-sheet modals, 44 px touch targets, and inputs sized so iOS stops zooming on every field. Two long-standing bugs died in the process: file-row actions were unreachable on touchscreens (hover-only), and taps sometimes needed two or three tries because the live fleet stream could rebuild the page mid-tap — re-renders now wait for your finger to lift.

🐳 Docker fix

The image now ships every module it needs (#1) — docker compose up -d on a Pi or NAS works out of the box. The test suite now boots the Hub from exactly the Dockerfile's file set, so this can't regress.


Upgrading: drop the new binary in place (or git pull + restart for source installs). Existing configs migrate automatically — printers, queue, and print history are tagged under the built-in U1 type with no file moves.

Note: FS mix serialization is verified byte-exact against the fork; print-parity validation (same mix sliced both ways, printed and compared) is ongoing.

Full changelog: v2.8.1...v2.9.0