What's new in v0.2.0
The voice light tells the truth
The dictation rainbow used to light on the keypress and turn off on a 180-second timer. It now follows the microphone itself (CoreAudio's device-running state — the same truth behind the orange menu-bar dot): the ring stays dark until recording actually starts, and goes dark the moment it stops, however it was stopped. A tap that only typed a space never lights it at all.
A voice key that can never type a space
New in Settings → Device: "Tap ⌃Y instead of space." Space is overloaded — with text in the chat input it types a space instead of starting dictation. The ⌃Y chord invokes Claude Code's voice:pushToTalk action directly and types nothing, whatever the input holds. Turning the toggle on writes the one-line binding into ~/.claude/keybindings.json for you (with a backup, and it never touches a ⌃Y you bound to something else). New Claude Code sessions pick it up on start.
Colors that actually save
Color and speed edits made in the swatch popover silently never persisted — they reverted on relaunch, on every machine. Fixed. The states table also gained column headers, and the swatch's hidden powers (color, hex, speed) are now labeled.
One visual language
Every state now defaults to shallow-breath, with two exceptions that mean something: error breathes deep, and ended stays dark. Focus adapts: the key you're looking at breathes deeper than the board around it. Your saved settings are untouched.
Secure Keyboard Entry, named
When another app holds Secure Keyboard Entry (issue #2), the pad's keys go silent and OpenBoard used to blame Input Monitoring — a permission that was actually granted. It now names the real cause and the app holding it, including the stale-holder case where only a log-out clears it.
From contributors
- iTerm2 support for press-to-jump (#4, @ebowman)
- Sessions with running background subagents stay working-blue instead of flipping to done-green (#5, @ebowman)
470 tests, all passing. Full diff: v0.1.0...v0.2.0