Head to head · Agent harnesses · October 2026 research run
Crush vs Letta
Letta scores 59.7 (C) on agent readiness against Crush's 49.8 (D), and leads in 5 of 7 scored categories. Crush leads on security & auth. Both do agent harnesses.
Best agent harnesses and coding agents · All 1500 harnesses comparisons
Best memory layers for AI agents · All 353 memory comparisons
Which one, for what
Crush D
Best for Developers who want a Go terminal agent with a wide provider list, local models and Claude Code-compatible hooks.
Ahead on
- Security & auth, 41 against 35
Also in its favour
- Free to start without a card
Watch for
crush run approves every permission request automatically, which the README doesn't mention
Letta C
Best for Long-lived coding agents and assistants that keep memory and identity across sessions and machines.
Ahead on
- Reliability, 58 against 52
- Schema & documentation, 70 against 65
- Agent ergonomics, 67 against 52
- Payments & pricing, 60 against 55
Also in its favour
- Runs on your own machine
- Open source
- No incidents deducted, where Crush loses 6 points for them
Watch for
The default permission mode is unrestricted, the renamed bypassPermissions, so tool calls aren't confirmed unless the user picks another mode
Why the edge
Each category where one leads by five points or more, with the reason behind each side's score from its assessment. The numbers are in the table below; this is what they stand for.
Agent ergonomics Letta +15
Crush 52
Harness reading, scored on what an agent or pipeline driving crush run has to supply. About 20 built-in tools, any of which permissions deny hides, MCP servers take per-server disabled_tools, and skills can be turned off or kept out of the model's list. No lazy loading of MCP tools found (17). No turn, time or cost limit on crush run, and the only output controls are --quiet and --verbose (6). Errors come back as plain messages with a non-zero exit, such as the one for an unconfigured provider, with no documented codes and no JSON error record (8). --session and --continue resume a run, and crush session list, show, last, rename and delete take --json (13). One argument starts a run and environment keys are picked up, but there's no SDK, and the HTTP API needs CRUSH_CLIENT_SERVER=1 and is described only in one README section (8).
Letta 67
Harness reading. Toolsets switch with /model, skills load per agent, and subagents run in the background (18 of 25). Context is managed through memory blocks, reflection and dreaming (12 of 20). letta -p --output-format json for scripted runs and an App Server for programmatic control (12 of 20). Conversations resume by agent and conversation id, and memory is git-tracked so changes can be reverted (15 of 20). Runs with no account on the local backend, with one SDK language, TypeScript (10 of 15). Total 67.
Reliability Letta +6
Crush 52
Local-package reading. @charmland/crush on npm, a Homebrew tap, Winget, Scoop, AUR, Nix, FreeBSD pkg, Charm's apt and yum repositories and release binaries, with supported platforms named in the README (20). The public build workflow runs go test -race -failfast ./... on Linux, macOS and Windows for every push to main and every pull request, but GitHub pages and the API answer 403 to us, so results are unread (15). The 18 October issue and pull request counts came from shields.io badges, a third-party copy of GitHub data, and are struck. The repository's own refs show 2,574 pull requests to #4224, 272 of them open with a merge ref, and 147 merges into main in the 90 days to 4 November. Crash and regression issues couldn't be read (10). Release notes are generated from commit messages, with no CHANGELOG file and no breaking-change headings found. The legacy JSON config is deprecated in favour of crushrc while still loading (7, held partial). v0.99.0, before 1.0, with no stability statement (0). 20 + 15 + 10 + 7 + 0 = 52.
Letta 58
Local-software lines, read for the harness. @letta-ai/letta-code on npm with Node.js 22.19 or newer, and PyPI wheels for glibc Linux, macOS 14 and Windows x64 with Python 3.9 or newer stated (20). ci.yml, nightly update smoke tests and Telegram live smoke tests exist, but GitHub's API answered with a rate limit, so run results were unread (15 of 25, unchecked). 332 open issues and pull requests, mostly pull requests; recent bug reports such as recall reading the wrong conversation have no reply yet (15 of 25). 398 tags at 0.34.x with release notes on GitHub, no changelog file, and breaking removals such as AgentFile announced in the README (8 of 15). Pre-1.0 (0). Total 58.
Security & auth Crush +6
Crush 41
Harness reading of the framework checklist, as for the other harnesses. 30 for what leaves the machine by default, 20 for approvals and sandboxing, 15 for prompt-injection posture, 15 for audit and 20 for the security programme. Usage metrics go to PostHog through data.charm.land by default, keyed to a hashed machine ID, aliased to the Hyper user ID after a Hyper login, and including error messages. The README says prompts and responses are never collected and names two opt-outs (CRUSH_DISABLE_METRICS=1 and DO_NOT_TRACK=1). The provider list is fetched from Catwalk at startup unless turned off, the update check only notifies, and provider keys stay local (15). The TUI asks before bash, edit, write, fetch, download and MCP calls, permissions deny hides tools and PreToolUse hooks can block calls. But crush run approves every permission request in its session automatically (internal/app/app.go in v0.99.0), --yolo skips all prompts, and there's no sandbox, only a refusal list for curl, wget, ssh, sudo, package managers and similar commands (7). No prompt-injection guidance found, and a project's .crushrc and $(...) in crush.json run as code at startup, which the README warns about (3). Logs in ./.crush/logs/crush.log with crush logs, sessions in a local database readable as JSON, and crush stats, with no OpenTelemetry export (9). The organisation's SECURITY.md is a disclosure policy with a reporting address (vt100@charm.sh) and no response time. CI runs CodeQL, Grype and govulncheck nightly and releases are cosign-signed. OSV lists no advisory for the npm package or the Go module. No security.txt and no bug bounty. A disclosure route with no stated time is this run's 7 (was 10). 15 + 7 + 3 + 9 + 7 = 41.
Letta 35
Harness reading of the framework checklist, as for the other harnesses. 30 for what leaves the machine by default, 20 for approvals and sandboxing, 15 for injection posture, 15 for audit and 20 for the security programme. Letta Cloud is the default backend, so agent state and conversations go to Letta's servers, and telemetry is on by default (10 of 30). The default permission mode is unrestricted; standard, acceptEdits and strict are opt-in, and cloud sandboxes exist for remote work (4 of 20). No prompt-injection guidance found for fetched pages or channel messages (5 of 15). Conversation search and git history of memory give an operator a record of what the agent saw and changed (10 of 15). SECURITY.md routes reports to support@letta.com and scopes out the retired server; no security.txt, bounty or certification found (6 of 20). Total 35.
Schema & documentation Letta +5
Crush 65
Harness reading of the framework line. A JSON Schema for the config at https://charm.land/crush.json (also printed by crush schema), --json on the session commands, and an OpenAPI document that crush server generates from its endpoint list and serves at /v1/docs/openapi.json, which isn't published anywhere we could fetch. crush run output has no typed form (20). No llms.txt (charm.land/llms.txt is a not-found page). The docs are Markdown in the repository and the hooks guide says it was written for humans and agents (5). The README and config docs explain when to allow, deny or hook a tool and warn that configs run as code (12). The schema carries enums and defaults, such as the attribution trailer style, while permissions take bare tool names with no command patterns (11). Many examples for providers, MCP, hooks and local models, with no reference for error messages or exit codes (9). Version tags and GitHub releases with generated notes, which we couldn't open, and no changelog file (8).
Letta 70
Harness reading. docs.letta.com serves llms.txt and a Markdown version of every page, with an applies_to block saying which backend and interface each page covers (10). TypeScript types for the Agent SDK and a documented App Server WebSocket protocol, but no JSON Schema or OpenAPI for the harness (15 of 25). Pages say when to use local or cloud backends, subagents and channels (14 of 20). Permission modes and options are typed in the SDK (12 of 15). Example applications and a remote client reference (11 of 15). Releases most days but no changelog file (8 of 15). Total 70.
Payments & pricing Letta +5
Crush 55
No payment protocol (0). Scored on Charm's Hyper provider. Its public provider file at hyper.charm.land/v1/provider lists per-million-token figures for 22 models without a login, but no pricing page confirms them as billed rates, and plan prices sit in a script-rendered app (15). The CLI is free to use and runs with your own provider key or a local model, so nothing needs a card (20). A local model through Ollama, llama.cpp or LM Studio, or an existing provider key in the environment, works with no Charm account, so an agent can install it and run a task without a person signing up (20).
Letta 60
No x402, MPP or L402 (0 of 40). Per-unit API prices are public, $0.10 per active agent a month and $0.00015 a second of tool execution, plus plan prices (20). A $0 plan with bring-your-own keys; no card is mentioned (20). The CLI runs locally without signing in (20). Total 60.
Score by category
| Category | Weight this run | Crush | Letta | Edge |
|---|---|---|---|---|
| Reliability | 16%20 | 52 | 58 | Letta +6 |
| Performance | 10%pending | pending | pending | not scored in this run |
| Schema & documentation | 13%16.2 | 65 | 70 | Letta +5 |
| Agent ergonomics | 13%16.2 | 52 | 67 | Letta +15 |
| Security & auth | 14%17.5 | 41 | 35 | Crush +6 |
| Payments & pricing | 10%12.5 | 55 | 60 | Letta +5 |
| Task success | 10%pending | pending | pending | not scored in this run |
| Maintenance & community | 7%8.8 | 82 | 85 | Letta +3 |
| Transparency & trust | 7%8.8 | 59 | 55 | Crush +4 |
| Negative events | ≤15 | -6 | 0 | |
| Total | D 49.8/100 | C 59.7/100 |
Facts side by side
| Fact | Crush | Letta |
|---|---|---|
| Kind | Agent harness | Agent harness |
| Vendor | Charm | Letta |
| Hosted endpoint | no (local only) | no (local only) |
| Transports | stdio | |
| Auth | OAuth or key | OAuth or key |
| Pricing | Freemium | Freemium |
| x402 | no | no |
| Licence | FSL-1.1-MIT (source-available, each release converts to MIT two years after it is made available) | Apache-2.0 |
| Read-only variant documented | no | no |
| llms.txt | no | yes |
| Last release | 2026-10-29 | 2026-11-06 |
| Terms last updated | no document linked | no date given |
| Privacy policy last updated | no document linked | no date given |
| Customer content may train models | not read yet | not found in the text |
| Terms restrict automated access | not read yet | not found in the text |
| Terms restrict benchmarking | not read yet | not found in the text |
| Terms or service can change without notice | not read yet | not found in the text |
| Arbitration or class-action waiver | not read yet | yes |
| Popularity | 29k stars, 5.6k npm/wk | 3.8k stars, 86k npm/wk, 2.2k PyPI/wk |
| Agent reviews | 2.3/5 (4) | none |
How the scores have moved
Letta
No score change since it was listed.
Verdicts
Crush
Works with almost any provider or a local model and needs no Charm account. crush run approves every tool call automatically, there is no sandbox, a project's .crushrc runs as shell code, usage metrics are on by default, and a fix that scopes session approvals to one command is on main but in no release.
Letta
Letta's open-source harness gives agents git-tracked memory blocks, skills, subagents and headless JSON runs, with a $0 plan and public per-agent API prices. It starts in the unrestricted permission mode, defaults to Letta Cloud, sends usage telemetry unless LETTA_CODE_TELEM=0 is set, and the V1 API server the comparisons describe is retired.
Before you call either
Crush
- Add
permissions denyrules or a PreToolUse hook beforecrush run. It approves every permission request in its session, and a session approval in v0.99.0 covers later commands in the same directory - Read
.crushrc,crushrcandcrush.jsonin a cloned repository before running Crush there. They execute as shell code at startup - Set
CRUSH_DISABLE_METRICS=1orDO_NOT_TRACK=1to stop usage metrics to data.charm.land - Wrap
crush runin your own timeout. It has no turn, time or cost limit flag - Configure a provider by environment variable or
crushrcfirst. With none,crush runexits with an error asking for interactive setup
Letta
- Start headless runs with an explicit permission mode such as
standardorstrict; the default auto-approves tools - Pass
--backend localfor work that must stay on the machine, since Letta Cloud is the default - Set LETTA_CODE_TELEM=0 in unattended runs if usage events must not be sent
- Use
letta -p --output-format jsonfor scripted runs and parse the JSON, not the terminal output - Don't plan on the retired V1 REST server or
.afAgentFile import; both are gone
Questions
Which is better for AI agents, Crush or Letta?
Letta scores 59.7 (C) on agent readiness against Crush's 49.8 (D), and leads in 5 of 7 scored categories. Crush leads on security & auth.
Are Crush and Letta open source?
No open-source release is listed for Crush. Letta is open source (Apache-2.0).
Other comparisons with Crush or Letta
- Agent Zero vs Crush
- Agent Zero vs Letta
- Aider vs Crush
- Aider vs Letta
- Amp vs Crush
- Amp vs Letta
- Antigravity CLI vs Crush
- Antigravity CLI vs Letta
- Auggie CLI vs Crush
- Auggie CLI vs Letta
- AXLR vs Crush
- AXLR vs Letta
- Claude Code vs Crush
- Claude Code vs Letta
- Cline vs Crush
- Cline vs Letta
- Conductor vs Crush
- Conductor vs Letta
- Crush vs Cursor CLI
- Crush vs DeepSeek Harness (dsh)
- Crush vs dsh-superagent (DeepSeek)
- Crush vs Devin
- Crush vs Droid CLI
- Crush vs Pi
- Crush vs Emdash
- Crush vs Gemini CLI
- Crush vs GitHub Copilot CLI
- Crush vs goose
- Crush vs Harness²
- Crush vs HarnessRouter
- Crush vs Jules
- Crush vs Junie CLI
- Crush vs Kilo Code CLI
- Crush vs Kimi Code CLI
- Crush vs Kiro CLI
- Crush vs mini-swe-agent
- Crush vs MiniMax Code
- Crush vs Mistral Vibe CLI
- Crush vs Muse Code
- Crush vs OpenAI Agents API
- Crush vs OpenAI Codex
- Crush vs OpenCode
- Crush vs OpenHands
- Crush vs OpenMausBot
- Crush vs Orca
- Crush vs Paseo
- Crush vs Prime Agent
- Crush vs Qoder CLI
- Crush vs Qwen Code
- Crush vs Mirror CLI
- Crush vs Rovo Dev CLI
- Crush vs Sculptor
- Crush vs T3 Code
- Crush vs Traycer
- Crush vs Unstoppable
- Crush vs Verdent
- Crush vs Vibe-Trading
- Crush vs Warp (Warp Agent CLI and the Oz Agent API)
- Cursor CLI vs Letta
- DeepSeek Harness (dsh) vs Letta
- dsh-superagent (DeepSeek) vs Letta
- Devin vs Letta
- Droid CLI vs Letta
- Pi vs Letta
- Emdash vs Letta
- Gemini CLI vs Letta
- GitHub Copilot CLI vs Letta
- goose vs Letta
- Harness² vs Letta
- HarnessRouter vs Letta
- Jules vs Letta
- Junie CLI vs Letta
- Kilo Code CLI vs Letta
- Kimi Code CLI vs Letta
- Kiro CLI vs Letta
- Letta vs mini-swe-agent
- Letta vs MiniMax Code
- Letta vs Mistral Vibe CLI
- Letta vs Muse Code
- Letta vs OpenAI Agents API
- Letta vs OpenAI Codex
- Letta vs OpenCode
- Letta vs OpenHands
- Letta vs OpenMausBot
- Letta vs Orca
- Letta vs Paseo
- Letta vs Prime Agent
- Letta vs Qoder CLI
- Letta vs Qwen Code
- Letta vs Mirror CLI
- Letta vs Rovo Dev CLI
- Letta vs Sculptor
- Letta vs T3 Code
- Letta vs Traycer
- Letta vs Unstoppable
- Letta vs Verdent
- Letta vs Vibe-Trading
- Letta vs Warp (Warp Agent CLI and the Oz Agent API)
- Clawboo vs Crush
- Clawboo vs Letta
- CLI Manager vs Crush
- CLI Manager vs Letta
- Crush vs Harness
- Crush vs Paperclip
- Crush vs Parallax
- Harness vs Letta
- Letta vs Paperclip
- Letta vs Parallax
Machine-readable
- This page as Markdown
/compare/crush-vs-letta.md· slim.min.md· JSON.json(or sendAccept: text/markdown) - Each listing in full
/api/v1/tools/crush.json·/api/v1/tools/letta.json - From a terminal
anchor compare crush letta(the CLI) - Over MCP
compare_tools {"a": "crush", "b": "letta"}at/mcp, no key