clyde

module
v1.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 6, 2026 License: MIT

README ΒΆ

Clyde

Claude's best friend.

A terminal companion for Claude Code. Tile it next to your claude pane and watch sessions, agents, tokens, diffs, and project state β€” live, without leaving the terminal.

CI OpenSSF Scorecard Go Reference


Claude Code writes everything it does to local JSONL files. Clyde reads them β€” plus your git tree and ~/.claude config β€” and turns them into a live dashboard: which agents are running, what tools they're calling, how much of your plan quota is burning, what changed on disk. Zero configuration, one binary, per-project scope.

cd your-project     # anywhere you run claude
clyde               # tile it in a side pane (tmux / Zellij / Ghostty / iTerm split)

No Claude Code session yet in that directory? Run clyde --demo for a deterministic tour on mock data.

What you get

πŸ‘€ Observability β€” see what claude is doing, as it does it
activity panel with subagent tool calls, usage quotas, bash ledger, cache stats
  • now β€” current operation + an animated mascot that reacts to session state
  • activity β€” the agent tree: main session and every subagent, with per-tool calls, durations, and live status
  • usage β€” context-window fill, real plan-quota percentages for the 5h and weekly windows (same numbers as claude.ai/settings/usage), reset countdowns, burn rate
  • bash β€” a ledger of every shell command claude ran, with duration and failures flagged
  • cache β€” prompt-cache hit ratio and trend, so you know why a turn was slow or expensive
  • permission requests β€” wire up the hook and approve/deny claude's tool calls from clyde with y/n
  • session tabs β€” multiple claude sessions in one cwd get a tab strip ([ / ] to cycle, Ξ£ for the aggregate view)
πŸ—‚ Workspace β€” stay oriented while claude edits
explorer fuzzy search into the syntax-highlighted viewer and editor
  • explorer β€” file tree with session-modified files highlighted and diffstats, plus fuzzy search (/)
  • viewer β€” syntax-highlighted file viewer with vim navigation (j/k, gg/G, / + n/N find), fullscreen mode (f)
  • editor β€” press i and it's a real editor: selections, clipboard, undo/redo, :w / :q!, βŒƒs to save
  • diff β€” accumulated git hunks for the session (enable it in settings)
  • servers β€” the MCP servers and LSPs claude has available, with live status
