TUI dashboard for orchestrating cmux workspaces and Claude Code agents
Project description
cmux-ctl
A terminal dashboard for orchestrating cmux workspaces and Claude Code agents.
Built with Textual.
Features
- Real-time dashboard — grid of workspace cards, auto-refreshing every 3 seconds
- Agent state tracking — running, waiting for input, idle, with color-coded borders
- Live terminal preview — last 15 lines of each workspace's terminal output
- Launch agents — start Claude Code in new or existing workspaces from the dashboard
- Send input / stop agents — interact with agents without switching windows
- Notification badges — unread alerts surfaced per workspace
- Stale detection — agents whose output hasn't changed in 30s are flagged
- Keyboard-first — full grid navigation, no mouse required
Prerequisites
- macOS with cmux installed and running
- Python 3.10+
Installation
pipx (recommended)
pipx install cmux-ctl
pip
pip install cmux-ctl
From source
git clone https://github.com/alaasdk/cmux-ctl.git
cd cmux-ctl
pip install -e .
Usage
cmux-ctl
That's it. The dashboard connects to cmux automatically and displays all active workspaces.
Keybindings
| Key | Action |
|---|---|
q |
Quit |
r |
Refresh |
l |
Launch agent |
s |
Stop agent (sends Ctrl+C) |
i |
Send input to agent |
Enter |
Switch to workspace in cmux |
Tab / Shift+Tab |
Next / previous card |
| Arrow keys | Grid navigation |
Configuration
| Environment Variable | Description | Default |
|---|---|---|
CMUX_BIN |
Path to the cmux binary | /Applications/cmux.app/Contents/Resources/bin/cmux |
How it works
cmux-ctl communicates with cmux entirely through its CLI:
cmux tree --all --json— discovers all workspaces, panes, and surfacescmux sidebar-state— reads workspace metadata (cwd, git branch, PR links, agent state)cmux read-screen— captures terminal output for live preview- Session map (
/tmp/cmux-session-map.json) — detects active Claude Code sessions
The dashboard polls every 3 seconds for workspace state and every 2 seconds for terminal content. Agent state is determined from sidebar metadata, screen content heuristics (e.g., detecting Claude Code's UI patterns), and the session map.
Development
git clone https://github.com/alaasdk/cmux-ctl.git
cd cmux-ctl
pip install -e .
# Run with Textual dev mode (live CSS reload, console)
make dev
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cmux_ctl-0.1.0.tar.gz.
File metadata
- Download URL: cmux_ctl-0.1.0.tar.gz
- Upload date:
- Size: 17.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
802644918f36f8358b9e3e8966e938a030e466a2ade27746939daa3b88a3736d
|
|
| MD5 |
7e21864af18c4f66e3a4731d6c0eb965
|
|
| BLAKE2b-256 |
0886f0f7fd234d683dac0f35f3f04cb5e5a16f8561b52e13e30312bdcf7fbadf
|
Provenance
The following attestation bundles were made for cmux_ctl-0.1.0.tar.gz:
Publisher:
publish.yml on alaasdk/cmux-ctl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cmux_ctl-0.1.0.tar.gz -
Subject digest:
802644918f36f8358b9e3e8966e938a030e466a2ade27746939daa3b88a3736d - Sigstore transparency entry: 1113654684
- Sigstore integration time:
-
Permalink:
alaasdk/cmux-ctl@a96565acd442bb0ac9cf762464eee6fa30ea14a0 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/alaasdk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a96565acd442bb0ac9cf762464eee6fa30ea14a0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cmux_ctl-0.1.0-py3-none-any.whl.
File metadata
- Download URL: cmux_ctl-0.1.0-py3-none-any.whl
- Upload date:
- Size: 20.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe0e00dfabd3ecd62744378030d02910e9fe4ff9718efbaf7bb3c8916d6f2eba
|
|
| MD5 |
b5a9ab58127e846234618761240accc8
|
|
| BLAKE2b-256 |
972e4576a0f0a2dd0c432e10ad5c9a9fa9eabdc95fec3f876c5f60ee10437f0e
|
Provenance
The following attestation bundles were made for cmux_ctl-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on alaasdk/cmux-ctl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cmux_ctl-0.1.0-py3-none-any.whl -
Subject digest:
fe0e00dfabd3ecd62744378030d02910e9fe4ff9718efbaf7bb3c8916d6f2eba - Sigstore transparency entry: 1113654689
- Sigstore integration time:
-
Permalink:
alaasdk/cmux-ctl@a96565acd442bb0ac9cf762464eee6fa30ea14a0 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/alaasdk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a96565acd442bb0ac9cf762464eee6fa30ea14a0 -
Trigger Event:
push
-
Statement type: