LYNXware — Peripherals + HID

lynx_v0.4.0::rust { rmk, vial, esp_now }

Rust: no_stdESP32-S3: 240MHzwireless: ESP-NOWframework: RMKconfig: Vial GUIstatus: active dev

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.

lynxCAT x2
Capture Node

Scans hardware at 1kHz, transmits raw InputAction frames via ESP-NOW.

lynxTOWER x1
Processing Hub

Routes through keyboard/mouse/sensor pipelines, outputs USB HID to host via RMK.

62 keys 3 slots / half ~5-10ms e2e ESP32-S3 @ 240MHz 8MB Flash

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 → Computer

Modular 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 present

4x6 matrix (20 keys). Optional rotary encoder (EVQWGD001).

fk | fkw

Thumb Slot

always present

4x3 matrix (11 keys). 2x WS2812B LEDs. Optional analog joystick.

tk | tkj

Bottom Slot

optional

Polymorphic — 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 ═══▶ Host

Features & 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
Low latency wireless

~5-10ms end-to-end (keypress to computer)

Auto-pairing

Hold tower's BOOT button on power-up — no MAC addresses to configure

Hot-swappable modules

Change your setup anytime across 3 slots per half

GUI configuration

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?

LYNXware v4 — Open-source keyboard firmware