I've been running multiple AI coding sessions in parallel and kept losing track of which one was thinking, which one was waiting for my input, and which one had quietly
finished. Alt-tabbing through terminals every 30 seconds got old fast.
VibeBar is a lightweight macOS menu bar app that solves this. It shows real-time session states (running / awaiting_input / idle / stopped) for Claude Code, Codex, and
OpenCode without you leaving your current window.
How it works
Rather than relying on a single detection method, it uses three data channels and merges them:
1. PTY wrapper (vibebar): wraps the CLI in a pseudo-terminal and monitors output patterns to infer interaction state with high fidelity.
2. Plugin events (vibebar-agent): a local Unix socket server that receives lifecycle events from dedicated hooks in Claude Code and OpenCode.
3. Process scanner: a fallback that runs ps to detect running tool processes when the stronger channels aren't available.
State priority when channels conflict: running > awaiting_input > idle > stopped > unknown.
Honest caveats
- Without the plugin, awaiting-input detection uses regex heuristics on terminal output — it works but isn't perfect.
- Codex has no plugin event channel yet, so it relies on the PTY wrapper or process scanner.
- Automated test coverage is still thin.
- macOS 13+ only.
Built in Swift 6.2 with strict concurrency. The menu bar icon has four styles (Ring, Particles, Energy Bar, Ice Grid) and supports English, 中文, 日本語, 한국어.
Source and releases: https://github.com/yelog/VibeBar
Happy to answer questions about the PTY/plugin architecture or the Swift implementation.