Skip to content
Firmware

Firmware

Base

  • ZMK main, through cormoran’s fork at main+dya: ZMK main plus a custom Studio protocol and cormoran’s BLE and activity extensions. Upstream ZMK has no v0.4 release; this is the line cormoran’s “v4” modules target.
  • Zephyr 4.1 (v4.1.0+zmk-fixes).
  • Board nice_nano//zmk (Zephyr’s hardware model v2 name; the default revision is the nice!nano v2), with the eyelash_sofle_left / eyelash_sofle_right shield and nice_view.
  • The shield is vendored in-repo at config/boards/shields/eyelash_sofle/, adapted from the vendor’s v0.3-only module.

Dependencies

Every west project is pinned to a commit, so the same repo commit always builds the same firmware. Read from config/west.yml on every site build:

ProjectRepositoryPinned atTracks
zmkcormoran/zmke5c9b691main+dya
zephyrzmkfirmware/zephyr10ba6d0cv4.1.0+zmk-fixes
zmk-module-ble-managementcormoran/zmk-module-ble-management57738cc4main
zmk-behavior-runtime-sensor-rotatecormoran/zmk-behavior-runtime-sensor-rotate8b1125edmain

zephyr is declared in config/west.yml on purpose: ZMK’s own manifest names it by branch, so pinning zmk alone would leave Zephyr floating.

Pinning means updates don’t arrive by themselves. mise run deps-check reports which pins have moved upstream. To take one: change the revision in config/west.yml (keep its # track: comment), west update, mise run doctor, build both halves, and commit with the reason. If a zmk bump changes the Zephyr entry in ZMK’s manifest, mirror it in config/west.yml.

Modules

ModuleWhereDoes
zmk-module-ble-managementwest, left halfBLE profile list, switch, rename and unpair, and output priority, over Studio RPC
zmk-behavior-runtime-sensor-rotatewest, left halfthe encoder behavior (rsr_vol), editable live in Studio
zmk-rgb-layerin-repo (zmk-rgb-layer/)per-layer underglow, moods, brightness; see Underglow

The Studio and RPC settings are central-only and live in the left shield’s eyelash_sofle_left.conf, not in the shared config/eyelash_sofle.conf.

Build matrix

GitHub Actions builds three firmwares on every push to main that touches config/, build.yaml or zmk-rgb-layer/, using ZMK’s reusable build-user-config workflow at a pinned ZMK-main commit:

ArtifactShieldExtras
eyelash_sofle_studio_lefteyelash_sofle_left nice_viewStudio on, locking off, studio-rpc-usb-uart snippet, zmk-rgb-layer
nice_view-eyelash_sofle_right-zmkeyelash_sofle_right nice_viewzmk-rgb-layer
settings_resetsettings_reset

zmk-rgb-layer goes in through -DZMK_EXTRA_MODULES, exactly as the local build tasks do.

Notable settings

From config/eyelash_sofle.conf:

SettingValue
Idle sleepafter 1 hour (CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=3600000)
Soft offon (CONFIG_ZMK_PM_SOFT_OFF=y)
Debounce8 ms press, 8 ms release
HID reportNKRO off (6KRO)
BLE transmit power+8 dBm
Pointing (mouse keys)on
Underglowon; off at boot, solid effect, max brightness 60, off when idle, same on USB and battery

Memory budget

Measured from CI run 39026110927 (2026-10-17), the v3.0.0 build:

BuildFlash usedFlash freeRAM usedRAM free
Left (Studio, nice!view)457 KB / 792 KB (57.7%)335 KB123 KB / 256 KB (48.2%)133 KB
Right (nice!view)323 KB / 792 KB (40.8%)469 KB77 KB / 256 KB (30.1%)179 KB
Settings reset51 KB / 792 KB (6.5%)13 KB / 256 KB (4.9%)

The left half is the tightest: Studio, both Studio transports (USB CDC-ACM and BLE GATT), the custom RPC modules and zmk-rgb-layer are all on it. The move from Zephyr 3.5 to 4.1 cost about 47 KB of flash and 14 KB of RAM on the left half, and 53 KB and 15 KB on the right, even after dropping three modules: that is the newer Zephyr and BLE stack. zmk-rgb-layer takes well under 1 KB.

Refresh this table after significant keymap or config changes, from the Memory region block of the latest Build ZMK firmware run log (mise run build-flash prints the same numbers for a local build).