A macOS menu bar app that answers one question: do any of my agents need me right now?
Watches Claude Code, Codex, Kimi Code, BearCode, OpenCode, Grok Build, and Antigravity across
every concurrent session, surfaces the ones waiting on you, and lets you approve, deny, or reply
without leaving the menu bar.
Quick Start · How It Works · Supported Agents · Features · Architecture
Running one coding agent is fine. Running seven is a tab-hunting problem.
Agents block on permission prompts, finish turns quietly, and ask clarifying questions into terminal windows you are not looking at. The cost is not the waiting, it is the discovery: cycling through windows to find which session stalled twenty minutes ago on a yes-or-no question.
SwarmBar puts that in the menu bar. Sessions sort into Needs you, Active, and Recent, the icon animates only while agents are working, and an approval prompt can be answered from the popover with the command visible in front of you.
It reads each tool's own state and speaks each tool's own control channel. There is no daemon to install in your agents, no wrapper to launch them through, and no telemetry going anywhere.
Agent writes state --> Monitor tails it --> Status derived --> Popover section --> You answer
- Each tool gets a monitor. They tail transcripts, session indexes, and state databases that the tools already write, and map trailing events to a status.
- Approvals arrive faster over hooks. Where a tool supports it, a small bridge script posts to a loopback server so a pending prompt shows up immediately rather than on the next poll.
- Sections answer the question. Needs you means answer something. Active means the process is alive. Recent means it is over.
- You answer in place. Approve and deny go back through each tool's own control channel. Replies are delivered to the session's terminal so you can steer a finished turn without switching windows.
Monitors are strictly read-only. Nothing is ever written to an agent's session or transcript state.
| Agent | Detection | Approve / Deny | Notes |
|---|---|---|---|
| Claude Code | transcripts + hooks | held hook response | The only tool whose hook carries a decision |
| Codex | rollout files | tty hotkeys | ESC is the only deny Codex offers |
| Kimi Code | session index + wire log | on-screen selector | The selector is read, never assumed |
| BearCode | same as Kimi | on-screen selector | Rides the Kimi family layout |
| OpenCode | in-process plugin | plugin respond endpoint | Prompts only where config has ask rules |
| Grok Build | update stream | tty keystrokes | Its hook runner ignores deny responses |
| Antigravity | presence lock + transcript | on-screen selector | Walked to with arrows, never a digit |
Keystroke-answered tools require iTerm2, and that is a design choice rather than a gap. iTerm2 can deliver a keystroke to one specific session, addressed by its tty, without touching what you are looking at. Other terminals only offer "type into whatever is frontmost", which would mean stealing your focus and racing you for it. Everywhere else, Approve and Deny focus the terminal instead of answering for you.
- Three sections that mean something: Needs you, Active, Recent.
- Comfortable and compact densities, plus a Small / Medium / Large size that scales the whole popover rather than only the type.
- A menu bar icon that encodes state in shape and opacity, never colour, and animates only while work is happening. All motion respects Reduce Motion.
- Approve and deny from the popover, with the command shown in monospace.
- Inline reply: write a multi-line answer in the popover and send it to a session whose turn has ended, without visiting the terminal.
- Double-click a row to jump to its terminal. Right-click for the path.
- Monitors never write to agent state.
- The loopback hook channel is authenticated per install.
- Config files are touched only for bridges you switch on in Settings, always through pure transforms, always leaving a one-time backup, and always preserving symlinks and hardlinks so shared profile dotfiles stay shared.
- Swift 6 with strict concurrency set to
complete - SwiftUI only,
MenuBarExtrain window style, with AppKit used solely for the status item - macOS 26+, no availability fallbacks
- XcodeGen so the project is defined by
project.ymlrather than a checked-in.xcodeproj - One third-party dependency. Sparkle, for
updates that install themselves. Self-updating replaces the running app with a file from the
network, and the signature check that makes that safe is the last thing worth hand-rolling.
Everything else is the system
libsqlite3, used to read Codex's own state database
A single @Observable SessionStore is the source of truth. SessionMonitor is the boundary with
one conformer per tool, so adding an agent means adding a monitor and nothing else. SessionStatus
is an enum with associated values, and needsAttention / isActive are computed from it, which is
what makes the three sections fall out rather than be maintained.
SwarmBar/
Monitors/ One per tool, plus the loopback hook server
Store/ SessionStore, terminal automation, status model
Views/ Popover, rows, settings, reply composer
Settings/ Bridge install and removal, pure config transforms
Tests/ Parsers, transforms, sections, timers, typography
scripts/ Bridge scripts installed into Application Support
Signed and notarized builds are published to the
Releases page. Download the latest, drag it to
/Applications, and launch it. There is no Dock icon by design: look for the hexagon in the menu
bar.
SwarmBar updates itself from there: Settings has a Check for updates button, and it also checks quietly in the background.
Prerequisites: macOS 26+, Xcode with the macOS 26 SDK, and
XcodeGen (brew install xcodegen).
git clone https://github.com/umzcio/SwarmBar.git
cd SwarmBar
xcodegen generate
xcodebuild -project SwarmBar.xcodeproj -scheme SwarmBar -configuration Release buildThe built app lands in the Xcode derived data path printed at the end of the build. Copy it to
/Applications and launch it.
xcodegen generate has to run whenever files are added, since project.yml is the source of truth
and the .xcodeproj is generated and gitignored.
xcodebuild -project SwarmBar.xcodeproj -scheme SwarmBar -configuration Debug testOpen Settings from the popover footer and switch on the tools you use. Each toggle installs a small
script and registers it with that tool's own hook or plugin mechanism, and leaves a
.backup-swarmbar copy of any config it edits. Detection works without them; they make pending
approvals appear immediately.
- Remote sessions over SSH
- More agents, added the way the seven built in were
See CONTRIBUTING.md. The short version: match the HTML prototype, keep monitors read-only, add no dependencies, and unit test the pure parts.
See SECURITY.md. Please report vulnerabilities privately rather than in an issue.
MIT. See LICENSE.
