Idempotent conversation exporter for Codex, Claude, and Cursor.
Project description
Conversation Exporter
Export AI conversation sessions into a Git repository using a readable, time-based structure.
What it does
- Scans source session files (Codex JSONL, Claude projects, Cursor workspaceStorage).
- Normalizes each session into a common model.
- Writes two artifacts per session:
- readable Markdown transcript:
YYYY-MM-DD-HHMM-slug.md - hidden normalized JSON:
.YYYY-MM-DD-HHMM-slug.json
- readable Markdown transcript:
- Organizes history by user and source system:
sync:history/<user>/<source-system>/(flat — sessions directly inside)backup:history/<user>/<source-system>/<system-name>/<path-relative-to-home>/...
- Runs idempotently (only reprocesses changed or new sessions).
Install and run
uv add convx-ai
# or: pip install convx-ai
convx --help
From source:
uv sync
uv run convx --help
sync — project-scoped command
Run from inside any Git repo. Syncs only the conversations that took place in that repo (or its subfolders) and writes them into the repo itself:
cd /path/to/your/project
uv run convx sync
By default syncs Codex, Claude, and Cursor. Use --source-system codex, --source-system claude, or --source-system cursor to sync a single source. No --output-path needed — the current directory is used as both the filter and the destination. Sessions are written flat under history/<user>/<source-system>/ with no machine name or path nesting.
backup — full backup command
Exports all conversations into a dedicated backup Git repo:
uv run convx backup \
--output-path /path/to/your/backup-git-repo \
--source-system codex
Common options
--source-system: source(s) to sync:all(default),codex,claude,cursor, or comma-separated.--input-path: source sessions directory override (per source).- default for Codex:
~/.codex/sessions - default for Claude:
~/.claude/projects - default for Cursor:
~/Library/Application Support/Cursor/User/workspaceStorage(macOS)
- default for Codex:
--user: user namespace for history path (default: current OS user).--system-name: system namespace for history path (default: hostname).--dry-run: discover and plan without writing files.--history-subpath: folder inside output repo where history is stored (defaulthistory).--output-path(backup only): target Git repository (must already contain.git).
Example output
convx sync (inside a project repo):
history/
pascal/
codex/
2026-02-15-1155-conversation-backup-plan.md
.2026-02-15-1155-conversation-backup-plan.json
claude/
2026-01-15-1000-api-auth-migration-plan/
index.md
agent-abc1234.md
.index.json
convx backup (dedicated backup repo):
history/
pascal/
codex/
macbook-pro/
Code/
everycure/
prototypes/
matrix-heatmap-test/
2026-02-15-1155-conversation-backup-plan.md
.2026-02-15-1155-conversation-backup-plan.json
Idempotency behavior
- Export state is stored at
.convx/index.jsonin the output repo. - A session is skipped when both:
session_keyalready exists, and- source fingerprint (SHA-256 of source file) is unchanged.
- If source content changes, that session is re-rendered in place.
Other commands
stats — index totals and last update time:
uv run convx stats --output-path /path/to/your/backup-git-repo
explore — browse and search exported conversations in a TUI:
uv run convx explore --output-path /path/to/your/repo
hooks — install or remove a pre-commit hook that runs sync before each commit:
uv run convx hooks install
uv run convx hooks uninstall
Secrets
Exports are redacted by default (API keys, tokens, passwords → [REDACTED]). Be mindful of secrets in your history repo. See docs/secrets.md for details and pre-commit scanner options (Gitleaks, TruffleHog, detect-secrets, semgrep).
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file convx_ai-0.1.0.tar.gz.
File metadata
- Download URL: convx_ai-0.1.0.tar.gz
- Upload date:
- Size: 130.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0e9fb9fe3b6f10aeb98957ae88d30809581ded81c0e59ef133acbdb870d7e629
|
|
| MD5 |
5ee63fcc62834cdad8eabe963834fd4d
|
|
| BLAKE2b-256 |
c8fa7f6fda9d1dd0fff39e11357f5826ee621a08ccfdc5243d600dcc1fd8275d
|
File details
Details for the file convx_ai-0.1.0-py3-none-any.whl.
File metadata
- Download URL: convx_ai-0.1.0-py3-none-any.whl
- Upload date:
- Size: 24.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
671362cbce0e682b04378b76615a8b29fe7e5c232b85db6e69ee8b76b91c6a5b
|
|
| MD5 |
325803ab4a365fc64a947d3905355038
|
|
| BLAKE2b-256 |
ca3c20a7c5a278ae55487f6ceecec93878b8cf0a8630bd593324cba581ece280
|