Two trees on your disk
Recall reads the left one. Recall owns the right one. Nothing lives anywhere else.
~/.claude/
└── projects/
├── <encoded-cwd-1>/
│ ├── <session-uuid>.jsonl
│ └── <session-uuid>.jsonl
└── <encoded-cwd-2>/
└── <session-uuid>.jsonlClaude Code writes here. Recall never modifies these files.
~/.recall/
├── db.sqlite # FTS5 index
├── aliases.json # plain-text mirror
├── tags.json # plain-text mirror
├── collections.json # plain-text mirror
├── notes/
│ └── <uuid>.md # one file per note
├── daemon.token # 0600, per-start
├── daemon.pid
├── daemon.log
└── models/
└── bge-base-en-v1.5/Tar this directory to back up everything. Untar on a new machine to restore.
Never delete user data
Every rename archives the prior value. Cleared values stay recoverable from history.
Backup in one command
tar czf recall.tgz ~/.recall/Reset without data loss
Drop db.sqlite, then run recall start and recall index. Aliases and notes survive via mirrors.
Where your data lives
Trees above. Operational details:
#Reset without data loss
recall stop
rm ~/.recall/db.sqlite*
recall start
recall indexAliases, tags, notes, and collections survive because the plain-text mirrors are authoritative.
#Never-delete guarantee
Every rename archives the prior value. Cleared values stay recoverable from history. The single carve-out is recall paste --purge (clipboard archive, where leaked-secret risk justifies a true delete).
#Plain-text reality
Notes are markdown files. Aliases and tags live in JSON mirrors. SQLite has no row-level encryption. Anything you can read in the UI is readable by any process running as your user. Same posture as Obsidian or git dotfiles. Recall is not a password manager.