LYNXware — Peripherals + HID
lynx_v0.4.0::rust { rmk, vial, esp_now }
A modular wireless split keyboard built in no_std Rust on ESP32-S3. Each half has three hardware slots — swap in keys, a mouse sensor, scroll wheel, joystick, or gyro to build each hand for your workflow. The keyboard halves only capture and transmit; a USB dongle handles all processing.
lynxCAT & lynxTOWER
┌─────────┐
│ Host │
└──┬──────┘
│ USB
╭──────┴───────╮
│ lynxTOWER │
╰──────┬───────╯
│
┌──────────────┴──────────────┐
│ ESP-NOW ~0.5ms │
└──────────────┬──────────────┘
╱ ╲
╱ ╲
lynxCAT (Left) lynxCAT (Right)
r1 m1 i1 t21 t11 t11 t21 i1 m1 r1
p1 r2 m2 i2 i5 t22 t12 t12 t22 i5 i2 m2 r2 p1
p4 p2 r3 m3 i3 i6 t33 t23 t13 t13 t23 t33 i6 i3 m3 r3 p2 p4
p5 p3 r4 m4 i4 i7 t24 t14 t14 t24 i7 i4 m4 r4 p3 p5
t25 t15 t15 t25
╰── Finger (20) ─╯╰─ Thumb (11) ─╯ ╰─ Thumb (11) ─╯╰── Finger (20) ─╯The Hardware
Two keyboard halves. One USB dongle. Fully wireless via ESP-NOW.
Circuit Boards
Each board has an interactive BOM — click any component to highlight it on the PCB layout.
Scans hardware at 1kHz, transmits raw InputAction frames via ESP-NOW.
Routes through keyboard/mouse/sensor pipelines, outputs USB HID to host via RMK.
Signal Flow
Physical Input (key press, mouse move, gyro tilt)
↓
Hardware Drivers (scan matrices, read sensors)
↓
InputAction Generation (KeyPress, MouseMotion, etc.)
↓
ESP-NOW Transmission (~1ms wireless)
↓
Dongle Reception & Routing
↓
RMK Keymap Engine (layers, macros, tap-hold)
↓
USB HID Reports → ComputerModular Slot Architecture
Each keyboard half has 3 hardware slots that accept different module variants. Configure each hand independently — reconfigure as your needs change.
Finger Slot
always present4x6 matrix (20 keys). Optional rotary encoder (EVQWGD001).
fk | fkwThumb Slot
always present4x3 matrix (11 keys). 2x WS2812B LEDs. Optional analog joystick.
tk | tkjBottom Slot
optionalPolymorphic — mouse sensor (SPI), gyroscope (I2C), or empty.
bn | bm-* | bg ├─ FINGER ── 13-pin ── always present ──── fk | fkw
│ matrix 4×6 · optional encoder
│
├─ THUMB ─── 12-pin ── always present ──── tk | tkj
│ matrix 4×3 · 2x LED · optional joystick
│
├─ BOTTOM ── polymorphic ── optional ───── bn | bm-* | bg
│ mouse SPI · gyro I2C
│
└─ ESP-NOW ═══ ~0.5ms ═══▶ lynxTOWER ═══▶ USB HID ═══▶ HostFeatures & Status
Working in v0.4.0
- Keyboard matrix (finger + thumb slots)
- Scroll wheel encoder
- Mouse sensor (ADNS-5050)
- ESP-NOW wireless link
- USB HID output via RMK
- Vial GUI configuration
- LED layer/caps feedback
Not yet ported to v4
- Battery — power management & charging
- Joystick — analog stick input
- Gyroscope — motion/tilt input
~5-10ms end-to-end (keypress to computer)
Hold tower's BOOT button on power-up — no MAC addresses to configure
Change your setup anytime across 3 slots per half
Remap keys via Vial — no coding required
Visual Feedback
Each LYNXcat has 2 RGB LEDs on the thumb module that display keyboard state at a glance. The tower monitors layer switches and Caps Lock state, then broadcasts to both cats via ESP-NOW.
┌───────────────────────────┬──────────────────────────────┐
│ LED 0: Caps Lock │ LED 1: Layer Indicator │
│ ───────────────── │ ─────────────────── │
│ OFF: Shows layer color │ Layer 0: Cyan (base) │
│ ON: Breathes yellow │ Layer 1: Magenta (nav) │
│ │ Layer 2: Yellow (symbol) │
│ │ Layer 3: Purple (function) │
└───────────────────────────┴──────────────────────────────┘Where do you want to start?
Using LYNXware
Pair your cats to the tower, assign keys in Vial, explore the LYNXgram default layout.
Understanding the Firmware
Capture-Process architecture, three async pipelines, ESP-NOW over ESP32-S3.
Contributing
Navigate the cat and tower crates, understand key-index transforms, read the build flags.