Codewhale is the public product from Shannon Labs. The
codewhale
command, npm package, and release-asset names remain lowercase technical
identifiers. 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 entrypoints)
npm install -g codewhaleThe wrapper downloads the matched codewhale and codew command assets
from this Release. Both contain the same compiled runtime.
Docker / GHCR
docker run --rm -it \
-e DEEPSEEK_API_KEY="$DEEPSEEK_API_KEY" \
-v codewhale-home:/home/codewhale/.codewhale \
ghcr.io/hmbown/codewhale:v0.9.9The image exposes the same runtime as both codewhale and codew. The
latest tag is also updated on release.
Cargo (Linux / macOS)
cargo install codewhale-cli --lockedThe Cargo package installs codewhale. Cargo cannot create a second command
alias from one binary target; users who want the shorter spelling can add a
codew symlink to that installed executable. The npm, Homebrew, archive,
shell-installer, and container channels install both command names directly.
Manual download — platform archives (recommended)
Each archive below contains the same runtime under the codewhale and
codew command names, 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 |
| Android ARM64 (Termux) | codewhale-android-arm64.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 | — |
| Windows ARM64 | codewhale-windows-arm64.zip | install.bat |
| Windows ARM64 (portable) | codewhale-windows-arm64-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
codewhale.exeandcodew.exeunder
%LOCALAPPDATA%\Programs\CodeWhale\binand adds that directory to the
current-user PATH. - Extract the archive for your machine:
codewhale-windows-x64.zipor
codewhale-windows-arm64.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.
Each platform also has bare, unarchived codewhale-<platform> and
codew-<platform> assets. The seven codewhale-tui-<platform> filenames
attached to v0.9.5 are byte-identical compatibility copies used only to let
already-installed v0.9.4 clients discover and cross this single-binary
transition; current installers do not expose a third runtime. 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 --ignore-missing
# Linux — individual binaries
sha256sum -c codewhale-artifacts-sha256.txt --ignore-missing
# macOS
shasum -a 256 -c codewhale-bundles-sha256.txt --ignore-missing
shasum -a 256 -c codewhale-artifacts-sha256.txt --ignore-missingWhat's in v0.9.9
Codewhale v0.9.9 is a truth-and-resilience release: the shell tool can no
longer wedge a session when the host runs out of disk or descriptors,
unverified context windows and output ceilings are labeled honestly at every
surface, DeepSeek V4 is priced on the published peak/off-peak tiers, SSE
UTF-8 fails closed in every dialect, Fleet shadowing is visible, bwrap gets
container essentials and extra roots, the dsh skin rides the bundle
profile, the agent tool schema is down to 12 fields, and README/website
locales grow to 18 and 8.
Fixed
- The lowercase
bashtool no longer wedges when its complete-output spill
file cannot be created: a full temp volume or exhausted descriptor table
used to fail every call —echo okincluded — with the harness-internal
"Failed to create streaming shell output" and never recover until the
host was cleaned up. The spill is now best-effort (the bounded tail is
still returned and the truncation notice says why the full-output path is
missing), and any remaining spawn/stream failure names the exhausted
resource — disk, file descriptors, memory — and says the next call is safe
to retry (). - Context-window honesty at every surface (): the
model-name hintandfallbackrungs of the context-window ladder are
guesses, and every surface that renders one now says so — the status line,
/status,/config, the context-pressure message, the model picker chips,
and the auto-router inventory. Unverified windows still drive real budgets
(compaction trigger, context meter, output reservation); they just stop
reading as capabilities anyone checked. A window parsed from an_Nk
model-name suffix (qwen3-32b-256k→ 256K) is now its own
model-name hintrung belowcatalog, because it is optimistic rather
than conservative — a catalog or provider-reported value beats it. The
[providers.<name>] context_windowoverride remains the hard fix and
renders asconfiguredwith no marker. - Output-ceiling honesty ():
codewhale doctor's
runtime-posture section gained atelemetry=on (default)-style row with
the source that decided it (cli | env | config | default), and
codewhale config get telemetryreports the resolved consent with its
source instead ofkey not foundon a machine whose batches ship. Truth
change only; resolution and behavior are untouched. - Fleet: a scout's read-only shell carve-out (). Delegation still never widens
authority: the role-isolation test and docs/SUBAGENTS.md pin that a child
cannot exceed its parent's posture (). /renameand/titlenow apply mid-first-turn: the session file does
not exist until the first autosave, so the rename fell through with
NotFound; the shared path now prefers the per-session checkpoint and
rebuilds from App state, with a PTY regression test through the live
event loop ().- Session cost no longer sits at
unverified_live_pricingwhen live pricing
cannot be verified (control-plane 503, Models.dev capabilities-only
overlays): provider-docs bundled fallback rates for the DeepSeek V4
family on Fireworks / OpenCode Zen restore a usable figure, live
per-provider rows still win, andkimi-k3stays unpriced until a
published rate exists (). - Release assets:
release.ymlasset-freshness checks compare against the
release job's ownstarted_at, so job-level reruns of the npm step are no
longer poisoned by earlier uploads (, ; ; supersedes draft
; refs , thanks , thanks
in ). - Website: copy on codewhale.net rewritten in plain declarative sentences —
one idea per sentence, numbers from the generated facts, no self-narration
— with a voice sheet at docs/design/WEB_VOICE.md (–). - Compact TUI rows below 60 columns no longer reserve a hidden session-metrics
strip, so narrow terminals reclaim the row instead of clipping the
transcript ().
Changed
- The model-facing
agenttool advertises exactly 12 fields —action,
prompt,type,profile,name,agent_id,message,until,
detached,worktree,write_roots,resume_from— down from 33
(). Budgets (max_steps,wall_time_secs,max_depth),
routing overrides (model,model_strength,thinking), worktree-path
knobs, the deliberate/spawn-contract fields and the wait/status/interrupt
extras moved off the advertised schema. Every removed field stays
parse-accepted and honored unchanged (same contract astoken_budget), so
saved transcripts, ACP/MCP clients and Fleet configs replay as-is; the
containment clamps are untouched. Child budgets now resolve
from role defaults (60/120 turns, 1800 s wall time, unchanged clamps) and
new[subagents]keysdefault_max_steps/default_wall_time_secs.
Because the tool catalog is part of the session-pinned prompt prefix
(docs/CACHE.md), upgrading re-fills the KV prefix once per session. - TUI prose — user messages, assistant answers, and reasoning/thinking —
now wraps at the full content width on wide terminals, matching
tool/status cells, instead of stopping at a 105-column rail that left a
dead right margin on ultrawide displays (, ). - Every
ci.ymljob now has an explicit 10–90 minute timeout appropriate to
its workload, bounding stale assigned runners instead of inheriting
GitHub's six-hour default (,
not completion of the full epic (). - Dependency: rusqlite 0.40.2 ().
Added
[transcript] prose_measure(positive integer, optional): caps prose
wrap at N columns for owners who want a bounded reading measure on
ultrawide terminals.0or absent keeps the full width; negative or
non-integer values are rejected with a clear config error. Tool, diff,
and status cells never inherit the cap (); codewhale.net routes fr, de, ca, hi, tr, it, pl and ar (with
dir="rtl"plumbing) as partial locales (); Claude Code parity
reference for agents/workflows/plugins/skills
(docs/design/CLAUDE_CODE_PARITY.md); config.example.toml / SUBAGENTS.md /
TOOL_LIFECYCLE.md brought back in line with the code ().dshintegration: an ambient ocean scene behind the DSH web UI — slow
whale silhouettes, a school of><>glyph fish, bubbles — drawn on a
canvas under a translucent veil of the Codewhale palette, plus an explicit
responsiveWHALE BROTHERS / CODEWHALE × DEEPSEEK HARNESSlockup; light
and dark, ~30 fps capped, paused when hidden, a static frame under
prefers-reduced-motion; on by default with the skin,
codewhale integrations dsh update --ocean falseturns it off ().- Sandbox: bwrap containers get the
--dev/--proc/--tmpfsessentials plus
configurable extra roots (bwrap_ro_roots/bwrap_dev_roots) so
toolchains that live outside the workspace stay reachable read-only
(). - OrcaRouter's default endpoint is classified as an aggregator billing
surface, so pricing and session-cost reporting use the correct billing
posture instead of treating it as a first-party provider ().
Contributors
- hexin (, closes
); owned direct
model casing resolves safely (, ) — configurable auto-router classifier
timeout ( — diagnosed the Z.aiglm-5.2casing collision and wrote the
first provider-scoped fix in ). - Reports and reproductions that shaped this release: ), ), ), ), and ).
See for older releases.
SOCIAL SHARE CARD GENERATOR