Skip to main content

Busy Crew

See what your Claude Code and Codex agents are doing at a glance, on the LED strip of your BUSY Bar. Each session is a little character: working, waiting for you, or done.

A BUSY Bar running Busy Crew: 4 Claude sessions and 3 Codex conversations, with their states

Your Mac reads Claude Code and Codex activity locally and sends a 72 × 16 pixel frame to the bar. No conversation content leaves your Mac and no cloud service is involved. Busy Crew is an independent project, not affiliated with BUSY, Anthropic or OpenAI.

What you see

When both families are active, the duo view above shows each family's count and up to four state dots. With only one family, each session gets its own character. Turn the scroll wheel to see the tokens your agents used.

Claude only: one working session, four finished, +2 more
Claude only
Codex only: one working, one finished, one failed
Codex only
Tokens today: Claude 1.0G, Codex 396M
Tokens today
Tokens this month: Claude 9.1G, Codex 1.7G
Tokens this month
On the bar Meaning
Terracotta (Claude) or blue (Codex), legs moving Working
Yellow ! Waiting for you: a question or a permission
Green ✓ Finished, not yet acknowledged
Gray, zzz Open but idle Claude session; zzz when all of them are
Gray ? Failed turn, unknown state or unreadable source
+N More sessions than the six slots

Token totals are shown in K (thousand), M (million) or G (billion) and include cache tokens. These captures are real, taken on the author's bar with commands like busy-crew snapshot docs/tokens-today.png --leds.

Requirements

Install

brew install cmdai-hq/tap/busy-crew   # or: uv tool install busy-crew
busy-crew install --address http://busybar.local --timezone Europe/Paris
busy-crew status

Use your bar's address. Your agents appear on the bar within a few seconds.

Updating: brew update && brew upgrade busy-crew or uv tool upgrade busy-crew, then busy-crew install, which keeps your settings, refreshes the LaunchAgent and hooks and restarts the collector. If you use the menu bar icon, run busy-crew menubar install too. Removing: run busy-crew uninstall first, then brew uninstall busy-crew or uv tool uninstall busy-crew.

From a checkout, to contribute or try unreleased changes, prefix every command in this README with uv run, and update with git pull --ff-only && uv sync --locked before the same install:

git clone https://github.com/cmdai-hq/busy-crew.git
cd busy-crew
uv sync --locked
uv run busy-crew install --address http://busybar.local --timezone Europe/Paris
What install changes on your Mac
  • A LaunchAgent (local.busybar.agent-deck) starts the collector at login and restarts it if it exits. It runs the interpreter given to install with --python or BUSY_CREW_PYTHON, else the Python that ran install. From a checkout, that is the checkout's environment, so keep the repository folder where it is. From a Homebrew package, it is the formula's opt path, which survives upgrades.
  • Claude Code hooks, added to Claude's settings after a private backup. They record only status identifiers and timestamps, never prompts, and never block Claude. Existing hooks and settings are preserved; a conflicting edit fails with recovery copies. Use --no-claude-hooks to rely on Claude's session registry alone, with coarser waiting and result detection.
  • A private state folder, ~/Library/Application Support/BusyCrew, for the configuration, backups and the log. Installations made before 1.0 keep BusybarAgentDeck.

Re-running install keeps the saved address and time zone unless you pass new ones. busy-crew uninstall removes the LaunchAgent and the hooks, and keeps the state folder.

Using it

On the bar Action
Start / Pause Cycle: sessions → tokens today → tokens this month
Scroll wheel, turn One view forward (+) or back (−)
Scroll wheel, press Acknowledge the ✓ on screen
Back Return to sessions
Selector on Off or Settings Pause the display

A session waiting for you always brings the sessions view back. No button answers a question or grants a permission: do that in Claude or Codex.

The same from the terminal:

busy-crew view sessions   # or: tokens, month
busy-crew ack             # acknowledge the results on screen
busy-crew refresh         # recount tokens now
busy-crew snapshot front.png --leds

A ✓ counts toward its family's total until you acknowledge it, the session starts new work, or it goes away (a closed Claude process, an archived Codex conversation, or a Codex response finished more than two hours ago). How results and acknowledgment work.

Menu bar icon

Optional. When the bar goes dark, the icon in your macOS menu bar says why: running, paused by the selector, degraded, stopped, or waiting for a reload after an update. Its menu shows each family's sessions and today's tokens, and lets you acknowledge results, recount tokens, reload the collector, open the log, or install a new release.

