ESP32-S3 Bluetooth macro keypad with a Windows companion app.
  • C# 74%
  • C++ 19.8%
  • PowerShell 3.4%
  • Shell 2.8%
Find a file
dikkadev 2330fd18fc fix(ble): harden GATT reconnects and persist runtime diagnostics
This hardens Windows BLE reconnects by validating full GATT readiness before treating a device as connected, retrying discovery/open flows, and disposing stale sessions when writes, service changes, or characteristic lookups fail. It also persists runtime diagnostics to a rotating log file so intermittent connection issues can be investigated after the fact.
2026-06-27 12:02:21 +02:00
.dev docs: add fresh-platform PCB recommendation 2026-06-25 16:25:49 +02:00
firmware Improve wake status UI and sleep wake LED 2026-06-22 15:11:42 +02:00
mechanical docs(mechanical): record public Onshape case model 2026-06-22 09:57:52 +02:00
pc fix(ble): harden GATT reconnects and persist runtime diagnostics 2026-06-27 12:02:21 +02:00
.gitignore validate paired HID delivery 2026-05-28 23:17:02 +02:00
AGENTS.md mock remote buttons over serial 2026-05-28 22:02:12 +02:00
README.md feat(firmware): add set-top double-press manual sleep control 2026-06-21 23:13:29 +02:00
what.md docs: add initial project requirements and hardware notes 2026-05-28 21:13:51 +02:00

remoteWispr

A small ESP32-S3 Bluetooth wireless keypad for a personal voice-transcription workflow.

Initial hardware target:

  • NULA DeepSleep ESP32-S3 board
  • 2100 mAh LiPo/Li-ion battery
  • WS2812B Ring7 LED ring, 7 outer pixels + 1 center pixel
  • 3 mechanical keyboard switches

Main behavior:

  • Act as a six-layer, 3-main-key wireless keypad with local set buttons for layer/debug/manual-sleep controls.
  • Send debounced main-key down/up, layer, and status events to the Windows app over a tiny binary BLE GATT protocol.
  • Let the Windows app map those remote events to actual Windows key combos, especially RightShift+F17 for the Wispr use case.
  • Keep layers, button debounce, LEDs, status, and warning generation owned by the remote.
  • Use low-brightness, lively LED feedback for layer, connection, and local status.
  • Battery percent/charging status is not implemented with current hardware; NULA exposes battery power/charging, but no confirmed firmware-readable battery-sense or charger-status pin.

Project context and research live in .dev/; the protocol spec is .dev/keypad-protocol.md.