
Time Machine for AI — encrypted backup, restore, and migration for AI agent state
Time Machine for AI — encrypted backup, restore, and migration for AI agent state
·
The portable, encrypted memory layer for every AI you use.
ChatGPT keeps your memory. Claude keeps your memory. Gemini keeps your memory. You don't. SaveState fixes that.
Every AI you use is building a model of you — your preferences, history, projects, voice. Each platform locks that memory up in its own silo. There is no portability, no audit trail, no encryption boundary the user controls. If a service changes its API, you switch platforms, or your account is suspended, everything that AI learned about you is gone.
Worse: even within a single platform, "memory" is shallow. 1M-token context windows don't fix it — research shows reliable recall drops below 50% past 256K. Your assistant forgets what you told it last month.
SaveState is the cross-platform memory layer you control. One encrypted, searchable, portable archive for everything your AIs know about you.
export SAVESTATE_PASSPHRASE="your-passphrase" # required, 8+ characters; never stored
npx @savestate/cli init # one-time: encryption + storage
npx @savestate/cli snapshot # capture state from any platform
npx @savestate/cli search "cocktail recs" # full-text across every snapshot
npx @savestate/cli search "cocktail recs" --offset 20 --limit 20 # next result page
npx @savestate/cli restore latest --to claude # move state between platforms
npx @savestate/cli mcp # serve memory to Claude Code / Cursor / CodexThink of it as 1Password for AI identity: your data, encrypted with your keys, portable across every platform — backup is just one of the things you can do with it.
# Install globally. The package name is @savestate/cli.
# `npm install -g savestate` and `npx savestate` are not published (npm E404).
npm install -g @savestate/cli
# Passphrase is required for snapshot and restore (at least 8 characters).
# init does not prompt when stdin is not a terminal, and it never stores this value.
export SAVESTATE_PASSPHRASE="your-passphrase"
# Initialize in your AI workspace (a Claude Code project with CLAUDE.md works)
cd ~/my-ai-workspace
savestate init
# Save the project
savestate snapshot --label first
# List snapshots
savestate list
# After CLAUDE.md changes, put the saved copy back.
# The edited file is kept as CLAUDE.md.bak.
savestate restore latest| Platform | Extract | Restore | Status |
|---|---|---|---|
| OpenClaw / Clawdbot / Moltbot | ✅ | ✅ | Full support |
| OpenAI Assistants API | ✅ | ✅ | Available |
| Claude Code | ✅ | ✅ | Available |
| ChatGPT | ✅ | ⚠️ Partial | Available |
| Claude (consumer) | ✅ | ⚠️ Partial | Available |
| Gemini | ✅ | ⚠️ Limited | Available |
| Cursor | ✅ | ✅ | Community (v0.1.0) |
| Windsurf | ✅ | ✅ | Community (v0.1.0) |
The OpenClaw adapter captures your complete agent state:
| Component | What's Captured |
|---|---|
| Identity | SOUL.md, USER.md, AGENTS.md, TOOLS.md, IDENTITY.md |
| Memory | MEMORY.md, memory/*.md, memory SQLite databases |
| Skills | All SKILL.md files + scripts |
| Scripts | personal-scripts/, cron-wrappers/ |
| Extensions | Extension configs |
| Conversations | All session JSONL files (1000+ sessions) |
| Gateway Config | openclaw.json (agent defs, models, routing) |
| Cron Jobs | Scheduled tasks and behaviors |
| Channel State | Telegram offsets, message continuity |
| Device Identity | Device pairing, node relationships |
# Full backup including semantic memory DBs
savestate snapshot
# Include credentials (channel auth tokens)
savestate snapshot --include-credentials
# Backup specific agent only
savestate snapshot --agent-id mainCommunity adapters welcome! See Contributing.
┌─────────────────────────────────────────────────┐
│ SaveState CLI │
│ init · snapshot · restore · list · diff │
├─────────────────────────────────────────────────┤
│ Adapter Layer │
│ clawdbot · chatgpt · claude · openai · custom │
├─────────────────────────────────────────────────┤
│ Core Engine │
│ snapshot · restore · diff · format │
├─────────────────────────────────────────────────┤
│ Encryption Layer │
│ AES-256-GCM · scrypt KDF · integrity check │
├─────────────────────────────────────────────────┤
│ Storage Backends │
│ local · s3 · r2 · b2 · filesystem │
└─────────────────────────────────────────────────┘Each snapshot produces a .saf.enc file:
snapshot.saf.enc (encrypted)
└── snapshot.tar.gz
├── manifest.json # Version, platform, timestamp, checksum
├── identity/
│ ├── personality.md # System prompt, SOUL, custom instructions
│ ├── config.json # Settings, preferences
│ └── tools.json # Tool/plugin configurations
├── memory/
│ ├── core.json # Platform memory entries
│ └── knowledge/ # Uploaded docs, RAG sources
├── conversations/
│ ├── index.json # Conversation list with metadata
│ └── threads/ # Individual conversation exports
├── trace/ # Askable Echoes trace ledger (optional)
│ ├── index.json # Run index + trace schema version
│ └── runs/ # One JSONL file per run
└── meta/
├── platform.json # Source platform details
├── snapshot-chain.json # Incremental snapshot chain
└── restore-hints.json # Platform-specific restore stepsUser passphrase
→ scrypt (N=2^17, r=8, p=1) key derivation
→ 256-bit AES key
→ AES-256-GCM authenticated encryption
→ Integrity verification built into GCM auth tagYour master key is never stored — it's derived from your passphrase each time. Data is encrypted before it leaves your machine.
savestate init Initialize SaveState in current directory
savestate snapshot Capture current AI state
-l, --label <label> Label for the snapshot
-t, --tags <tags> Comma-separated tags
-a, --adapter <adapter> Adapter to use
-s, --schedule <interval> Auto-snapshot interval (e.g., 6h)
savestate restore [snapshot-id] Restore from a snapshot (default: latest)
--to <platform> Restore to different platform
--dry-run Preview without making changes
--include <categories> Only restore specific categories
--tag <tag> Restore the newest snapshot with this tag
--label <label> Restore the newest snapshot with this label
savestate list List all snapshots
--json Output as JSON
--oldest-first Show snapshots from oldest to newest
--platform <id> Only snapshots recorded from this platform
--adapter <id> Only snapshots recorded by this adapter
--exclude <ids> Exclude snapshots from comma-separated adapters
--since <date> Only snapshots taken after an ISO 8601 date
--until <date> Only snapshots taken before an ISO 8601 date
--snapshot <id> Show one snapshot by ID
--tag <tag> Only snapshots with this tag
--label <label> Only snapshots with this label
--reverse Alias for --oldest-first
--limit <n> Max snapshots to show
--offset <n> Skip snapshots before applying --limit
savestate search <query> Search across snapshot contents
--type <types> Limit to memory, conversation, identity, or knowledge
--exclude <types> Skip memory, conversation, identity, or knowledge
--since <date> Only search snapshots taken after an ISO 8601 date
--until <date> Only search snapshots taken before an ISO 8601 date
--snapshot <id> Search within one snapshot
--adapter <id> Only search snapshots from this adapter
--tag <tag> Only search snapshots with this tag
--label <label> Only search snapshots with this label
--offset <n> Skip ranked results before applying --limit
--limit <n> Max results to show (default 20)
--json Output results as JSON
Search results are ranked consistently across snapshots, so `--offset` can be
combined with `--limit` to page through results. Both values are bounded to
1000; the default page size is 20.
savestate diff <a> <b> Compare two snapshots
savestate config View/edit configuration
--set <key=value> Set a config value
--json Output as JSON
savestate adapters List available adapters
savestate schedule Configure auto-backups (Pro/Team)
--every <interval> Backup interval (1h, 6h, 12h, 1d)
--disable Disable scheduled backups
--status Show schedule status
--json Output as JSON
savestate migrate Migration wizard between platforms
--from <platform> Source platform
--to <platform> Target platform
--list Show platform capabilities
--json Output the --list catalog as JSON
--dry-run Preview migration plan
savestate export Export an encrypted agent container
-a, --agent <id> Agent ID to export
-o, --output <file> Output file path
--dry-run Preview without writing
--force Overwrite an existing output file
--include <paths> Only pack named state paths
-p, --passphrase <pass> Passphrase, or SAVESTATE_PASSPHRASE / prompt
-k, --keyfile <path> Keyfile instead of a passphrase; empty path, missing file, directory, or file with no contents is rejected before encrypting
Prints load, encrypt, and write byte sizes
savestate import <file> Import an encrypted agent container
--dry-run Preview without restoring
-p, --passphrase <pass> Passphrase, or SAVESTATE_PASSPHRASE / prompt
-k, --keyfile <path> Keyfile instead of a passphrase; empty path, missing file, directory, or file with no contents is rejected before decrypting
--target <dir> Write restored agent state to this directory; missing parent directory is rejected before restoring
--force Overwrite an existing target file
Prints read, decrypt, verify, and restore progress
savestate verify <file> Verify a .savestate file and list components
-p, --passphrase <pass> Passphrase for verification
-k, --keyfile <path> Keyfile for verification; empty path, missing file, directory, or file with no contents is rejected before decrypting
--json Output as JSON
Prints checksum, size, content type, encryption, and key derivation
(including when the container has no agent_state payload)
savestate trace list List Askable Echoes trace runs
--json Output as JSON
--offset <n> Skip the first N runs (0–1000)
--limit <n> Max runs to show (1–1000)
savestate trace show <run_id> Show events for a trace run
--json Output as JSON
--offset <n> Skip the first N events (0–1000)
--limit <n> Max events to show (1–1000)
savestate trace export Export trace as JSONL (stdout)
--run <id> Export only a specific run
--format jsonl Export format
--offset <n> Skip the first N runs (0–1000)
--limit <n> Max runs to export (1–1000)# Default — snapshots stored in ~/.savestate/
savestate config --set storage.type=local
# Custom path (e.g., Dropbox, iCloud sync folder)
savestate config --set storage.options.path=~/Dropbox/savestateCloud storage is managed through the SaveState API with server-side subscription verification:
# Authenticate first
savestate login
# Push local snapshots to cloud
savestate cloud push # Push latest snapshot
savestate cloud push --all # Push all snapshots
# Pull snapshots from cloud
savestate cloud pull # Pull latest
savestate cloud pull --id abc123 # Pull specific snapshot
# List cloud snapshots
savestate cloud list # Shows usage statsCloud storage quotas:
All data is encrypted locally before upload. Zero-knowledge by design.
SaveState is open source. We welcome contributions!
git clone https://github.com/savestatedev/savestate.git
cd savestate
npm install
npm run build
node dist/cli.js --helpAdapters implement the Adapter interface:
import type { Adapter, Snapshot, PlatformMeta } from 'savestate';
export class MyAdapter implements Adapter {
readonly id = 'my-platform';
readonly name = 'My Platform';
readonly platform = 'my-platform';
readonly version = '0.1.0';
async detect(): Promise<boolean> { /* ... */ }
async extract(): Promise<Snapshot> { /* ... */ }
async restore(snapshot: Snapshot): Promise<void> { /* ... */ }
async identify(): Promise<PlatformMeta> { /* ... */ }
}Publish as @savestate/adapter-<name> on npm for auto-discovery.
src/
├── cli.ts # CLI entry point (commander)
├── index.ts # Public API
├── types.ts # All TypeScript interfaces
├── encryption.ts # AES-256-GCM encryption
├── format.ts # SAF archive packing/unpacking
├── config.ts # Configuration management
├── snapshot.ts # Snapshot creation
├── restore.ts # Snapshot restoration
├── commands/ # CLI command handlers
│ ├── init.ts
│ ├── snapshot.ts
│ ├── restore.ts
│ ├── list.ts
│ ├── diff.ts
│ ├── config.ts
│ └── adapters.ts
├── storage/ # Storage backends
│ ├── interface.ts
│ └── local.ts
└── adapters/ # Platform adapters
├── interface.ts
├── clawdbot.ts
└── registry.tsMIT © SaveState Contributors
SaveState — Your AI identity, backed up.
savestate.dev
Paste this prompt into your agent. It reads this page and does the setup for you.
Read https://aiagentslisting.com/mcp/savestate to learn what the "SaveState" MCP server does and how to install it. Add it to my coding agent's MCP configuration as documented on that page, then confirm the server connects and list the tools it exposes.Agents can also browse this directory over MCP at https://aiagentslisting.com/api/mcp
npx @savestate/cli init # one-time: encryption + storage
npx @savestate/cli snapshot # capture state from any platform
npx @savestate/cli search "cocktail recs" # full-text across every snapshot
npx @savestate/cli search "cocktail recs" --offset 20 --limit 20 # next result page
npx @savestate/cli restore latest --to claude # move state between platforms
npx @savestate/cli mcp # serve memory to Claude Code / Cursor / CodexThis server runs locally, so we can't read its tool list over the web yet.
Maintain this server? Claiming proves you own the listing and earns the last 4 points.
Claim this listingPaste this line near the top of your repository's README. The badge always renders the current score.
[](https://aiagentslisting.com/mcp/savestate)Nothing comparable is listed yet.
v0.5.0v0.5.0 - Full OpenClaw Runtime State CaptureRelease notesv0.2.1v0.2.1 — CI/CD, Install Script, Stripe BillingRelease notesConnect to the AI Agents Listing MCP server at https://aiagentslisting.com/api/mcp using the HTTP transport and complete the sign-in when it asks. Then call the submit_review tool for the listing "savestate" with a rating from 1 to 5 and a short note on what worked and what did not.No reviews yet
Be the first to share your experience with this tool.
One email a week. New agents, MCP servers and skills, and what is actually getting traction.