Export AI conversation sessions into a Git repository using a readable, time-based structure.
- 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).
- Cursor: supports both single-folder and multi-root (
.code-workspace) windows — sessions are attributed to the matching repo folder.
No install needed — just run from any project folder:
uvx --from convx-ai convx syncuv add convx-ai
# or: pip install convx-ai
convx --helpFrom source:
uv sync
uv run convx --helpRun 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 syncBy 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.
Exports all conversations into a dedicated backup Git repo:
uv run convx backup \
--output-path /path/to/your/backup-git-repo \
--source-system codex--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) Supports both single-folder and multi-root (.code-workspace) Cursor windows.
- 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).
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
- 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.
stats — index totals and last update time:
uv run convx stats --output-path /path/to/your/backup-git-repoexplore — browse and search exported conversations in a TUI:
uv run convx explore --output-path /path/to/your/repohooks — install or remove a pre-commit hook that runs sync before each commit:
uv run convx hooks install
uv run convx hooks uninstallExports 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).
