CodeWhale is the canonical project, command, npm package, and
release-asset name. The legacy npm packagedeepseek-tuiis
deprecated and receives no further releases. Users coming from
v0.8.x legacydeepseek/deepseek-tuinames should migrate
withdocs/REBRAND.md.
Install
Recommended — npm (one command, both binaries)
npm install -g codewhaleThe wrapper downloads both binaries from this Release and places them in the same directory.
Docker / GHCR
docker run --rm -it \
-e DEEPSEEK_API_KEY="$DEEPSEEK_API_KEY" \
-v ~/.deepseek:/home/codewhale/.deepseek \
ghcr.io/hmbown/codewhale:v0.8.59The image ships the codewhale dispatcher and codewhale-tui runtime. The latest tag is also updated on release.
Cargo (Linux / macOS)
cargo install codewhale-cli codewhale-tui --lockedBoth crates are required — codewhale-cli produces the codewhale dispatcher and codewhale-tui produces the interactive runtime that the dispatcher delegates to. Installing only one binary will fail at runtime with a MISSING_COMPANION_BINARY error.
Manual download — platform archives (recommended)
Each archive below contains both the codewhale dispatcher and codewhale-tui runtime, plus an install script:
| Platform | Archive | Install script |
|---|---|---|
| Linux x64 | codewhale-linux-x64.tar.gz |
install.sh |
| Linux ARM64 | codewhale-linux-arm64.tar.gz |
install.sh |
| Linux RISC-V | codewhale-linux-riscv64.tar.gz |
install.sh |
| macOS x64 | codewhale-macos-x64.tar.gz |
install.sh |
| macOS ARM | codewhale-macos-arm64.tar.gz |
install.sh |
| Windows x64 (installer) | CodeWhaleSetup.exe |
NSIS setup |
| Windows x64 | codewhale-windows-x64.zip |
install.bat |
| Windows x64 (portable) | codewhale-windows-x64-portable.zip |
— |
Unix (Linux / macOS):
tar xzf codewhale-<platform>.tar.gz
cd codewhale-<platform>
./install.shWindows:
- For the installer path, run
CodeWhaleSetup.exe; it installs both binaries under%LOCALAPPDATA%\Programs\CodeWhale\binand adds that directory to the current-user PATH. - Extract
codewhale-windows-x64.zip - Run
install.bat(copies to%USERPROFILE%\bin) - Add
%USERPROFILE%\binto your PATH
The portable Windows archive skips the install script — extract and run from any directory. The NSIS installer is currently unsigned and may trigger Windows SmartScreen until a signing certificate is wired into the release pipeline.
Individual binaries are also attached below for scripting and the npm wrapper. The legacy npm package deepseek-tui is deprecated and is not republished. For migration from v0.8.x legacy binary names, see docs/REBRAND.md.
Verify (recommended)
Download the checksum manifests from this Release and verify:
# Linux — archive bundles
sha256sum -c codewhale-bundles-sha256.txt
# Linux — individual binaries
sha256sum -c codewhale-artifacts-sha256.txt
# macOS
shasum -a 256 -c codewhale-bundles-sha256.txt
shasum -a 256 -c codewhale-artifacts-sha256.txtWhat's in v0.8.59
Added
- Moonshot Kimi K2.7 Code model. The Moonshot/Kimi provider now defaults to
kimi-k2.7-code, recognizeskimi/kimi-k2aliases for that model, keeps
explicitkimi-k2.6selectable, and adds the OpenRouter
moonshotai/kimi-k2.7-coderegistry row. - Concise verbosity mode (#3052). CLI noninteractive launches now default
to concise prompt/output discipline unless overridden by config, env, or
--verbosity, while interactive TUI launches remain normal by default.
Thanks @cyq1017 for the PR. - Ephemeral generated project context (#3058). Opening CodeWhale in a
directory with no instruction files now keeps the bounded generated project
overview in memory instead of creating.codewhale/instructions.md. - ACP registry auth metadata (#1447). The ACP stdio adapter now advertises
terminal authentication setup ininitialize.authMethods, matching the
registry's validation requirement. - Sidebar context menus (#3065). Right-clicking the sidebar no longer shows
Paste; clickable sidebar rows now offer their row command as the first
context action. - Sidebar hover popovers (#3088). Streaming turns now keep sidebar hover
popovers responsive while continuing to throttle transcript/body mouse
motion. - Dark-theme selection contrast (#3074, thanks @drpars). Session, config,
help, context-menu, and approval selections now use the muted selection
background instead of the bright accent color. - Cursor-style activity metadata rows (#3146). Dense successful tool-run
summaries now render as a single mutedExplored .../Updated metadata
row, include short command-family labels for successful generic verifier
groups, and keep keyboard/mouse expansion and detail inspection intact. - Provider-wait observability (#3095). Footer stall reasons now name the
active provider/model route, idle seconds vs stream budget, and whether a
fanout plan is still at0 runningor dispatch is pending. Structured
provider-wait incidents log once per turn from the main tick loop (not on
every footer redraw). - Interactive fanout launch gate (#3095). Direct sub-agent children queue
behind a configurable semaphore ([subagents] interactive_max_launch,
default 4) with a visiblequeued: waiting for an interactive fanout slot
reason before their first model step. - Goal lifecycle controls.
/goalis now the primary command surface for
session goals, withpause,resume,complete,blocked, andclear
controls while/huntremains a compatibility alias. - Persistent thread-goal API. App-server clients can now set, get, and clear
durable thread goals throughthread/goal/set,thread/goal/get, and
thread/goal/clear, backed by the state store with Codex-style status and
token/time accounting fields. - Command-boundary ownership layers (#2888/#3055). Built-in slash command
metadata now lives incommands/registry.rs, slash parsing in
commands/parse.rs, and handlers under group-owned command areas, preserving
the existing dispatch surface while reducing futurecommands/mod.rschurn. - Approval-rule source metadata (#1186/#2971). Runtime API
approval.requiredevents now include optionalmatched_rulemetadata when
an execution-policy rule caused the prompt. Thanks @greyfreedom for the PR
and @Ram9199 for the audit-semantics discussion. - Localized tool-family labels (#2901). Tool activity labels for read,
patch, run, find, delegate, fanout, RLM, verify, think, and generic tool
work now route through the shipped locale tables. Thanks @gordonlu for the
PR. - Localized config section labels (#2918). The interactive config view now
localizes section and session/saved scope labels while preserving English
search terms. Thanks @gordonlu for the PR. - Localized config editor labels (#2919). The config editor modal now
localizes edit labels, default/unavailable placeholders, and effective
currency hints. Thanks @gordonlu for the PR. - Hotbar number-key dispatch (#3056). Bare
1-8now trigger bound
hotbar slots only when the composer is empty, whileAlt+1-Alt+8trigger
slots regardless of composer text and overlays keep key ownership. Thanks
@reidliu41 for the PR. - Voice dictation commands (#3051).
/voice,/voice-send, and
/voice-controlnow record throughsox/rec/arecord, transcribe via the
active provider's chat-completions API, and insert transcripts at the
composer cursor. Thevoice.togglehotbar action dispatches the real voice
command, with help and status text localized across all seven shipped
locales. Thanks @HUQIANTAO for the PR. - Thread rewind and snapshot restore API (#2808). GUI clients can now call
POST /v1/threads/{id}/undo,/patch-undo, and/retryto fork, roll back,
or rerun recent thread turns, plusPOST /v1/snapshots/{id}/restoreto
restore a workspace snapshot by id. Thanks @bengao168 for the PR. - Active provider fallback chain (#2773). Configured
fallback_providers
now build an ordered primary-plus-fallback route that the TUI can report,
advance through, and reset with/provider fallback reset, including footer
visibility for fallback state. Thanks @idling11 for the PR. - Provider metadata registry (#3005). Built-in provider ids, display names,
defaults, env vars, config keys, aliases, and wire formats now live in a
shared metadata registry, with the provider drift check covering the registry
contract. Thanks @sximelon for the PR. - Hugging Face provider route (#2879). Hugging Face Inference Providers now
have first-class config, env, docs, and registry coverage for the
OpenAI-compatible router, includinghuggingface/hugging-face/
hugging_face/hfaliases andHUGGINGFACE_*/HF_*env fallbacks. Thanks
@mvanhorn for the PR.
Fixed
- SSE data lines without spaces (#3152). Chat Completions, Responses, and
Anthropic stream readers now accept bothdata: {...}anddata:{...}SSE
frames, matching the spec and preventing providers that omit the optional
space from streaming empty output. Thanks @wgeeker for the PR. - Runtime thread detail N+1 reads (#3141).
get_thread_detailnow scans
persisted turn items once and groups them by turn instead of reading the
items directory once per turn, preserving item order while keeping large
thread detail loads responsive. - Project-local hook trust boundary (#3140).
.codewhale/hooks.tomlis now
loaded only after the workspace is trusted in user-owned config, matching the
project-local MCP trust model while preserving the documented shell-command
hook contract. - Skill registry sync latency (#3139).
/skills syncnow syncs registry
entries with bounded ordered concurrency, so network latency no longer stacks
one skill at a time while output order stays deterministic. - SiliconFlow China provider config (#2893/#2895).
siliconflow-CN
now reads its own[providers.siliconflow_cn]/[providers.siliconflow-CN]
table and falls back to[providers.siliconflow]only for unset
api_key/base_url/modelfields. Thanks @Artenx for the report and
@idling11 for the PR. - Self-update download timeout (#3006).
codewhale updatenow applies a
five-minute HTTP client timeout so blocked or very slow GitHub release
downloads fail instead of hanging indefinitely. Thanks @New2Niu for the PR. - Legacy
deepseekupdate migration (#2960/#3013/#3053). Running
deepseek updateordeepseek-tui updatefrom a pre-rebrand install now
returns copy-pasteable npm, Cargo, Homebrew, and manual-binary migration
steps instead of trying to spawn a missingcodewhalebinary. README and
rebrand docs now cover the same upgrade path. Thanks @jazzi and
@tiangangQiu for the reports, @cyq1017 for the update-path PR, and
@angus-guo for the README PR. - Short
codewshim delegation. Thecodewconvenience binary now
prefers the siblingcodewhaledispatcher installed next to it before
falling back toPATH, preventing fresh local builds or installs from
accidentally invoking an older global dispatcher. - Constitution trust wording (#2950/#3008). The base prompt now explains
that "begins with an A" means a baseline of trust, not a literal output
formatting rule. Thanks @cyq1017 for the PR. - TUI provider-source recovery (#3007/#3011). Unsupported interactive
providers now report whether the value came from--provider, environment,
or config. Config-sourced unsupported providers fall back to DeepSeek without
forwarding stale keyring secrets. Thanks @cyq1017 for the PR. - Exec auto-model handoff (#3148).
codewhale exec --model autonow
survives the CLI/TUI boundary by honoring the CodeWhale model env alias and
legacy DeepSeek model handoff before falling back to provider defaults.
Thanks @hongchen1993 for the PR. - macOS shortcut modifiers (#2938/#2943). Ctrl-like shortcuts that are
reported asSUPERby macOS terminals now work for backgrounding tasks and
sidebar-focus chords without rewriting clipboard shortcuts. Thanks @idling11
for the PR. - TUI mouse-report leak (#3063/#3067). Strip raw SGR mouse coordinate
tails from the composer even whenuse_mouse_captureis false, covering
orphaned terminal reporting state after crashes or focus races. - Interrupted sub-agent lifecycle (#3080). API-timeout interruptions now
emitMailboxMessage::Interrupted, render terminal interrupted cards, and
reconcile stale running fanout counts from manager snapshots. - OpenAI Codex stream diagnostics and active tool collapse (#3146). The
Responses bridge now reports nestedresponse.failed/
response.incompleteerrors instead ofunknown, and dense successful
in-flight tool bursts collapse into the same calm activity metadata row as
committed history. - OpenAI Codex reasoning tiers. Switching from DeepSeek to
openai-codex
now normalizes stale reasoning state into Responses-compatible
low/medium/high/xhightiers. Startup,/config, and the model
picker now display Codex labels instead of leaking DeepSeek
off/maxnames, while Codex still reports as a Responses payload
provider. The Responses request builder also clamps legacyminimalinput
tolowand has regression coverage that Codex requests use
reasoning.effort, not DeepSeekthinkingfields. - OpenAI Codex context metadata (#3070). The
gpt-5.5default and
CodeWhale aliases now use OpenAI's documented 1,050,000-token context window
and 128,000 max-output metadata for context pressure, prompts, and doctor
capability output. - OpenRouter Nemotron 3 Ultra preset. The OpenRouter preset and model
registry now emitnvidia/nemotron-3-ultra-550b-a55bwhile keeping the old
Ultra aliases compatible. - OpenRouter auth after MiMo switches (#3064). Switching from Xiaomi MiMo
to OpenRouter now has regression coverage for preflight key failures and
Bearer auth header isolation before any request can be dispatched. - Responses strict-tool schema compatibility (#3062/#3017/#1883). Responses
function tools now preserve per-tool strict-mode compatibility, keep optional
strict-schema fields nullable, and append deterministic constraint notes when
root composition groups must be flattened for Responses. - Runtime prompt autonomous loop guard (#3061). Runtime policy reference
now explicitly forbids initiating new work when<runtime_prompt>is the
only new turn content and no tool/sub-agent handoff is pending. - Goal runtime status sync. Goal token budgets and active/paused/complete
status now sync into the engine alongside the objective, and model-visible
update_goalcan only mark goals complete or blocked.
Contributors
- Devin session work on #3080/#3095 (PRs #3103, #3104, #3106) — Hunter Bown
(maintainer integration/cherry-pick oncodex/v0.8.59-release-ready). - Nightt (@nightt5879) for the Responses strict-tool schema hardening in PR
#3062. - yekern (@yekern) for the #3061 runtime-prompt loop safety report and repro
that shaped the dispatch guard. - Paulo Aboim Pinto (@aboimpinto) for the staged command-boundary design and
Layer 3 registry/parser extraction in PR #2888, plus the #2851/#2791/#2870
architecture stream that guided the grouped command areas in #3055.
Contributor credits for this release live in the changelog entry above —
thank you to everyone whose reports, PRs, reviews, and reproductions shaped it.
See CHANGELOG.md for full notes and docs/CHANGELOG_ARCHIVE.md for older releases.