# Changelog ## [0.9.18] – 2026-05-31 ### New - **πŸŽ‰ 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 via `web/printer/…` like the Anycubic Slicer Next does (verified by live MQTT sniff + Workbench-Vue source). **Note:** the currently loaded slot can not be overwritten during a print β€” unload it first. - **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). New `README.es.md` and 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 from `current_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/metadata` also serves `object_height` (total Z) so Obicos `mmProgress` widget 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/setInfo` was 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, `OGFL99` alone 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 with `connection refused` and 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 pid` warnings in the log:** the camera ffmpeg helpers were killed without awaiting their `wait()` β€” 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_height` on `gcode_files` (added automatically on first start of 0.9.18). ## [0.9.17] – 2026-05-30 ### New - **πŸ§ͺ Obico integration (experimental):** The bridge now exposes a Moonraker-compatible surface that the [moonraker-obico](https://github.com/TheSpaghettiDetective/moonraker-obico) plugin accepts. Time-lapses, layer-aligned first-layer scan and WebRTC live streaming work against a (self-hosted or cloud) Obico server. **Note:** the spaghetti-detection ML model is trained on side-view cameras (Ender/Voron); how well it works with the Kobra X's top-down camera is still to be evaluated empirically (it already looked promising in our tests). Stream, time-lapse and telemetry work β€” the failure-detection side stays flagged as experimental for now. - **Multi-language UI (PR #37 by @gangoke):** Inline translations have moved into JSON files; a globe-icon dropdown lets you switch language. Browser locale is auto-detected; manual choice persists in LocalStorage. Languages: πŸ‡©πŸ‡ͺ πŸ‡¬πŸ‡§ πŸ‡ͺπŸ‡Έ πŸ‡¨πŸ‡³ (ES + ZH-CN are AI-translated and not verified by native speakers yet). - **OrcaSlicer filament profile per AMS slot:** The slot-edit dialog now lets you pick a concrete OrcaSlicer profile (e.g. "PolyTerra PLA β€” Polymaker") per slot; the bridge sends it along on AMS sync instead of just "Generic PLA". Profile list is generated from the OrcaSlicer source (~1000 profiles, 43 vendors). A matching patch in OrcaSlicer-KX is on the way so OrcaSlicer fully honours the hint. - **H.264 direct stream:** New `/api/camera/h264` endpoint serves the printer camera stream as MPEG-TS without re-encoding β€” dramatically reduces latency, bridge CPU during Obico streaming drops from ~13 % to ~3 %. ### Fixes - **Setting temperature via bridge UI / Obico caused a printer system error:** Fixed via live MQTT capture from Anycubic Slicer Next β€” the `tempature/set` command needs a `type` field (0=nozzle, 1=bed, 2=both) and must go over the `web/printer/…` topic, not `slicer/printer/…`. Nozzle/bed heating from the bridge now works. - **Large GCode uploads (>50 MB) timed out:** The socket connect timeout was active during `sendall()` too β€” pushing ~200 MB over LAN took more than 30 s and was falsely aborted. Connect / send / read phases are now timed out separately. - **Camera snapshots were slow and could collide with the live stream:** The bridge now keeps a central camera cache (one ffmpeg pulls from the printer, all consumers share it). Snapshots return in ~1.3 ms from RAM instead of 1–2 s per spawned ffmpeg. Also resolves the single-client limit on the printer (HTTP 429 on parallel access). - **Language switch did not refresh the GCode browser:** Strings baked into the file cards ("Print", "Estimate", "Download") stayed in the previous language. Cards are now re-rendered on language switch. - **GCode web upload + download + verify dialog (PR #32 by @gangoke):** Files can be uploaded / downloaded directly in the browser, with a warning dialog when starting a GCode that was not uploaded via OrcaSlicer. ### CI/Build - Multi-arch Docker image (amd64 + arm64) automated via Gitea Actions. - Release builds for all three targets (linux-amd64, linux-arm64, windows.exe) via the local CodeBuilder. ## [0.9.16] – 2026-05-22 ### New - **Auto-start camera on print:** new setting "Turn camera on at print start" β€” when enabled, the bridge starts the camera stream automatically when a print begins (works for both OrcaSlicer and the Bridge UI). ### Fixes - **Single-color print blocked by an empty AMS slot:** OrcaSlicer writes all configured filaments into the GCode header even when the model uses only one, so the bridge told the printer it needed every color β€” and an empty unused slot aborted the print. The bridge now maps only the filaments actually used by the GCode. - **Filament sync now position-accurate:** with an empty slot in the middle (e.g. slot 1 yellow, 2 empty, 3 red, 4 white) OrcaSlicer showed the colors shifted onto the wrong slots. Fixed β€” empty slots keep their position, and the sync color format follows the Happy Hare convention (RRGGBB without `#`). - **Slicer time + thumbnail missing after a browser reload** (or when a print was started directly from OrcaSlicer): both are now restored from the GCode store by filename instead of relying on volatile state. - **German translation gaps** in the ACE dryer dialog fixed. ### Logging - Repeated log lines are collapsed into a counter ("Γ—N") instead of spamming the console; status-poll traffic is no longer logged at INFO. - New log level filter (All / Errors / Warnings), a toast on new errors, full tracebacks forwarded to the browser log, and a timestamped download filename. ## [0.9.15] – 2026-05-21 ### Fixes (Issue #29) - **UI in the OrcaSlicer device tab was broken:** OrcaSlicer's embedded webview only loads the bare HTML and ignores external `