I built sessionport because I kept switching between Claude Code, OpenCode, and Codex depending on the task, and every time I lost the session — flattened into a dumb transcript at best, gone at worst.
It works by parsing each tool's native session format (Claude's JSONL, OpenCode's SQLite, Codex's rollout JSONL) into a shared intermediate representation — Session → Message[] → Part — then rendering that back out as another tool's format, markdown, JSON, or a "seed" handoff prompt.
npx sessionport # interactive wizard
sessionport
or
sessionport export claude --to markdown
sessionport import claude opencode
Three providers are supported right now, but that's really just the start. The whole point of the IR design is that adding a new provider is just a reader (parse their format into the IR) + an importer (write the IR into their format) — you don't touch anything else. I'd like this to eventually cover most of the AI coding tools people actually use day to day: Cursor, Windsurf, Cline, Aider, Gemini CLI, whatever else people are running.
If you use a tool that isn't supported yet and know its session/storage format, I could really use help writing a reader/importer pair for it — that's the fastest way to grow this into something genuinely useful across the ecosystem instead of a Claude-Code-specific hack. Also open to input on the IR itself if anyone sees gaps in how it models sessions.
GitHub: https://github.com/azizmass/sessionport
Happy to walk anyone through the reader/importer interface if you want to take on a provider.
Top comments (0)