Claude Panel

Claude Code gets its own screen — it decides what you need to see

Python 3.12+ License Stars

Panel cycling through main, status, and ambient screens

Main screen (Claude's content) → Status dashboard → Ambient screensaver

--- Claude Panel is a persistent TUI that sits next to your Claude Code terminal. Claude autonomously updates the panel with whatever it thinks matters — code it just wrote, a diagram, next steps, or a mood emoji. A structured dashboard tracks the current task, files changed, and key decisions, refreshing after every response. And when you're between tasks, ambient terminal screensavers keep the vibe going. ## Three Screens | Screen | Managed by | What it shows | |--------|-----------|---------------| | **Main** | **Claude** | Whatever Claude thinks is useful right now — code snippets, explanations, diagrams, progress checklists, mood emoji. Full creative control. | | **Status** | **Claude** (AI curator) | Structured dashboard: current task, files changed, decisions made. Auto-updates after every response. | | **Ambient** | **You** | Terminal screensaver of your choice. Plays when nothing else needs your attention. | **Claude manages the content, you manage the screensaver.** The main and status screens update automatically — Claude reads the conversation, decides what's worth pinning on screen, and writes it. No manual commands needed. ## Ambient Screensavers Twelve built-in terminal animations ship with the package. Navigate with arrow keys or `panel(show="ambient")`.

aurora screensaver

aurora

tokyo-drift screensaver

tokyo-drift

Also available: `neon-dreams` | `neon-street` | `space-flight` | `rain-city` | `city-lights` | `matrix` | `noir` | `banquet` | `dvd-bounce` | `synthwave` All screensavers are bundled with the package — they work out of the box on a fresh install. ### Custom screensavers Drop a `.py` file in `~/.claude-panel/screensavers/` and it becomes available immediately. User screensavers override bundled ones of the same name, so you can customize any built-in screensaver without touching the package. ```bash # List available screensavers panel(screensaver="rain-city") # Or ask Claude to create one # "make me a screensaver with falling snow" ``` Screensavers are plain Python scripts that draw to a Rich canvas. [Creating your own takes ~10 lines.](CONTRIBUTING.md#creating-a-screensaver) ## Install ```bash # As a Claude Code plugin (recommended) claude plugin marketplace add alex-radaev/claude-panel claude plugin install claude-panel@claude-panel ```
Manual installation ```bash git clone https://github.com/alex-radaev/claude-panel cd claude-panel uv sync ``` Then add to your MCP config (`~/.claude/settings.json` or `.mcp.json`).
## Usage The panel **opens automatically** when you start a Claude Code session — an iTerm2 (macOS) or Windows Terminal (WSL) split pane launches with the viewer. No manual commands needed. To disable auto-open, set `"auto_open": false` in `~/.claude-panel/config.json`. You can also open it manually: ```bash # From Claude Code panel_open() # Manual uv run claude-panel ``` Once running, Claude takes over. The main and status screens update on their own. You can switch views: ```python panel(show="ambient") # switch to screensaver panel(show="main") # switch to main canvas panel(show="status") # switch to status dashboard panel(screensaver="tokyo-drift") # change screensaver ``` | Key | Action | |-----|--------| | `q` | Quit viewer | | `<-` `->` | Cycle screens | | `c` | Clear panel | > **iTerm2 tip:** The panel pane may look washed out because iTerm2 dims inactive split panes by default. To fix: **Settings > Appearance > Dimming** and uncheck **Dim inactive split panes**. ## How It Works ``` Claude Code session iTerm2 Split Pane ┌──────────────────────┐ ┌──────────────────┐ │ │ │ │ │ Main Claude │ │ Textual TUI │ │ + Background agents │ │ Viewer │ │ + Stop hook curator │ │ │ │ │ │ │ └──────────┬───────────┘ └────────┬─────────┘ │ WRITES │ POLLS └──────► per-session ◄──────┘ state.json ~/.claude-panel/sessions// ``` 1. **Claude responds** — a Stop hook runs the AI curator (Haiku). It reads the conversation, decides what changed, and updates the **status screen**. 2. **Claude spawns a background agent** — updates the **main screen** with whatever content is worth showing. Zero conversation noise. 3. **The viewer polls** the state file every 300ms and re-renders instantly. **Session isolation:** Each Claude Code session gets its own state. Run multiple sessions — they don't interfere. The viewer tracks whichever session is active. ## Review Notifications The panel can show GitHub PRs waiting for your review directly on the main screen. A shared background poller checks `gh search prs --review-requested=@me` every 2 minutes and surfaces results as a clickable list with links that open in your browser. - **Auto-appears** when you have pending reviews - **Auto-dismisses** when you approve, comment, or request changes - **One poller** shared across all concurrent sessions (no duplicate API calls) - **Clickable links** — click a PR title to open it in the browser - Filter by GitHub org via `review_notifications.org` in config - Disable entirely with `"review_notifications": false` ## Configuration `~/.claude-panel/config.json`: ```json { "auto_open": true, "model": "claude-haiku-4-5-20251001", "favorite_screensaver": "tokyo-drift", "update_every_n": 1, "curator_personality": "playful", "review_notifications": { "enabled": true, "poll_interval_seconds": 120, "org": "my-org" } } ``` | Option | Values | Description | |--------|--------|-------------| | `auto_open` | `true`, `false` | Automatically open the panel on session start (default: `true`) | | `model` | Any Claude model ID | Model for the status curator (default: Haiku) | | `favorite_screensaver` | Screensaver name | Default ambient screensaver | | `update_every_n` | Number | Update status every N responses (1 = every time) | | `curator_personality` | `"playful"`, `"professional"` | Curator tone — playful adds humor and emoji combos, professional is concise and factual | | `review_notifications` | Object or `false` | GitHub review request notifications (default: enabled) | | `review_notifications.enabled` | `true`, `false` | Toggle review notifications on/off | | `review_notifications.poll_interval_seconds` | Number | How often to check GitHub for new reviews (default: `120`) | | `review_notifications.org` | GitHub org name | Only show reviews from this org (omit for all orgs) | ## Contributing Contributions welcome — especially new screensavers. See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide, including a screensaver template that gets you started in ~10 lines of Python. ## License MIT