RepoPilotOpen in app →

Kuberwastaken/claurst

Your favorite Terminal Coding Agent, now in Rust

Mixed

Mixed signals — read the receipts

weakest axis
Use as dependencyConcerns

copyleft license (GPL-3.0) — review compatibility

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • Last commit today
  • 13 active contributors
  • GPL-3.0 licensed
Show all 7 evidence items →
  • CI configured
  • Tests present
  • Concentrated ownership — top contributor handles 60% of recent commits
  • GPL-3.0 is copyleft — check downstream compatibility
What would change the summary?
  • Use as dependency ConcernsMixed if: relicense under MIT/Apache-2.0 (rare for established libs)

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/kuberwastaken/claurst?axis=fork)](https://repopilot.app/r/kuberwastaken/claurst)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/kuberwastaken/claurst on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: Kuberwastaken/claurst

Generated by RepoPilot · 2026-05-09 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Kuberwastaken/claurst shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Mixed signals — read the receipts

  • Last commit today
  • 13 active contributors
  • GPL-3.0 licensed
  • CI configured
  • Tests present
  • ⚠ Concentrated ownership — top contributor handles 60% of recent commits
  • ⚠ GPL-3.0 is copyleft — check downstream compatibility

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live Kuberwastaken/claurst repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/Kuberwastaken/claurst.

What it runs against: a local clone of Kuberwastaken/claurst — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in Kuberwastaken/claurst | Confirms the artifact applies here, not a fork | | 2 | License is still GPL-3.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>Kuberwastaken/claurst</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Kuberwastaken/claurst. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/Kuberwastaken/claurst.git
#   cd claurst
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of Kuberwastaken/claurst and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Kuberwastaken/claurst(\\.git)?\\b" \\
  && ok "origin remote is Kuberwastaken/claurst" \\
  || miss "origin remote is not Kuberwastaken/claurst (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
  && ok "license is GPL-3.0" \\
  || miss "license drift — was GPL-3.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "src-rust/crates/cli/src/main.rs" \\
  && ok "src-rust/crates/cli/src/main.rs" \\
  || miss "missing critical file: src-rust/crates/cli/src/main.rs"
test -f "src-rust/crates/api/src/lib.rs" \\
  && ok "src-rust/crates/api/src/lib.rs" \\
  || miss "missing critical file: src-rust/crates/api/src/lib.rs"
test -f "src-rust/crates/api/src/providers/mod.rs" \\
  && ok "src-rust/crates/api/src/providers/mod.rs" \\
  || miss "missing critical file: src-rust/crates/api/src/providers/mod.rs"
test -f "src-rust/crates/core/src/analytics.rs" \\
  && ok "src-rust/crates/core/src/analytics.rs" \\
  || miss "missing critical file: src-rust/crates/core/src/analytics.rs"
test -f "src-rust/Cargo.toml" \\
  && ok "src-rust/Cargo.toml" \\
  || miss "missing critical file: src-rust/Cargo.toml"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Kuberwastaken/claurst"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

Claurst is an open-source, multi-provider terminal coding agent written in Rust that replicates and extends Claude Code's agentic capabilities for local execution. It integrates with 30+ AI providers (Anthropic, OpenAI, Google, Ollama, etc.) via a pluggable provider system, executes tools in a sandboxed terminal, manages conversation state with memory consolidation, and provides a rich TUI built with Ratatui and Crossterm for interactive pair programming. Rust monorepo (src-rust/) with 11 workspace crates: core (agent logic), api (HTTP abstractions), tools (command execution), query (prompt handling), tui (terminal UI with Ratatui), commands (CLI commands), mcp (Model Context Protocol), bridge (CLI/remote communication), cli (entry point), buddy (companion features), plugins (plugin system), acp (provider adapters). State flows from CLI → TUI → Core → API/Tools → Provider SDKs. Configuration stored in TOML, serialized via serde.

👥Who it's for

Developers who want a locally-hosted, telemetry-free AI coding copilot that works in the terminal; engineers building AI agent systems who need a reference implementation of multi-provider tool-use patterns; Rust developers wanting to understand async TUI applications and streaming API integrations.

🌱Maturity & risk

v0.0.9 active development — the repo shows consistent recent activity (CI/CD pipelines in .github/workflows/, release binaries distributed, workspace-based monorepo structure). Core features are functional (managed agents, multi-provider support, plugins), but experimental features are marked as such. Not yet 1.0, so expect breaking changes; however, the codebase is production-capable for local use.

Single maintainer (Kuberwastaken) creates vendor lock-in risk. Large dependency footprint (tokio, reqwest, ratatui, syntect, rusqlite) means supply-chain exposure. The crates/acp (Anthropic provider abstraction) and crates/mcp (Model Context Protocol) are tightly coupled, making provider swaps potentially fragile. No visible test suite in the file structure (critical gap for a tool that executes arbitrary shell commands).

Active areas of work

Managed Agents system recently added (Manager-Executor agentic loop with 6 pre-built templates). Speech modes are experimental (/rocky, /caveman, /normal). Multi-provider support expanded (visible in docs/providers.md). Voice/microphone features can be disabled at build time. Binary releases are active across 5 platforms (Windows, Linux x86_64/aarch64, macOS Intel/Silicon). GitHub Pages deployment configured.

🚀Get running

git clone https://github.com/kuberwastaken/claurst.git
cd claurst/src-rust
cargo build --release --package claurst
# For Raspberry Pi or headless (no ALSA):
# cargo build --release --package claurst --no-default-features
# Binary at target/release/claurst

Then set API key via environment or /connect command inside TUI.

Daily commands:

cargo run --release --package claurst
# Or invoke binary directly:
./target/release/claurst
# Environment: CLAURST_API_KEY or set via /connect

🗺️Map of the codebase

  • src-rust/crates/cli/src/main.rs — Primary entry point for the terminal agent; initializes the CLI, handles user input, and orchestrates the main event loop.
  • src-rust/crates/api/src/lib.rs — Core API abstraction layer exposing provider registry, message normalization, and multi-provider request handling—essential for understanding how different LLM providers are unified.
  • src-rust/crates/api/src/providers/mod.rs — Provider trait and module organization; defines the interface all LLM providers (Anthropic, OpenAI, Azure, etc.) must implement.
  • src-rust/crates/core/src/analytics.rs — Core state and context management for agent sessions; tracks messages, permissions, and execution context throughout the agent's lifecycle.
  • src-rust/Cargo.toml — Workspace root configuration defining all crates, versions, and shared dependencies—required reading for build configuration and dependency resolution.
  • src-rust/crates/commands/src/lib.rs — Command execution layer that bridges user input to agent actions; critical for understanding how terminal commands are parsed and executed.
  • src-rust/crates/bridge/src/lib.rs — Bridge module for CLI-to-remote communication; essential for understanding distributed execution and multi-machine agent support.

🛠️How to make changes

Add a New LLM Provider

  1. Create a new provider module in src-rust/crates/api/src/providers/ with your provider name (e.g., mistral.rs) (src-rust/crates/api/src/providers/mistral.rs)
  2. Implement the Provider trait defined in src-rust/crates/api/src/provider.rs, including send_message(), send_message_stream(), and configuration methods (src-rust/crates/api/src/provider.rs)
  3. Register your provider in the module registry by adding a public use statement and match arm in the factory function (src-rust/crates/api/src/providers/mod.rs)
  4. Create type definitions for your provider's request/response in src-rust/crates/api/src/provider_types.rs or add variants to existing enums (src-rust/crates/api/src/provider_types.rs)
  5. Add a transformer in src-rust/crates/api/src/transformers/ if your provider uses a unique message format not compatible with existing transformers (src-rust/crates/api/src/transformers/mod.rs)
  6. Register models for your provider in src-rust/crates/api/src/model_registry.rs with appropriate capability metadata (src-rust/crates/api/src/model_registry.rs)
  7. Update OAuth flow in src-rust/crates/cli/src/oauth_flow.rs to handle your provider's authentication if required (src-rust/crates/cli/src/oauth_flow.rs)

Add a New Terminal Command

  1. Define your command structure and handler in src-rust/crates/commands/src/named_commands.rs following the existing command patterns (src-rust/crates/commands/src/named_commands.rs)
  2. Register the command in the command dispatcher within src-rust/crates/commands/src/lib.rs to make it available to the agent (src-rust/crates/commands/src/lib.rs)
  3. Add command documentation in the system prompt at src-rust/crates/cli/src/system_prompt.txt so the agent knows how to invoke it (src-rust/crates/cli/src/system_prompt.txt)

Add Support for a New Provider Authentication Method

  1. Implement authentication logic in src-rust/crates/api/src/auth.rs as a new variant or handler method (src-rust/crates/api/src/auth.rs)
  2. Create provider-specific OAuth or credential flow in src-rust/crates/cli/src/oauth_flow.rs (or specialized file like codex_oauth_flow.rs for complex flows) (src-rust/crates/cli/src/oauth_flow.rs)
  3. Update the provider implementation in src-rust/crates/api/src/providers/[provider_name].rs to use the new auth method in request headers/body (src-rust/crates/api/src/providers/anthropic.rs)

Extend Agent Capabilities with a New Tool

  1. Define the tool handler in src-rust/crates/commands/src/named_commands.rs or create a new module under src-rust/crates/commands/src/ (src-rust/crates/commands/src/named_commands.rs)
  2. Register the tool in the command dispatcher in src-rust/crates/commands/src/lib.rs so it can be invoked by the agent (src-rust/crates/commands/src/lib.rs)
  3. Document the tool in the system prompt at src-rust/crates/cli/src/system_prompt.txt to enable agent self-instruction (src-rust/crates/cli/src/system_prompt.txt)
  4. Update agent state tracking in src-rust/crates/core/src/analytics.rs if the tool modifies session state or requires permission tracking (src-rust/crates/core/src/analytics.rs)

🪤Traps & gotchas

No test suite visible: Critical for a tool executing arbitrary shell commands — test coverage unknown. Voice/Audio feature flag: Default build includes microphone support (requires libasound2-dev on Linux); omit with --no-default-features. Database schema migration: rusqlite uses bundled SQLite but no migration system visible — check crates/tools/src/ for schema initialization. MCP version pinning: crates/mcp/ couples to a specific Model Context Protocol version; updating providers may require MCP changes. Config file location: Likely in ~/.config/claurst/ or platform-specific via dirs crate, but not explicitly documented in visible files. Streaming response parsing: Provider SDKs vary widely in streaming format (SSE, JSONL, newline-delimited); integration points are in crates/api/src/providers/ and may have undocumented edge cases.

🏗️Architecture

💡Concepts to learn

  • anthropics/anthropic-sdk-python — Official Anthropic SDK that Claurst wraps; reference for streaming API behavior and tool-calling protocol
  • continuedev/continue — Similar multi-provider coding agent (Python/TypeScript-based) with IDE integrations; shares architectural patterns for tool management and provider abstraction
  • aider/aider — Alternative terminal coding agent (Python); architectural peer for comparison on tool execution, conversation management, and multi-file editing
  • modelcontextprotocol/specification — MCP specification that Claurst implements in crates/mcp/; authoritative reference for tool definition and resource protocol
  • ratatui-org/ratatui — TUI framework Claurst depends on; understanding Ratatui internals essential for debugging rendering and event handling in crates/tui/

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add integration tests for multi-provider authentication flow in crates/api

The repo supports multiple LLM providers (Anthropic, Azure, Bedrock, Cohere, Copilot) via src-rust/crates/api/src/providers/, but there are no visible integration tests validating auth flows across providers. With auth.rs and provider_error.rs in place, adding tests would catch provider-specific auth failures early and document expected behavior.

  • [ ] Create src-rust/crates/api/tests/integration_tests.rs
  • [ ] Add test cases for each provider's auth flow: anthropic.rs, azure.rs, bedrock.rs, cohere.rs, copilot.rs
  • [ ] Test error handling paths via provider_error.rs
  • [ ] Document test setup in docs/auth.md (which exists but likely needs provider-specific examples)
  • [ ] Ensure tests mock external API calls to avoid credential exposure

Implement missing CI workflow for Rust crate builds and clippy linting

The repo has .github/workflows/pages.yml and release.yml, but no workflow for running cargo test, cargo build, and clippy on pull requests. With 12 workspace crates (core, api, tools, query, tui, commands, mcp, bridge, cli, buddy, plugins, acp) defined in Cargo.toml, a build matrix is needed to catch regressions early.

  • [ ] Create .github/workflows/rust-ci.yml
  • [ ] Configure matrix build for Rust stable/nightly on Linux/macOS
  • [ ] Add steps: cargo check, cargo clippy --all-targets, cargo test --workspace
  • [ ] Include cargo fmt --check to enforce code style
  • [ ] Test devcontainer build via .devcontainer/Dockerfile

Add comprehensive example configurations and validation in docs/configuration.md with schema file

The repo has extensive configuration capability (agents, hooks, providers, commands per docs/ structure) but docs/configuration.md exists without visible schema examples. Contributors and users need concrete examples of TOML/JSON config structures, especially for the 12 crates with different concerns (TUI, MCP, plugins, bridges).

  • [ ] Create docs/configuration-schema.md documenting TOML structure for core config sections: [providers], [agents], [commands], [hooks], [plugins]
  • [ ] Add 3-5 complete example config files in docs/examples/ (e.g., minimal.toml, advanced.toml, mcp-enabled.toml)
  • [ ] Reference the provider_types.rs and model_registry.rs to document available provider/model configurations
  • [ ] Add validation hints to prevent misconfiguration (required fields, type requirements)
  • [ ] Link examples from docs/installation.md first-run setup section

🌿Good first issues

  • Add integration tests for tool execution in crates/tools/src/executor.rs — test subprocess spawning, signal handling, and output capture with mock binaries. Currently zero test coverage visible.: medium: Safety-critical code (executes arbitrary user commands) with no visible test harness
  • Document the SQLite schema and migration process in docs/database.md — currently undocumented. Trace schema initialization in crates/tools/src/ and explain the message history table structure.: easy: Critical for users debugging local state or contributors modifying message storage
  • Add OpenTelemetry tracing instrumentation to the agent loop in crates/core/src/agent.rs and provider calls in crates/api/src/ — currently uses basic tracing subscriber without structured observability.: medium: Production deployments need performance visibility; this enables request tracing and latency analysis across providers

Top contributors

Click to expand

📝Recent commits

Click to expand
  • b8a3f80 — Merge pull request #118 from whiteaxesing/fix/ollama-null-content-crash (Kuberwastaken)
  • d20508d — Merge pull request #125 from ilyasakin/fix-macos-arch-detection-docs (Kuberwastaken)
  • 24686e7 — fix(ollama): replace null content with empty string to prevent crash after tool use (whiteaxesing)
  • 7476d89 — Merge pull request #126 from ilyasakin/add-opencode-go-provider (Kuberwastaken)
  • 833ba17 — feat: add OpenCode Go as a provider option in /connect (ilyasakin)
  • 663bae9 — fix: detect Apple Silicon vs Intel Macs via WebGL renderer (ilyasakin)
  • f3784c1 — fix: voice & ASLA dep errors (#88) (Kuberwastaken)
  • ce5e454 — Merge branch 'main' of https://github.com/Kuberwastaken/claurst (Kuberwastaken)
  • c748fe8 — feat: live model thinking process (#116) (Kuberwastaken)
  • e577a7d — Merge pull request #119 from k99k5/feat/import-claude-config (Kuberwastaken)

🔒Security observations

  • High · Incomplete Dependencies Configuration — src-rust/Cargo.toml. The Cargo.toml workspace dependencies definition is truncated at 'tokio-util = { versio'. This incomplete dependency specification could lead to unintended version resolution, potentially pulling vulnerable or incompatible versions of tokio-util and other dependencies. Fix: Complete the truncated dependency specification and ensure all workspace dependencies are fully defined with explicit versions. Run 'cargo check' and 'cargo audit' to verify dependency integrity.
  • High · Use of Native TLS Without Pinning — src-rust/Cargo.toml - reqwest dependency. The reqwest dependency is configured with 'native-tls' feature, which relies on the system's certificate store. Without certificate pinning, the application is vulnerable to MITM attacks if the system's CA store is compromised or misconfigured. Fix: Implement certificate pinning for critical API endpoints, particularly for authentication and sensitive data transmission. Consider using rustls instead of native-tls for better control over TLS configuration.
  • High · Potential SQL Injection via SQLite — src-rust/Cargo.toml - rusqlite dependency, src-rust/crates/tools, src-rust/crates/commands. The codebase includes rusqlite dependency without visible evidence of parameterized query usage in the file structure. The presence of user-facing tools and commands increases risk of SQL injection if queries are constructed with user input. Fix: Audit all database queries to ensure parameterized statements are used exclusively. Never concatenate user input into SQL queries. Use rusqlite's params!() macro for all queries.
  • High · Multi-Provider Authentication Without Visible Validation — src-rust/crates/api/src/auth.rs, src-rust/crates/api/src/providers/. The codebase supports multiple AI providers (Anthropic, Azure, OpenAI, Google, Bedrock, etc.) with authentication via API keys. The auth.rs and provider files suggest credential handling, but no visible validation of secure storage mechanisms. Fix: Implement secure credential storage using OS credential managers (keyring, Credential Manager). Never log or display API keys. Use environment variables with restricted permissions. Implement API key rotation policies.
  • High · Unsafe Process Execution Capability — src-rust/Cargo.toml - enigo dependency, src-rust/crates/tools. Dependencies include 'enigo' (keyboard/mouse control) and the file structure suggests tool execution capabilities. Without proper sandboxing, this enables potential code execution vulnerabilities if user input flows to process execution. Fix: Implement strict input validation and sanitization for any user-controlled parameters passed to process execution. Use seccomp or other sandboxing mechanisms. Whitelist allowed commands and arguments.
  • Medium · Terminal Output Injection Risk — src-rust/crates/tui/. The TUI implementation uses ratatui and crossterm for terminal UI. If user/AI-generated content is rendered without proper escaping, terminal escape sequences could be injected to manipulate the UI or potentially execute terminal commands. Fix: Sanitize all user-controlled and AI-generated content before rendering. Strip or escape terminal control sequences. Use ratatui's safe text rendering APIs rather than raw terminal writes.
  • Medium · Plugin System Without Visible Signature Verification — src-rust/crates/plugins/. The codebase includes a plugins crate, but no visible mechanism for verifying plugin signatures or sandboxing plugin execution. Arbitrary plugin loading could allow code execution attacks. Fix: Implement cryptographic signature verification for all plugins. Load plugins in restricted environments with minimal permissions. Maintain a whitelist of approved plugins. Consider using WebAssembly for plugin sandboxing.
  • Medium · Model Registry Without Visible Validation — src-rust/crates/api/src/model_registry.rs. The model_registry.rs suggests dynamic model selection and configuration. Without proper validation, an attacker could potentially specify malicious models or endpoints. Fix: Validate all model identifiers and endpoints against a hardcoded whitelist. Implement strict URL validation for provider endpoints. Use allow-lists rather than block-lists for supported models.
  • Medium · undefined — undefined. undefined Fix: undefined

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · Kuberwastaken/claurst — RepoPilot