The TweetDeck for Claude Code. A Zellij sidebar plugin that monitors, attends to, and orchestrates multiple Claude Code sessions from a single terminal view. Zellij is a modern terminal multiplexer (like tmux, but with a plugin system and built-in layout management).
Warning
Beta Software. cc-deck is under active development and not yet suitable for production use. APIs, configuration formats, and behavior may change between releases without notice. That said, the author uses it daily for real work, and it generally does what it promises. Bug reports and feedback are very welcome.
Website · Documentation · Quickstart · Contributing
Managing multiple Claude Code sessions from separate terminals quickly becomes unwieldy. You lose track of which session is waiting for input, which one just finished, and which one needs your attention next.
cc-deck solves this with a real-time sidebar that shows all your sessions and intelligently directs your attention where it matters most.
The sidebar plugin tracks every Claude Code session across tabs. It shows activity status, handles permission requests, and provides keyboard-driven navigation. Smart attend automatically cycles through sessions that need your attention, prioritizing permission requests over completed tasks over idle sessions.
An AI-driven build pipeline analyzes your local environment for tool dependencies, lets you configure shell, Zellij, and Claude Code settings, and generates optimized container images. Four Claude Code commands handle the workflow: extract, settings, build, push.
When deploying containerized sessions, cc-deck can restrict outbound network access to only the domains your project needs. Domain groups (python, nodejs, rust, golang, github, and more) let you describe allowed domains by ecosystem instead of listing individual hosts. A tinyproxy sidecar enforces the allowlist in Podman deployments, while NetworkPolicy and EgressFirewall resources handle Kubernetes and OpenShift.
Run cc-deck locally with Zellij, in Podman containers with mounted source code, or deploy as Deployments on Kubernetes and OpenShift. The sidebar experience is the same everywhere.
brew install cc-deck/tap/cc-deck
cc-deck plugin installDownload the latest release from GitHub Releases:
# macOS (Apple Silicon)
curl -fsSL https://github.com/cc-deck/cc-deck/releases/latest/download/cc-deck_$(curl -s https://api.github.com/repos/cc-deck/cc-deck/releases/latest | jq -r .tag_name | sed 's/^v//')_darwin_arm64.tar.gz | tar -xz
sudo mv cc-deck /usr/local/bin/
cc-deck plugin install# Fedora / RHEL
sudo dnf install ./cc-deck_*.rpm
# Debian / Ubuntu
sudo apt install ./cc-deck_*.debDownload RPM and DEB packages from GitHub Releases. After installing, run cc-deck plugin install to set up the Zellij plugin and hooks.
podman run -it --rm \
-e ANTHROPIC_API_KEY=sk-ant-... \
quay.io/cc-deck/cc-deck-demo:latestgit clone https://github.com/cc-deck/cc-deck.git
cd cc-deck
make installRequires Zellij 0.43+, Go 1.22+, and Rust stable with wasm32-wasip1 target.
zellij --layout cc-deckOr set as default in ~/.config/zellij/config.kdl:
default_layout "cc-deck"Three layout styles are installed:
| Layout | Command | Description |
|---|---|---|
standard |
zellij --layout cc-deck |
Sidebar + tab-bar + status-bar (default) |
minimal |
zellij --layout cc-deck-minimal |
Sidebar + compact-bar |
clean |
zellij --layout cc-deck-clean |
Sidebar only, no bars |
To change the default variant:
cc-deck plugin install --layout minimal --force| Key | Action |
|---|---|
Alt+s |
Open session list / cycle through sessions |
Alt+a |
Jump to next session needing attention |
| Key | Action |
|---|---|
j / ↓ |
Move cursor down |
k / ↑ |
Move cursor up |
Enter |
Switch to selected session |
Esc |
Cancel (return to original session) |
r |
Rename session |
d |
Delete session (with confirmation) |
p |
Pause/unpause session |
n |
New tab |
/ |
Search/filter by name |
? |
Show keyboard help |
| Action | Effect |
|---|---|
| Left-click session | Switch to that session |
| Right-click session | Rename session |
| Click [+] | New tab |
Edit the plugin config in the layout file (~/.config/zellij/layouts/cc-deck.kdl):
plugin location="file:~/.config/zellij/plugins/cc_deck.wasm" {
mode "sidebar"
navigate_key "Super s" // default: "Alt s"
attend_key "Super n" // default: "Alt a"
}Key syntax follows Zellij key format: Alt, Ctrl, Super (Cmd on macOS), Shift as modifiers, followed by the key character.
After editing, restart Zellij to apply.
Note:
make installoverwrites the managed layout files (cc-deck.kdl,cc-deck-standard.kdl,cc-deck-clean.kdl). Use a personal layout file to preserve custom keybindings across reinstalls.
Create a personal layout that won't be overwritten by make install:
cp ~/.config/zellij/layouts/cc-deck.kdl ~/.config/zellij/layouts/cc-deck-personal.kdlEdit ~/.config/zellij/layouts/cc-deck-personal.kdl and add your custom keys to the plugin blocks:
plugin location="file:~/.config/zellij/plugins/cc_deck.wasm" {
mode "sidebar"
navigate_key "Super s"
attend_key "Super n"
}Then set it as default in ~/.config/zellij/config.kdl:
default_layout "cc-deck-personal"Now zellij (without --layout) uses your personal keybindings automatically.
To use Cmd-based shortcuts, configure Ghostty to pass Cmd keys through to Zellij:
Ghostty (~/.config/ghostty/config):
keybind = cmd+s=unbind
keybind = cmd+n=unbind
| Icon | State | Description |
|---|---|---|
| ○ | Init | Session detected, Claude Code not yet producing output |
| ● | Working | Actively generating output or calling tools |
| ⚠ | Waiting (Permission) | Needs user permission to proceed (highest attend priority) |
| ⚠ | Waiting (Notification) | Paused with informational notification |
| ○ | Idle | Running but waiting for user input |
| ✓ | Done | Task completed |
| ✓ | Agent Done | Sub-agent completed |
| ⏸︎ | Paused | Excluded from attend cycling, name dimmed |
Uses exclusive tiers. Only the highest non-empty tier is cycled:
- ⚠ Waiting (permission first, then notification, oldest first). When waiting sessions exist, Alt+a cycles ONLY among those.
- ✓ Done (most recently finished first). Only used when no waiting sessions exist.
- ○ Idle/Init (tab order). Only used when nothing else needs attention.
- Skips: Working and Paused sessions are never attended.
Subsequent presses round-robin within the selected tier.
Containerized sessions can be restricted to only the network domains your project needs, preventing code or secret exfiltration from YOLO-mode agents.
Add a network section to your cc-deck-build.yaml:
network:
allowed_domains:
- github
- python
- golangThen generate compose files with a proxy sidecar:
cc-deck deploy --compose my-build-dir/ my-sessionThe session container is placed on an internal network with all traffic routed through a tinyproxy sidecar that only allows the specified domains.
Built-in groups cover common ecosystems. Run cc-deck domains list to see all available groups:
| Group | Covers |
|---|---|
python |
pypi.org, files.pythonhosted.org |
nodejs |
registry.npmjs.org, yarnpkg.com |
rust |
crates.io, static.crates.io |
golang |
proxy.golang.org, sum.golang.org |
github |
github.com, ghcr.io, githubusercontent.com |
gitlab |
gitlab.com, registry.gitlab.com |
docker |
registry-1.docker.io, auth.docker.io |
quay |
quay.io, cdn.quay.io |
Backend domains (Anthropic or Vertex AI) are included automatically.
Create ~/.config/cc-deck/domains.yaml to extend or override built-in groups:
cc-deck domains init # Seed config with commented built-in definitions# Extend built-in python group with internal registry
python:
extends: builtin
domains:
- pypi.internal.corp
# Create a custom group
company:
domains:
- artifacts.internal.corp
- git.internal.corp# Add a group to manifest defaults
cc-deck deploy --compose dir/ --allowed-domains +rust my-session
# Remove a group
cc-deck deploy --compose dir/ --allowed-domains -nodejs my-session
# Replace entirely
cc-deck deploy --compose dir/ --allowed-domains vertexai,rust my-session
# Disable filtering (security warning printed)
cc-deck deploy --compose dir/ --allowed-domains all my-sessioncc-deck domains blocked my-session # Show denied requests
cc-deck domains add my-session pypi.org # Add domain at runtime
cc-deck domains show python # Inspect a group's domains# Prerequisites
rustup target add wasm32-wasip1
# Go 1.22+ required
# Build and install
make installcc-deck plugin removecc-zellij-plugin/ Zellij sidebar plugin (Rust, WASM)
cc-deck/ CLI tool (Go)
docs/ Antora documentation source
demos/ Demo recording system
demo-image/ Demo container image build
base-image/ Base container image build
specs/ Feature specifications (SDD)
Contributions are welcome. See CONTRIBUTING.md for the development process, including how we use Spec-Driven Development for larger changes.
cc-deck follows Spec-Driven Development. Each feature starts with a specification before implementation. Current specs:
| ID | Feature | Status |
|---|---|---|
| 002 | Kubernetes CLI | Planned |
| 012 | Sidebar Plugin | Implemented |
| 013 | Keyboard Navigation & Global Shortcuts | Implemented |
| 014 | Session Pause Mode & Keyboard Help | Implemented |
| 015 | Session Save and Restore | Planned |
| 016 | K8s Integration Tests | Planned |
| 017 | Base Container Image | Implemented |
| 018 | Build Pipeline | In Progress |
| 019 | Documentation & Landing Page | In Progress |
| 020 | Demo Recording System | In Progress |
| 021 | Release Process | Implemented |
| 022 | Network Security & Domain Filtering | In Progress |