Skip to content

v3.0.0 — ZMK main / Zephyr 4.1

Latest

Choose a tag to compare

@rdlu rdlu released this 17 Oct 16:12
dc7a81c

The firmware moves off ZMK v0.3 / Zephyr 3.5 onto ZMK main (Zephyr 4.1), via cormoran's main+dya fork. The keymap is unchanged: same layers, home-row mods, combos, game mode and underglow. This is a major version because flashing it needs a settings reset and re-pairing.

⚠️ Upgrading from v2.x

  1. Flash settings_reset.uf2 on both halves.
  2. Flash the new left and right firmware.
  3. Power both off, then turn on the right half first, then the left.
  4. On each computer, remove the old "Eyelash Sofle" pairing (for example bluetoothctl remove <MAC>), then pair again from SYS|NUM + BT0–BT4.
mise run flash-release-reset   # once per half
mise run flash-release         # left, then right

Highlights

  • ZMK main + Zephyr 4.1 (cormoran main+dya @ e5c9b691, Zephyr v4.1.0+zmk-fixes @ 10ba6d0c, both SHA-pinned). Upstream ZMK has no v0.4 release. This is the line cormoran's "v4" modules target.
  • Studio still works over USB and Bluetooth (locking off). The custom-RPC plumbing is kept: cormoran_ble (BLE profile list/switch/rename/unpair, output priority) and cormoran_rsr (runtime encoder binding). That's the groundwork for sofleii, a planned Rust/ratatui status + control TUI.
  • Leaner module set. Removed battery-history and settings-rpc (still v0.3-only upstream) and runtime-input-processor (only the vendor overlay used it). Their DYA Studio panels are gone.
  • Shield vendored in-repo at config/boards/shields/eyelash_sofle/. The vendor module only supported v0.3. While copying it, a duplicate ext-power node was removed (the v4 board already drives P0.13), along with a deprecated BT_CTLR default.

Breaking / renamed

  • Board: nice_nano_v2 → nice_nano//zmk.
  • Reset artifact: settings_reset-nice_nano_v2-zmk.uf2 → settings_reset.uf2.
  • CONFIG_WS2812_STRIP removed (no longer exists on Zephyr 4.1).

Tested on hardware (2026-10-17)

Typing on both halves, split link, volume encoder, joystick mouse, per-layer underglow, all layers, game mode, nice!view, soft-off (Q+S+Z, 2 s; wake with one reset press), BLE host pairing, and Studio over USB (raw RPC: device info, custom subsystems, BLE profiles). Studio over BLE in the browser wasn't re-tested.

Memory budget

Left 457 KB / 792 KB flash (57.7%), 123 KB / 256 KB RAM. Right 323 KB (40.8%) / 77 KB. The newer Zephyr/BLE stack costs about 47–53 KB of flash per half versus v2.8.0, even after dropping three modules. Plenty of headroom remains.

Known issue (upstream)

cormoran_ble.get_split_info returns an empty reply. The module never sets nanopb's has_info, and it hardcodes peripheral_connected = false anyway. This doesn't affect the keyboard; it only matters to RPC clients.

Docs

CLAUDE.md said the soft-off combo was Q+A+Z. It's Q+S+Z (positions 14 28 40).

Full changelog: v2.8.0...v3.0.0