CodeWhale
- ID:
codewhale - Store:
${CODEWHALE_HOME:-~/.codewhale}/sessions/<id>.json— one file per session - Store (pre-rebrand):
~/.deepseek/sessions/<id>.json, which CodeWhale migrates into the current root on first access - Read overrides:
DEJA_CODEWHALE_ROOTreplaces the session directory;CODEWHALE_HOMEmoves the whole store - Format: JSON —
{schema_version, metadata, messages}, pretty-printed - Needs: nothing
- Resume:
codewhale --resume <id>, run in the workspace the session was worked in —--session-idis its alias andcodewhale exectakes both (checked against 0.9.13)
CodeWhale is a terminal agent written in Rust. It shipped as deepseek-tui
until v0.8.41 and under its own name since; the provider integration did not
change with the name. It is not the DeepSeek Harness deja reads as deepseek —
a different program with a different store, which is why both entries exist.
metadata carries the id, the title CodeWhale derived itself, created_at,
updated_at, the workspace the session was worked in, and
parent_session_id when the session came from a fork. A message is
{role, content}, where content is the block list Anthropic's API uses —
text, thinking, tool_use, tool_result — so the decoding the Cline and
Claude readers already do applies here: a call becomes a command or a file
record, a tool_result becomes tool output, error runs included.
thinking blocks are dropped. So are the system and developer roles:
CodeWhale's own documentation names them as where it puts compaction summaries,
branch summaries and sub-agent framing, which is the harness talking to itself
rather than anything either side said.
$CODEWHALE_HOME is an isolation boundary in CodeWhale's own resolver — with it
set, the legacy root is not consulted — and deja does not reach outside it
either.
Last verified: 2026-09-20
Known quirks and drift
- No per-message timestamps. The file stores
created_atandupdated_at
for the session and nothing per message. The session's own start is the clock,
one millisecond per record, so two identical turns stay two records rather
than collapsing into one the way they did for Zed (#3333).
- Bookkeeping sits beside the transcripts.
offline_queue.json,
owners.json and the checkpoints/ slot share the sessions directory; they
are named rather than counted, so drift in the store still shows up as an
unread file.
- The shapes come from the source, not from a running install. The store
layout, the role list and the tool names are read out of CodeWhale's own
crates — session_manager.rs, core/src/request.rs, core/src/role.rs,
tui/src/tools/registry.rs — and its docs/REBRAND.md. Nothing here has been
checked against a live CodeWhale on this machine.
- Resume is real, the store shape is not checked live.
codewhale --helpon
0.9.13 lists --resume, --session-id and --continue, and --continue
refuses in a directory with no saved session, which is how the per-workspace
scoping shows. codewhale exec does not persist a session at all — the TUI
writes them — so the file layout above is still read from the source rather
than from one the binary wrote here.
- Nothing is wired. deja reads this store and writes nothing into CodeWhale.
Its MCP server map, its hook block and its plugin marketplace are each a
channel an install could use; none is written yet.
deja reads this format and thirty-three others, and turns what it finds into memory your agents can search. See the harness matrix for what is wired where, or install it and search your own history.
Found this useful? Star deja-vu on GitHub.