Claudish to English A working prototype plugin for Claude Code, named Claudish to English, rewrites assistant messages into plain English using a local LLM via ollama, and is display-only, preserving the original text in transcripts. The plugin fails open—if ollama is down or a model is missing, users see Claude's original output unchanged—and requires ollama, a pulled model (default gemma4:26b-mlx, ~17 GB), jq, and curl. It is installable from the gvzdv/claudish-to-english marketplace or the Anthropic community marketplace after review, and all behavior is controlled by CLAUDISH_* environment variables. A Claude Code plugin that shows a plain-English rewrite of each assistant message, produced by a local LLM via ollama . It is display-only : Claude's own reasoning and the saved transcript keep the original text — only what you read on screen changes. An optional second hook rewrites Markdown files into plain English when they are written or edited opt-in, off by default . Status: working prototype. Every hook fails open— if anything goes wrong ollama down, timeout, missing dependency , you simply see Claude's original text. The plugin can never swallow or corrupt an answer. This plugin shells out to a local model. Nothing works until these are in place: | Requirement | Why | Install | |---|---|---| ollama, running | Does the rewriting, locally | brew install ollama then ollama serve | | A pulled model | The actual rewriter | ollama pull gemma4:26b-mlx ~17 GB; choose the model that fits into your memory | jq | Parses hook JSON | ships with macOS; else brew install jq | curl | Talks to ollama | ships with macOS | Warm the model once after ollama serve the first call is a slow cold load : ollama run gemma4:26b-mlx "hi" If the local model isn't ready, the plugin does nothing to your text — Claude's output shows normally, unchanged. That is by design, not a bug. It skips fails open when ollama is down, the request times out, or the model isn't pulled. The first time that happens in a session it tells you why: the display hook appends a one-line notice on screen, and the Markdown hook shows a systemMessage . So a silent skip is never a mystery once per session; set CLAUDISH NOTICE=0 to silence it . Pick a model you actually have. The default is gemma4:26b-mlx . Pull it as above , or pull a smaller/faster model and point the plugin at it by setting CLAUDISH MODEL to that model's exact ollama tag in your env see Configuring the plugin configuring-the-plugin . If CLAUDISH MODEL names a model you have not pulled, every rewrite is skipped — with the one-time notice above. Directly from this repository also serves its own marketplace : /plugin marketplace add gvzdv/claudish-to-english /plugin install claudish-to-english@gvzdv-plugins After review by the Anthropic team, the plugin will be available to install from the community marketplace: /plugin marketplace add anthropics/claude-plugins-community /plugin install claudish-to-english@claude-community If the install summary says Run /reload-plugins to activate. , run that command. Try before installing loads it for one session, no install : claude --plugin-dir /path/to/claudish-to-english Run /reload-plugins after edits; if it doesn't load, check the /plugin Errors tab. All behavior is controlled by CLAUDISH environment variables full list in Configuration configuration-env-vars below . When you install from a marketplace, set them in Claude Code's env block in settings.json — do not edit the plugin's own hooks/hooks.json , which lives in the read-only plugin cache ~/.claude/plugins/cache/… and is overwritten on every update.For a personal, all-projects setup, use ~/.claude/settings.json : { "env": { "CLAUDISH MODEL": "gemma4:26b-mlx", "CLAUDISH MODE": "append" } } The hooks are subprocesses Claude Code spawns, so they inherit these. A few things to know: Restart Claude Code after editing The value is captured at launch, so a running session keeps the old one. env .The highest-precedence settings file that defines env does not merge across scopes. env supplies the entire block — it isn't combined with lower scopes. Precedence: managed → local → project → user. Keep all your CLAUDISH vars in whichever file wins. Scopes: ~/.claude/settings.json all your projects · .claude/settings.json shared with a repo, checked in · .claude/settings.local.json just you, just this repo . Quick one-off without editing a file — hooks inherit the launching shell: CLAUDISH MODEL=llama3.2:3b claude To confirm the hook is firing, set CLAUDISH DEBUG=1 and watch "$TMPDIR"/claudish-to-english/debug.log . Claude Code fires the MessageDisplay event once per streamed chunk , not once per message. Each fire is a separate process carrying message id , index , a final flag, and this chunk's delta a text fragment, not the whole message . So the hook buffers every delta to a temp file keyed by message id and only calls the model on the final chunk, once the whole message is known: chunk 0 final:false ─┐ chunk 1 final:false ─┤ append each delta to $TMPDIR/claudish-to-english/