dockctl: a Stream Dock driven by config files and coding agents
October 31, 2026
Codegithub.com/
Why I built it
I have an AJAZZ Stream Dock (AKP153E), a Stream Deck lookalike with fifteen LCD keys and a three-screen side column. It comes with a vendor app, and the app is the problem:
- Keys go dark whenever the app isn't running. They only show what they do while it's open.
- GUI-only configuration. Profiles are JSON files full of generated IDs, so you can't keep them in version control or dotfiles.
- No CLI or API. Nothing else on the machine can change a key.
- Weight. The app is about 1.1 GB, Qt plus an embedded Chromium, to drive a few small screens.
I didn't want a nicer GUI. I wanted a good command-line tool that a coding agent could use, so the keys could show what my agents are doing and let me answer them with one press.
How it works
- Config as code. One TOML file at
~/.config/dockctl/config.toml. Edit it by hand or withdockctl set; the daemon reloads it live. - A small daemon. A LaunchAgent owns the USB device, starts at login, and redraws the keys after unplugging, sleep or a reboot.
- Its own protocol code. dockctl talks USB HID directly to the Mirabox "293" board family (AJAZZ rebrands Mirabox hardware). The vendor app isn't needed at all.
Built for coding agents
- Machine-readable.
--jsonoutput and stable exit codes. - The agent can see the dock.
dockctl previewrenders the current layout as a PNG. - Live status.
overlay,bannerandpollkeys show things like CI status or an agent's state. - Ask a human.
dockctl ask "Deploy?"blocks until someone presses a key on the device. - Self-documenting.
dockctl guideprints the full reference, so an agent can learn the tool in one call.
The starter page is a set of keys for driving Claude Code. To choose them, I counted what I actually type in my own Claude Code sessions and shell history, and ranked each phrase by times typed × characters saved. "yes", "commit and push" and /model came out near the top.

Limitations
- One tested model. Only the AJAZZ AKP153E (rev 2, USB ID
0300:3010). Other 293-family devices may work but are untested. - Not supported. Models with knobs or touch strips, Elgato Stream Decks, Linux, Windows.
- No signed releases. Install with the script or
uv tool installfrom the repo. Keys that type text need the macOS Accessibility permission; with the Xcode Command Line Tools installed, setup compiles a tiny launcher so only that launcher gets the grant.
Code and install instructions: github.com/rahimnathwani/dockctl.