Launching today
Your coding agent can read the code and still miss why you rejected an earlier approach. Selvedge preserves that context: explicitly record decisions, rejected paths, reasons, and when to reconsider them; retrieve the history through MCP or a Python CLI before trying again. Records live in local SQLite. MIT-licensed, no account, and no LLM calls by Selvedge. Try the built-in demo in a temporary database, then connect it to your coding workflow.





I'm Mason, the maintainer of Selvedge.
A fresh coding session can read your code and still miss why you rejected an earlier approach. That missing context can send an agent back down a path you already explored.
Selvedge makes those decisions retrievable. Developers and agents explicitly record what was tried, why it was rejected, and what would justify reconsidering it. Later sessions can look up that context through MCP or the CLI before choosing their next step.
A concrete example from the built-in demo: reject storing raw API keys because a database leak would expose usable credentials, record the hashed-key approach, and say when to revisit the decision. A later lookup retrieves the rejection and its reason.
The workflow is simple:
1. Record the decision, rejected approach, reason, and reconsideration conditions.
2. Query prior_attempts when similar work comes up.
3. Reconsider the old decision when its assumptions change.
Records live in local SQLite. Selvedge is MIT-licensed, requires no account or subscription, and makes no LLM calls itself. Recording is explicit: you or your agent decide what to preserve.
Try it:
uv tool install --upgrade selvedge
selvedge demo
The demo uses a temporary database without modifying your project. It records a rejection and retrieves it through a fresh database connection.
Quickstart: https://selvedge.sh/start/quickstart/
Source: https://github.com/masondelan/selvedge
What decision does your coding agent keep forgetting, and what context would have helped it?
I added a 56-second technical walkthrough with real CLI output: record a rejected cache decision, exit the process, then retrieve its reason from a fresh process using the same temporary SQLite store. The example is fictional, and the commands and captured output are available to reproduce it.
Watch: https://youtu.be/wXoA9htThAM
Reproduce: https://gist.github.com/masondelan/32f8d7e6fcb1ce3cff4040efa544c16d