Catch up without reading every diff
How might someone back from a week away learn what changed, and why?
Git records what changed. It doesn't tell you why, or what you missed while you were away. Checkpoint reads the history on every push and writes it down as Markdown in the repository: a checkpoint for each commit, a catch-up for whoever was away, a guide for whoever is new, and a summary for each pull request.
How might someone back from a week away learn what changed, and why?
How might a new developer find the main decisions without depending on someone's memory?
How might project context live in the repository, reviewed like code, instead of in another tool?
Git keeps the diff, not the reason behind it.
One checkpoint per commit, written on push. Git supplies the diff, author and date; the model writes Context, Changes, Impact and a priority. Anything inferred is marked "Likely". Its own files and bot commits are left out, so it never summarises itself.
Every commit costs a model call, and a model can still misread a diff. The files are reviewed like code.
Coming back means reading other people's work, not your own.
It starts from your last commit and reads everyone else's checkpoints since then. Critical changes come first, five at most. The prompt forbids inventing names, owners or PR numbers. Your catch-up is deleted when you commit again.
A catch-up is only as good as the checkpoints it's built from.
Someone new needs the whole picture, not the latest change.
MASTER_CONTEXT.md is rebuilt when a pull request merges, from the file tree, README, dependencies and recent checkpoints. Python projects get architecture diagrams from the syntax tree; other languages get model-drawn ones.
The diagrams help you find your way. They aren't a full map of the code.
An example team, and every sheet is Checkpoint's own output. Cleo and Ben push while Ava is away. On Friday her catch-up is built from their checkpoints, and Darren starts with the project guide.
f15c0ae — 2026-10-02Ava’s commit starts Sprout, a fictional local plant-watering reminder service. The README says Cleo and Ben maintain it while Ava is away, and Darren is joining the project. The service uses local JSON files and no external services.
b26f83c — 2026-10-05The watering interval setting is being renamed from reminder_days to watering_interval_days to make its purpose explicit. Existing configuration must be updated before starting the service.
af60d81 — 2026-10-05The plant-watering reminder service is moving its reminder endpoint into an API route namespace. This is a breaking URL change: clients must switch from GET /reminders to GET /api/reminders. The commit does not describe a data-format change.
3894c30 — 2026-10-06Plants whose watering date was the current day were excluded from the due list. The commit fixes that boundary so plants are due on their scheduled day, not only afterward.
24153c1 — 2026-10-06The commit adds coverage for the boundary between overdue, due-today, and future watering reminders. It checks how sprout.reminders.due_plants handles those cases across two consecutive dates.
ef1521b — 2026-10-07The service is moving its settings from JSON to YAML. The commit adds PyYAML as a runtime dependency and updates the default settings loader to use it. The existing watering interval and server port remain unchanged.
b9d8436 — 2026-10-07Plant storage now uses an explicit schema version and renames watered_at to last_watered. Existing files without a version are treated as v1 by the migration, but the reminder loader requires v2. Operators must migrate existing data before starting the service.
277188e — 2026-10-08This change adds tests for migration backup and repeat-run behavior. The migration converts plant data from watered_at to last_watered; the tests check that the original data is backed up before migration and that an existing backup blocks migration.
33cf8bc — 2026-10-08The server needs a health endpoint that does not read plant storage. This gives clients a way to check the HTTP server without using the reminders endpoint.
ee814c0 — 2026-10-08Returning maintainers need a clear path for upgrading existing installations. The commit adds an upgrade pointer to the README alongside the existing setup and run instructions.
You need to upgrade plant data, settings, dependencies, and client URLs before bringing an existing installation back up. The service also has a storage-independent health endpoint, and reminders now include plants due today.
python -m sprout.migrate once. The reminder loader now requires schema version 2; unversioned and v1 files cannot load until migrated. The migration renames watered_at to last_watered. It refuses to overwrite an existing plants.json.bak, so you must resolve that file before retrying a v1 migration.GET /api/reminders. The old GET /reminders route now returns 404. Matching is exact, so a query string on the new route also prevents a match. Update any client, script, or monitoring configuration that uses the old URL.python -m pip install -r requirements.txt and put your settings in settings.yaml. The default loader no longer reads settings.json, and importing sprout.reminders requires PyYAML even if you do not load settings.watering_interval_days instead of reminder_days. Settings containing only the old key cause a KeyError when due plants are calculated. The supplied interval remains seven days.Sprout is a fictional, local plant-watering reminder service. It reads configuration and plant records from files, calculates which plants need water, and exposes the result over HTTP. It has no external services and no production database; the tracked plants.json is sample data. Ava started the project, Cleo and Ben maintain it while Ava is away, and Darren is joining. The main engineering work is keeping the reminder rule, file formats, HTTP interface, and upgrade path aligned. Existing installations need special attention: settings moved from JSON to YAML, the interval key and reminders route changed, and plant records now require a versioned schema.
The first version used DSPy, Gemini, LangGraph and ChromaDB. I was exploring the frameworks as much as the problem. Git already knows which files changed, who changed them and exactly how, so I took the frameworks out. Now the model only explains what needs interpretation.
@@ -13,6 +13,6 @@ def load_plants(path=Path('plants.json')):1313 1414 1515 def due_plants(plants, today, settings):16− interval = timedelta(days=settings['reminder_days'])16+ interval = timedelta(days=settings['watering_interval_days'])1717 return [plant for plant in plants1818 if date.fromisoformat(plant['watered_at']) + interval < today]The watering interval setting is being renamed from reminder_days to watering_interval_days to make its purpose explicit. Existing configuration must be updated before starting the service.
@@ -15,4 +15,4 @@ def load_plants(path=Path('plants.json')):1515 def due_plants(plants, today, settings):1616 interval = timedelta(days=settings['watering_interval_days'])1717 return [plant for plant in plants18− if date.fromisoformat(plant['watered_at']) + interval < today]18+ if date.fromisoformat(plant['watered_at']) + interval <= today]Plants whose watering date was the current day were excluded from the due list. The commit fixes that boundary so plants are due on their scheduled day, not only afterward.
@@ -0,0 +1,26 @@1+"""Upgrade sample plant storage with a backup and an atomic replacement."""2+import json3+from pathlib import Path4+5+6+def migrate(path=Path('plants.json')):7+ original = path.read_bytes()8+ data = json.loads(original)9+ if data.get('schema_version') == 2:Plant storage now uses an explicit schema version and renames watered_at to last_watered. Existing files without a version are treated as v1 by the migration, but the reminder loader requires v2. Operators must migrate existing data before starting the service.
Checkpoint runs inside your GitHub Actions. Every document it writes goes back into the repository as a commit, so there's no dashboard to sign into.
pip install checkpoint-agent, then checkpoint --init. Add your model's API key as a GitHub secret and push.# While You Were Gone — Since October 02, 2026 You need to upgrade plant data, settings, dependencies, and client URLs before bringing an existing installation back up. The service also has a storage-independent health endpoint, and reminders now include plants due today. ## Critical Changes (Must-Read)
Every document Checkpoint writes is a Markdown file in the repository. People review it in pull requests, Git versions it, and models read the same files. There's no dashboard and no database.
Successful workflow runs averaged 3m02s across 9 earlier runs and 2m08s across 43 later ones, 29.9% less. That's what the run history shows, not a controlled benchmark: the earlier runs came from one day, the later ones from about a month.
Shipped. checkpoint-agent v1.2.6 is on PyPI, and the checkpoint, catch-up, pull-request summary and project guide flows all work. Support for repositories outside GitHub isn't finished.
The system got better when Git supplied the facts and models explained the changes. More AI wasn't always the answer.