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, all three entrypoints)
npm install -g codewhaleThe wrapper downloads the matched codewhale, codew, and codewhale-tui
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 codewhale-home:/home/codewhale/.codewhale \
ghcr.io/hmbown/codewhale:v0.9.2The image ships the codewhale dispatcher, codew shim, 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 codew shim, while codewhale-tui produces the interactive runtime that the dispatcher delegates to. Installing only one crate will fail at runtime with a MISSING_COMPANION_BINARY error.
Manual download — platform archives (recommended)
Each archive below contains the codewhale dispatcher, codew shim, 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 |
| 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 installscodewhale.exe,codew.exe, andcodewhale-tui.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 binaries attached below (codewhale-<platform>, codew-<platform>, and codewhale-tui-<platform>) — the npm wrapper and the in-app codewhale update download the matched runtime binaries, whereas the .tar.gz / .zip archives above are the recommended manual download and additionally bundle an install script. 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.2
This is the Codewhale v0.9.2 source candidate. It is not a published release
until the matching tag, packages, checksums, and release assets exist.
Changed — behavior
Legacy
model = autono longer elects a network classifier on its own.
Holding a DeepSeek API key used to silently selectdeepseek-v4-flashas the
classifier for every Auto turn — a per-turn cost on a route nobody asked for,
and one provider privileged over the rest. Auto now stays local and free
unless an explicit[auto.router]block names a provider and model.
If you relied on the implicit default, restore it explicitly:
[auto.router]
provider = "deepseek"
model = "deepseek-v4-flash"
[auto.router]remains legacymodel = autoconfiguration. It is unrelated
to a Fleet's Adaptive Reasoning Router, which is a saved service referenced by
name from a Fleet file and decides only how hard an already-frozen route
thinks.
Landed since v0.9.1, not yet released. A cluster of defects found by a
read-through audit of the policy engine, the MCP proxy, the session index,
and the app-server bridge — several of them cases where the wrong outcome
was reached silently, behind a response or a log line that looked fine. The
release also adds opt-in session, reasoning, localization, and inspectability
surfaces; existing defaults remain stable unless an entry below explicitly
says otherwise.
Added
/permissionsnow lists the active user permission-rule source, each rule's
effective matcher and global/repository scope, and whether that scope applies
in the current workspace./permissions remove <number>previews deletion
and requires a snapshot-bound confirmation token, so a concurrent edit
cannot move a different rule under the confirmed index. Appends and removals
share one adjacent lock, preserve unrelated TOML formatting and comments,
atomically replacepermissions.toml, and reload the live user ruleset
without clearing session-only approvals./config ask-rulesremains a
compatibility entry; rule creation, glob/directory rules, and deny
persistence remain out of scope ( by , by ).
/lane [list|status|interrupt|restart|resume]— durable Lane control from the
composer, backed by the same executorcodewhale lane …calls.codewhale lane interrupt|restart|resumeare the matching CLI verbs;lane stopstays as
a compatibility spelling oflane interrupt. Appending@<lifecycle-seq>to a
lane id fences a write to the exact durable generation you observed, so a
concurrent transition is rejected as a conflict rather than acted on ().
The bundled skill pack now ships a
helpskill (catalog generation 7). It is
invocation: explicit-only, so it never enters the model's ambient catalogue
and costs no prompt budget. Its body is a routing card that points at the
surfaces this build actually exposes —/helpand/help <command>,
/skillsand/skills inspect,/config,doctor, and thedocs/tree
when the workspace is a Codewhale checkout — and explicitly forbids pasting a
command list or settings table into context ().
Locale-routing coverage for the complete bundled catalog across every shipped
locale (en,ja,zh-Hans,zh-Hant,pt-BR,es-419,vi,ko). No
bundled skill ships a localized routing description and none was invented;
the tested contract is deterministic fallback to the canonical English
description, with the rendered catalogue byte-identical across locales.
Exact-tag match, primary-subtag fallback, and English fallback are covered
against a synthetic authored fixture, and the parity test fails if a bundled
skill ever gains localized metadata without source-backed coverage ().
Approval cards can now remember eligible safe shell and file-write approvals
as exactallowrules scoped to the current repository. Remembered shell
commands use complete-command matching, validated file and patch paths remain
workspace-relative, and dangerous, critical, or repo-law-held requests stay
ineligible and continue to require review.
tui.header_items(array of strings, optional, default[]): an opt-in
header chip showing cumulative session token usage as input / cache-hit /
output. Setheader_items = ["tokens"]under[tui]to enable it. The
chip is the only elidable element of the header — the git label, context
meter, and version stamp keep their space, and narrow terminals drop the
chip rather than the baseline chrome. Unknown entries are warned about and
skipped so configs written by newer builds stay loadable by older ones
(; PR , harvested with
co-authorship).
thinking_default_expandedlets reasoning blocks start open while keeping
Space as the per-block toggle. The setting is persisted, available through
native and runtime configuration, and documented for SSH/tmux accessibility
(issue by by
; reported by
.
Session control now includes a sessions rail, shared archive projection,
picker archive controls, and opt-in interactive auto-resume with explicit
handoff behavior. The work closes the remaining session-browsing direction
from for the original report.
The bundled contributor-onboarding skill can sync contribution context,
select the appropriate gate, and prepare a digest without inflating the
ambient skill catalog. It follows the contributor-navigation request in
.
Bahasa Indonesia now has a complete repository documentation suite and a
registered website dictionary alongside the shipped TUI locale (PRs by ).
Reasoning content can keep its rail, italics, cursor, and expansion controls
while disabling only the warm background highlight. The independent setting
is persisted and localized (; reported by by by by
by ).
Interrupted checkpoints and timed recovery snapshots remain checkpoints
instead of being promoted into orphan session files, preventing duplicate
/resumeentries (PR ).
Every shipped locale is admitted by the typed settings schema and native
chooser, with complete/partial status kept independent and tested (PR , closing by in
by ).
Non-streaming model calls receive a generation-length response budget rather
than the SSE header-open timeout, while actual SSE opens share the bounded
cross-provider transport seam. The equivalent fix direction came from
closed PR .
Resumed sessions diagnose a deleted inherited workspace before shell launch
instead of failing as an opaque Windows process error (report ). DeepSeek native tool-call wrapper tokens are also scrubbed
from visible streaming and completed output as a grounded fail-soft follow-up
to report ; that report's exact emitted marker remained
unconfirmed.
Auto model routing now preserves the user's requested reasoning effort
through startup, provider/model changes, session restore, the picker,
Ctrl+T, and Hotbar actions. The tier is normalized only after the concrete
provider route is known instead of being silently replaced by Auto
( by ).
Implemented in PR ; reported and root-caused by
).
codewhale fleet status(andlist/interrupt/resume) created
.codewhale/fleet.jsonlas a side effect of opening the manager, then
reportedno_fleet_ledgerfor the file it had just made — so the second
invocation showed an empty Fleet where none existed. The CLI now refuses
those verbs before the manager is constructed, matching/fleet().
lane interruptreportedtransitionedeven when it changed nothing —
another process's stop looked like our own. The Runtime backend now reports
whether this call performed the transition, and a no-op isno_change.
The@<lifecycle-seq>fence is also evaluated inside the registry's per-Lane
lock rather than before it, so a stale fence refuses without running Runtime
teardown instead of racing between the check and the stop ().
The hotbar is no longer modelled as a third control surface. A slot binds a
slash command and fires it with no argument, so it runs as the slash
surface; the contract now declares which verb a bare press actually reaches
(hotbar_bare_dispatch, true only forlane.list) instead of advertising
target-taking verbs as hotbar-reachable ().
No surface advertises a backend it does not have.
lane restartand
lane resumehave no implementation — a Lane is re-created by
codewhale lane start, and a stopped Lane's Runtime session is gone — so all
three surfaces refuse them withbackend_not_implementedand say why.
fleet restartdrives the manager loop to completion, which only the CLI
runs, so/fleet restartreportssurface_not_supportedand names the CLI
command rather than quietly doing a smaller thing ( by
by
). Fleet keeps
Fleet/member concerns;/goalmoved to a Session section and Workflow
orchestration to its own Workflow section. The inert DeepSeek-only
default_modelfallback moved out of Model settings into an explicit
Legacy section — exact-Fleet users switch Fleets, not fallback models;
the config field is retained because the runtime still reads it. This is
presentation only: the persisted keys (goal_command,workflow,
default_model), their values, scopes, and runtime behavior are unchanged.
Auto model routing is scoped to the active provider. The classifier
inventory no longer discloses other providers' runnable routes (or the fact
that their credentials exist), a classifier reply naming another provider is
refused, the local heuristic no longer falls back to a different provider
when the active one is unusable, and the implicit DeepSeek-flash classifier
is skipped for non-DeepSeek sessions. Auto receipts and the model picker
hint report the active-provider-only scope instead of "runnable providers".
Cross-provider Auto is available only through the persisted[auto] cross_provider = trueopt-in (an explicit[auto.router]route remains its
own opt-in for the classifier call). Same-provider strong/fast selection and
[auto] cost_savingare unchanged.
The QA pseudo-terminal acceptance harness now parses frames with
rio-vt
behind its existing neutral frame/color surface, retaining the assertions
while removing thevt100dependency (PR ).
Anthropic Messages and OpenAI Responses stream opening now share the
client/stream_entry.rsseam already used by Chat Completions: one bounded
response-header wait, shared dual/HTTP-1.1 policy selection, at most one
HTTP/1.1 fallback on a classified HTTP/2 header stall, and common idle-timeout
diagnostics. Wire-specific authentication, headers, endpoints, decoding, and
rate-limit behavior remain at each adapter edge. The timeout-placement
diagnosis and fix direction came from closed PR .
Security
- Release containers now publish an SBOM attestation and pin maximum-mode
provenance explicitly so supply-chain metadata cannot silently weaken with a
builder-default change (PR ).
Contributors
Thank you to the contributors whose code, reports, and reviews shaped v0.9.2:
- ), plus safe
permission-rule listing and snapshot-bound removal (PR — off-event-loop clipboard
writes (PR ), CRLF-safe
edits (PR ). - ) and context-menu hover alignment (PR — the hooks configuration/executor
split from PR (snailoniu) — OpenCode Zen's
model-aware routes, authentication, documentation, and test isolation from
closed PR — the zh-Hans translation
quality review harvested from PR ,
LaTeX implementation from PR , and the context-menu
reproduction in — the request-preview concept from
PR — non-UTF-8fetch_url
decoding direction from PR — required source-candidate credit for
the canonicalBashno-cwdworkspace fix and regression in PR ). - .
- ) and the Indonesian documentation and website locale (PRs ).
- , issue — migration of the QA PTY frame
parser torio-vt(PR — truthful finalization of restored
stale shell cells (PR — release-container SBOM and
explicit provenance mode (PR ,
— equivalent fix
direction for the effective-home sweep (), and streaming/non-streaming timeout split ( — the LaTeX transcript
rendering report in — the token-header request and
output-presentation measurements in . - .
- ,
,
— reports and product direction behind
the stale-workspace diagnosis (),
contributor onboarding (),
session control ().
See for older releases.
SOCIAL SHARE CARD GENERATOR