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

FinderSat 8/1 10:33
AgentBar
ACTIVITY10s
Needs attention2

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

Active1

agentbar

Codex · gpt-5-codex · 30s

Running

3,120

Recent1

docs-site

Cursor · 42m

Done

9,881

Manual·
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

Active
Lists each agent's current state (running / awaiting approval / waiting for input / done / failed), with pending approvals rising to the top. Watching runs on file polling. For Claude, a pending approval is detected from the trailing tool_use (uncompleted) and result records in the raw log. Not a guess.
Graph
Shows call relationships between agents as an indented tree. When Claude spawns 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.
Analysis
Reports tokens and estimated cost per provider, cache hit rate, the bottleneck (longest run), and the graph's max depth, and warns when the agent chain is too deep. Costs are estimates and may already be covered by a subscription. Not a basis for billing.
Rules
Lists global (~/.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~/.claude/projects/**/*.jsonl+ rate-limits.json
Codex~/.codex/sessions/YYYY/MM/DD/*.jsonl
Qwen~/.qwen/projects/<project>/chats/*.jsonl
Gemini~/.gemini/tmp/<project>/chats/*.jsonl
Cursor…/Cursor/User/globalStorage/state.vscdbSQLite, read-only
Command Codeno local files · remote quota (opt-in)
OpenCode~/.local/share/opencode/storage/**/*.json
Hermes~/.hermes/state.dbSQLite, read-only
Usage shows daily tokens, quota (warning color from 80%), per-model breakdown, and estimated cost. History drills down from sessions in the last 60 days to conversation turns (user / assistant / tool).

Lightness 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

Measures its own CPU time, memory (RSS), and files read, and reports them in the popover. The count of forbidden processes spawned is always 0, and it shows as a plain number.

ProcessGuard

Compares snapshots of descendant processes before and after each usage fetch, and raises an error if a forbidden process appeared. 'Spawns nothing' is implemented as a runtime check.

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

  1. timer
  2. claude CLI launches
  3. MCP · OAuth · auto-update
  4. browser · session created
  5. Mac freezes

One usage fetch in AgentBar

  1. timer
  2. open JSONL
  3. parse
  4. display
AspectCodexBarAgentBar
Where usage comes fromSpawns 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
SubprocessesSpawned. Pulls in MCP servers, auto-update, even a browserNone
NetworkCLI-dependent (49 GiB per day reported from auto-update alone)No traffic by default. Only explicitly configured remote usage is an exception
On failureKeeps retrying, discards the cache, loses dataKeeps the last good data and shows when it was fetched
Auth dialogsKeychain 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

  • #2052

    Background probe triggers CLI auto-update

    90.6 GiB downloaded over three days. 257–495 Claude CLI processes spawned per day.

  • #1844

    Hourly 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.

  • #2251

    Each 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.

  • #1999

    CodexBarCLI memory grew to 46 GB + 29 GB

    Triggered a system-wide OOM (jetsam) on a 48 GB RAM machine. Similar leaks recurred from #1004.

  • #2241

    CLI probe success rate: 8.6% (23 of 268)

    Discarded the cached snapshot on failure, leaving gaps of up to 110 minutes.

  • #2306

    Status 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.

terminal
# 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

Get AgentBar

See how lightly it runs on your own Mac.

AgentBar runs entirely on files your agents already write to disk. It spawns no CLI, MCP server, browser, or agent to get usage or history. The Diag tab reports AgentBar's own CPU, memory, and spawned process count — always 0. macOS 14+ · Swift 6 / SwiftUI · source on GitHub.

git clone https://github.com/tsuvic/agentbar