Last month, we shipped the savestate migrate command. The response surprised us — not for the feature itself, but for the use cases people found.
Developers migrating from ChatGPT to Claude for code. Teams moving off OpenAI Assistants to self-hosted solutions. Researchers preserving agent states before experiments. People just wanting to know their AI context wasn't locked in forever.
Today, we're opening up about the architecture behind the Migration Wizard — and where we're taking it next.
The Core Problem
Every AI platform stores context differently:
- ChatGPT — Memories as plain text, custom instructions, conversation JSON
- Claude Code — CLAUDE.md files, .claude/ directory, memory files
- OpenAI Assistants — Vector stores, file objects, thread metadata
- Gemini — Settings JSON, Gems configuration
- OpenClaw — SOUL.md, cron jobs, SQLite memory databases
Moving between them has been a manual nightmare. Export JSON from one, manually translate to the other's format, cross your fingers, import.
We wanted something better: a single command that handles the translation automatically.
Extract → Transform → Load
The Migration Wizard is built on a classic pattern: ETL (Extract, Transform, Load).
Extract
Each platform has an adapter that knows how to pull state. The ChatGPT adapter parses export ZIPs. The Claude Code adapter reads CLAUDE.md files. The OpenAI Assistants adapter calls their API.
Extracted data goes into our SaveState Archive Format (SAF) — a normalized structure that captures:
- Identity — System prompts, personality, instructions
- Memory — Learned facts, preferences, knowledge
- Conversations — Full thread history with metadata
- Configuration — Tools, settings, integrations
Transform
Here's where it gets interesting. Not all platforms support the same concepts:
| Concept | ChatGPT | Claude Code | OpenClaw |
|---|---|---|---|
| System prompt | Custom Instructions | CLAUDE.md | SOUL.md |
| Memory | Memories (text) | .claude/memory/ | SQLite DB |
| Scheduled tasks | — | — | cron/jobs.json |
| Vector stores | — | — | Optional |
The Transform phase handles these differences. It maps concepts between platforms, converts formats, and gracefully degrades when the target doesn't support a feature.
For example: If you migrate from OpenClaw to Claude Code, your cron jobs won't transfer (Claude Code doesn't have them), but the wizard preserves them in the snapshot and tells you exactly what was skipped.
Load
The target adapter takes the transformed SAF and writes it to the destination. For Claude Code, that means creating CLAUDE.md files. For OpenAI Assistants, it means API calls to create threads and upload files.
Everything is encrypted in transit. Decryption happens only on your machine, right before loading.
Using the Wizard
The simplest migration is fully interactive:
$ savestate migrate
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⏸ SaveState Migration Wizard
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Available Platforms:
clawdbot ✓ extract ✓ restore
claude-code ✓ extract ✓ restore
openai-assistants ✓ extract ✓ restore
chatgpt ✓ extract ⚠ restore (Memory/instructions only)
claude-web ✓ extract ⚠ restore (Memory/projects only)
gemini ✓ extract ⚠ restore (Limited)
Source platform (migrate FROM): chatgpt
Target platform (migrate TO): claude-code
Migration Plan:
From: ChatGPT
To: Claude Code
What will be migrated:
✓ Identity (personality, instructions, system prompts)
✓ Memory (learned facts, preferences)
✓ Configuration (settings, tool configs)
⚠ Conversations (preserved in snapshot, may not import to target)
Proceed with migration? (yes/no): yes
✓ Extracting from ChatGPT...
✓ Snapshot created: ss_abc123...
✓ Restoring to Claude Code...
✓ Migration complete!
Or go fully scripted:
savestate migrate --from chatgpt --to claude-code --dry-run
Platform Support Matrix
Here's what each platform supports today:
| Platform | Extract | Restore | Notes |
|---|---|---|---|
| OpenClaw/Clawdbot | ✅ Full | ✅ Full | Complete state including cron, memory DBs |
| Claude Code | ✅ Full | ✅ Full | CLAUDE.md, memory, settings, todos |
| OpenAI Assistants | ✅ Full | ✅ Full | Threads, files, vector stores via API |
| ChatGPT | ✅ Full | ⚠️ Partial | Can restore memories + instructions only |
| Claude (claude.ai) | ✅ Full | ⚠️ Partial | Can restore to Projects + memory |
| Gemini | ✅ Full | ⚠️ Limited | Settings restore only |
What's Next
This architecture is the foundation for something bigger.
Coming soon:
- Semantic memory migration — Transform memories intelligently, not just copy/paste
- Conversation summarization — Compress years of chat history into digestible context
- Bi-directional sync — Keep multiple platforms in sync, not just one-time migration
- Community adapters — Plugin system for adding new platforms
The goal: true AI identity portability. Your relationship with your AI assistant shouldn't be locked to one vendor.
Try It Today
# Install SaveState
npm install -g @savestate/cli
# See available platforms
savestate migrate --list
# Start a migration
savestate migrate
Your AI identity has been building for months. It shouldn't disappear when you switch platforms.
Full documentation at savestate.dev/docs. Questions? GitHub or hello@savestate.dev.