Bridge between claude.ai / ChatGPT and Claude Code (VS Code). Export any chat to clean Markdown with one click, ready to paste as context into Claude Code, or to send a Claude Code session back to your web chat.
exportal-demo.mp4
Status: bidirectional (claude.ai / ChatGPT ↔ Claude Code). VS Code extension + Chrome companion + CLI. Landing: exportal.dev. Support: exportal.dev/support. Privacy: exportal.dev/privacy. Changelog:
CHANGELOG.md. Threat model:SECURITY.md. Detailed progress:DEVLOG.md. What's coming:ROADMAP.md.
When you switch from claude.ai to Claude Code (or vice versa), you lose all the context and have to re-explain your project. Exportal generates a clean Markdown file with the entire conversation, including tool use, thinking, and results, that you paste in as initial context.
With both extensions installed and paired:
- Open any chat at
claude.ai/chat/<uuid>, a project atclaude.ai/design/p/<uuid>, or a chat atchatgpt.com/c/<uuid>. - Click the floating Exportal button (bottom-right corner) → Export this chat.
- VS Code saves the conversation to
<workspace>/.exportal/<timestamp>-<slug>.md, opens the file, and automatically opens the Claude Code panel with the Markdown attached as@-mention. You just write your prompt and you're done. - The Exportal panel surfaces an After import section with quick prompts ("Continue this conversation", "Summarize and plan next steps", etc.). Click one and the prompt is copied to the clipboard with the cursor already inside Claude Code's input:
Ctrl+Vsends "@filename.md your-prompt" in one go. Edit the list with theexportal.postImportTemplatessetting.
VS Code closed? No problem, the FAB detects it and opens it automatically via
vscode://. The conversation is imported as soon as the bridge starts, without you having to do anything. The first time, your browser may ask you to confirm "Open this with Visual Studio Code?": click "Remember" and it disappears forever.
Exportal tab on something else (Explorer, Search…)? The After-import section restores the moment you switch back to the Exportal tab in the activity bar. You don't need to have it open during the export.
For Claude Design projects, in addition to the chat, the generated assets (HTML, JSX, JSON, etc.) are downloaded to <workspace>/.exportal/<timestamp>-<slug>/ (sibling folder of the .md). The .md starts with a "Generated assets" header listing the files so Claude Code sees them.
Or with a keyboard shortcut (without opening the panel):
Alt+Shift+E: export the current chat to VS Code (works on/chatand/design/p).Alt+Shift+O: prepare the official export (only on/chat, in case you want the version with all your chats; the extension forwards the ZIP when it arrives by email).
Auto-attach to the Claude Code chat can be disabled with the exportal.autoAttachToClaudeCode setting. Add .exportal/ to your .gitignore if you don't want to version the imports.
From the Exportal tab in VS Code, ↑ Export current session section, click claude.ai or ChatGPT. It automatically picks the most recent Claude Code session (the one you're using), renders the chat to Markdown, copies it to the clipboard, saves the .md to <workspace>/.exportal/ as a fallback, and opens the provider's site in the browser. You paste with Ctrl+V or drag the .md if the session is too long (claude.ai/ChatGPT truncate pastes >100K characters). No provider has a write API: the final step is manual by design.
If you download the official export ZIP (claude.ai: Settings → Export data; ChatGPT: Settings → Data controls → Export), Exportal imports it with one click:
- Open the Exportal tab. If you downloaded the ZIP recently, the panel detects it automatically and shows the filename + time on the provider's row (green). Click the row → direct import, no file picker.
- If it doesn't detect anything, click anyway → file picker.
- Real-time watch listens to your Downloads folder while the panel is visible: download a new ZIP and in ~1.5 seconds it shows up on the corresponding row.
If you enable the exportal.alsoWriteJsonl setting, alongside the .md a .jsonl compatible with Claude Code is written to ~/.claude/projects/<encoded-cwd>/<sessionId>.jsonl. The imported conversation shows up directly in /resume as if it were a local session of the project. It's experimental: the .jsonl format is reverse-engineered, not officially documented, and may break between versions.
There's an Exportal icon in the activity bar (the left vertical bar). The panel brings everything important together in a clear hierarchy:
- After import: appears only after a successful import (and survives switching to other tabs in the meantime). Quick prompt templates that copy + drop the cursor into Claude Code's input. X to dismiss; reappears on the next import.
- Settings: toggles for
autoAttachToClaudeCodeandalsoWriteJsonl. - ↓ Import to workspace: one row per provider (claude.ai, ChatGPT, Gemini coming soon). Click → file picker, or direct import if it detected a fresh ZIP in Downloads.
- ↑ Export current session: mirror of Import. Click
claude.aiorChatGPT→ sends the most recent Claude Code session to the provider's web chat. - Bridge status at the bottom, clickable. Expand to see the endpoint, the pairing token (with copy + "Copy and open Chrome" that triggers auto-pair without opening the big panel) and a shortcut to Logs.
From the Marketplace (recommended):
Ctrl+Shift+X→ search for "Exportal" → Install.
Or local build to develop/work with changes:
npm install
npm run package:vsix
code --install-extension exportal-*.vsixWhen you open VS Code for the first time, a two-step pairing wizard appears: Step 1 sends you to the Chrome Web Store to install the companion; Step 2 shows the pairing token with a "Copy token and open Chrome" button. If you skip it, you can reopen the wizard with Ctrl+Shift+P → Exportal: Show pairing token.
- Install Exportal Companion from the Chrome Web Store, or download
exportal-companion-<version>.zipfrom Releases and load it unpacked inchrome://extensions(Developer mode enabled). - In VS Code, run Exportal: Show pairing token → click Copy token and open Chrome. This opens claude.ai with the token in the URL fragment; the companion's content script captures it automatically, opens its options page showing "Done! All connected", and VS Code shows a pairing-complete notification. No copy, no paste.
The icon badge reflects the state: OK green (imported), SET yellow (token missing), OFF red (VS Code not responding), AUTH red (invalid token), OLD red (VS Code outdated), ERR red (others). Click the icon while in any error state and the options page opens with a banner explaining the fix.
A short success chime plays when an export lands in VS Code (default ON, opt-out from the companion's options page).
| Method | When it's useful | What it does |
|---|---|---|
Export this chat (button or Alt+Shift+E) |
You want this chat right now. | Reads claude.ai's internal API (same session cookies), sends the JSON to the local VS Code bridge, opens the Markdown. No ZIPs, no emails. |
Prepare official export (button or Alt+Shift+O) |
You want all your chats, or the full official export with attachments/projects. | Saves the UUID of the current chat. When the official claude.ai ZIP finishes downloading, the companion forwards it to VS Code and VS Code opens that chat directly from the list. |
To export Claude Code sessions to Markdown, or to import a claude.ai ZIP from the terminal:
# Export a Claude Code session
npx exportal export <sessionId> --out session.md
# Import from a claude.ai ZIP
npx exportal import list ./data-abc.zip # list conversations
npx exportal import show ./data-abc.zip <uuid> # render oneBoth commands redact secrets by default. See --help.
- Local-first, zero-network: nothing leaves your machine.
- Fail-closed on security: redaction enabled by default, both in CLI and extension.
- Mandatory preview in the CLI before writing an export.
- Boring tech: strict TypeScript, Node 20+, minimal dependencies.
- Node.js ≥ 20
- VS Code ≥ 1.85 (for the extension)
npm install
npm run lint # ESLint
npm run typecheck # tsc --noEmit
npm test # vitest
npm run build # compile to ./dist (CLI + extension bundle)
npm run ci # all of the above in orderThe extension is debugged with F5 (opens an Extension Development Host with the fresh bundle).
MIT, see LICENSE.




