← Back to Blog
February 7, 2026

Migration Wizard: The Architecture Behind AI Identity Portability

How we built cross-platform AI migration with Extract → Transform → Load architecture. The foundation for ChatGPT ↔ Claude and beyond.

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).

Source Platform EXTRACT SAF Archive TRANSFORM LOAD Target Platform

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.