daemon connecting Claude Code sessions to the JamJum JP-mini via usb or bluetooth
padmon CHANGELOG.md
6.3 kB · 119 lines
Markdown
at main

Changelog #

All notable changes to this project are documented here, following Keep a Changelog.

[Unreleased] #

Added #

  • Antigravity (agy) CLI sessions in iTerm2: padmon hook accepts Antigravity hooks.json events (SessionStart, PreInvocation, PostInvocation, PreToolUse on ask_question, PostToolUse, Stop, including fullyIdle for background tasks and subagents) and writes the required JSON response to stdout, and padmon statusline forwards Antigravity agent_state (including tool-confirmation and question waiting) alongside context fill.
  • README: Claude Desktop sessions, their limits, and blocked claude:// links.
  • A push on a Claude Desktop session's pad opens the session in Claude Desktop. The pad goes off within 5 minutes when the session's Claude Code process ends (spec, plan).
  • Claude Desktop sessions get a pad with their state colors. Their hooks are identified by CLAUDE_CODE_HOST_SESSION_ID (plan).
  • MIT license (LICENSE).
  • Spec for Claude Desktop and cloud sessions: Desktop sessions through their hooks, opt-in cloud sessions polled from the Claude API, and pushes that open the session in Claude Desktop (spec).

Changed #

  • A Desktop session removed by the 5-minute check is logged, and the session registry scan reads only regular files.
  • Sessions are identified by a session key instead of an iTerm2 pane UUID, so padmon can show sessions that do not run in iTerm2 (plan). No visible change.

[0.2.0] - 2026-09-28 #

Controller profiles: padmon works with more than one kind of pad controller, and the Arturia MiniLab mkII is the second one.

Added #

  • Controller profiles. Each supported controller is one TOML file in controllers/, compiled into padmon: how to find the device, which messages each pad sends, and how to set its colors. The tests check every profile, and compare its examples with the exact bytes padmon sends (spec, plans A and B).
  • Arturia MiniLab mkII over USB, with its factory preset: 16 pads on two banks. Magenta working, yellow blinking waiting, blue background, green idle, and a white blinking pad for a new window. A pad shows its color again after the MiniLab's own red press light.
  • Palette driver for controllers with a fixed color palette and one message per pad. It sends only the pads that change, and blinks instead of pulsing.
  • Controller selection. When more than one controller is connected, padmon uses the one with the highest priority (the JP-Mini), and keeps the active controller while it stays connected.
  • padmon midi-monitor [port prefix] lists the MIDI ports and prints each incoming message as hex, what it is, and which profile pad it hits.
  • Contribution guide (controllers/README.md): how to find a controller's messages, write a profile, and the pull request checklist.
  • README: the supported controllers, the MiniLab, and what to do when the JP-Mini stays on Bluetooth with a USB cable connected (Lockdown Mode must allow the USB accessory).

Changed #

  • Controller log lines name the profile and the connection, e.g. controller connected (jamjum-jp-mini, usb) and controller connect failed (<id>, <connection>): <error>.
  • The JP-Mini runs through the same driver interface as other controllers. Its behavior is unchanged.

Fixed #

  • The daemon no longer fails to start at login when launchd starts it before the Nix volume is mounted: the install script points the app's copy of padmon at the macOS libiconv instead of the one in /nix/store.

[0.1.0] - 2026-09-26 #

First release: padmon shows Claude Code sessions on a JamJum JP-Mini pad controller and switches to their iTerm2 panes.

Added #

  • Session pads. Each interactive Claude Code session in an iTerm2 pane gets a pad (up to 16), kept across /clear, /compact and resume. The color shows its state: purple working, orange waiting for you, green idle, blue finished but background tasks still running (spec, background state).
  • Context fill. Pad saturation shows how full the context window is, fed from the Claude Code statusline (padmon statusline).
  • Push to focus. Pushing a lit pad brings iTerm2 to the front with that session's window, tab and pane, from any app and on every bank.
  • New window from a dark pad. Pushing a dark pad opens a new iTerm2 window; a session started there within 60 s takes that pad, which pulses in dim white meanwhile (spec).
  • Attention breath. Waiting (orange) pads breathe between dim and full brightness (4 s per breath, in sync); over Bluetooth for about 5 minutes, then steady, to save the controller's battery.
  • USB and Bluetooth. The controller works over USB or Bluetooth, preferring USB and switching automatically; over Bluetooth, colors go through the controller's vendor GATT service (spec).
  • Robust background daemon. padmon daemon runs from an ad-hoc-signed ~/Applications/padmon.app launchd agent, restarts after crashes, follows controller unplug/replug and Bluetooth reconnects, and prunes closed panes.
  • Safe hooks. padmon hook forwards Claude Code hook events over a private Unix socket and gives up after 1 s, so it never stalls Claude Code.
  • Reverse-engineered protocol. The JP-Mini pad-color SysEx (command 0x51) and its Python reference implementation (jpmini.py), found in KuSuite 5.3.
  • Install and docs. macOS install/uninstall scripts, a README in Simplified Technical English (ASD-STE100), and a devenv environment for development.