macOS menu bar app · Claude Code · Codex · Qwen · Gemini · Cursor · +3 more
Agents at work,
watched from the side.
Run Claude Code with Codex and Qwen open beside it, and after a while you lose track of what each one is doing and who called whom. AgentBar sits in the menu bar and reconstructs it from the files your agents already write to disk: each agent's current state, the call graph between them, and a token-and-cost postmortem. An approval waiting on you is read from the last record of the raw log and pinned to the top. AgentBar itself spawns no CLI, no MCP server, no browser.
macOS 14+ · Swift 6 / SwiftUI · lives in the menu bar, opens a Graph window
codexbar
Claude · sonnet-4.5 · 2m
Awaiting Bash approval (inferred from log tail)
Approval
12.4k
landing-page
Qwen · qwen3-coder · 6m
Input
8,204
agentbar
Codex · gpt-5-codex · 30s
Running
3,120
docs-site
Cursor · 42m
Done
9,881
- agents watched
- 8
- processes spawned to read usage
- 0
- outbound requests by default
- 0
Features
Watched from the side. Nothing spawned.
The popover and the Graph window show only records the agents wrote to disk themselves. Usage, history, and call relationships all rest on the same foundation.
POPOVER · Active tab + separate window
See the current state and the reasons side by side
tool_use (uncompleted) and result records in the raw log. Not a guess.codex exec and that Codex spawns claude -p, the chain is reconstructed from tool-call commands, timestamps, and working directories. Nodes are runs (execution units), so resuming never breaks the parent-child links.~/.codex/AGENTS.md ~/.claude/CLAUDE.md, etc.) and project agent config files. Present files show in green, unconfigured ones in gray, and selecting one opens it for editing on the spot. The Compare toggle lines up global and project files so you can check for duplicate instructions line by line. Un-imported files and legacy config are flagged here too.POPOVER · Usage / History tabs
Reads only files the agents already wrote
Usage and history never go through a CLI, MCP server, or browser. AgentBar reads files the agents are already writing.
~/.claude/projects/**/*.jsonl+ rate-limits.json~/.codex/sessions/YYYY/MM/DD/*.jsonl~/.qwen/projects/<project>/chats/*.jsonl~/.gemini/tmp/<project>/chats/*.jsonl…/Cursor/User/globalStorage/state.vscdbSQLite, read-only—no local files · remote quota (opt-in)~/.local/share/opencode/storage/**/*.json~/.hermes/state.dbSQLite, read-onlyLightness is a feature, so it's proven at runtime
Updates and self-monitoring
Update
npm brew cask app binary — updates AI tools however they were installed. Runs only when you trigger it, with a hard timeout on every command.Diag
ProcessGuard
Verified by 172 tests, including regression tests for no-process-spawn and load boundaries.
Design
No agent is spawned to read usage
Usage, history, and the call relationships between agents can all be read from files the agents themselves wrote to disk. So AgentBar does not spawn agents to get usage. CodexBar spawns the CLI on a schedule to get the same data. The difference is design, not optimization.
What a single usage fetch looks like in each app.
One usage fetch in CodexBar
- timer
- claude CLI launches
- MCP · OAuth · auto-update
- browser · session created
- Mac freezes
One usage fetch in AgentBar
- timer
- open JSONL
- parse
- display
| Aspect | CodexBar | AgentBar |
|---|---|---|
| Where usage comes from | Spawns the agent CLI on a timer (a full Node.js stack with MCP, OAuth, and auto-update) | Reads JSONL / JSON files the agents already write to disk |
| Subprocesses | Spawned. Pulls in MCP servers, auto-update, even a browser | None |
| Network | CLI-dependent (49 GiB per day reported from auto-update alone) | No traffic by default. Only explicitly configured remote usage is an exception |
| On failure | Keeps retrying, discards the cache, loses data | Keeps the last good data and shows when it was fetched |
| Auth dialogs | Keychain prompt reappears every few minutes (multiple reports) | No auth dialogs in the background |
The CodexBar column is based on reports in public issues. See docs/codexbar-issues.md for details.
From CodexBar's GitHub issues (excerpts)
200 issues surveyed, #1767–#2467 · as of 2026-07-27
#2052Background probe triggers CLI auto-update
90.6 GiB downloaded over three days. 257–495 Claude CLI processes spawned per day.
#1844Hourly delegated CLI refresh launches the default browser
A recovery path for misdetected token expiry called /usr/bin/open. During fast retries, a browser opened every 20 seconds to 3 minutes.
#2251Each probe creates a new empty account session
36+ phantom sessions accumulated on claude.ai over a few weeks. Also tripped the provider's rate limits.
#1999CodexBarCLI memory grew to 46 GB + 29 GB
Triggered a system-wide OOM (jetsam) on a 48 GB RAM machine. Similar leaks recurred from #1004.
#2241CLI probe success rate: 8.6% (23 of 268)
Discarded the cached snapshot on failure, leaving gaps of up to 110 minutes.
#2306Status item refresh spins MenuBarAgent forever
Menu bar froze for minutes at 100–125% CPU (macOS 27 beta).
Source: the public issues at github.com/steipete/CodexBar. The classification and summaries are collected in docs/codexbar-issues.md inside the repository.
Get started
Install the DMG, or build from source
The recommended install is the DMG from GitHub Releases (signed and notarized). Building from source works too. Once launched, it stays in both the menu bar and the Dock.
DMG (recommended)
Download from GitHub Releases. Signed with a Developer ID and notarized.
From source
git clone, then swift run. Building requires Xcode 16 / Swift 6.
Homebrew Cask
The cask definition is in the repository. The public tap is not published yet.
- macOS
- 14 (Sonoma) or later. Apple Silicon and Intel.
- Building from source
- Xcode 16 / Swift 6 (Command Line Tools alone are not enough)
- Dependencies
- None (SwiftPM only)
Click the gauge icon to open a popover with five tabs: Active / Usage / History / Update / Diag. From the Active tab you can open the Graph window, which shows call relationships between agents as a tree. The popover layout is specified in docs/DESIGN.md in the repository.
# From the repository root
swift build
# Run. No window opens.
# A gauge icon appears in the menu bar.
swift run AgentBar
# Core logic tests (includes the no-process-spawn regression tests)
swift test