Skip to content

Latest commit

 

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

chud icon: a happy pixel chud holding a cookie

chud

Run Claude Code and Copilot CLI sessions side by side, and see at a glance which one needs you.

With several coding agents going at once, you end up tab-hopping to check which one finished, which one is asking a question, and how much of your plan you've burned. chud is a small terminal multiplexer, written in Rust, built for exactly that. Every session sits in a sidebar with its live status. You get a notification when an agent is done or waiting on you. And each agent has a pixel chud (slang for someone who eats a lot) that gets fatter the longer it works.

It runs as a TUI inside any terminal, or as its own macOS app with bundled fonts.

Key features

Live agent status Working, needs input, done, or exited, for Claude Code, Copilot CLI and Codex CLI. It also picks up agents you start by hand inside a shell session.
Notifications & unread markers A macOS notification when an agent finishes or asks for input; a marker on sessions you haven't looked at since.
Split panes Watch several agents at once: drag a session out of the sidebar onto a pane to open it beside, above or below. Drag dividers to resize; the layout survives a restart.
Any agent Gemini CLI, aider, opencode and amp out of the box too; add your own harness in config.json.
Light and dark Follows the system theme, live in chud.app.
Plan usage header Claude's or Codex's rolling 5-hour limit with a reset countdown plus the weekly %, or Copilot's monthly premium requests.
Context fullness Per-session bar in the sidebar showing how full each agent's context window is.
Groups Put sessions in named, foldable groups; drag sessions to reorder or regroup them.
Dashboard Summary page with token charts, working time, and every agent's chud.
Diff review See the repo's changed files, then commit or discard without leaving chud.
Copy and paste Drag over the terminal to select and copy; ⌘V pastes. C-a y copies the whole session view.
Mouse-first UI Toolbar, … and right-click menus, drag and drop, resizable sidebar. Every action also has a keyboard shortcut.
Restore on restart Layout, groups, names and agent chats come back the next time you run chud — including a Claude or Copilot chat you started by hand in a terminal, which reopens in the folder it ran in.
A chud per session Every agent's header carries its own chud, as fat as its context is full, running on a treadmill while Claude compacts the conversation. Click it to pet it. The dashboard shows the full-size one.
Fast & idle-friendly Draws only when something changes; release builds use fat LTO.

Installation

Prerequisites

  • macOS. That's what chud is built and tested on, and the app bundle is macOS-only.
    • Windows is groundwork only: chud and chud.app compile for Windows, and the theme, clipboard and notifications have Windows code paths. None of it has been run on Windows yet, there is no installer, and agents started by hand inside a shell aren't detected there.
  • Rust 1.85 or newer (the crates use edition 2024).
  • Claude Code and/or GitHub Copilot CLI.
  • Optional: the GitHub CLI (gh), logged in, for the Copilot quota in the header.

1. Build and install

git clone https://github.com/ZingZing001/chud.git
cd chud
./bundle.sh          # builds everything and installs ~/Applications/chud.app

Re-run bundle.sh after any code change. If you only want the terminal version:

cargo install --path .   # puts `chud` in ~/.cargo/bin

2. First start

