A line-for-line port of the firmware's oled_task_user().
Both halves drive 5-character × 16-line vertical displays; the master syncs agent
status to the right half over the split link. One keyboard serves
GitHub Copilot and Claude Code — pick a scenario;
the toggles behave like the real keys on the Copilot layer.
Left half (master) — 128×32 rotated 270°
Right half — the mascot watches you type (try it!), agent slots below
Scenario
Which agent is running
Permission request — answer it from the keyboard
Focused app (the bridge watches your windows)
Copilot-layer toggle keys
Reading the display
PILOT
active layer — inverted while the Copilot layer is on
ASK?
an agent is blocked waiting on you, with the tool it wants beneath. Enter the Copilot layer and the banner flips to ^ OK — the arrow thumb caps are armed: ▲ allows, ▼ denies. Ignore it and it falls through to the agent's own prompt.
VOICE
mic is hot — shows inverted while push-to-talk (left knob) is held
VSC
the focused app, watched by the bridge: VSC/JB for editors (also sets the chord flavor), TEAMS, OTLK, EDGE. Context changes the controls: in Teams the knobs become call controls — left press mutes your mic (⌘⇧M), right press toggles your camera (⌘⇧O); in Edge the right knob cycles tabs; in Outlook it walks the message list. Leaving the editor stands the Copilot layer down — unless an agent is waiting on you, when it holds so you can answer. OS (MAC/WIN) below is USB-detected.
CAPS
appears while caps lock is on; shows WORD during Caps Word (double-tap shift to capitalize one word)
14:37
local time from the bridge — --:-- means the bridge is off (the right screen's AGENT header goes ----- too)
2·bash
live session count with the latest activity beneath it
RUN
how long the current agent run has been going — appears only while a slot is spinning
CLAUDE
the active agent's name on the right screen, under its mascot. Six and seven letters don't fit a five-glyph line, so both are drawn as 3×5 bitmaps.
26%
Claude's five-hour session limit over the countdown to its reset — read from Claude Code's statusline, the only place a local client can get it. Blank for Copilot, which has no equivalent.
AGENT
three slots on the right screen, one icon per agent, synced over the TRRS link
Agent icons
session idleworking (spins)turn doneerrorwaiting on you
The bridge listens for hook events on localhost from both
agents — Copilot CLI, VS Code Copilot Chat and Claude Code. Their event
names differ only in casing, so one listener serves all three: prompt
submitted / tool running → spinner, permission request
→ !, turn finished → ✓, error → ✗,
open idle session → ring. Each session claims a slot, and the
mascot follows whichever agent went last. If the bridge goes quiet for
90 s the firmware falls back to -----.
The permission hook is synchronous, so the bridge holds it
open while the keyboard decides and answers with the agent's own verdict
shape. Nothing is invented if you walk away: after
--ask-timeout the hook returns empty and the agent prompts you
itself, exactly as it would with no keyboard attached.
Layers — click one to preview it on the OLED
dashed = transparent (falls through to Base) · faint = unassigned ·
red = Copilot / layer keys · circles = knob presses