Gerald
A handheld terminal next to the keyboard – a ClockworkPi uConsole with a Raspberry Pi CM4 – showing as a large drawn face what Claude Code is doing right now: thinking, working, waiting, done. It chimes when Claude needs input, streams the tool calls, and lets you allow or deny shell commands with a key press on the device.
The part that keeps it from being decoration
A face mirroring state is a display. It gets interesting when the path runs back: when a Bash command is waiting for permission, it takes over the device's screen, and pressing Y or N allows or denies it in the real session.
At that point it stops being an ambient display and becomes a control. The decision about whether a command runs on my machine happens on a piece of hardware sitting next to the machine.
How it hangs together
Claude Code hooks fire on session events and send a small JSON line to a unix socket, fire-and-forget. A daemon holds exactly one BLE connection to the device and pushes JSON snapshots over Nordic UART, one object per line – the same protocol as Anthropic's Hardware Buddy reference, which the project originally grew out of.
The return path is the actual trick: PreToolUse(Bash) round-trips. The device answers with a permission, and that becomes the hook's allow or deny.
Plus a session HUD: model, context window fill, usage limits with a reset countdown – read off the statusline and mirrored onto the device.
Status
Public monorepo, both halves keeping their own git history. Interface in English and German, switched via GERALD_LANG. It runs; autostart of the Mac daemon across a real reboot is still open, which is a macOS permissions matter.