The first time chud opens, it walks you through setup. It takes about thirty seconds:

  • Theme: follow the system, or always dark or light. It previews as you choose.

  • Your chud: pick whichever mascot drawing looks right in your font.

  • Context and usage: turns on Claude Code's status line, which feeds chud each session's context size and your plan's limits. It backs up ~/.claude/settings.json first, keeps every other setting, and never replaces a status line you already use without asking.

  • Checks: whether the claude-code-warp plugin is installed (chud uses it to see Claude working) and whether gh is logged in (for Copilot's quota). If the plugin is missing, the walkthrough shows how to install it:

    claude plugin marketplace add warpdotdev/claude-code-warp
    claude plugin install warp@claude-code-warp

Run chud --setup to go through it again. Your choices live in ~/.config/chud/config.json.

3. Other agents (optional)

Codex gets everything Claude and Copilot do — status, the context bar, its plan's 5-hour and weekly limits, and a restart reopening the same chat — read from its own session files, so there is nothing to set up. It honours $CODEX_HOME.

Gemini CLI, aider, opencode and amp are recognised out of the box. They get an icon, a colour, a chud and a status. For any other agent or your own harness, add it to config.json:

{
  "agents": [
    { "name": "my-harness", "match": ["my-harness"], "icon": "◆", "color": "#7ac2ff" }
  ]
}

Status comes from the agent's own signals when it sends them, and otherwise from its activity: working while output flows after you press Enter, done once it goes quiet. Context bars and plan usage are Claude and Copilot only, because their logs have known formats.

Environment overrides, handy for scripts: CHUD_THEME=light|dark, CHUD_MASCOT=blocks|safe, CHUD_SETUP=skip.

Usage

Open chud from ~/Applications (or open -a chud), or run it in any terminal:

chud                    # restore your last layout (or start a zsh session)
chud claude copilot     # open these sessions instead
chud "claude --model opus" zsh

To watch sessions side by side, drag one out of the sidebar onto a pane: near an edge it opens on that side, in the middle it takes that pane's place. Right-click a session for Open beside / below current pane, or press C-a | / C-a - (⌘D in chud.app) to show the next session beside the one you're in. Click a pane to type into it, drag the line between panes to resize, and close a pane with its ✕ or C-a w — the session keeps running in the sidebar.

Drag across the terminal to select text. Letting go copies it, ⌘C copies it again, and ⌘V pastes.

New sessions start in zsh; launch claude or copilot inside them and chud picks the agent up. Use + New ▾ in the toolbar for a new terminal or group. Click a session to switch, right-click it (or its …) for its menu, and drag it to move it.

Every shortcut starts with the Ctrl-a prefix:

Keys Action
C-a n New terminal (zsh) in this group
C-a j / k / 1–9 Next / previous / nth session
C-a Tab Jump to the next session that needs you
C-a / Find a session: type any part of its name, folder or agent
C-a r Rename session (empty = automatic name from the chat title)
C-a g / G Move session to a group / rename its group
C-a z Fold / unfold this group
C-a J / K Move session down / up
C-a y Copy what this session shows to the clipboard
C-a v Hand the mouse to the terminal, to select outside the pane
C-a f Zoom: hide or show the sidebar
C-a | / C-a - Show the next session beside / below this one
C-a o Move to the next pane
C-a w Close this pane (the session keeps running)
C-a d Diff review (c commit, r discard, R refresh)
C-a s Dashboard
C-a x Kill session
C-a q Quit (running chud again restores everything)
C-a C-a Send a literal Ctrl-a

In chud.app the usual ⌘ shortcuts work too: ⌘C copy, ⌘V paste, ⌘T new session, ⌘W kill it, ⌘D / ⌘⇧D split, ⌘1–⌘9 to jump, and ⌘+/⌘−/⌘0 for text size.

C-a ? or the Help button shows this list in the app. chud keeps its state in ~/.config/chud/.

Contributing

Contributions are welcome. For anything bigger than a small fix, open an issue first so we can agree on the approach.

  1. Fork the repo and create a branch.
  2. Make your change. Keep diffs small and match the surrounding style.
  3. Check it:
    cargo test --workspace
    cargo clippy --workspace
    ./bundle.sh               # try the app for real
  4. Open a pull request that says what changed and how you tested it.

Where things live:

Path What's there
src/main.rs App state, input handling, save/restore
src/ui.rs All drawing: sidebar, header, dashboard, menus
src/session.rs PTYs, agent detection and status parsing
src/usage.rs Token usage from agent logs, plan limits
src/chud.rs The pixel chud
src/git.rs Diff review and commits
app/ The macOS window (iced + iced_term), icon, fonts
fixtures/ Raw terminal recordings of real Claude and Copilot sessions

To redraw the app icon, run python3 app/icon.py.

License

No license has been chosen yet, so all rights are reserved for now. A LICENSE file will be added when that changes.

The bundled fonts, Fira Code Nerd Font and Noto Sans Symbols 2, are under the SIL Open Font License 1.1. See app/fonts/OFL-FiraCode.txt and app/fonts/OFL-NotoSansSymbols2.txt.

About

A terminal app built in Rust for running Claude Code and Copilot CLI sessions side by side

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages