Skip to content
Your data

Two trees on your disk

Recall reads the left one. Recall owns the right one. Nothing lives anywhere else.

Source · read-only
~/.claude/
└── projects/
    ├── <encoded-cwd-1>/
    │   ├── <session-uuid>.jsonl
    │   └── <session-uuid>.jsonl
    └── <encoded-cwd-2>/
        └── <session-uuid>.jsonl

Claude Code writes here. Recall never modifies these files.

Recall owns
~/.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

bash
recall stop
rm ~/.recall/db.sqlite*
recall start
recall index

Aliases, 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.

Last updated