Busy Crew's menu, open from the macOS menu bar: Running, started 6 minutes ago; Claude 1 working, 2 done, 1 idle; Codex 3 working, 1 done; today's tokens; Acknowledge results, Refresh tokens now, Reload collector, Open log, Quit menu icon

busy-crew menubar install   # needs the Swift compiler: xcode-select --install

Icon states, actions and updates. The picture is a simulation of the real menu.

Configuration

install writes config.json in the state folder (example):

Key Purpose
address The bar's URL, e.g. http://busybar.local
timezone Time zone for "today" and "this month"
ccusage Absolute path to ccusage, if the LaunchAgent cannot find it
token The bar's local API key, if LAN access requires one
update_check false stops the daily check for a new release on GitHub

Over HTTP the key travels unencrypted: use a trusted network, or HTTPS if your device supports it. The busylib WebSocket SDK puts the key in a URL query and honors proxy environment variables; don't share those URLs or proxy logs.

CLAUDE_CONFIG_DIR, CODEX_HOME and BUSY_CREW_STATE (formerly AGENT_DECK_STATE, still honored) are supported; set them before installing, which pins them in the LaunchAgent and the hook command.

Troubleshooting

Start with busy-crew status.

  • The bar went dark: check status first. The collector may have stopped, or it is running while the selector is on Off or Settings, or a higher-priority app owns the display. The menu bar icon tells these apart at a glance.
  • Token views show ?: ccusage is missing or failed; sessions still work. Set ccusage in config.json.
  • busy-crew not found, or invalid choice: you're running an older copy. Update it as above; from a checkout, use uv run busy-crew. The pre-1.0 agent-deck command still works.

More, including Claude settings conflicts and recovery: troubleshooting.

How it works

  • Claude Code: the session registry (~/.claude/sessions) gives each session, its state and its process; hooks sharpen "waiting for you" and finished results.
  • Codex: the app's local SQLite databases and conversation logs, opened read-only.
  • Tokens: one ccusage daily report from the 1st of the month, refreshed every two minutes.
  • The bar: a frame through the BUSY Bar local API, with a 15-second lease so the bar recovers its own display if your Mac goes away.

Limits worth knowing: Codex approval requests are only partly visible, cloud tasks and other machines aren't tracked. Details: how it works, tested versions.

Privacy: Busy Crew talks to your bar: frames, display cleanup and its button events, with the bar's API key if you set one. Once a day it asks GitHub for the number of its latest release; "update_check": false turns that off. Apart from turn events and the questions an agent asks you, conversation content is never parsed, and nothing from it is stored, logged or sent. What is read, kept and sent.

Development

uv sync --locked
uv run python -m unittest discover -s tests -v
uv run busy-crew run              # run the collector in the foreground
uv run busy-crew demo /tmp/demo   # fictional previews of each layout

The tests never contact a device, run a model or touch your real agent data. CI runs them on macOS and Linux with Python 3.11, 3.14 and 3.15. Verified on BUSY Bar firmware 1.2.4 (API 27.5.0). To develop on the Mac that runs your bar, keep the Homebrew copy installed and follow Developing on the Mac that runs your bar. See CONTRIBUTING and SECURITY.

License

MIT. Contributions are welcome; see CONTRIBUTING.

The characters are drawn in code, inspired by Clawd and Codex. References: BUSY Bar developer docs, busylib, Claude Code hooks, ccusage.

Metadata

Release files for busy-crew 1.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for busy-crew 1.1.2
File Size Uploaded
busy_crew-1.1.2.tar.gz 741.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for busy-crew 1.1.2
File Interpreter ABI Platform
busy_crew-1.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 795.6 kB

Release files / busy_crew-1.1.2.tar.gz

Download URL busy_crew-1.1.2.tar.gz
Size 741.3 kB
Tags Source
SHA-256 checksum
How to use checksums
15fded2f484c3ebb67f17376b6fa5b1c34410c816009ef6172d703bec0117c48
BLAKE2b-256 checksum
How to use checksums
d1b6fe054de54f54dec8fd887681623e783dd6186b6d97cb308c7eee805a6a63
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release files / busy_crew-1.1.2-py3-none-any.whl

Download URL busy_crew-1.1.2-py3-none-any.whl
Size 54.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
85f11b55c12fd53f269e05142774411330613f579d6a363ee16354bb607921c5
BLAKE2b-256 checksum
How to use checksums
2d7f3453d1f7e6c0e1b675190e71f5c8026843722f2bde004cbec37029aeeb14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.4

2 release files

1.1.3

2 release files

This release

1.1.2 This release

2 release files

1.1.1

2 release files

1.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page