{"id":48754569,"url":"https://github.com/utensils/claudette","last_synced_at":"2026-05-24T00:06:09.362Z","repository":{"id":350756837,"uuid":"1188189987","full_name":"utensils/claudette","owner":"utensils","description":"Claude's missing better half — a companion tool for Claude Code usage.","archived":false,"fork":false,"pushed_at":"2026-05-01T17:26:54.000Z","size":15159,"stargazers_count":17,"open_issues_count":29,"forks_count":5,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-01T17:28:00.550Z","etag":null,"topics":["claude-code","remote-workspace","worktree-manager","worktrees"],"latest_commit_sha":null,"homepage":"http://utensils.io/claudette/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/utensils.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-21T18:30:14.000Z","updated_at":"2026-05-01T17:26:57.000Z","dependencies_parsed_at":"2026-04-22T03:02:14.125Z","dependency_job_id":null,"html_url":"https://github.com/utensils/claudette","commit_stats":null,"previous_names":["utensils/claudette"],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/utensils/claudette","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utensils%2Fclaudette","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utensils%2Fclaudette/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utensils%2Fclaudette/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utensils%2Fclaudette/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/utensils","download_url":"https://codeload.github.com/utensils/claudette/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utensils%2Fclaudette/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32508912,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","remote-workspace","worktree-manager","worktrees"],"created_at":"2026-04-13T00:22:31.246Z","updated_at":"2026-05-20T04:03:24.506Z","avatar_url":"https://github.com/utensils.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"Claudette\" width=\"128\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eClaudette\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003eClaude's missing better half — a companion tool for Claude Code usage.\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://utensils.github.io/claudette/\"\u003e\u003cimg src=\"https://img.shields.io/badge/docs-utensils.github.io%2Fclaudette-7c3aed\" alt=\"Documentation\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/utensils/claudette\"\u003e\u003cimg src=\"https://codecov.io/gh/utensils/claudette/graph/badge.svg\" alt=\"codecov\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://discord.gg/JQdfT3Z67F\"\u003e\u003cimg src=\"https://img.shields.io/discord/1491165880820699398?logo=discord\u0026label=Discord\" alt=\"Discord\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.reddit.com/r/ClaudetteApp\"\u003e\u003cimg src=\"https://img.shields.io/reddit/subreddit-subscribers/ClaudetteApp?style=social\" alt=\"Reddit\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Highlights\n\n- **[Parallel agents in isolated git worktrees](https://utensils.github.io/claudette/features/parallel-agents/)** — run multiple Claude Code agents simultaneously, each on its own branch with no merge conflicts.\n- **[Plan mode and AskUserQuestion handling](https://utensils.github.io/claudette/features/plan-mode/)** — let the agent draft a plan or pause for input, then approve, deny with feedback, or answer from the GUI or the CLI.\n- **[Checkpoints and workspace forking](https://utensils.github.io/claudette/features/checkpoints-and-forking/)** — roll any session back to an earlier turn, or fork a workspace from a checkpoint to explore alternates without losing the original.\n- **[CLI client + Claude Code skill](https://utensils.github.io/claudette/features/cli-client/)** — script every workspace operation from the terminal; install the bundled skill and a \"main\" agent can drive Claudette to fan out work across N workspaces.\n- **[Remote workspaces over encrypted WebSocket](https://utensils.github.io/claudette/features/remote-workspaces/)** — connect to another machine and work with its repos, agents, and terminals as if they were local. Auto-discovers on LAN via mDNS.\n- **[SCM providers (GitHub, GitLab, extensible)](https://utensils.github.io/claudette/features/scm-providers/)** — pull request status, CI checks, and one-click merge without leaving the app, powered by sandboxed Lua plugins.\n- **[MCP supervision and env-providers](https://utensils.github.io/claudette/features/mcp-servers/)** — per-repo MCP server config with health monitoring, plus a pluggable env stack ([direnv, mise, dotenv, nix-devshell](https://utensils.github.io/claudette/features/scm-providers/#environment-provider-plugins)).\n- **[Voice input](https://utensils.github.io/claudette/features/voice-input/)** — push-to-talk dictation with Apple Speech (macOS) or bundled Whisper, all on-device.\n- **[Agent providers](https://utensils.github.io/claudette/features/providers/)** — choose Claude Code, Ollama (local), LM Studio (local), the OpenAI API, or Codex as first-class agent backends. Gateway and app-server paths adapt chat controls to whichever provider is active.\n\nFull documentation lives at **[utensils.github.io/claudette](https://utensils.github.io/claudette/)**.\n\n## About\n\nClaudette is a cross-platform desktop application built with [Tauri 2](https://tauri.app) (Rust backend) and React/TypeScript (frontend). It provides a lightweight interface for managing and orchestrating Claude Code sessions, similar in spirit to [Conductor.build](https://conductor.build) but with a focused feature set. Unlike most similar tools, Claudette runs natively on **macOS** (Apple Silicon + Intel), **Linux** (x86_64 + aarch64, Wayland + X11), and **Windows** (x86_64 + ARM64).\n\n## Prerequisites\n\n- [Rust](https://rustup.rs/) (stable toolchain, edition 2024)\n- [Bun](https://bun.sh/) (JavaScript runtime and package manager)\n- [Tauri CLI](https://tauri.app/start/): `cargo install tauri-cli --version \"^2\"`\n- Platform dependencies for Tauri:\n  - **macOS**: Xcode Command Line Tools (`xcode-select --install`)\n  - **Linux**: System libraries for WebKitGTK and (when building with the default `voice` feature) ALSA. On Debian/Ubuntu:\n\n    ```sh\n    sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file \\\n      libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev \\\n      libasound2-dev\n    ```\n\n    Equivalents on other distros: `alsa-lib-devel` (Fedora/RHEL), `alsa-lib` (Arch). Nix users get this automatically via `flake.nix`.\n\n    Headless or sandboxed Linux environments that lack ALSA can build without voice support:\n\n    ```sh\n    cargo tauri build --no-default-features --features tauri/custom-protocol,server\n    ```\n  - **Windows**: [Visual Studio C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) with the **Desktop development with C++** workload (or full Visual Studio 2022). Building `ring` on ARM64 also requires Clang/LLVM on PATH — `scoop install llvm` is the easiest path. WebView2 ships with Windows 11 and recent Windows 10. Voice support is off by default on Windows; see [Run in development mode](#run-in-development-mode) for the opt-in.\n\n## Getting started\n\n```sh\n# Install frontend dependencies\ncd src/ui \u0026\u0026 bun install \u0026\u0026 cd ../..\n```\n\n### Run in development mode\n\nPick the launcher that matches your platform — `--new`, `--clean`, and `-h`/`--help` work on both. `--clone` (rsync mirror of your real setup into a stable sandbox dir; re-runs sync incrementally) is macOS/Linux only for now; on Windows the PowerShell launcher silently treats it as an unknown passthrough to `cargo run`.\n\n```sh\n# macOS / Linux — shell launcher\n./scripts/dev.sh                 # full-feature dev (required for macOS voice)\n./scripts/dev.sh --new           # fresh-user sandbox under TMPDIR\n./scripts/dev.sh --clone         # rsync mirror of your real setup; incremental on re-run\n./scripts/dev.sh --clean         # nuke /tmp/claudette-dev/ and exit\ncargo tauri dev                  # quick path; no voice, no port probing\n```\n\n```powershell\n# Windows — PowerShell launcher\n.\\scripts\\dev.ps1                # equivalent of dev.sh, ARM64 + x64\n.\\scripts\\dev.ps1 --new          # fresh-user sandbox under $env:TEMP\n.\\scripts\\dev.ps1 --clean        # nuke $env:TEMP\\claudette-dev\\ and exit\n.\\scripts\\dev.ps1 --help         # full flag/env reference\n```\n\nTo get the bare `dev` command (matching the Nix devshell), add this to your PowerShell profile (`$PROFILE`):\n\n```powershell\nfunction dev {\n    $repo = \"\u003cabsolute path to your claudette clone\u003e\"\n    \u0026 \"$repo\\scripts\\dev.ps1\" @args\n}\n```\n\nBoth launchers do a few things `cargo tauri dev` doesn't:\n\n- **macOS only**: wraps the binary in a signed `Claudette Dev.app` bundle (with the right `Info.plist` usage strings and `Entitlements.plist`) and launches it via Launch Services. This is required because macOS's privacy system (TCC) refuses to grant Microphone or Speech Recognition permissions to a bare Mach-O binary and aborts the process when the prompt appears.\n- Probes free Vite + debug-eval ports and exports them so multiple dev instances can run side by side.\n- Stages the `claudette-cli` sidecar binary so the in-app CLI install path works in dev.\n- Writes a per-PID discovery file at `${TMPDIR:-/tmp}/claudette-dev/\u003cpid\u003e.json` (or `$env:TEMP\\claudette-dev\\\u003cpid\u003e.json` on Windows) consumed by the `/claudette-debug` skill.\n\n**Windows-only details** the `dev.ps1` launcher takes care of so you don't have to:\n\n- Forces Vite's bind to `127.0.0.1` (IPv4). Vite's default `localhost` resolves to `::1` on Windows, but WebView2 navigates IPv4-first — mismatch surfaces as a blank webview with `HRESULT 0x80070057`.\n- Defaults to the same feature set as `scripts/dev.sh` — `devtools,server,voice,alternative-backends`. On `aarch64-pc-windows-msvc` the launcher appends `-C target-feature=+fullfp16` to `$env:RUSTFLAGS` so the `gemm-f16` ARMv8.2 inline asm in the `voice` feature compiles. Existing `RUSTFLAGS` are kept (rustc concatenates `-C target-feature` directives), so any flags you already set continue to apply. Override the feature set with `$env:CARGO_TAURI_FEATURES` to drop voice or add other features.\n- Skips `tauri/custom-protocol`. With it on, `import.meta.env.DEV` is false in the webview, which leaves `window.__CLAUDETTE_INVOKE__` unset and breaks the `/claudette-debug` TCP eval server.\n- Stages the `claudette-cli` sidecar at the path Tauri's `bundle.externalBin` expects — necessary because `tauri.conf.json`'s `beforeDevCommand` shell script can't run on Windows.\n\n### Build, test, lint\n\n```sh\n# Build optimized release binary\ncargo tauri build\n\n# Run backend tests\ncargo test --all-features\n\n# Lint\ncargo clippy --workspace --all-targets\n\n# Check frontend types\ncd src/ui \u0026\u0026 bunx tsc --noEmit\n```\n\n## Project structure\n\n```\nCargo.toml              # Workspace root + claudette lib crate\nsrc/\n  lib.rs                # Backend library entry point\n  db/                   # SQLite database (rusqlite)\n  git.rs                # Async git operations\n  diff.rs               # Diff parsing\n  agent/                # Claude CLI subprocess + streaming, alternative backends\n  model/                # Data types\n  names/                # Random workspace name generator\n  ui/                   # React/Vite frontend\n    src/\n      components/       # UI components (sidebar, chat, diff, terminal, modals)\n      hooks/            # Tauri event listeners\n      stores/           # Zustand state management\n      services/         # Typed Tauri IPC wrappers\n      types/            # TypeScript types matching Rust models\nsrc-tauri/\n  Cargo.toml            # Tauri binary crate\n  tauri.conf.json       # Tauri configuration\n  src/\n    main.rs             # Tauri entry point\n    commands/           # #[tauri::command] handlers\n    state.rs            # Managed application state\n    pty.rs              # Terminal PTY management\n    transport/          # Remote transport trait + WebSocket client\n    remote.rs           # Remote connection manager\n    mdns.rs             # mDNS service browser\nsrc-server/\n  Cargo.toml            # Server library + standalone binary crate\n  src/\n    lib.rs              # Server library (shared by Tauri binary and standalone CLI)\n    main.rs             # Standalone CLI entry point (clap)\n    ws.rs               # WebSocket accept loop + per-connection handler\n    handler.rs          # JSON-RPC command dispatcher\n    tls.rs              # Self-signed TLS certificate management\n    auth.rs             # Pairing token + session token auth\n    mdns.rs             # mDNS service advertisement\nsrc-cli/\n  Cargo.toml            # Command-line client crate (`claudette` binary)\nsrc-mobile/\n  Cargo.toml            # Tauri iOS / Android remote-control client crate\n```\n\n## Command-line client\n\nThe `claudette` CLI drives the running desktop app over a local IPC socket. Use it to script workspace creation, send prompts to chat sessions, or fan out a phase-of-work plan across many workspaces at once.\n\n```bash\n# Discover what's available\nclaudette capabilities\n\n# List repos and workspaces\nclaudette repo list\nclaudette workspace list\n\n# Create a workspace and dispatch a prompt\nclaudette workspace create \u003crepo-id\u003e my-task\nclaudette chat send \u003csession-id\u003e @./prompts/task.md\n\n# Inspect and orchestrate active chat sessions\nclaudette chat list \u003cworkspace-id\u003e\nclaudette chat show \u003csession-id\u003e --limit 50\nclaudette chat turns \u003csession-id\u003e\nclaudette chat send \u003cother-session-id\u003e \"Can you review this approach?\"\nclaudette chat stop \u003csession-id\u003e\n\n# Fan out N workspaces from a YAML manifest\nclaudette batch validate plan.yaml\nclaudette batch run plan.yaml\n\n# Pull-request shortcuts (resolves the active SCM provider per workspace)\nclaudette pr list --workspace \u003cworkspace-id\u003e\nclaudette pr show \u003cnumber\u003e --workspace \u003cworkspace-id\u003e\n\n# Generic plugin invocation (escape hatch when no first-class subcommand exists)\nclaudette plugin list\nclaudette plugin invoke github list_pull_requests --workspace \u003cworkspace-id\u003e '{}'\n\n# Install shell completion\nclaudette completion zsh \u003e ~/.zsh/completions/_claudette\n```\n\nA batch manifest declares one repository, optional defaults, and a list of workspaces with prompts:\n\n```yaml\nrepository: my-repo\ndefaults:\n  model: sonnet\nworkspaces:\n  - name: builtins-tsx\n    prompt_file: ./prompts/43-builtins.md\n  - name: shell-rs\n    prompt: |\n      Implement issue #42 ...\n    model: opus\n```\n\nMost CLI operations require the desktop app to be running — IPC-backed commands flow through the GUI's own command core, so tray icons, notifications, and the workspace list update live as the CLI works. Two exceptions: `claudette completion \u003cshell\u003e` is purely local (clap_complete output, no IPC) and `claudette version` prints the CLI version unconditionally and only notes if the GUI isn't reachable. Run `claudette --help` for the full subcommand list. The full reference (with every flag) lives at [docs/features/cli-client](https://utensils.github.io/claudette/features/cli-client/).\n\nMain-agent orchestration uses the same IPC surface: `claudette chat show` returns session metadata, recent transcript messages, completed tool activity, attachment metadata, and pending AskUserQuestion / ExitPlanMode controls. Use `claudette chat answer \u003csession-id\u003e \u003ctool-use-id\u003e --answers-json '{\"Question?\":\"Answer\"}'`, `claudette chat approve-plan`, or `claudette chat deny-plan` to resolve pending controls from a terminal or another agent.\n\n### Drive from a Claude Code agent\n\nThe repo ships a Claude Code skill at [`.claude/skills/claudette/SKILL.md`](.claude/skills/claudette/SKILL.md) that pre-grants an agent permission to invoke `claudette` and provides a curated playbook of common workflows. Use it from a Claudette checkout (auto-loaded as a project skill), or symlink it into `~/.claude/skills/claudette/` to use it from any project. See [docs/features/cli-client](https://utensils.github.io/claudette/features/cli-client/#driving-claudette-from-a-claude-code-agent) for setup details.\n\n## Remote access\n\nClaudette can connect to workspaces on another machine over an encrypted WebSocket connection. The local app discovers or connects to a remote server and displays remote repos, agents, and terminals alongside local ones.\n\n### Sharing from the desktop app\n\nClick **Share this machine** in the sidebar. The server starts automatically as a subprocess and displays a connection string to share. No separate installation required — the server is embedded in the Claudette binary (gated behind the default-enabled `server` feature).\n\nOn startup the server prints a connection string:\n\n```\nclaudette-server v0.24.0 listening on wss://0.0.0.0:7683\nName: Work Laptop\n\nConnection string (paste into Claudette):\n  claudette://work-laptop.local:7683/aBcDeFgH1234...\n```\n\n### Headless server (standalone)\n\nFor headless machines without a GUI, the standalone server binary is still available:\n\n```sh\n# Build and install the standalone server binary\ncargo install --path src-server\n\n# Start it (generates a TLS certificate and pairing token on first run)\nclaudette-server\n```\n\n### Connecting from the local app\n\n**Automatic (LAN):** If both machines are on the same network, the server appears automatically in the sidebar under **Nearby**. Click **Connect** and enter the pairing token when prompted.\n\n**Manual:** Click **+ Add remote** in the sidebar footer and paste the full connection string. Claudette authenticates, stores a session token, and reconnects automatically on future launches.\n\n### Server management\n\n```sh\n# Regenerate the pairing token (revokes all existing sessions)\nclaudette-server regenerate-token\n\n# Print the current connection string\nclaudette-server show-connection-string\n\n# Bind to a specific interface or port\nclaudette-server --bind 192.168.1.50 --port 9000\n\n# Disable mDNS advertisement\nclaudette-server --no-mdns\n```\n\nAll traffic is encrypted with TLS. The local app pins the server's certificate fingerprint on first connection (trust-on-first-use), similar to SSH's `known_hosts`.\n\n## Community\n\nJoin us on [Discord](https://discord.gg/JQdfT3Z67F) to ask questions, share feedback, and connect with other Claudette users.\n\n## Contributing\n\nContributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) to get started. All participants are expected to follow our [Code of Conduct](CODE_OF_CONDUCT.md).\n\n### Translations\n\nClaudette currently ships in English and Spanish, and we'd love help adding more languages. Translations live as JSON files under `src/ui/src/locales/\u003clang\u003e/` (frontend) and `src/locales/\u003clang\u003e/` (tray menu, notifications, and quit dialog) — most of the work is editing key/value pairs and requires no Rust or TypeScript experience. See [Translating Claudette](CONTRIBUTING.md#translating-claudette) in the Contributing Guide for the step-by-step recipe.\n\n## Development notes\n\n- The project uses Rust edition 2024 and Bun as the frontend package manager.\n- The backend (`src/`) is a library crate consumed by the Tauri binary (`src-tauri/`).\n- See `CLAUDE.md` for detailed architecture and contribution guidelines.\n\n## Relationship to Anthropic\n\nClaudette is an independent, community-built tool. **It is not affiliated with, endorsed by, or sponsored by Anthropic, PBC.** \"Claude\" and \"Claude Code\" are trademarks of Anthropic, PBC; their use here is descriptive — Claudette orchestrates the official Claude Code CLI — and does not imply any partnership.\n\n### How Claudette uses your Claude account\n\nClaudette does **not** authenticate to Anthropic on your behalf. It spawns the official `claude` CLI you have installed locally as a subprocess; the CLI authenticates itself using the credentials you have configured for it. Claudette never reads, copies, or forwards your Claude OAuth tokens, and explicitly strips any inherited subscription tokens from spawned subprocesses so they are never passed through.\n\n### Pro/Max plan usage and parallel agents\n\nPer the [Claude Code legal and compliance page](https://code.claude.com/docs/en/legal-and-compliance):\n\n\u003e Advertised usage limits for Pro and Max plans assume ordinary, individual usage of Claude Code and the Agent SDK.\n\nClaudette can run multiple agents in parallel git worktrees. **We recommend keeping default parallelism low (1–3 simultaneous agents)** and treating heavier use as something you explicitly opt into. Whether running N parallel agents counts as \"ordinary, individual usage\" under your plan is a judgment Anthropic reserves for itself; Claudette is the affordance, but the responsibility for staying within your plan's terms is yours.\n\nIf you need higher throughput, the supported path is API-key authentication via [Claude Console](https://platform.claude.com/), which is governed by Anthropic's [Commercial Terms](https://www.anthropic.com/legal/commercial-terms).\n\n### Plugin secrets storage\n\nClaude Code plugins may require their own secrets (API keys, tokens). Claudette stores these in the same secure-storage object Claude Code itself uses — the macOS Keychain entry `Claude Code-credentials`, or `~/.claude/.credentials.json` on Linux — but only under its own `pluginSecrets` namespace. Your Claude OAuth tokens (`claudeAiOauth.*`) are never read or written by Claudette's plugin code.\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Futensils%2Fclaudette","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Futensils%2Fclaudette","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Futensils%2Fclaudette/lists"}