pconv list
List conversations discoverable on this machine. Filter by
--workspace-toml auto, --since 2d, or --grep refactor;
sort with --sort msgs|title|started; cap with --limit.
Table or JSON output.
Three commands. That’s the whole tool.
pconv list # see your recent sessionspconv dump <session-id> # render one as paste-ready markdownpconv dump <session-id> | clip.exe # WSL — copy to clipboard# (use pbcopy on macOS, wl-copy on Wayland)Paste into a new Claude Code session, claude.ai, opencode, whatever
— the conversation keeps going. If the session was authored on a
different OS, add --rewrite wsl-to-win (or win-to-wsl) so paths
inside the content get translated on the way out.
Even faster, inside a portagenty workspace:
# Skip the list + copy UUID dance — just grab the most recent# session in this workspace and send it straight to the clipboard.pconv dump --latest --workspace-toml auto | clip.exe
# Long session? Keep only the last 50 messages.pconv dump --latest --workspace-toml auto --tail 50 | clip.exe/compact/compact and immediately wished I still had the detail.” Grab the pre-compact session by id and paste the full version back into the chat.pconv dump <id> > docs/agent-context/session.md, commit, move on.list_conversations and get_conversation directly.pconv list
List conversations discoverable on this machine. Filter by
--workspace-toml auto, --since 2d, or --grep refactor;
sort with --sort msgs|title|started; cap with --limit.
Table or JSON output.
pconv dump
Dump one session to stdout. --latest --workspace-toml auto
skips the id-copy step. --tail N keeps only the last N
messages. --rewrite wsl-to-win|win-to-wsl|strip translates
paths. Default output: paste-ready markdown.
pconv mcp serve
Stdio MCP server. list_conversations + get_conversation
tools with typed schemas (every CLI flag mirrored), plus each
conversation as a convos://conversation/<id> resource.
See wiring guide.
—rewrite wsl-to-win · win-to-wsl · strip
apply to text + tool-call args — not cwd metadata
~/.claude/projects/~/.claude/projects/Claude Code keys conversation storage by the absolute path of the CWD at launch. WSL and Windows encode the same project two different ways. /resume from one side doesn’t see the other.
file-level sync seems like the answer — it isn’t
9999+ occurrences of /mnt/c/… ← WSL paths
72 occurrences of C:\… ← Windows paths
Symlinks, Docker bind mounts, polling sync — all merge storage and leave the content alone. A Windows-launched Claude Code resuming a WSL-authored session fails the first time it tries to Read /mnt/c/….
portaconv flips the approach
Don’t fight the on-disk split. Read the substantive dialogue out, normalize it, optionally rewrite paths on the way out, and let the human (or another agent) paste it into a fresh session anywhere. A fresh session has no embedded paths — no OS-specific failure mode. On-demand reads. No daemon. No race windows. Composes with pipes.
Read-only. No daemon. No file watching. pconv never writes to
Claude’s storage — close the process and nothing’s running. Every
feature has explicit reliability tiers: what’s always the same, what’s
opt-in, what could drift as Claude evolves. See the
reliability tiers table
for the full breakdown — it’s the first thing to read if you’re
scripting against portaconv.
portaconv is a sibling to portagenty (the terminal-native workspace launcher). Use them together or independently:
cargo install portaconv, run pconv from any
terminal. Reads ~/.claude/projects/ directly.pa convos shim passes workspace
context to pconv so list/dump automatically scope to the
current workspace’s projects.v0.0.1 feature-complete for v0.1. Core model, Claude Code adapter, markdown renderer, path-rewrite transforms, stdio MCP server, portagenty workspace scoping, and per-file list cache all landed. See the agents + portagenty page for wiring it into Claude Code / opencode, and the Claude Code adapter notes for the v0.1 record-type contract.