-
v0.9.26 Stable
released this
2026-06-21 21:54:13 +02:00 | 17 commits to nightly since this releaseWhat's new in 0.9.26
New
Fixed
- Camera always started at print begin (issue #50).
camera_on_printwas missing from the/api/stateresponse. - Auto-leveling setting ignored in Moonraker print path (issue #57).
- Filament mapping free-text fields replaced by dropdowns (issue #57).
- Dashboard showed generic material type instead of profile name (issue #57).
- Ghost profile shown on empty slot (issue #57).
- Skip-Objects panel missing in Orca upload flow (issue #57).
- Banner and dialog appeared simultaneously (issue #57).
- "Clear" reloaded idle file on next poll (issue #57). Preview image and buttons disappear instantly.
- Material matching for "PLA Silk", "Matte PLA" etc. (PR #64, @p2l).
See CHANGELOG for full details.
Downloads
- Camera always started at print begin (issue #50).
-
v0.9.25 Stable
released this
2026-06-17 07:21:56 +02:00 | 18 commits to nightly since this releaseFixed
- Random crashes / container restarts — segfault in
libcrypto.so.3(issue #53).
The MQTT-over-TLS client shared a single SSL socket between the reader thread
(recv) and the sender threads (sendall) without serializing them. CPython's
sslmodule does not allow concurrent read and write on the same socket — the
overlap corrupted OpenSSL's internal state, causing a heap corruption and a
segfault that manifested reliably on some hosts (timing-dependent). All socket
access (recv / sendall / close / reconnect) is now serialized under a single
lock; the reader probes readiness withselect()outside the lock so senders
are never starved. Reconnect and disconnect now swap the socket atomically.
Thanks to @BasK for the detailed fault-handler trace that pinpointed this. - File browser accepted non-GCode uploads (issue #59). Drag & drop bypassed
the file picker'sacceptfilter, so e.g. a JPG could be uploaded. Uploads are
now validated both client- and server-side; only.gcode,.gcode.3mf,.3mf
and.bgcodeare accepted. Thanks @gangoke.
Downloads
- Random crashes / container restarts — segfault in
-
v0.9.24 Stable
released this
2026-06-16 21:51:36 +02:00 | 19 commits to nightly since this releaseNew
- Skip Objects available in every print flow (issue #57). The "Skip objects" panel in the Slot Mapper used to appear only when printing from the Browser tab. It now shows in all flows (upload / print bar included), collapsed by default behind a
✂ Skip objects (N)header to keep the dialog compact, expanding on click with the object preview and checklist. - Slot Mapper shows the specific profile name (issue #57). Each slot now displays its mapped filament profile (e.g. "PolyTerra PLA — Polymaker") in the dropdown options and as a hover tooltip on the slot marker, instead of just the generic type. Falls back to the generic type when no profile is mapped.
Thanks to @Alex_M for the detailed UX feedback in issue #57.
Downloads
- Skip Objects available in every print flow (issue #57). The "Skip objects" panel in the Slot Mapper used to appear only when printing from the Browser tab. It now shows in all flows (upload / print bar included), collapsed by default behind a
-
v0.9.23 Stable
released this
2026-06-16 15:22:27 +02:00 | 20 commits to nightly since this releaseNew
- Auto-open print dialog after upload. A new
print_start_dialogsetting (Settings → Printer → "Start Print Behavior") controls what happens after a file is uploaded while the printer is idle:Print Dialogopens the slot-assignment dialog automatically,Print Barkeeps the previous banner behaviour. Based on PR #56 by @gangoke. - Per-print auto-leveling toggle. The print dialog now has its own auto-leveling checkbox that overrides the global default for a single print.
Fixed
- Object skip was silently ignored at print start (PR #56, @gangoke). The skip command was sent before the printer entered the
printingstate, so it was dropped. The skip is now re-applied in a retry loop once the print is confirmed running, with a pending-lock so the UI doesn't reset the skip state prematurely. - Upload during an active print overwrote the running job's preview. Uploading a new file while printing no longer replaces the thumbnail / file_ready of the job currently on the bed.
Downloads
- Auto-open print dialog after upload. A new
-
v0.9.22 Stable
released this
2026-06-16 13:24:08 +02:00 | 21 commits to nightly since this releaseNew
- Restructured Settings panel. The settings modal has been replaced by a persistent Master-Detail panel with five categories: Connection, Printer, Appearance, Filament, and System. Poll interval is now adjustable live.
- Vendor visibility filter (issue #41). A new checklist in the Filament settings lets you restrict the slot profile dropdown to specific manufacturers. "Generic" and your own imported profiles are always visible. The list updates automatically after a profile import.
- Idle file actions in the progress card (issue #55). After uploading a file while the printer is idle, three quick-action buttons appear directly in the progress card: ▶ Print, ⚙ Map Slots, and ✕ Clear — matching the file browser workflow without navigating away.
Fixed
- Mobileraker: app crashed with
Null is not a subtype of ObjectinConfigExtruder.fromJson(issue #48).configfile.configwas returned as an empty object{}. Mobileraker parses bothconfigfile.settingsandconfigfile.configthrough the same strict Dart parser — both are now populated with the same extruder/bed/stepper stub. - Mobileraker: app hung indefinitely on refresh (issue #48). The WebSocket
server.files.metadatahandler called a non-existent store method, returning empty metadata. Mobileraker retried this thousands of times per second. Both the HTTP and WS paths now share a single_build_file_metadata()method. - Mobileraker: ETA / remaining time not shown (issue #48). Side effect of the metadata loop fix — once
currentFileresolves, Mobileraker can calculate ETA fromestimated_time. - Mobileraker:
notify_status_updatetriggered repeatedConfigFile.parse(issue #48). Static objects (configfile,webhooks,heaters,history) were included in every live status push. They are now filtered out; only live telemetry is broadcast. motion_report(live_position,live_velocity) added to printer objects for Mobileraker motion display.- Saving filament slot profiles no longer silently drops the
visible_vendorssetting fromconfig.ini.
Downloads
-
v0.9.21 Stable
released this
2026-06-14 11:11:11 +02:00 | 22 commits to nightly since this releaseFixed
- Camera stream not visible on Android (Chrome / Firefox). Android
browsers do not supportmultipart/x-mixed-replace(MJPEG). The UI
now detects Android and falls back to snapshot-polling at 5 fps
(/api/camera/snapshotevery 200 ms) — no server-side change needed.
Changed
- Docker image now pinned to Debian 12 (Bookworm) (
python:3.11-slim-bookworm)
to avoid glibc 2.41 compatibility issues introduced by the Debian 13
base image thatpython:3.11-slimrecently started pulling. - MQTT and HTTP connections now force IPv4 (
AF_INET) to prevent
connection failures on hosts where the printer is only reachable via
IPv4 but the OS prefers IPv6. - Extruder stub in the Moonraker
configfileresponse now includes
sensor_typeandfilament_diameter— fixes a Mobileraker crash
(Null is not a subtype of Object, issue #48).
Downloads
- Camera stream not visible on Android (Chrome / Firefox). Android
-
v0.9.20 Stable
released this
2026-06-08 23:40:57 +02:00 | 25 commits to nightly since this releaseNew
- French language support (PR #45 by @Nathacks)
- Z height display in the print UI (PR #49 by @Nathacks). Shows
current Z position in mm below the layer counter.
Fixed
- Camera auto-start ignored "Enable camera on print start" setting
after a bridge restart (issue #50). The setting was cached in the
process environment — after saving it in the UI, the old value
survived the restart and the new value fromconfig.iniwas never
read. - Camera restarted automatically after manual stop during a print
(issue #50). A new_camera_user_stoppedflag suppresses
auto-restart for the current print session. It resets when the
print ends. - Spurious "stream unavailable" error toast when stopping the camera
manually. The image error handler was still registered when
img.srcwas cleared. - JS error (
ReferenceError: br is not defined) when toggling the
light. Variable was referenced from the wrong scope. - Webcam URLs are now absolute so that Mobileraker/Obico clients can
reach them.
Downloads
-
v0.9.19.1 Stable
released this
2026-06-04 12:17:46 +02:00 | 27 commits to nightly since this releaseFixed
- Standalone binaries (Linux/Windows) reported
vunknownas their version. TheVERSIONfile is now embedded into the PyInstaller onefile bundle. - When the TLS certificates (
anycubic_slicer.crt/.key) were missing, the bridge only logged the raw[Errno 2] No such file or directory. It now states clearly where the files need to be placed and thatanycubic-certs.zipfrom the Gitea release is the source.
Changed
- Filament profile list re-curated: 209 entries instead of 399. Profiles that only exist inside printer-specific vendor bundles (e.g. Eryone Thinker X400, Artillery M1 Pro, WonderMaker ZR, Tiertime, Cubicon, CoLiDo, Afinia, Snapmaker) were dropped — OrcaSlicer wouldn't have found them in a default Kobra X setup anyway, because the matching vendor bundle is only loaded when the corresponding printer vendor is active. For those filaments the custom profile import (issue #41) remains the way.
Downloads
- Standalone binaries (Linux/Windows) reported
-
v0.9.19 Stable
released this
2026-06-02 13:59:54 +02:00 | 32 commits to nightly since this releaseNew
- 🎯 Filament sync with OrcaSlicer now picks the right preset
instead of always falling back to "Generic PLA". Requires an
OrcaSlicer build with the
PR #13719
receive-side patch (included in the OrcaSlicer-KX build). The bridge
sendsname+vendor_nameper AMS slot on the lane path AND
gate_filament_nameper gate on the Happy-Hare MMU path (OrcaSlicer
switches to the HH path automatically for AMS setups). - Import your own OrcaSlicer profiles into the bridge (issue #41).
Settings → "OrcaSlicer Profiles" or directly in the slot-edit dialog
("★ Import own profiles…") lets you upload.jsonfiles from
~/.config/OrcaSlicer/user/<id>/filament/— single files or as a
ZIP. They show up in the slot dropdown under "★ Own profiles" and
are passed through to Orca on sync as user matches. Works over HTTP
so the bridge can run in Docker on a Raspi/NAS while OrcaSlicer
lives on a desktop. Override-only profiles with just
inherits: "Generic PLA @System"+ a few tweaks are detected
correctly — the bridge resolves the inherited fields from the
system parent.
Fixes
- AMS sync stuck on "Generic PLA": the Orca data model has 68
duplicatefilament_idvalues (OGFL99alone shared by 136
profiles), and the bridge often picked an ID that was not
is_compatiblewith the Kobra X (e.g.GFL92from the Kobra-2
profile → Orca rejected it). The generator now prioritises Kobra-X
variants and filters out phantom profiles (cross-vendor overrides) —
orca_filaments.jsondropped from 1035 to 400 clean profiles. - Slot without an explicit override now sends
Generic <type>
instead of an implicit vendor guess. Library generic profiles have
compatible_printers: [](= all printers), so they are always
visible and match reliably. - Slot card shows the vendor right after save without a browser
reload.poll()was async, the re-render only happened on the next
tick. - ACE dryer toggle threw a 502 even though the dryer worked
(PR #42 by @gangoke):setDryis now fire-and-forget like
setAutoFeed. The printer answers on that push topic with
code: 0instead ofcode: 200, which the bridge wrongly treated
as an error.
Data model / API
orca_filaments.jsonregenerated: only real vendor profiles and
OrcaFilamentLibrary profiles. Bambu/Polymaker/SUNLU library profiles
in, Qidi cross-bundles out.- New endpoints:
POST /kx/filament/profiles/user(ZIP/JSON upload),
GET /kx/filament/profiles/user(list user imports),
DELETE /kx/filament/profiles/user[?vendor=…&name=…]. Persisted in
<KX_DATA_DIR>/orca_filaments.user.json(volume — survives image
updates).
Build
- New module
bridge/orca_filaments.py(shared parser helpers used by
the generator and the import endpoint). - Dockerfile + release.sh updated to include
orca_filaments.py.
Downloads
- 🎯 Filament sync with OrcaSlicer now picks the right preset
-
v0.9.18 Stable
released this
2026-05-31 20:19:38 +02:00 | 36 commits to nightly since this releaseNew
- 🎉 Push filament material and colour from the bridge to the
printer: The values you pick in the slot-edit dialog now actually
reach the printer and stick — the printer display shows the same
slot setup as the bridge UI right away. In 0.9.17 the command was
sent over the wrong MQTT topic (slicer/printer/…) and the printer
silently dropped it. It now goes viaweb/printer/…like the
Anycubic Slicer Next does (verified by live MQTT sniff +
Workbench-Vue source). Note: the printer must be idle, and
empty slots can not be labelled. - Spanish translation reviewed by a native speaker (PR #40 by
@pezfisk): missing accents (impresión, cámara, después,
animación, …) and term consistency (Pause → Pausa, Start →
Iniciar, Layer → Capa). NewREADME.es.mdand cross-links between
the three READMEs. - Z-height now shows up in Obico. The printer does not report a
real Z position over MQTT (live-sniff confirmed), so the bridge
estimates it fromcurrent_layer × layer_height + first_layer_height.
Layer heights are parsed from the gcode header at upload time and
persisted in the gcode store; fallback for prints started directly
from the slicer is the OrcaSlicer default filename pattern
(…_0.2_…gcode)./server/files/metadataalso serves
object_height(total Z) so ObicosmmProgresswidget can render
current Z / total Z. - Slot card shows the OrcaSlicer profile vendor under the
material (e.g.PLA / Polymaker), with the profile name + internal
ID as tooltip. Lets you see at a glance which slot override is
active.
Fixes
- Slot profile picker in the AMS dialog (issue #39 by
@harrygeier): three separate bugs in 0.9.17 caused the chosen
brand to disappear after save and a different material to show up
on re-open.multiColorBox/setInfowas sent on the wrong MQTT topic — see
above.- Save fired two parallel requests (profile override + material/
colour) → race. Now sequential, and the local state is reloaded
before the dialog closes. - OrcaSlicer filament IDs are not unique —
orca_filaments.json
has 68 duplicate IDs,OGFL99alone is shared by 136 vendor
profiles (caught by @gangoke). The primary selector is now
(vendor, name)— unique across all 1002 profiles.
- MQTT reconnect (issue #33 by @icebear): if the printer was
powered off overnight the bridge gave up after 5 reconnect attempts
(~60 s total) — filament sync still worked in the morning (its
HTTP), but starting a print failed withconnection refusedand
the user had to restart the bridge itself. The reader thread now
reconnects forever (backoff caps at 60 s) until the printer
responds again, with logs dropping to DEBUG after the first 5
attempts so an overnight outage does not spam the log. Unknown child pidwarnings in the log: the camera ffmpeg
helpers were killed without awaiting theirwait()— children
lingered as zombies and asyncio reported them every ~20 s. Fixed
in CameraCache +/api/camera/stream.
UI polish
- Pause button is now a toggle: while printing →
⏸ Pause,
while paused →▶ Resume. The separate resume button is gone. - Pause + stop hidden when the printer is idle — both used to be
visible at all times, which was confusing on a standby printer.
Build
- gcode store migration: new columns
layer_height+
first_layer_heightongcode_files(added automatically on first
start of 0.9.18).
Downloads
- 🎉 Push filament material and colour from the bridge to the