Skip to main content

claudewheel

TUI launcher for Claude Code with profile, GitHub account, version, model, directory, MCP, and permission switching.

Installation

Install from PyPI:

pipx install claudewheel

Or with uv:

uv tool install claudewheel

Requires Python 3.11+.

Upgrading from the Node package

Early versions of claudewheel were distributed as an npm package (npm install -g claudewheel). The Node wrapper is deprecated -- it only exists as a thin shim that calls python3 -m claudewheel. Install the Python package directly instead:

npm uninstall -g claudewheel    # remove the old Node wrapper
pipx install claudewheel        # install the Python package

If you have the old Node binary at /opt/homebrew/bin/claudewheel or a similar npm global path, removing the npm package will clean it up.

Quick start

claudewheel         # launch the TUI
claudewheel --help  # show all flags

The first run creates ~/.claudewheel/ populated with defaults (config, segments, options, themes).

The segment bar

The TUI is a single horizontal "segment bar" rendered at the vertical centre of the terminal. Each segment is a labelled cell whose value can be cycled, searched, or freely edited. Above and below the focused segment, a vertical "fan-out" shows the other available options dimmed in the segment's accent colour. Pressing Enter on any segment launches Claude Code with the current selections.

Keys:

  • Left / Right -- move focus between segments (also exits freeform edit mode)
  • Up / Down -- cycle the focused segment's value (blank state --- is part of the ring)
  • Type characters -- start fuzzy search (on searchable segments) or freeform edit (on freeform segments)
  • Tab -- accept the current fuzzy match and advance to the next segment
  • Backspace -- delete a search/edit character (on a non-empty selected value, starts edit mode)
  • Esc -- cancel the in-progress search or edit
  • Enter -- launch
  • q or Ctrl-C -- quit without launching

Search shows the matched characters in the search-match colour. The search buffer turns red when no option matches.

Narrow terminals

When the segment bar is wider than the terminal, the renderer switches to a scrolling viewport:

  • The focused segment is centered horizontally
  • Edge arrows (<2, 3>) show how many segments are off-screen in each direction
  • A minimap in the top-right corner shows all segments as small colored squares; the focused one has an opaque background highlight
  • Partially visible segments at the viewport edges are clipped rather than wrapped

The viewport activates automatically and deactivates when the terminal is resized wider. All rendering is identical to the non-scrolling case when the bar fits.

Segment types

Key Label Controls
profile Profile Maps to CLAUDE_CONFIG_DIR (e.g. ~/.claude-personal)
github GH Selects the GitHub account; gh auth token --user <acct> exported as GH_TOKEN
version Ver Picks the Claude Code binary in ~/.local/share/claude/versions/
model Model Sets the model ID (ANTHROPIC_MODEL); [1m] suffix enables 1M-context
directory Dir Working directory to cd into before launch
mcp MCP MCP profile mode (default, strict)
permissions Perms Permission mode passed to Claude Code (bypass, default, plan, auto)

Profile, GitHub, and Model are creatable: their option lists end with a + sentinel that prompts for a new value and persists it to options.json. Directory is freeform: you can type any path. Version pulls a live npm listing merged with the locally installed binaries.

Commands

Command Description
health run diagnostic health checks on profiles, tokens, and hooks, then exit
config open the ~/.claudewheel/ config directory in your $EDITOR
versions list all installed Claude Code versions, marking the current symlink target
install download and install a specific Claude Code version
uninstall delete an installed Claude Code version binary from the versions directory
reset-options delete options.json so it regenerates from defaults
show print a summary of current segment selections, theme, and recent directories
migrate move session data files from one profile to another, optionally filtered by UUID
stats report shared-store stats and clean up legacy data
mv rename a project directory and migrate session data
import import session data from an external Claude Code directory
deploy-hooks deploy built-in hook scripts to the ~/.claudewheel/scripts/ directory
patch-profiles sync existing profiles and shared-settings.json to canonical hook and disallowedTools defaults
reconcile-permissions reconcile profile and shared-settings permissions (deny/ask/allow) to the canonical guardrail model; requires exactly one of --dry-run or --apply
launch start the interactive TUI launcher to select a profile, model, and directory
profile create, inspect, rename, delete, and manage Claude Code profiles and their stored tokens
profile create create a new profile interactively through a guided wizard, then set up its authentication
profile delete delete a registered profile and clean up its directory, tokens, and options entries
profile show inspect a profile's configuration, authentication status, and session data in a detailed report
profile rename rename a profile, moving its directory, tokens, and session data to the new name
profile fix-auth remove session credentials that shadow a long-lived token
profile check-tokens validate every discovered profile's stored OAuth token against the Anthropic API
permission add, remove, and list permission rules across Claude profiles
permission add Add a permission rule to a profile's settings.json. Takes a category (allow, deny, or ask) and a rule string such as Bash or Read(//home/**). Writes the rule into the specified category array. Use --profile to target a single profile or --all-profiles to apply the rule across every registered profile. Skips duplicates if the rule already exists in the category.
permission remove Remove a permission rule from a profile's settings.json. Takes a category (allow, deny, or ask) and the exact rule string to delete. The rule is removed from the specified category array and the file is saved. Use --profile to target a single profile or --all-profiles to remove the rule from every registered profile. Reports whether the rule was found.
permission list List permission rules from a profile's settings.json. Displays rules in grouped, flat, or JSON format controlled by --format. Use --category to filter output to a single category (allow, deny, or ask). Use --profile to inspect a single profile or --all-profiles to show rules from every registered profile, with each profile's rules displayed under a header.

