A new terminal escape sequence specification, OSC 7501 (the Program Status Protocol), lets any program report its status directly to the terminal: idle, working, waiting on the user, finished, or failed, along with a reason. The author, who maintains the Ghostty terminal emulator and works on Superlogical, created the spec to replace fragile heuristics (like Herdr's regex-based title detection) and non-terminal APIs used by agentic inbox tools (Herdr, cmux, Agent Deck) that track multiple running coding agents. The protocol uses simple key=value pairs sent over the pty, works over SSH and containers, supports hierarchical task trees, and has already been prototyped in Terraform, Claude Code, Codex, Homebrew, libghostty, and Rex with implementations as short as a dozen lines.
Questions this post answers
What is OSC 7501 and what problem does it solve?
OSC 7501 is the Program Status Protocol, a terminal escape sequence specification allowing any program to report its state (idle, working, done, blocked, or error) directly through the pty. It replaces fragile heuristics like reading window titles for spinner characters and inbox-specific socket APIs, working uniformly over SSH and containers since it uses the pty every program already has. Developers building terminal tools or agent orchestration can track new specs like this one through daily.dev.
How do agentic inbox tools like Herdr currently detect whether a coding agent is working or blocked?
Herdr uses detection manifests, which are TOML rule files matching patterns like Braille spinner characters or half-circle busy spinners in the window title to classify Claude Code as idle, working, or blocked. These rules are fragile; the Claude Code manifest alone had ten changes in three months as the agent's UI changed, such as switching spinner characters after version 2.1.228. Anyone orchestrating multiple coding agents can follow protocol changes like this via daily.dev.
How do you format an OSC 7501 status message in a shell script?
Send an escape sequence of the form ESC ] 7501 ; state=working:msg=<base64-encoded-text> ESC \, using printf and base64 encoding for the message. A working shell function wraps this in a `status()` call, for example reporting 'working', then 'done' or 'error' after a command like rsync finishes or fails, requiring no SDK, sockets, or JSON. Developers scripting terminal status reporting can keep up with protocols like this through daily.dev.
Share this post