How to delete Crush session history, and what you lose
one crush.db SQLite file per project, tracked in projects.json
Unlike agents that keep every conversation under one directory in your home folder, Charm's Crush writes a separate SQLite database inside each project you run it in. Deleting your global data directory removes only the list of projects, while the conversations stay inside each repository's .crush folder.
Where the sessions are
<project>/.crush/crush.db
${XDG_DATA_HOME:-~/.local/share}/crush/projects.json
Nothing under ~/.local/share/crush holds a transcript. Instead, projects.json records each project's path and its data_dir (which defaults to <project>/.crush). Running crush projects prints the same list:
crush projects
Inside each crush.db, two tables carry the history: sessions (one row per session, with parent_session_id linking subagent runs to the session that spawned them) and messages (joined on session_id, where the parts JSON array holds the prompt text, tool calls, file edits and command output).
How to delete one session
In Crush's interactive TUI session picker, highlight the session and press Delete (or d) to remove it directly. From the command line, close Crush in that project first — crush.db is live state the TUI owns while running — and remove the session's messages, any subagent child sessions, and the session row itself:
sqlite3 .crush/crush.db "
DELETE FROM messages WHERE session_id = '<session-id>'
OR session_id IN (SELECT id FROM sessions WHERE parent_session_id = '<session-id>');
DELETE FROM sessions WHERE id = '<session-id>' OR parent_session_id = '<session-id>';
VACUUM;
"
Deleting rows in SQLite marks their pages for reuse without shrinking the file on disk; VACUUM rewrites the database without the freed pages.
How to delete a project's history
With Crush closed, removing crush.db (and any WAL sidecars beside it) clears every session recorded in that project:
rm -f .crush/crush.db .crush/crush.db-wal .crush/crush.db-shm
Beside the database, .crush/ holds only an auto-generated .gitignore file that keeps crush.db out of version control; if you remove the whole directory, Crush recreates it on the next launch, and both Crush and deja skip stale entries in projects.json whose directories no longer exist. Your global configuration, provider keys and MCP servers live in ~/.config/crush/crush.json, and custom commands live in ~/.config/crush/commands/, so removing a project's .crush/crush.db leaves them untouched. To clear every project's history across the machine, check the paths in ${XDG_DATA_HOME:-~/.local/share}/crush/projects.json and remove each <data_dir>/crush.db.
deja delete does not reach into a project's crush.db. When deja is installed, deja forget <id> drops a session from deja's own index and leaves a tombstone so the next scan does not re-import it.
What you lose
The prompts, the shell commands and their exit codes, and the exact old and new lines of every edit, multiedit, write and lsp_replace_symbol call. Once removed, crush --session <uuid> in that project can no longer resume the conversation.
Keeping it searchable instead
deja follows projects.json and reads each project's crush.db — along with the other forty-two agents' histories on the machine — into one local index, searchable from the shell and readable by Crush itself over MCP:
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh deja "crush session about the symbol rename"
Nothing to configure first: the per-project databases are already on disk. Indexing and search stay local, credentials are stripped as the index is built, and deja forget removes a session from the index when you want it gone. A session whose crush.db was later deleted stays readable with deja show and under the Deleted tab of bare deja, while deja never writes rows back into crush.db. Set DEJA_CRUSH_ROOT to point deja at a backup of the data directory holding projects.json.
Where every agent keeps its history · Memory for Crush · The Crush format
Found this useful? Star deja-vu on GitHub.