Segment overrides

Every enabled segment gets its own --<key> flag. These pre-fill the TUI:

c --profile myprofile --github myhandle
c --directory ~/Projects/foo --model claude-opus-4-7

If the override set covers every required segment, the TUI is skipped entirely and Claude Code launches directly.

Session passthrough

Mutually exclusive flags forwarded to Claude Code:

c -c                       # --continue: resume the most recent session
c -r                       # --resume: open Claude Code's session picker
c -r 0123abcd              # --resume <id>: jump to a specific session
c -p "summarize this repo" # --print: non-interactive print mode

These compose with segment overrides: c --profile personal -r opens the picker against the personal profile.

Print mode (-p) skips the TUI and launches Claude Code non-interactively. Extra flags after -- are passed through:

c -p "explain auth.py" -- --output-format json --allowedTools "Read,Bash"

Config directory

~/.claudewheel/ layout:

Path Purpose Auto-written?
config.json Theme, enabled segments, default flags, health-check switch, minimap mode No (user-edited)
segments.json Segment definitions (label, width, wrap, searchable, etc.) No
options.json Values, metadata, and discovery configs per segment Only via + UX
state.json last_config, recent_dirs, launch_count, npm cache Yes, every launch
themes/*.json Colour schemes (dark.json, light.json ship by default) No
hooks/* Executable scripts -- see below No

Defaults are regenerated on first run if any file is missing.

On startup, missing keys from the current defaults are merged into existing files (config, segments, themes) without overwriting user values. Schema-versioned migrations handle value changes that must be applied once (e.g. correcting a default).

Hooks

Drop an executable script into ~/.claudewheel/hooks/ whose name starts with pre-launch (e.g. pre-launch-token-refresh). It runs immediately before exec, with the chosen segment values exported as CL_<KEY> environment variables:

#!/usr/bin/env bash
# ~/.claudewheel/hooks/pre-launch-warn-work
if [[ "$CL_PROFILE" == "work" && "$CL_DIRECTORY" == "$HOME/Projects/personal-thing" ]]; then
    echo "Refusing to use the work profile on a personal project." >&2
    exit 1
fi

A nonzero exit aborts the launch (and prevents launch_count from being incremented). Hooks have a 10-second timeout.

Adding new options

  • Profile / GitHub / Model: cycle the segment to its + sentinel, press Enter, type the new value. It is appended to options.json under the segment's values list and selected.
  • Direct edit: open ~/.claudewheel/options.json and add to the relevant segment's values array. For profiles you also need a metadata.<name>.config_dir entry.
  • Install a Claude Code version: run c --install <version> or pick a not-yet-installed version in the TUI and confirm the install prompt. Binaries land in ~/.local/share/claude/versions/<version>.

Themes

Two themes ship with the launcher: dark.json and light.json in ~/.claudewheel/themes/. Switch by setting theme in config.json to the file's basename. Themes define per-segment foreground / focus / option / unavailable colours and the search highlight palette. Add a new theme by writing another themes/<name>.json and pointing config.json at it.

Themes also include an overflow section for viewport chrome:

Key Controls
arrow_fg Colour of the <N / N> edge scroll indicators
minimap_fg Colour of unselected minimap squares
minimap_focused_bg Background highlight on the focused minimap square
minimap_char Character used for minimap squares (default )

Tests

cd /home/m/Projects/claudewheel
python3 -m unittest discover tests/

240+ stdlib unittest tests covering segment cycling, fuzzy matching, requires-evaluation, install/manifest parsing, discovery merge logic, viewport scrolling, and config migration. Runs in under one second.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

claudewheel-0.20.1.tar.gz (2.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

claudewheel-0.20.1-py3-none-any.whl (134.7 kB view details)

Uploaded Python 3

File details

Details for the file claudewheel-0.20.1.tar.gz.

File metadata

  • Download URL: claudewheel-0.20.1.tar.gz
  • Upload date:
  • Size: 2.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for claudewheel-0.20.1.tar.gz
Algorithm Hash digest
SHA256 072ed81f6737c63a569fa2b20de65baa94662f81c4cce86cb64c5db99441d8a6
MD5 8c148183b440e64a1247e6e889b17392
BLAKE2b-256 e6d66b1782853ed80835449b42223450519ad8158db79500755f001577f1f5bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for claudewheel-0.20.1.tar.gz:

Publisher: publish.yml on smm-h/claudewheel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file claudewheel-0.20.1-py3-none-any.whl.

File metadata

  • Download URL: claudewheel-0.20.1-py3-none-any.whl
  • Upload date:
  • Size: 134.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for claudewheel-0.20.1-py3-none-any.whl
Algorithm Hash digest
SHA256 52e1dd867b0310fcaf8b0be3b409ded85adaf2a5317c112b557c8d36c0549d72
MD5 c309e87b3ce26e54264fb4a526573875
BLAKE2b-256 39a1af60fb598be796868045a06c28b7d49d15610d6c6dba17af66114cf13883

See more details on using hashes here.

Provenance

The following attestation bundles were made for claudewheel-0.20.1-py3-none-any.whl:

Publisher: publish.yml on smm-h/claudewheel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page