Warning
Develop snapshot, not for production.
This is a test build cut from the develop branch, not a release. It contains in-progress work that has not been through the full release verification path. Install it on a printer you're comfortable recovering, not your daily driver. If you hit problems, file an issue with logs and a debug bundle, and roll back to 20260606_02 if you need a stable build.
Everything in the most recent stable release (20260606_02) is also in this build. See the 20260606_02 release notes for the stable feature set: https://github.com/rinkhals-community/Rinkhals/releases/tag/20260606_02
Highlights
- Kobra S1 Max firmware 2.7.1.4 is now supported, in addition to 2.6.9.6.
- Fixed the Kobra S1 Max touch menu showing 4 blank tiles. Tapping the "Rinkhals" entry now opens the Rinkhals UI as intended.
- Lower memory use and honest memory reporting. Two apps use noticeably less RAM, and the dashboard now shows what is actually available instead of a misleading "97% used".
- Installs can no longer brick the printer on a bad copy. An interrupted install aborts cleanly and leaves your previous version intact instead of rebooting into a loop.
Firmware support
- Kobra S1 firmware 2.7.2.7 supported, with the
minimum_cruise_ratiooverride that avoids a GoKlipper NaN crash on that firmware. - Kobra S1 Max firmware 2.6.9.6 supported.
- Kobra S1 Max firmware 2.7.1.4 supported. New runtime gate, build-time gate, and K3SysUi/gkapi binary patches for the version Anycubic shipped after 2.6.9.6. Stock printer.cfg on this firmware adds a
[fan_generic exhaust_fan]section for the new exhaust fan hardware plus some wipe/throw motion tuning; nothing that needed special handling on our side. - Fixed: Rinkhals touch menu showed 4 blank tiles on Kobra S1 Max. The K3SysUi patch on KS1M 2.6.9.3 and 2.6.9.6 was hooking the wrong row of the Device settings menu (Export logs to U-disk instead of Service Support), so tapping the relabelled "Rinkhals" entry ran the stock Service Support page instead of launching the Rinkhals UI. Root-caused from a community report (discussion #53) by reading the menu's jump table directly rather than assuming a fixed offset from a previous firmware.
App Store
- New touchscreen App Store that browses and installs community apps directly from the printer, sourced from the
Rinkhals.Appscatalog. Includes model-aware SWU selection during install, atomic install behaviour, a stale-button guard for the apps list, and workflow guards in the install pipeline.
Web portal
- For now the default address for the web portal is http://:8090 THIS WILL CHANGE IN THE FUTURE
- Dashboard reports real CPU utilization instead of the load average. The top-left tile (relabelled "CPU") shows actual CPU busy percentage sampled from
/proc/stat. On this hardware the Realtek RTL8723DS wifi driver and the Rockchip media stack keep around 11 kernel threads permanently parked in uninterruptible sleep on driver semaphores, and Linux counts uninterruptible tasks in the load average, so the old number sat near 11 even when the CPU was almost idle. It never reflected real work; CPU utilization does. - Dashboard Memory tile is a segmented bar with an "available" bracket. The old tile derived usage from
MemFreeand read around 97% used even when ~40% of RAM was actually available. It now shows in use / cached / free as three segments, with a bracket over the cached-plus-free portion labelled with the available figure, so it is clear that "available" (not "free") is the number that matters. - Terminal shell sessions survive navigating away. Opening a root shell at
:8090/terminal/and then switching to System Logs, the Apps installer, or any other page no longer kills the session. The terminal panel is mounted once for the lifetime of the app and only hidden when you are off the Terminal page, so shells and their PTY connections keep running underneath. Multiple tabs within the terminal page are preserved as well. - Read-only Firmware page that shows the Anycubic stock-firmware catalogue alongside the Rinkhals patches available for each version, with the install flow plumbed end-to-end via the new Rinkhals Patches card.
- Apps card now gates installs and uninstalls while a print is running.
- Web shell (terminal) now starts sessions in
/root, and its bottom-row clipping is fixed with more padding under the last row. - Symlink handling in the file browser is now a first-class node type instead of being treated as an opaque file.
- Dashboard now shows comprehensive system metrics and printer state blocks; Remote Display and Webcam mapping restored; Mainsail/Fluidd port mappings corrected.
- CORS centralised and the wildcard origin dropped. Dev-mode default port fixed.
- Visual cleanup: dropped decorative accent dots and the inline
devbadge from the navigation. Machine Settings renamed to "Manage Rinkhals" and moved to the bottom of the sidebar.
Memory footprint
The printer has 213 MB of RAM and no swap, so a few MB matters.
- Firmware Collector no longer keeps Python resident. The opt-in app was a daemon that held a Python interpreter (~14 MB) in RAM around the clock just to run a roughly 20 second check once a day. It is now a one-shot scheduled by a tiny shell supervisor, so its steady-state footprint drops from ~13.7 MB to ~0.2 MB (measured on a KS1), with a brief spike only while a check actually runs. Behaviour is unchanged.
rinkhals-webis no longer UPX-packed. Packing shrank the binary on disk but decompressed the whole image into unreclaimable anonymous memory at startup, which on this no-swap board pinned about 8 MB of RAM plus a ~3.7 MB decompression buffer. Unpacked, its code stays file-backed and reclaimable: measured ~12 MB down to ~8 MB resident (about 34% less), with pinned memory dropping from ~8.3 MB to ~1.4 MB. The binary is about 6 MB larger on disk, which is negligible on/useremain.
Moonraker / GoKlipper integration
- Workaround for the GoKlipper
FIRMWARE_RESTART/RESTARTdeadlock that leaves Mainsail and Fluidd disconnected until power-cycle. The gcode is now refused at the Rinkhals shim layer with an explanatory message, instead of being forwarded to gklib where it wedges. - Latent
data_store._init_sensorsTypeError fixed. GoKlipper returnsheaters.available_monitors: nulland the upstream code did.get(key, [])which doesn't substitute the default on explicit nulls. Normalised inside the existingpatch_mainsailwrap so every downstream consumer sees[]instead ofNone. - KS1M Home All wedging Mainsail/Fluidd fixed by synthesising
motion_reportfromtoolheadinstead of exposing GoKlipper's own broken implementation. mmu_ace: custom tool-to-gate mapping (ttg_map) set via the Fluidd Tool Mapping dialog no longer gets silently overwritten by the periodic ACE status poll (issue #49).- Suppressed a spurious klipper config path warning.
Install / update
- Installer verifies the Rinkhals file copy before committing to a new install. If the copy step was interrupted or truncated (seen in the wild on a KS1 running firmware 2.7.2.7: the copy finished in about 1 second instead of the usual ~60, silently missing
home/rinkhalsandusr/bin/python), the installer used to still promote the incomplete copy to the active version, clear the.disable-rinkhalssafety flag, prune the previous good install, and reboot into a non-bootable state (the "sad tones" failure jingle, then reboot, repeating). It now checks the copy succeeded and that key files landed before committing, and aborts cleanly through the existing on-screen error path if not, leaving your previous install intact.
Other fixes
K3SysUino longer spawns a duplicateudhcpcafter the DHCP app has already started.ashglob handling fixed so/rootstays read-write persistent across boots.- Legacy
printer_mutable.cfgcyclic symlinks are now guarded against. - Local LCD snake animation restored during updates.
- App status parsing in the monitor now explicitly checks for the
startedstate.
Test plan
If you install this build, please specifically exercise:
- Kobra S1 Max on 2.7.1.4: confirm Rinkhals installs and boots cleanly.
- Kobra S1 Max on 2.6.9.3 / 2.6.9.6: tap the "Rinkhals" entry in the Device settings menu and confirm it opens the real Rinkhals UI (not 4 blank tiles).
- Install / reinstall: confirm the install completes and boots. If you previously hit a boot loop after an interrupted copy, confirm this build either installs cleanly or aborts with an on-screen error while leaving your previous install intact.
- Dashboard CPU tile: confirm it shows a sensible utilization percentage rather than a load number near 11.
- Dashboard Memory tile: confirm it shows the segmented in use / cached / free bar with an "N MB available" bracket, and that the available figure is sensible (not near 0 or near total).
- Firmware Collector (if you use it): enable it and confirm it still reports firmware updates. It now runs a brief check once a day rather than staying resident, so you will not see a persistent
collector.pyprocess between checks. - Terminal persistence: open one or more shells at
:8090/terminal/, navigate to another page and back, and confirm the sessions are still alive. - App Store: browse and install flow on your printer model.
- Web portal Firmware page: does the Anycubic catalogue render? Does the install flow surface the right SWU for your model?
- Mainsail / Fluidd: send a
RESTARTfrom the console; you should see an explanatorygcode_responseinstead of a wedged connection. mmu_ace: set a custom tool mapping in Fluidd's Tool Mapping dialog and confirm it survives a few minutes of ACE status polling instead of reverting to 1:1.
Report findings to https://github.com/rinkhals-community/Rinkhals/issues with a debug bundle.
Full Changelog: 20260606_02...20260706_01_test