chatgpt-export-parser
v0.1.0
Published
Parse ChatGPT export archives into JavaScript objects with full support for branched conversations
Downloads
6
Maintainers
Readme
ChatGPT Export Parser JS
Turn ChatGPT data‑export ZIPs into easy‑to‑use JavaScript objects with full support for branched conversations.
Status: ✅ Production Ready — Handles all ChatGPT export features including branched conversations, tool messages, and runtime validation.
Why?
OpenAI's export gives you a single ZIP with conversations.json, files, feedback logs, etc. This library unwraps that archive and surfaces:
conversations[]– list of chats (title, timestamps, id…).conversation.messages[]– ordered turns (user/assistant/system/tool).conversation.messageTree– hierarchical tree structure for branched conversations.conversation.branches[]– identified conversation branches and their relationships.- Attachments & safe URLs (when present).
All as plain JS objects or typed data (TS). Perfect for analysis, search, or re‑publishing your own archive.
Install
npm install chatgpt-export-parser # package name TBDQuick start
import { parseExport } from 'chatgpt-export-parser';
const data = await parseExport('ChatGPT-data.zip');
console.log(data.conversations[0].messages);API
| function | purpose | |
| ---------------------------------- | ----------------------------- | -------------------------------------------- |
| parseExport(zipPath \| Buffer) | returns { conversations, files, metadata } |
| splitLargeJson(jsonPath, outDir) | helper to shard huge archives | |
| toMarkdown(conversation) | convert a chat to MD | |
Types
interface ExportData {
conversations: ParsedConversation[];
files: string[];
metadata: {
user?: any;
messageFeedback?: any;
modelComparisons?: any;
sharedConversations?: any;
};
}
interface ParsedConversation {
id: string;
title: string | null;
createTime: Date;
updateTime: Date;
messages: ParsedMessage[]; // Flat array of all messages
messageTree?: MessageTree; // Hierarchical tree structure
branches?: ConversationBranch[]; // Identified conversation branches
originalMapping?: Record<string, MessageNode>; // Original ChatGPT mapping
isArchived: boolean;
safeUrls: string[];
}
interface ParsedMessage {
id: string;
role: "user" | "assistant" | "system" | "tool";
content: string;
createTime: Date;
metadata: Record<string, unknown>;
parentId?: string; // Parent message ID
childrenIds?: string[]; // Child message IDs
branchId?: string; // Branch this message belongs to
}
interface MessageTree {
id: string;
message: ParsedMessage;
parent?: MessageTree;
children: MessageTree[];
branchId: string;
}
interface ConversationBranch {
id: string;
messages: ParsedMessage[];
startTime: Date;
endTime: Date;
parentBranchId?: string;
childrenBranchIds: string[];
}Examples
Basic Usage
import { parseExport } from 'chatgpt-export-parser';
const data = await parseExport('ChatGPT-data.zip');
// Access all conversations
data.conversations.forEach(conv => {
console.log(`Conversation: ${conv.title}`);
console.log(`Messages: ${conv.messages.length}`);
console.log(`Branches: ${conv.branches?.length || 0}`);
});Branched Conversations
// Get all messages including branches
const conversation = data.conversations[0];
// Flat array of all messages (current + branches)
conversation.messages.forEach(msg => {
console.log(`${msg.role}: ${msg.content}`);
if (msg.parentId) {
console.log(` Parent: ${msg.parentId}`);
}
});
// Tree structure for advanced navigation
const tree = conversation.messageTree;
const traverseTree = (node: MessageTree) => {
console.log(`${node.message.role}: ${node.message.content}`);
node.children.forEach(traverseTree);
};
traverseTree(tree);
// Branch information
conversation.branches?.forEach(branch => {
console.log(`Branch ${branch.id}: ${branch.messages.length} messages`);
console.log(` Time: ${branch.startTime} to ${branch.endTime}`);
});Original Mapping Access
// Access the original ChatGPT mapping structure
const originalMapping = conversation.originalMapping;
Object.entries(originalMapping).forEach(([id, node]) => {
console.log(`Node ${id}:`);
console.log(` Parent: ${node.parent || 'none'}`);
console.log(` Children: ${node.children.length}`);
if (node.message) {
console.log(` Role: ${node.message.author.role}`);
}
});Development
npm install
npm run build
npm testRoadmap
- [x] ✅ Basic parser for ChatGPT exports
- [x] ✅ Zod runtime validation
- [x] ✅ Branched conversation support
- [x] ✅ Tree structure and branch identification
- [x] ✅ TypeScript types and exports
- [ ] Stream parser for >1 GB exports
- [ ] CLI (
chatgpt-export <zip> --markdown) - [ ] Project‑aware grouping once OpenAI exposes it
- [ ] Tests against multiple export versions
Contributing
PRs welcome! Drop issues if the schema shifts.
License
MIT - see LICENSE file.