🎨 Customization β€” make it yours
settings overlay cycling themes live
  • 7 themes, cycled live from the settings overlay: Tokyo Night, Catppuccin, Dracula, Gruvbox, Nord, RosΓ© Pine, Kanagawa
  • mascot personas (meowl, bowl, or off β€” we don't judge)
  • 3 layouts: stack (responsive 1–2 columns), tabs, multi-col (3 columns, β‰₯160-col terminals) β€” cycle with βŒƒl
  • per-panel toggles, sizes, and collapse defaults β€” remembered per project across restarts
  • notification style (fullscreen / banner / off) and a cost-alert threshold

The GIFs above are generated from demo/*.tape with VHS against clyde --demo β€” fully reproducible.

Install

curl -fsSL https://raw.githubusercontent.com/Systemartis/clyde/main/install.sh | sh

Detects your OS + arch, fetches the matching archive, verifies the cosign keyless signature (if cosign is on $PATH), checks the sha256 against checksums.txt, and drops the binary into $HOME/.local/bin. Override with INSTALL_DIR=... or pin a specific tag with VERSION=v1.0.0 (see comments at the top of install.sh).

If you don't have cosign installed yet, you'll get a warning that the install proceeded with sha256 verification only. For full supply-chain verification install cosign first (brew install cosign) β€” see SUPPLY_CHAIN.md.

Pre-built binaries (manual)

Each release ships a tar.gz for linux/{amd64,arm64} and darwin/{amd64,arm64} plus a checksums.txt, an SPDX SBOM per archive, and a cosign signature. See SUPPLY_CHAIN.md for the full verify recipe.

VERSION=1.0.0
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
curl -fsSL "https://github.com/Systemartis/clyde/releases/download/v${VERSION}/clyde_${VERSION}_${OS}_${ARCH}.tar.gz" \
  | tar -xz -C /tmp clyde
install -m 0755 /tmp/clyde "$HOME/.local/bin/clyde"   # or anywhere on $PATH
clyde --version
Build from source (go install)

Requires Go 1.26+:

go install github.com/Systemartis/clyde/cmd/clyde@latest

The binary lands at $(go env GOPATH)/bin/clyde (typically ~/go/bin/clyde). Add that to $PATH or symlink it somewhere already on it:

ln -sf "$(go env GOPATH)/bin/clyde" ~/.local/bin/clyde
Windows

There are no native Windows builds yet. Use the linux/amd64 build under WSL2 β€” clyde reads ~/.claude inside the WSL filesystem, so run Claude Code from the same WSL environment.

Usage

cd /path/to/your/project        # any directory where you run Claude Code
clyde                           # tile this in a side pane next to `claude`
clyde --demo                    # try it in 10 seconds: deterministic mock data, no live reads
Flag Default What it does
--demo off Run against deterministic mock data β€” no live reads, no hook server. Good for a first look and for reproducing UI bugs.
--layout from config Override the layout mode for this run: stack, tabs, or multi-col (3 columns; needs a β‰₯160-col terminal, otherwise falls back to tabs).
--source claude LLM source adapter. Only claude ships today; gemini/codex/kimi are planned.
--version β€” Print the version and exit.
--crash-report β€” Bundle the log, version, and environment into a tarball at ~/clyde-crash-<timestamp>.tar.gz for bug reports, then exit.

Clyde reads real Claude Code session data from ~/.claude/projects/<encoded-cwd>/*.jsonl. It detects sessions for the current working directory; per-project scope means clyde is intentionally local to the cwd it's launched from. If clyde shows no sessions, confirm you have run claude in this directory at least once.

Plan usage & credentials

On a Pro/Max subscription, the usage panel shows the same 5-hour and weekly percentages as claude.ai/settings/usage. To do that, clyde reads the OAuth token Claude Code already stored locally (the macOS Keychain, or Claude Code's credentials file on Linux) and calls the same usage endpoint Claude Code uses. Keychain credentials are treated as strictly read-only β€” clyde never writes, refreshes, or rotates them.

  • On macOS the first live run may show a Keychain access prompt β€” that's clyde reading Claude Code's existing token. Click "Deny" and clyde still works: the plan bars fall back to a time-elapsed approximation derived from your local session files, marked (plan offline).
  • API-key users (no subscription) see a $ cost figure instead of plan bars β€” per-token cost is the meaningful number there.
Diagnostics

Clyde logs JSON records to ~/.cache/clyde/clyde.log (or $XDG_CACHE_HOME/clyde/clyde.log). Set CLYDE_DEBUG=1 to raise the level to debug. When reporting a bug, attach the tarball produced by clyde --crash-report β€” it contains the log, version, and environment, and nothing else.

Keybindings

The footer always shows h β€” press it for a per-panel cheat-sheet. The essentials:

Key Action
Tab / Shift+Tab next / previous panel
↑ ↓ ← β†’ move focus (column-aware); scroll in active mode
Enter expand panel β†’ enter active mode (interact with its content, pink border)
Backspace leave active mode / collapse
Space collapse ⇄ expand (stack layout)
e a d u s b c jump to explorer Β· activity Β· diff Β· usage Β· servers Β· bash Β· cache
Ctrl+E / Ctrl+A / Ctrl+D the same jumps, chorded
[ / ] previous / next session tab
+ / - resize the active panel (stack layout)
Ctrl+L cycle layout mode (stack β†’ tabs β†’ multi-col)
Ctrl+0 collapse every panel except the focused one
h per-panel command cheat-sheet
? settings overlay
y / n / Esc allow / deny / dismiss a pending permission request
Ctrl+N preview the notification overlay (once per run)
q / Ctrl+C quit

Explorer (active mode): ↑↓ move the cursor across the modified-files and tree sections, ←→ jump between sections, Enter opens a file or toggles a directory, / fuzzy-searches the cwd, gg/G and βŒƒd βŒƒu βŒƒf βŒƒb do what vim taught you, y/Y copy the full path / basename.

Viewer: j/k or arrows scroll, gg/G jump, / finds (n/N between matches), f toggles fullscreen, i enters the editor, : opens command mode (:w :q :wq :q!), βŒƒs/⌘s saves, Esc closes (asks before discarding unsaved edits).

Editor: type normally; Shift+arrows select, ⌘c/βŒƒc copy, ⌘a select-all, ⌘z/βŒƒz undo, βŒ˜β‡§z/βŒƒy redo, βŒ₯/βŒƒ+arrows jump words, Home/End line edges.

The mouse works too: click to focus, double-click for active mode, wheel to scroll the panel under the cursor, click a panel's top border to collapse it.

Hook notifications

Clyde can surface Claude Code's permission requests as a notification you answer with one keypress β€” approve or deny tools without switching panes.

How it works: in live mode clyde starts a localhost-only HTTP server on a random free port and writes its URL (which embeds a per-run auth token) to ~/.cache/clyde/hook-url (mode 0600). A PreToolUse hook in Claude Code POSTs each pending tool call to that URL and blocks until you respond.

Add this to ~/.claude/settings.json (merge with any existing hooks block):

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "curl -fsS -m 290 -X POST -H 'Content-Type: application/json' -d @- \"$(cat \"${XDG_CACHE_HOME:-$HOME/.cache}\"/clyde/hook-url)\""
          }
        ]
      }
    ]
  }
}

Because the command reads hook-url at call time, it always finds the current port β€” no settings edit needed when clyde restarts. clyde setup prints this snippet plus your resolved hook-url path on plain stdout.

In the notification: y approves, n denies, Esc denies and dismisses. The design fails closed: if clyde isn't running (curl fails, the hook errors) Claude Code proceeds with its own normal permission prompt, and if clyde's queue is full the call is denied with a retry message rather than silently approved. Pending hooks are auto-denied when you quit clyde.

Configuration

The global config lives at ~/.config/clyde/config.toml. Everything is optional β€” built-in defaults apply, then the global file, then a per-project override section. Most settings can also be changed live from the settings overlay (?), and persist back to this file.

[layout]
default_mode = "stack"            # stack | tabs | multi-col
auto_switch_threshold = 80        # below this terminal width, force stack
cycle_hotkey = "ctrl+l"

# One block per panel: now, calls, diff, usage, explorer, servers, bash, cache.
# position orders panels in the stack; height (optional) pins a row count.
[panels.now]
enabled = true
default_collapsed = false
position = 1

[panels.calls]                    # the "activity" panel
enabled = true
default_collapsed = true
position = 2

[panels.diff]
enabled = false                   # off by default β€” hunks show inline in activity
default_collapsed = true
position = 3

[panels.bash]                     # opt-in: session-wide bash command ledger
enabled = false

[panels.cache]                    # opt-in: prompt-cache efficiency dashboard
enabled = false

auto_switch_to_all_on_new_session = true   # jump to the Ξ£ tab when a new session appears
remember_layout = false           # persist collapse/resize changes across runs (per project)
notification_style = "fullscreen" # fullscreen | banner | off
notify_cost_threshold_usd = 20.0  # 0 disables cost alerts (plan-quota alerts still fire)
theme = "tokyo-night"             # tokyo-night | catppuccin | dracula | gruvbox | nord | rose-pine | kanagawa
mascot_persona = "meowl"          # meowl | bowl | off
boot_screen_enabled = true

# Per-project overrides (applied last, keyed by absolute cwd).
[projects."/Users/you/work/api".panels]
diff = true
bash = true

Privacy & trust model

Clyde is a local observer. It reads files Claude Code already writes on your machine (~/.claude/projects, ~/.claude/todos, ~/.claude/settings.json), your project's .git, and β€” only for the plan-usage percentages β€” calls Anthropic's usage endpoint with the credentials Claude Code already stored. No telemetry, no analytics, no network calls beyond that one optional endpoint. Logs stay in ~/.cache/clyde/. See SECURITY.md for the full trust model and disclosure process.

Stack

  • Go + charm.land/bubbletea/v2 + lipgloss/v2 β€” single static binary.
  • Hexagonal layering: internal/domain (pure stdlib) / internal/application (use cases) / internal/ports (interfaces) / internal/adapters/* (see the directory β€” every adapter is wired in cmd/clyde/main.go).
  • Strict TDD: failing test β†’ implement β†’ green β†’ refactor. Domain and application use table-driven tests; TUI uses teatest/v2 golden snapshots.
  • Lint enforcement: golangci-lint depguard rules in .golangci.yml reject layering violations (domain β†’ adapters/UI, application β†’ adapters, ports β†’ adapters).

Development

go test ./...                 # unit + integration tests
go test -race ./...           # what CI runs
go vet ./...                  # static checks
gofmt -l .                    # formatting (no diff = clean)
golangci-lint run ./...       # lint + hexagonal layer enforcement
go build ./cmd/clyde          # local build
go run ./cmd/clyde --demo

See CONTRIBUTING.md for the local-dev setup, the strict-TDD requirement, and the conventional-commits + branch-naming rules.

Uninstall

rm "$(which clyde)"                                  # the binary (~/.local/bin/clyde or ~/go/bin/clyde)
rm -rf ~/.cache/clyde                                # log + hook-url (or $XDG_CACHE_HOME/clyde)
rm -rf ~/.config/clyde                               # config.toml

If you added the hook snippet, also remove the clyde entry from hooks.PreToolUse in ~/.claude/settings.json.

Security

Found a vulnerability? Please don't open a public issue. See SECURITY.md for the disclosure process and trust model. Each tagged release ships SPDX SBOMs and a keyless cosign signature over checksums.txt β€” verify before running.

Governance

GOVERNANCE.md describes how decisions get made and who holds the keys; MAINTAINERS.md lists the current crew.

License

Open source under the MIT License β€” see LICENSE. Copyright Β© 2026 Systemartis, Vlad Popescu-Bejat, Maxim Tudor Maicovschi. Free to use, modify, and redistribute; attribution required per the license terms.

Trademarks

Clyde and the visual identity are trademarks of Systemartis. The MIT license covers the source code; it does not grant rights to the name or branding. Forks are welcome β€” please pick a different name.

Claude and Claude Code are trademarks of Anthropic, PBC. This project is not affiliated with, endorsed by, or sponsored by Anthropic. Clyde is a third-party companion that reads files Claude Code writes locally; it is not a client of any Anthropic API on its own (the optional plan-usage check uses the same credentials Claude Code already wrote to your Keychain).

Directories ΒΆ

Path Synopsis
cmd
clyde command
Command clyde is the composition root for the clyde TUI.
Command clyde is the composition root for the clyde TUI.
internal
adapters/anthropicapi
Package anthropicapi implements the ports.PlanUsageSource interface by calling Anthropic's OAuth-protected /api/oauth/usage endpoint with the access token that Claude Code CLI stores locally.
Package anthropicapi implements the ports.PlanUsageSource interface by calling Anthropic's OAuth-protected /api/oauth/usage endpoint with the access token that Claude Code CLI stores locally.
adapters/claudesettings
Package claudesettings reads and caches Claude Code's settings file (`~/.claude/settings.json`).
Package claudesettings reads and caches Claude Code's settings file (`~/.claude/settings.json`).
adapters/clydelog
Package clydelog wires a structured logger (slog) for clyde.
Package clydelog wires a structured logger (slog) for clyde.
adapters/fsexplorer
Package fsexplorer implements a filesystem tree walker that populates the explorer panel with real directory structure.
Package fsexplorer implements a filesystem tree walker that populates the explorer panel with real directory structure.
adapters/git
Package git implements a thin adapter that shells out to the git binary to retrieve repository status information.
Package git implements a thin adapter that shells out to the git binary to retrieve repository status information.
adapters/hookserver
Package hookserver provides a tiny localhost HTTP server that receives PreToolUse hook calls from the claude CLI and exposes them as a channel of HookEvents.
Package hookserver provides a tiny localhost HTTP server that receives PreToolUse hook calls from the claude CLI and exposes them as a channel of HookEvents.
adapters/jsonl
Package jsonl implements ports.SessionSource by reading Claude Code JSONL session files from ~/.claude/projects/<encoded-cwd>/.
Package jsonl implements ports.SessionSource by reading Claude Code JSONL session files from ~/.claude/projects/<encoded-cwd>/.
adapters/lspscan
Package lspscan β€” LSPSource adapter that detects language servers on PATH.
Package lspscan β€” LSPSource adapter that detects language servers on PATH.
adapters/mcpconfig
Package mcpconfig reads MCP (Model Context Protocol) server configuration from the Claude Code settings file (~/.claude/settings.json).
Package mcpconfig reads MCP (Model Context Protocol) server configuration from the Claude Code settings file (~/.claude/settings.json).
adapters/processscan
Package processscan is the ports.ProcessSource adapter that detects running `claude` CLI processes by parsing their argv for the `--session-id <UUID>` flag.
Package processscan is the ports.ProcessSource adapter that detects running `claude` CLI processes by parsing their argv for the `--session-id <UUID>` flag.
adapters/systemclock
Package systemclock implements the ports.Clock interface using the real system clock.
Package systemclock implements the ports.Clock interface using the real system clock.
adapters/tui
Package tui provides the Bubble Tea v2 TUI adapter for clyde.
Package tui provides the Bubble Tea v2 TUI adapter for clyde.
application/livesession
Package livesession implements the LiveSession use case.
Package livesession implements the LiveSession use case.
application/watchsession
Package watchsession implements the WatchSession use case.
Package watchsession implements the WatchSession use case.
domain/event
Package event defines the Event domain entity β€” an atomic record of activity within a Claude Code session.
Package event defines the Event domain entity β€” an atomic record of activity within a Claude Code session.
domain/pricing
Package pricing provides a hardcoded pricing table for Claude models and cost/compaction helpers for the usage panel.
Package pricing provides a hardcoded pricing table for Claude models and cost/compaction helpers for the usage panel.
domain/project
Package project defines the Project domain entity.
Package project defines the Project domain entity.
domain/session
Package session defines the Session domain types.
Package session defines the Session domain types.
domain/usage
Package usage defines the Usage value object β€” an immutable accumulator of token counts produced during assistant Events.
Package usage defines the Usage value object β€” an immutable accumulator of token counts produced during assistant Events.
ports
Package ports β€” LLMSource port definition.
Package ports β€” LLMSource port definition.
version
Package version exposes build metadata for the `--version` flag.
Package version exposes build metadata for the `--version` flag.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL