The coding agent that only talks to your providers.
Crush's agent, TUI, LSP and MCP support, with the phone-home taken out. No telemetry, no update checks, no catalog fetches. Web tools stay off until you say so, cloned repos stay inert until you trust them, and your OpenCode setup comes along.
Free, open source, FSL-1.1-MIT. Version —, released .
Windows, macOS, Linux
Single static binary
Local models welcome
SHA-256 sums on every release
What's different
Same agent. Much shorter list of who it talks to.
Upstream Crush is excellent. This build changes what it does without asking, not how it codes. Every change is listed in the changelog.
No phone-home
PostHog telemetry, the update check, the Catwalk and Hyper catalog fetches, the Hyper vendor service and the forced Termux DNS resolvers are removed, not just disabled. The provider catalog is a local file you refresh on purpose with crush update-providers.
Web tools off by default
fetch, agentic_fetch, download and sourcegraph are hidden from the model until you run option web-tools true. Even then, every request asks first. Downloads are capped and headers are redacted in logs.
Untrusted projects stay inert
A cloned repo's crush.json, crushrc and OpenCode config are ignored until you run crush trust. No MCP servers or LSPs start from a project you have not vouched for. .env files are no longer auto-loaded.
Stricter bash auto-approval
Only a single, parsed, read-only command runs without a prompt. Wrappers such as env and timeout, redirections, pipes into writes and multi-line commands always ask.
OpenCode import
MCP servers, providers, model choices, the models.dev cache, rules, skills, custom commands, tool toggles and file-edit permissions come from your OpenCode install. Read from disk only. How it works.
Reviewable releases
Every tag builds six archives in a public GitHub Actions run with pinned actions, ships a SHA256SUMS.txt, and lands as a draft release that is reviewed before it is published.
OpenCode import
Already set up OpenCode? You're done.
Crush reads ~/.config/opencode at startup and brings the useful parts across. Nothing is copied or rewritten, and nothing of OpenCode's runs. Plugins in particular are never executed: they are listed in the report so you know what is being skipped.
MCP servers, providers and your default and small model
The cached models.dev catalog, for providers Crush doesn't already know
Rules, global AGENTS.md, skills and custom commands (as opencode:<name>)
Tool toggles, deny rules, and edit: allow as a no-prompt list inside the project
A network: note for MCP commands like npx -y that reach the registry on every start
Each part has an on/off switch under options.opencode, and CRUSH_DISABLE_OPENCODE=1 turns the whole thing off. Run crush opencode to see exactly what was read and what was skipped.
crush opencode
Config files read
~/.config/opencode/opencode.jsonc
project-level config: skipped (not trusted; see `crush trust`)MCP servers (on)
bench local bench-mcp --project bench imported
playwright local npx -y @playwright/mcp@latest imported
network: playwright: npx contacts the npm registry
every time it starts; add --prefer-offlineModel choice (on)
large pc/bonsai-27b (agent build) selected
small pc/bonsai-27b-quick (small_model) selected
Models catalog (on)
cached 232 providers, 9056 models; 219 usable by Crush
Credentials (off) set options.opencode.credentials to use
API keys from `opencode auth login`
Commands (on)
opencode:commit, opencode:review, opencode:simplify
Notes
plugins are never run: media-models.js, notify.js
What it connects to
Everything that can open a socket, on one list.
Verified with a process-tree connection watcher during the fork's audit, and again on a Windows PC against a local llama-server. If a line isn't here, Crush doesn't do it.
Model providers you configure. Chat completions, plus a GET /models discovery call against the same base URL.
MCP servers you configure. Local processes, HTTP or SSE endpoints, and their OAuth flows if they use one.
OAuth refresh for accounts you signed in with crush login.
Web tools, only once enabled and only after you approve each request.
Catalog refresh, only on request with crush update-providers.
Nothing else. No telemetry, no update check, no crash reports, no startup fetches.
always, to hosts you chose opt-in
Download
Get Crush (cetla build)
Latest: v, . No release is published yet; check the releases page or build from source below. All releases
The installer needs no admin rights. It puts Crush in %LOCALAPPDATA%\Programs\Crush, adds crush to your PATH and the Start menu, and uninstalls from Settings → Apps. Open a new terminal afterwards and run crush in a project folder. Not code-signed: if SmartScreen appears, choose More info → Run anyway.
A static binary; works on any glibc or musl distro, Raspberry Pi 4/5, Graviton and Ampere.
Package managers (Homebrew, npm, AUR, Nix) install upstream Crush, not this build. Get it from the downloads above or build from source.
Checking a download
Every release includes SHA256SUMS.txt. Put it next to the archive and compare.
# macOS / Linux
shasum -a 256 -c SHA256SUMS.txt --ignore-missing
# Windows (PowerShell)
Get-FileHash crush_<version>_Windows_x86_64_Setup.exe
Select-String Windows_x86_64_Setup SHA256SUMS.txt
Build from source
Go 1.27 or newer, nothing else. Same command on every platform.
git clone https://github.com/ItsCetla/crush-cetla.git
cd crush-cetla
go build -o crush .
./crush --version
FAQ
Questions people ask.
Is this an official Charm release?
No. It is an independent fork of charmbracelet/crush. Charm is not involved and does not support it. Bugs in code that isn't fork-specific belong upstream.
Does it work with local models?
Yes. Any OpenAI- or Anthropic-compatible endpoint works, including llama-server, LM Studio, Ollama and vLLM. Set a provider with a base_url and an API key (or a {file:…} reference in OpenCode config) and pick the model. Timeouts are long enough for a cold 30k-token prompt on a 27B model.
What does crush trust actually gate?
Project-level config, project OpenCode files, project MCP servers and LSPs, and the no-prompt list for edits inside the project. Until a project is trusted, Crush still works in it but uses only your global config. CRUSH_TRUST_PROJECT=1 trusts the current directory for one run, which is handy for scripts.
Why are the binaries unsigned?
Signing and notarizing cost money and tie a release to a person's certificate. Instead, every build runs in a public GitHub Actions workflow with pinned actions, and the checksums file lets you verify what you got. If you'd rather not trust that, go build takes about a minute.
Can I turn the web tools on?
Yes: option web-tools true inside Crush, options.enable_web_tools: true in config, or CRUSH_ENABLE_WEB_TOOLS=1. Each fetch still asks for permission, and downloads are size-capped.
What license is it under?
FSL-1.1-MIT, the same Functional Source License as upstream Crush. You may use, copy, modify and redistribute it for anything except a competing product; each version becomes MIT two years after its release.