Wil je overstappen van ChatGPT naar Claude? In twee stappen zet je alles over: al je gesprekken, Custom GPTs, projecten en memories. Volledig geautomatiseerd.
Wat heb je nodig?
Zo werkt het in het kort:
Stap 1: Claude exporteert via de Chrome extensie al je ChatGPT data (gesprekken, GPTs, projecten, memories)
Stap 2: Je importeert die data met chatgpt2claude, zodat je alles kunt doorzoeken vanuit Claude
Stap 1: Exporteren met Claude Cowork
Open Claude Desktop, zet Cowork mode aan (rechtsboven), en plak onderstaande prompt. Claude doet de rest, hij opent ChatGPT in Chrome en haalt alles op.
Ik wil mijn volledige ChatGPT account migreren naar Claude. Gebruik de Chrome extensie om via de ChatGPT browser-tab alles te exporteren. Ik ben ingelogd op chatgpt.com.
## Wat er geƫxporteerd moet worden
1. Custom GPTs: alle GPTs met hun volledige system instructions
2. Projecten: alle projecten met metadata, bestanden en instructies
3. Memories: alle opgeslagen memories
4. Alle gesprekken: de volledige inhoud van elke conversatie, als markdown
## Technische aanpak
### Stap 0: Setup helper functies
Injecteer deze functies in de ChatGPT tab via JavaScript:
window._download = (filename, content) => {
const blob = new Blob([content], {type:'text/plain'});
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = filename;
a.click();
URL.revokeObjectURL(a.href);
};
window._convToMarkdown = (data) => {
const msgs = Object.values(data.mapping || {})
.filter(m => m.message && m.message.author?.role !== 'system' && m.message.content?.parts?.length > 0)
.sort((a,b) => (a.message.create_time||0) - (b.message.create_time||0))
.map(m => {
const role = m.message.author.role === 'user' ? 'User' : 'Assistant';
const parts = m.message.content.parts.map(p => typeof p === 'string' ? p : JSON.stringify(p)).join('\n');
return '**' + role + ':** ' + parts;
});
const date = data.create_time ? new Date(data.create_time * 1000).toISOString().slice(0,10) : 'unknown';
return '# ' + (data.title || 'Untitled') + '\nDatum: ' + date + ' | Berichten: ' + msgs.length + '\n\n' + msgs.join('\n\n---\n\n');
};
### Stap 1: Auth token ophalen
const session = await fetch('/api/auth/session');
const {accessToken} = await session.json();
### Stap 2: Custom GPTs exporteren
GET /backend-api/gizmos/bootstrap?limit=2
Download als custom-gpts-export.md
### Stap 3: Projecten exporteren
GET /backend-api/gizmos/snorlax/sidebar?owned_only=true&conversations_per_gizmo=5
Download als projecten-export.md
### Stap 4: Memories exporteren
GET /backend-api/memories?exclusive_to_gizmo=false&include_memory_entries=true
Download als memories-export.md
### Stap 5: Gesprekken ophalen (smart dedup paginatie)
window._smartFetch = {done:false, newItems:[], dupes:0, uniqueIds:new Set(), consecutiveDupePages:0};
(async () => {
const state = window._smartFetch;
const getToken = async () => (await (await fetch('/api/auth/session')).json()).accessToken;
let token = await getToken(), tokenAge = 0, offset = 0;
while (true) {
if (tokenAge >= 50) { token = await getToken(); tokenAge = 0; }
const r = await fetch('/backend-api/conversations?offset=' + offset + '&limit=100&order=updated', {headers: {'Authorization': 'Bearer ' + token}});
if (r.status === 429) { await new Promise(r => setTimeout(r, 30000)); token = await getToken(); tokenAge = 0; continue; }
const items = (await r.json()).items || [];
if (!items.length) break;
let newCount = 0;
for (const item of items) { if (!state.uniqueIds.has(item.id)) { state.uniqueIds.add(item.id); state.newItems.push(item); newCount++; } else state.dupes++; }
if (!newCount && ++state.consecutiveDupePages >= 3) break; else if (newCount) state.consecutiveDupePages = 0;
offset += 100; tokenAge++;
await new Promise(r => setTimeout(r, 300));
}
state.done = true;
})();
### Stap 6: Alle gesprekken downloaden (parallel)
window._parallelState = {processed:0, total:0, errors:0};
(async () => {
const state = window._parallelState;
const items = window._smartFetch.newItems;
state.total = items.length;
const getToken = async () => (await (await fetch('/api/auth/session')).json()).accessToken;
let token = await getToken(), tokenAge = 0, batch = [], batchNum = 1;
for (let i = 0; i < items.length; i += 5) {
if (tokenAge >= 150) { token = await getToken(); tokenAge = 0; }
const results = await Promise.all(items.slice(i, i+5).map(async item => {
try {
let r = await fetch('/backend-api/conversation/' + item.id, {headers: {'Authorization': 'Bearer ' + token}});
if (r.status === 429) { await new Promise(r => setTimeout(r, 30000)); token = await getToken(); tokenAge = 0; r = await fetch('/backend-api/conversation/' + item.id, {headers: {'Authorization': 'Bearer ' + token}}); }
return r.ok ? await r.json() : (state.errors++, null);
} catch(e) { state.errors++; return null; }
}));
tokenAge += 5;
for (const data of results) { if (data) batch.push(window._convToMarkdown(data)); state.processed++; }
if (batch.length >= 100) { window._download('gesprekken-batch-' + String(batchNum++).padStart(2,'0') + '.md', batch.join('\n\n===NEXT===\n\n')); batch = []; }
await new Promise(r => setTimeout(r, 200));
}
if (batch.length) window._download('gesprekken-batch-' + String(batchNum).padStart(2,'0') + '.md', batch.join('\n\n===NEXT===\n\n'));
window._download('inventaris.json', JSON.stringify(items.map(it => ({id:it.id, title:it.title, created:it.create_time, updated:it.update_time})), null, 2));
state.done = true;
})();
Voer alle stappen sequentieel uit. Monitor de voortgang en rapporteer wanneer alles klaar is.
Claude gaat nu automatisch aan de slag. Na 30-45 minuten verschijnen er bestanden in je Downloads-map:
- custom-gpts-export.md: al je Custom GPTs met system instructions
- projecten-export.md: al je projecten
- memories-export.md: al je memories
- gesprekken-batch-01.md t/m XX.md: al je gesprekken
- inventaris.json: metadata van alle gesprekken
Stap 2: Importeren met chatgpt2claude
Nu maak je die bestanden doorzoekbaar vanuit Claude met chatgpt2claude, een open-source MCP server die alles lokaal indexeert.
Installeer
pip install chatgpt2claude
Importeer je gesprekken
# Importeer een hele map met .md bestanden
chatgpt2claude import ~/Downloads/chatgpt-export/
# Of per bestand
chatgpt2claude import ~/Downloads/gesprekken-batch-01.md
Verbind met Claude Code
claude mcp add chatgpt2claude -- chatgpt2claude serve
Klaar. Je kunt nu vanuit Claude je hele ChatGPT-geschiedenis doorzoeken:
- "Zoek in mijn ChatGPT geschiedenis naar gesprekken over Python"
- "Vind dat gesprek waar ik database schema's besprak"
- "Laat alle gesprekken van vorige maand zien"
Hoe lang duurt het?
| Stap |
Duur |
| Exporteren (Stap 1) |
30-45 min (automatisch, je hoeft niks te doen) |
| Importeren (Stap 2) |
5-10 min |
Getest met een account van 7.600+ gesprekken, 18 Custom GPTs, 55 projecten en 169 memories.
Alles blijft lokaal
chatgpt2claude slaat alles op je eigen computer op. Geen API keys nodig, geen cloud, geen data die je machine verlaat.
Meer info: github.com/laifehacker/chatgpt2claude