Glossary¶
One short definition per term used on this site, with how it is known and the page that explains it.
Conventions
Byte strings are lower-case hex in code spans; a params or reply string starts at frame
byte 8 (see Transport). Command ids are written category/subcommand, for
example 30/1004. Versions are written 3.41.0 (keyboard) and 2.3.3 (module); the keyboard reports
them with a leading zero on the wire (see Firmware versions).
Terms¶
| Term | Definition | Evidence | See |
|---|---|---|---|
| Ack | The reply to a write. Its status byte says the frame was parsed; it does not prove the write was applied (read back). A REMAP write ack echoes the layer or slot index. | MEASURED (owner's board, 3.41.0) | Transport |
| Active profile | The NayaFlow profile marked ON_BOARD, the only one "Flash Create" writes (UI: "Active profile (flashes to Naya device)"). |
STATIC DOC | NayaFlow and NayaCore |
| Batch (vendor term) | A shipment wave of the Create. Batch 0 = 100 test units (January 2025, tester firmware without remapping or modules); Batch 1 about 150; Batch 2 two waves of 250; Batch 3 two waves of about 500; Batch 4 about 1300; the vendor called Batches 0-2 production-validation units; all pledges had shipped by 2025-09-11. | DOC (Kickstarter updates 18-22 and 25) | History |
| Battery Zero (vendor term) | The vendor's name for a rare fault that drains a module "beyond recovery"; it announced firmware and hardware fixes and a recovery mode (see Recovery mode; NayaFlow 1.3.8 notes "module recovery support for battery Zero"). | DOC (Kickstarter update 21, 2025-06-16; 1.3.8 notes) | Power |
| Bay (module bay) | The dock on each half where a module sits; the left bay and right bay each light a 24-index block of the LED map (88-111, 112-135). | MEASURED (owner's board, 2026-09-08) | Module dock |
| Bay record | A keymap record at positions 0x4a-0x51 (one per module type and side) whose type byte picks the module-config slot that layer uses; 78 means "inherit from the base layer". |
MEASURED (owner's board, 3.41.0, 2026-09-03) | Keymap |
| Beta channel | NayaFlow-Beta, a separate app published from NayaTech/NayaFlow-beta-releases (16 releases, 2025-09-01 to 2026-07-17); three keyboard firmwares shipped only there (3.39.4, 3.40.0, 3.40.4). |
DOC STATIC | History |
| Body, wing, dock | The three hinged parts of a half: the main body, the wing (outer two key columns, tenting hinge) and the dock (thumb keys and module ring). | DOC (Create manual v1.1.x p.9) | The keyboard half |
| Boot pass | The 1-1.7 s every half spends in its bootloader at power-on (USB PID 0x006F left, 0x00D3 right) before the application starts; distinct from a half parked in the bootloader, which stays until an SMP reset. |
MEASURED (owner's boards, 2026-09-22) | Bootloader |
| Buffer cell (internal battery) | The small cell in each half that keeps it running while a module is swapped; not meant to power normal use. | DOC (manual p.4; FCC exhibits) | Power |
| Byte 3 (chunk countdown) | Frame byte 3 counts the frames still to come: in a chunked write (02 01 00) and in a multi-part read reply (03 02 01 00 for a four-chunk layer); 00 on a single frame, on write acks and on every read request. |
MEASURED (our captures of 2026-09-01, 09-03 and 09-17) | Transport |
| Category | Frame byte 4, the command family: 30 REMAP, be Bluetooth, ca charger, de module, ed LED, ee reset, f1 firmware, fa SPI flash, fe system, ff host-side meta. |
STATIC MEASURED (nayactl; NayaCore) | Command map |
| Central / peripheral | The left half is the central: it owns every REMAP store, drives both halves' LEDs and reaches the right half as dst 0x51 for the reads it relays (see Relay); the right half is the peripheral. |
MEASURED INFERRED (owner's board, 3.41.0) | Split link |
| Continue flag | The request flags byte 01, asking for the next chunk of a chunked read; 00 starts (or restarts) the read. |
MEASURED (owner's board, 3.41.0) | Python recipes |
| CRL / CRR / DG | The FCC IDs 2BQ4V0825CRL (left half), 2BQ4V0825CRR (right half), 2BQ4V0825DG (dongle); grantee code 2BQ4V. |
DOC (FCC filings) | Regulatory records |
| Crown, Gesturepad (vendor terms) | The Tune's outer rotating ring and its inner touch surface. | DOC (Tune manual v1.1.x p.6) | Tune |
| Danger Zone | NayaFlow's section with destructive buttons: force module update, Test and Format SPI-Flash (ZMQ event repair_flash), Clear all keymap data (clear_data), Clear BLE Devices (clear_ble_devices). NayaCore dispatches clear_data to its ClearAllData operation, which sends 30/10ca; clear_all_data is that operation's process name, not an event. |
STATIC DOC | NayaFlow and NayaCore |
Destination (dst) |
Frame byte 2 of a request: 0x50 the left half, 0x51 the right half (on the right half's own port, or through the left half's port for the reads the left relays; see Relay). |
MEASURED (owner's board; create-legacy-firmware1) | Transport |
| Dock-bus address | The byte a docked module answers with (de/1001, de/1007): bit 0 is the side, the high nibble the type (0x10 Touch, 0x20 Track, 0x40 Tune; 0xF0/0xF1 not booted). |
MEASURED (owner's board; nayactl pull request #2) | Modules |
| ED | The LED command category (0xed), for live effects and three persistent settings (ed/1012 scan mode, ed/1013 maximum brightness, ed/1014 LED action override). |
STATIC MEASURED (owner's board, 2026-09-13/16) | LEDs |
| EOT | The 04 byte that ends every frame. |
STATIC | Transport |
| Flags byte / status byte | Frame byte 8, and the first byte of every params or reply string on this site. In a request 00 (or 01 = continue); in a reply the status: 00 last, 01 more, 11 not implemented, 16 nothing stored, 18 nothing stored (continuation), ea value refused. |
MEASURED (owner's boards, 3.41.0 and 3.28.7) | Transport |
| Flash generation A / B | Two keyboard hardware variants (flash parts) that need different images; B images carry _64 in their names (kb_fwl_64.bin); NayaCore tells them apart by USB PID bit 0x1000. |
STATIC | Firmware images |
| Flavor (interrupt flavor) | The hold-tap decision rule stored in every hold-tap record (ZMK's balanced, tap-preferred, hold-preferred, tap-unless-interrupted); valid values 0-3 (4 stops every key). 00 behaves as hold-preferred, 01 as balanced and 02 as tap-preferred (ZMK's order), so NayaFlow's default "Balanced", written as 00, types as hold-preferred; 03 is not measured. |
MEASURED STATIC (owner's board, 3.41.0, 2026-09-03/17 and 2026-09-253) | Settings and timing |
| flow-bg-server | NayaFlow's Go background server (HTTP API, database, ZMQ bridge). | STATIC | NayaFlow and NayaCore |
| Force update (module) | NayaFlow's forced module-firmware update for a module that does not answer. | DOC | Module firmware |
| Frame | One message on the USB serial link: aa, three header bytes, category, size, subcommand (2 bytes), flags, payload, XOR checksum, 04. |
STATIC MEASURED | Transport |
| Hold-tap | A key record with a tap action and a hold action (record types 03 and 10); its body carries the hold kind, tap kind, flavor and tapping term. |
MEASURED (owner's board, 3.41.0) | Keymap |
| Hollow port | A half whose own USB port opens, completes the handshake and then answers every command with an empty payload while the half still types; seen on the right half while the halves ran different firmware (left 3.41.0, right 3.35.4), and it ends when they match. | MEASURED (create-legacy-firmware1) | Transport |
| HWID | NayaCore's id for a half, equal to the half's USB serial string and to the fe/1004 reply. |
STATIC MEASURED | NayaFlow and NayaCore |
| KEYHASH | The SHA-256 of the public signing key stored in each MCUboot image; one value across every stock keyboard image of the 25 stable releases and of the 16 beta releases. | STATIC (create-legacy-firmware manifests) | Firmware images |
| KK | A key position byte (0x00-0x49 for the 74 keys); it equals the record's position. |
MEASURED | Layout and positions |
| Layer list | The keyboard's table of layers, one 20-byte entry each [index][id][animation][10][16-byte UUID]; names are host-only. Read with 30/1001, written with 30/1002; rewriting it byte for byte restores stored lighting on both halves. |
MEASURED (owner's board, 3.41.0, 2026-09-03/10) | Layers |
| LED map | 136 entries per layer [position][hue u16 LE][saturation] covering keys, side bars and both module bays; saturation 150 means "no color set". |
MEASURED (owner's board, 3.41.0) | LEDs |
| LEN / size | In a record, LEN is the parameter length (record = LEN + 3 bytes); in a frame, the size byte counts subcommand, flags and payload (payload + 3). | MEASURED | Transport |
| M_Firmware / FlashMemory.bin | The left half's store for module firmware and the 1 MiB LittleFS bundle NayaFlow uploads into it (SMP image id 4). | STATIC | Module firmware |
| MCUboot | The bootloader on each half (serial recovery over USB CDC, SMP protocol); it only accepts images signed with Naya's key. | STATIC MEASURED | Bootloader |
| Module-config slot | An entry of the keyboard's module-config store (30/1009 list, 30/100b/30/100c data); slot 0 is a blank template; layers pick slots through bay records. |
MEASURED (owner's board, 3.41.0, 2026-09-02/03) | Modules |
| Motion category | The first u32 of a two-word 0f record in a module field: 0 pointer X, 1 pointer Y, 3 buttons, 4 vertical scroll, 6 horizontal scroll, 8 zoom. |
MEASURED STATIC | Module fields |
| NayaCore | NayaFlow's C++/Qt service that does all device I/O. | STATIC | NayaFlow and NayaCore |
| NayaFlow | Naya's desktop configurator (Electron). | DOC | NayaFlow and NayaCore |
| OneKey | OpenFlow's name for up to four behaviors on one key (tap, hold, double tap, tap + hold). | DOC (OpenFlow) | Tools |
| Params / reply string | This site's way of writing a frame's contents: every byte after the two subcommand bytes up to the checksum, starting with frame byte 8 (the flags byte in a request, the status byte in a reply). fe/1002 reply 00 00 03 29 00 = status 00, then the version bytes. |
DOC (this site's convention) | Transport |
| Parked | A half sitting in its bootloader (no lights, no typing) until an SMP os reset sent to the port that answers SMP, or a power cycle; recoverable. |
MEASURED (owner's board, 2026-09-08 to 09-20) | Recovery |
| Position | The index of a record in a layer: 0x00-0x49 keys, 0x4a-0x51 bays, 0x52 and up the second bank. |
MEASURED | Keymap |
| ProtocolCDC / SystemCDC | NayaCore's names for the binary protocol channel (the one this site documents) and the retired text channel (answered only by firmware older than 3.31.1). | STATIC DOC (1.17.2 notes) | History |
| Record | One entry of a layer, [position][type][len][param...]. |
MEASURED | Keymap |
| Recovery mode (module) | The MODULE_FORCE_CHARGING key (record type 06, id 401), which force-charges a critically drained module in that half's bay; the module is unusable meanwhile and the mode ends by itself or on restart. |
MEASURED DOC | Disassembly |
Relay (dst 0x51 on the left port) |
A request sent to the left half's port with dst 0x51. The left half relays only some reads: the firmware-version read reaches the right half (on 2026-09-20 the left port read the right half's 3.35.4 while the right half's own port was hollow), but Bluetooth identity reads come back for the left half, and the right half's port cannot reach the left half. Which sender byte a relayed reply carries is OPEN (details). |
MEASURED (create-legacy-firmware1) | Transport |
| REMAP | Category 0x30: layer list, layer data, LED maps, module configs, clear-all (30/10ca). |
STATIC MEASURED | Command map |
| Resource | A stock firmware file as shipped: the whole 663 552-byte slot (header, encrypted image, TLVs, padding and a pre-written swap trailer). | STATIC | Firmware images |
| Second bank | Positions KK + 0x52, where double tap and tap + hold live for key KK. When a key has either, NayaCore puts both banks inside a type-10 wrapper ([term u16][inner type][inner param]): a 27-byte record around a two-behavior pair, a 10-byte record around a single key press; NayaCore's logs print the same forms. |
MEASURED STATIC (USB capture, 2026-09-03; NayaCore 6.11.0; keys written in these forms typed as set on 3.41.0, 2026-09-26) | Keymap |
| SMP | The mcumgr management protocol the bootloader speaks (CBOR over framed serial), used to upload images (image upload, slot id 2 for the keyboard, 4 for the module bundle) and to reset (os reset). |
STATIC MEASURED | Bootloader |
.sfb |
An encrypted module firmware file (Touch_UserApp.sfb, Track_, Tune_, Float_, Query_, each with a HASH file) inside FlashMemory.bin, staged in the left half's flash for the module to update from. |
STATIC | Module firmware |
| Speedlink (vendor term) | The vendor's name for the wireless dongle (model NAYA-100-1, FCC ID 2BQ4V0825DG). |
DOC (manual) | Speedlink dongle |
SPIFLASH_TEST (fa/1001) |
The read-only SPI-flash self-test; per partition a state and five return codes. | STATIC MEASURED (2026-09-10) | Python recipes |
| Split link | The Bluetooth connection between the two halves (7.5 ms interval, 4 s supervision timeout on 3.41.0). | MEASURED (owner's board, 3.41.0, be/100c) |
Split link |
Status 16 |
The reply status meaning "nothing stored for this read" (a header-only frame; 18 on a continuation). |
MEASURED (donor board, 3.28.7, 2026-09-19) | Transport |
| Subcommand | Frame bytes 6-7, big-endian (10 04 for 0x1004). |
STATIC | Transport |
| Tapping term | The hold-tap time in ms, stored inside every hold-tap record (both banks); NayaFlow writes its global value into each record; there is no device-wide term. | MEASURED (owner's board, 3.41.0, 2026-09-17) | Settings and timing |
| Trailer (swap trailer) | The last bytes of a stock resource (image_ok = 01 and the MCUboot magic), which make the bootloader swap the new image in permanently as soon as the upload ends. |
STATIC MEASURED (flashes of 2026-09-20) | Firmware images |
| Two-word record | A record whose parameter is two u32 values, command first (for example Bluetooth, LED keys, mouse buttons, module motion). | MEASURED STATIC | Disassembly |
| Version gate | A minimum keyboard firmware NayaCore requires for an operation or a command (for example 3.30.0 for REMAP commands, 3.36.0 for the activity timeouts). | STATIC | Disassembly |
| Wedged | A half whose command handler has stopped: it answers nothing and may stop typing until it is unplugged or power-cycled. Any configuration write of three frames wedges 3.28.7; oversized single 30/100e frames are reported to wedge 3.41.0. A half parked in its bootloader is not wedged: an SMP os reset brings it back. |
MEASURED (donor board, 3.28.7, 2026-09-19) REPORTED (the 30/100e case2) |
Differences by firmware |
| XOR checksum | The XOR of subcommand high through the last payload byte (not the size byte). | STATIC (NayaCore's broker frames) | Python recipes |
Open questions¶
- OPEN Whether flavor
03is tap-unless-interrupted, as ZMK's order predicts (details). - OPEN The sender byte of a relayed reply (details).
Sources¶
-
create-legacy-firmware,
FLASHING-PROCEDURE.md, "Measured on hardware, both halves (2026-09-20)". ↩↩↩ -
nayactl, pull request #6. ↩
-
OpenFlow, commit 036d04c: a home-row typing test on the owner's board (3.41.0, 2026-09-25) with hold-tap records at flavor
00and01. ↩