Every time I switched between Claude, Codex, and Claude Code, I spent the first few minutes of the session re-explaining the same things — what I was building, what the current task was, what decisions had already been made.
The tools don't share memory with each other. I was the context bus.
So I built Checkpoint — a local CLI that gives your repo a continuity layer. (The project's called contextos; checkpoint is the command you actually type.) It writes readable Markdown files to .contextos/ and generates a focused continuation pack for the next AI tool:
checkpoint continue --from codex --for claude-code
The output is a compact Markdown handoff: current task, relevant decisions, files to inspect, next action. You paste it or pipe it to the next agent.
Here's what a pack actually looks like (example — replace with your real output):
# Continuation Pack — for Claude Code
Generated from: codex · 2026-06-02
## Current task
Wire secret redaction into `checkpoint continue` before the pack is printed.
## Decisions that matter here
- Redaction runs on the assembled pack, not per-file (one pass, fewer misses).
- Patterns live in .contextos/context/constraints.md so they're reviewable.
## Files to inspect
- src/checkpoint/redact.py — regex set + entropy check
- src/checkpoint/render.py — where the pack is assembled
## Next action
Add a failing test for an AWS key in a task note, then make it pass.
Install
pip install checkpoint-cli
Or with uv:
uv tool install checkpoint-cli
Get started in 60 seconds
checkpoint setup-user # one-time user preferences
checkpoint init # adds .contextos/ to your project
checkpoint status # check what memory exists
checkpoint continue # generate the continuation pack
How it works
Everything lives in plain Markdown files you can read, edit, diff, and commit:
.contextos/
context/ # architecture, constraints, decisions
tasks/ # active and completed work
handoffs/ # latest.md always has the most recent state
state/ # local event log
checkpoint continue reads those files, applies secret redaction, and prints a pack shaped for the target agent — Codex, Claude, Claude Code, Cursor, Aider, or generic.
No account. No cloud. No hidden state. Apache-2.0.
Why local-first matters
You decide what context moves to the next tool. The files are yours - readable before they're sent anywhere, and secrets get redacted on the way out.
Where it is now
v0.1.3. Works, dogfoods itself, rough in places. If you try it and something breaks, open an issue — and tell me which agent format you want supported next.
Top comments (0)