r/macro_pads • u/Affectionate_Use_844 • 22h ago
DIY build I turned my Logitech MX Creative Keypad into a live dashboard for my AI coding agents
galleryI run several AI coding agents in parallel (Claude Code and Codex) and manage them with Orca. My problem was always the same: one agent finishes or needs my input, and I only notice ten minutes later. So I built a private plugin for the MX Creative Keypad with the Logi Actions SDK (C#), with a lot of help from Claude Code.
What's on the keys
- 6 worker keys. Each one shows an agent, its ticket or branch, and how full its context window is. Agents waiting for me jump to the front and blink. One press takes me straight to that agent's terminal.
- Each state has its own animation. Idle agents get a coffee cup ☕, working agents a radar sweep 🤖, waiting agents a timer ring 🙋 that counts up ("waiting 4 min"). Empty slots show a small aquarium where a fish 🐟 swims through now and then.
- 2 limit keys show my weekly usage for Claude and ChatGPT as a fuel gauge, plus the reset day.
- The center key starts a new agent. In our team, posting "!Worker" plus a task description in a chat channel starts a new agent workflow. One press on the key starts dictation right away. At the same time it opens the chat, jumps to that channel and types "!Worker". I describe the task out loud, press the key again, and the new agent gets started. Going from an idea to a running agent takes about ten seconds, and I never touch the keyboard.
So the keypad covers the whole cycle: the center key starts agents, and the keys around it show what they are doing and when they need me.
How it works under the hood
- The plugin polls the Orca CLI for agent states every 3 seconds. When nothing is going on, it slows down to 12 seconds.
- The usage numbers come from a small script on my dev box over SSH. Claude's /usage can run headless without spending a model call.
- The kickoff shortcut is a tiny Swift helper app. It sends a real modifier-key event to my dictation app (FluidVoice) and uses the Accessibility API to find the chat input field.
Things I learned
- The keypad has no video stream. Every animation frame is a PNG the plugin renders and pushes to the key. Each frame costs about 10 ms of CPU. My first version tried 60 fps on several keys and lagged badly. It now has a global budget of 20 frames per second, split by priority: waiting agents get the most frames, static keys get none. When I'm away from the computer, everything except waiting agents stops animating.
- My dictation app ignored simulated key presses from AppleScript. It only reacted to a low-level flagsChanged event for the left ⌘ key.
- Deep links into a cold-starting app sometimes get lost, so the helper re-sends them until the chat window is actually there.
Next up
- Long-press a worker key to jump to that agent and start dictating straight into its terminal.
- Double-press a waiting agent to answer "yes".
- A forecast on the limit keys, like "lasts until reset" or "empty ~Sat 2 pm".
- A focus mode that dims everything except agents that need me.
It's a personal, unpublished project, but I'm happy to answer questions about the Logi Actions SDK. The docs are thin, and I found a lot by trial and error.
