Your agents haunt you.
Haunt them back.

Six Claude Code and Codex sessions, and every one wants something: a permission, an answer, a nudge. bogyman watches the sessions you already started and keeps one list of who is blocked, on what, and since when. Then it takes you straight there.

brew install soleo/tap/bogyman
  • One Rust binary
  • No account
  • Never spawns an agent
  • --json on every command

What it does

One list. Every haunting.

It answers the questions you keep switching tabs to answer yourself, and never touches your terminals, tmux or worktrees unless you ask it to.

Who is waiting, on what

Blocked sessions first, oldest wait at the top, with what each one needs from you: a permission, an answer, a sandbox prompt.

Jump straight there

focus selects the terminal tab, attaches a background Claude session, brings Claude Desktop forward, or resumes a session that ended.

Reply without attaching

send delivers a one-line answer. Claude Code reads it between tool calls, or starts a turn with it when idle.

Hear when it blocks

The optional daemon keeps the list current and sends a desktop notification when a session blocks or fails.

Built for scripts and agents

Every command takes --json and answers with the same envelope, failures included, so a script or a supervising agent can depend on it.

A haunted day

Glance, triage, unblock.

  1. 01
    Start work however you likeClaude Code in a few tabs, a background session, Codex, the Code tab in Claude Desktop. bogyman picks each one up from its hooks.
  2. 02
    Keep the count in your promptbogyman status prints one line, like ⏳2 ▶3 ✓1, from its cache, so it fits a shell prompt, tmux or a status bar.
  3. 03
    Answer the oldest wait firstbogyman waiting lists who is blocked; bogyman focus takes you to the top one.
  4. 04
    Unblock and move onSend a one-line answer, or let a supervising agent read bogyman ls --json and do the nudging.

The CLI

A few commands, one question.

A table on a terminal, tab-separated text in a pipe, JSON when you ask. Exit codes you can branch on: 0 ok, 3 nothing waiting, 4 vendor command missing.

bogyman ls
Every live session, blocked first. --watch redraws each second; --all adds failed and stopped ones.
bogyman waiting
Blocked sessions only, oldest wait first. Exits 3 when empty, so it works in && chains.
bogyman status
One line for a prompt or status bar, from the cache. --format to template it.
bogyman focus <id>
Bring a session in front of you: Ghostty, iTerm2, Terminal, WezTerm, kitty or tmux on macOS, xdotool or wmctrl on Linux.
bogyman send <id> "msg"
Deliver a message without attaching. - reads it from stdin.
bogyman show <id>
The full record plus the last 20 events. Takes an id, a prefix, the vendor id or the name.
bogyman install
Merges hooks into Claude Code and Codex settings. A second run changes nothing; uninstall removes only its own.
bogyman daemon
Optional background poller and notifier. daemon install runs it at login with launchd or systemd.
bogyman doctor
Vendor versions, hooks registered, store health and the last event from each vendor.

Under the hood

It listens. It doesn’t drive.

bogyman reads what the agents already write down. It never returns a decision to a hook, so it can’t slow down or block an agent.

  1. 01Hooks push eventsbogyman install registers bogyman hook on the Claude Code and Codex hook streams. Each event appends one row to a local SQLite file and exits. Hooks never print, so a broken one can’t leak into a transcript.
  2. 02Polls fill in detailClaude Code’s session files, claude agents --json, Codex rollouts and Claude Desktop’s session index add the model, tokens, the exact reason a session waits and its last reply.
  3. 03One record per sessionVendor, host, directory, state, what it waits for and since when. The tables, the status line and --json all read that one record.

Coverage

What it can see under the bed.

Only what is on your disk. A session it can’t see stays off the list rather than showing up as a guess.

SurfaceCoverageSource
Claude Code, terminal tabFullhooks + session files
Claude Code, agent view or --bgFullclaude agents --json
Claude Desktop, local Code tabFullhooks + session index
Codex CLIFullhooks + rollouts
Claude Desktop, Code tab over SSH or WSLPlannedsession index
Cowork, localNot showninside Cowork’s VM
Cloud sessions, chat tabsNot shownnot on disk

Privacy

Local, quiet, easy to remove.

On your machineNo account, no server. The store is a SQLite file in ~/.local/share/bogyman.
Summaries, not promptsIt keeps session summaries and the first 200 characters of what a session waits on. redact = true keeps only the state.
Starts nothingIt never spawns, schedules or attaches to an agent on its own. focus and send run only when you ask.
Leaves your hooks aloneinstall writes a .bogyman-bak first and merges its entries. uninstall removes only bogyman’s.
Quiet about what it can’t seeCloud sessions aren’t on your disk, so they stay off the list instead of showing a guess.
Open sourceMIT licensed, written in Rust. Read every line on GitHub.

why I built it

“The agents got CLAUDE.md, MCP, skills and a seventeen-hour horizon. The person supervising them got a row of tabs.”

The job left to the person is supervision. bogyman is the thin layer that sits beside whatever you already use and answers one question well: who is waiting on me?

Read the story: Two Tools for the Human in the Loop →
Written in
Rust
Watches
Claude Code · Codex
Runs on
macOS · Linux
License
MIT

Get bogyman.

Free and open source, for macOS and Linux. Works with Claude Code and Codex.

curl -fsSL https://raw.githubusercontent.com/soleo/bogyman-cli/main/install.sh | sh
brew install soleo/tap/bogyman

Then run bogyman install to wire up the hooks and bogyman doctor to check that events arrive.

What’s new in v0.3.0 · All releases · bogyman site

bogyman is free. If it saves you time, buy me a coffee.

Also from me: Tinycap, a tiny macOS app that turns your screen into small files for a pull request.