One menu bar item — or a Dynamic Island — for all your AI coding agents. Live status, remote Allow/Deny, questions and plan reviews answered in place, built on nothing but files.
AgentBar is a lightweight, native macOS app that shows the live state of your AI coding sessions — nine agents in one place: Claude Code and Claude Cowork, Codex, Cursor CLI, Gemini CLI, Qwen Code, OpenCode, GitHub Copilot and Google Antigravity. It lives in the menu bar, as a Dynamic Island pill under the notch, or both. Each agent gets its own animated mascot (Clawd the crab walks the bar while Claude works), and the bar always surfaces the session that needs you most.
What started as remote Allow/Deny grew into answering everything an agent can ask without touching the terminal: permission prompts with an inline diff, multiple-choice questions as a tap-through wizard, and Claude's full plan rendered as Markdown with Keep planning / Approve buttons. Underneath, the architecture is deliberately boring: tiny hook scripts write one JSON file per session, the app watches a folder and renders. No sockets, no daemons, no network — and the same files drive a Linux CLI and a native Windows port.
Running coding agents in parallel has a characteristic failure mode, and it isn't the agent getting something wrong — it's the agent silently waiting. A session in a background terminal hits a permission prompt and blocks. You find out twenty minutes later, when you switch tabs and realize nothing has happened since the last time you looked. Multiply that by three or four concurrent sessions across different agents, and babysitting terminals becomes the actual job.
The existing answers don't scale: per-agent notifier apps (one more menu bar item each), notification spam you learn to ignore, or just alt-tabbing on a timer. What I wanted was one glanceable spot that always shows the session that needs me most — and, for the most common interruption of all, the permission prompt, the ability to answer right there without leaving whatever I was doing.
The whole system is files. Tiny hook scripts write one JSON file per session to ~/.agentbar/state.d/; the frontends watch that folder and render. Claude Code and Cowork report with full fidelity (prompt, tool use, permission, question, plan, stop), Codex, Cursor CLI, Gemini CLI, Qwen Code and OpenCode report through their own hook systems, and Antigravity gets an observe-only hook bridge plus a transcript watcher. Copilot still has no public event API — it's launchable from the menu, mascot ready.
The protocol is task-aware: each state file also carries what the session is doing — the prompt, the model, when it started — so a row can say “fix the auth bug in middleware · 28m” instead of just a repo name. Approvals are two more folders of the same protocol: a blocking hook writes into requests.d/, a frontend writes the decision into answers.d/, the hook unblocks. Priority decides what leads: permission outranks working, working outranks idle — and a failed turn shows red and named, sorted so it can never be buried under the green Done rows. Clicking a session row jumps to its exact terminal tab or split pane, matched by tty (iTerm2, Terminal.app, WezTerm).
claude · cowork ──┐
codex · cursor │ one JSON per session
gemini · qwen ├─▶ ~/.agentbar/state.d/ ──watch──▶ menu bar · island
opencode · antigr ┘ linux cli · windows
permission / question / plan ─▶ requests.d/
✓ Allow · ✕ Deny · answer · plan review ─▶ answers.d/
(no sockets, no daemons, no network — just files)When a session asks for permission, the request appears under the amber needs approval row with exactly what you're approving: a −old/+new mini-diff for Edit, the full command for Bash, a preview for Write. ✓ Allow once, ✓ Always (only when Claude Code itself suggests a rule, shown as readable text like Bash(git push:*), never raw JSON), ✕ Deny, or defer back to the terminal. An opt-in global hotkey — ⌥⌘A / ⌥⌘D — answers the newest request without even opening the menu. Decisions return through Claude Code's own PermissionRequest hook, so the terminal prompt never appears. Antigravity's permission dialogs get the same inline strip; Codex and Copilot rows offer a clearly-labeled best effort instead (focus the terminal, press the approval key, behind macOS's Accessibility permission).
The design constraint that shaped all of it: the app must never become a hostage. The terminal prompt stays live the whole time and whoever answers first wins — the other side's answer is ignored cleanly. If AgentBar isn't running, quits mid-wait, or you simply ignore the request, the prompt shows in the terminal exactly as it would have without AgentBar. Fail-open by construction — every failure mode was enumerated and each one ends at the ordinary terminal prompt.
Since v1.10 AgentBar can live as a Dynamic Island: a small pill under the notch showing the working agent's mark and its task. Point at it and it opens into a full session panel — whatever needs you leads as a hero card, everything else is a quiet one-liner below. It never opens on its own, never takes focus from your editor, and falls back to a floating pill on displays without a notch.
The island is where answering grew past permissions. Claude's multiple-choice questions show as tappable option cards — a four-question call becomes a one-question-at-a-time wizard with a quiet “2/4” mark and Back. When Claude finishes planning, the whole plan renders as formatted Markdown, scrollable when long, with Keep planning (sends it back to refine) and Approve plan. A finished session says what it finished — one line of the agent's closing words under the green Done — and a quiet footer shows provider quota, read from the CLIs' own local files: no network, no keychain, nothing leaves the machine. Opt-in sound cues — four tiny synthesized retro-console motifs — mark the moments a session wants you.
AgentBar is a clean-room rewrite of an earlier single-agent notifier concept, rebuilt around one bet: the simplest possible transport wins. State is plain JSON files in watched folders — the whole protocol is debuggable with ls and cat, survives crashes on either side, and adding an agent means adding a script that writes a file. It's now written down as a normative, OS-neutral spec — docs/protocol.md — and the macOS app, the Linux CLI and the Windows port are just three frontends against the same contract.
~/.claude/settings.json preserving whatever is already there, and touches Codex, Cursor, Gemini, Qwen or OpenCode configs only for the tools you actually use. The installer prints exactly what it changes before acting; reinstalling is always safe.AgentBar is open source under MIT, at v1.12.0 — 18 releases in the first four weeks, from the first multi-agent bar through remote Allow/Deny, the Dynamic Island, question wizards and plan review. It installs with a one-line curl, a Homebrew cask, or by pasting the install command into your coding agent and letting it do the work; after that a built-in checker updates it in one click. The agentbar CLI is a full peer of the menu bar app on Linux (status, watch with keyboard Allow/Deny, a waybar module), and AgentBar for Windows is a native system-tray counterpart speaking the same protocol.
Next levers: a notarized build (today's builds sign with a stable local identity, so permission grants survive updates, but a manual download still triggers Gatekeeper's warning), live Copilot status the moment a public event API appears, and remote approvals for Qwen Code once its decision contract is verified.
# one line — downloads the latest release, installs the hooks
curl -fsSL https://raw.githubusercontent.com/michalstrnadel/AgentBar/main/Scripts/install.sh | bash
# or via Homebrew
brew install --cask michalstrnadel/tap/agentbar
# then open a NEW Claude Code session and watch the bar