← Rahim Nathwani

dockctl: a Stream Dock driven by config files and coding agents

Codegithub.com/rahimnathwani/dockctl

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 with dockctl 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. --json output and stable exit codes.
  • The agent can see the dock. dockctl preview renders the current layout as a PNG.
  • Live status. overlay, banner and poll keys 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 guide prints 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.

dockctl preview of the starter page: fifteen keys such as Yes, Keep going, Commit & push, Run tests, Stop, Compact and Model, with the date, free disk space and time on the side screens

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 install from 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.