<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Akarsh Kushwaha]]></title><description><![CDATA[Akarsh Kushwaha]]></description><link>https://akarsh04.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Akarsh Kushwaha</title><link>https://akarsh04.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 20:36:03 GMT</lastBuildDate><atom:link href="https://akarsh04.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I Built Capi — A Tool That Tells You Why Your Config Values Exist]]></title><description><![CDATA[Every engineer has been here.
You open a config file and see something like DB_POOL_SIZE=10. You want to change it. You check git blame and it says "fix config" by someone who left 8 months ago. You s]]></description><link>https://akarsh04.hashnode.dev/i-built-capi-a-tool-that-tells-you-why-your-config-values-exist</link><guid isPermaLink="true">https://akarsh04.hashnode.dev/i-built-capi-a-tool-that-tells-you-why-your-config-values-exist</guid><category><![CDATA[Cognee]]></category><category><![CDATA[devtools]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[hackathon]]></category><category><![CDATA[Hangover]]></category><category><![CDATA[Python]]></category><category><![CDATA[WeMakeDevs]]></category><category><![CDATA[context]]></category><category><![CDATA[memorylayer]]></category><dc:creator><![CDATA[Akarsh kushwaha]]></dc:creator><pubDate>Sun, 05 Jul 2026 10:02:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a47aa6411f54475cf2b7746/a247e8f5-ddf4-4003-99cb-ce934a20c904.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>Every engineer has been here.</p>
<p>You open a config file and see something like <code>DB_POOL_SIZE=10</code>. You want to change it. You check git blame and it says "fix config" by someone who left 8 months ago. You search Slack. Nothing. You check Notion. Empty. You ask your senior and they say "I think someone set it because of some memory issue, be careful."</p>
<p>You make a call. You change it. You deploy.</p>
<p>Production crashes.</p>
<p>That context — why that value existed, what incident caused it, who set it and why — was always there. Just scattered across a buried Slack thread, an incident report, a post-mortem nobody linked together. Nowhere you could actually find it when you needed it.</p>
<p>This is the problem I built Capi for.</p>
<hr />
<h2>What is Capi?</h2>
<p>Capi stands for Config Archaeology. The name says it all — you're digging through layers of history to understand why something exists.</p>
<p>The idea is simple. Every config value was set by someone, at some point, for some reason. That reason is the most valuable context you can have before touching it. Right now that context lives nowhere queryable.</p>
<p>Capi ingests your git history, incident reports, and PR descriptions and builds a knowledge graph that connects config keys to the reasoning, incidents, and decisions behind them. You query a config value, you get the full story.</p>
<p>It is not a chatbot. It is not a linter. It is a memory layer for decisions your team already made but never stored anywhere useful.</p>
<p><strong>Live:</strong> <a href="https://capi-bay.vercel.app">capi-bay.vercel.app</a><br /><strong>GitHub:</strong> <a href="https://github.com/Akarshkushwaha/Capi">github.com/Akarshkushwaha/Capi</a></p>
<hr />
<h2>What It Looks Like</h2>
<p>The dashboard opens with one question — what happened last night?</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a47aa6411f54475cf2b7746/4f30a940-6b60-4548-b119-6de5c6d59197.png" alt="" style="display:block;margin:0 auto" />

<p><em>The investigation form. Type any config key name, select your service, hit investigate.</em></p>
<p>Type <code>DB_POOL_SIZE</code>, hit investigate, and Capi pulls everything it knows — commits, PRs, incidents — into a Case File:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a47aa6411f54475cf2b7746/e7427b7d-2dc8-4f9a-88bf-08055229b66c.png" alt="" style="display:block;margin:0 auto" />

<p><em>The Case File. Danger score, safe operating range, archaeology provenance, prior offenses — all connected.</em></p>
<p>And if you want to see how everything links together, the Evidence Board shows the full knowledge graph Cognee built from your git history:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a47aa6411f54475cf2b7746/ccf06a9a-c2c2-4850-a153-fea95a995623.png" alt="" style="display:block;margin:0 auto" />

<p><em>The Evidence Board. Config keys (amber), incidents (red), engineers (blue) — all connected by strings of provenance.</em></p>
<hr />
<h2>Why Cognee and Not Just a Vector Database</h2>
<p>This is the part worth explaining properly.</p>
<p>My first thought was simple — embed all the git history and incident reports into a vector database, do semantic search, done. But that has a real problem.</p>
<p>Vector search finds text that is similar to your query. It can find documents that mention a config key. But it cannot answer "what incident caused this value to be set" — because that is a relationship question, not a similarity question.</p>
<p>To answer that you need to know that this config key was changed in this commit which happened right after this incident which was caused by this specific infrastructure problem. That chain of relationships is a graph traversal problem, not a search problem.</p>
<p><a href="https://cognee.ai">Cognee</a> builds a hybrid graph-vector knowledge store. It extracts entities from whatever you give it, maps relationships between them, and when you query it, automatically decides whether to use semantic similarity or graph traversal depending on what the question needs.</p>
<p>That is why I used Cognee specifically. Not because it was the hackathon sponsor. Because it is genuinely the right tool for this problem.</p>
<p>The entire API is four functions:</p>
<pre><code class="language-python">await cognee.remember()  # ingest into the knowledge graph
await cognee.recall()    # query with auto-routed retrieval
await cognee.improve()   # re-weight graph from outcomes
await cognee.forget()    # remove stale nodes
</code></pre>
<p>Everything Capi does sits on top of these four. Full quickstart at <a href="https://docs.cognee.ai">docs.cognee.ai</a> and source code at <a href="https://github.com/topoteretes/cognee">github.com/topoteretes/cognee</a>.</p>
<hr />
<h2>How Each Operation Maps to Capi</h2>
<p><strong>remember()</strong> takes your git log, PR descriptions, and incident reports and ingests them into the knowledge graph. Cognee does not just store the text — it extracts entities like config key names, dates, engineer names, incident IDs and builds a graph connecting them.</p>
<p><strong>recall()</strong> is what powers the query command. When you ask "why was this value set?", Cognee traverses the graph and returns the connected story — not just documents that mentioned the key, but the actual chain of who changed it, when, and why.</p>
<p><strong>improve()</strong> is the self-improving part. Every time a config change leads to an incident, Capi calls improve() with a negative signal. Every time a config change deploys cleanly, it calls improve() with a positive signal. The graph gets re-weighted over time. High-risk keys surface stronger warnings. The system gets smarter without anyone manually tuning it.</p>
<p><strong>forget()</strong> handles deprecation. When a service shuts down or a config key is removed, forget() surgically removes those nodes from the graph so you stop getting warnings about values that no longer exist.</p>
<hr />
<h2>How to Integrate Capi Into Your Workflow</h2>
<h3>Install</h3>
<pre><code class="language-bash">git clone https://github.com/Akarshkushwaha/Capi
cd Capi
pip install -r requirements.txt
cp .env.example .env
# Add your GROQ_API_KEY and GITHUB_TOKEN to .env
</code></pre>
<p>Cognee itself needs no external infrastructure:</p>
<pre><code class="language-bash">pip install cognee
</code></pre>
<p>All three stores — graph (Kuzu), vector (LanceDB), relational (SQLite) — are file-based and embedded. They initialize automatically on first run. No Docker, no Postgres, no Redis.</p>
<hr />
<h3>Step 1 — Ingest your repo</h3>
<img src="https://cdn.hashnode.com/uploads/covers/6a47aa6411f54475cf2b7746/77dc5d00-e714-430e-a1df-4f9d94ad2cff.png" alt="" style="display:block;margin:0 auto" />

<p>The line that got me was <code>Cognifying commit diffs</code>. Capi is not reading a .env file — it is walking backward through your entire git history, extracting commit patches and diff provenance, and building a memory graph on what actually happened over time.</p>
<hr />
<h3>Step 2 — Query any config key</h3>
<img src="https://cdn.hashnode.com/uploads/covers/6a47aa6411f54475cf2b7746/a388d246-d42c-45db-88b9-e9684bba9f6f.png" alt="" style="display:block;margin:0 auto" />

<p>That is the answer to "why is DB_POOL_SIZE=10 and not 20" — traced from git diff through PR through incident, in one query.</p>
<h3>Step 3 — Audit an entire config file before deploying</h3>
<img src="https://cdn.hashnode.com/uploads/covers/6a47aa6411f54475cf2b7746/3f1fdc91-6274-40b3-90ac-2aaba76516c6.png" alt="" style="display:block;margin:0 auto" />

<p>Two danger keys caught before the deploy even happens.</p>
<hr />
<h3>Step 4 — Record incidents to make Capi smarter</h3>
<p>When a config change causes a production issue:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a47aa6411f54475cf2b7746/f832cae0-7bfb-46ea-ab3f-a56c14b63155.png" alt="" style="display:block;margin:0 auto" />

<p>Next time anyone queries <code>DB_POOL_SIZE</code>, the warning will be stronger. The memory re-weighted itself. Nobody configured anything manually. That is what self-improving actually means.</p>
<hr />
<h2>What Surprised Me While Building This</h2>
<p>I underestimated how much Cognee does under the hood.</p>
<p>When you call remember(), it runs entity extraction, relationship mapping, and embedding generation in a single pipeline pass. The line <code>Cognifying commit diffs</code> in the ingest output was the moment it clicked — Capi was not storing text, it was building a memory graph on what actually happened in the git history. Config key nodes connected to incident nodes connected to engineer nodes, all from plain text commit messages and diff patches.</p>
<p>The recall() routing also surprised me. Ask "what is DB_POOL_SIZE set to" and it behaves like a search. Ask "what incident caused DB_POOL_SIZE to be set" and it switches to graph traversal. Same function, same API, completely different retrieval path underneath. You never specify which — Cognee picks based on the shape of the question.</p>
<hr />
<h2>The Stack</h2>
<pre><code class="language-plaintext">Memory       → Cognee open source (Kuzu + LanceDB + SQLite, all embedded)
LLM          → Groq llama-3.3-70b-versatile
Backend      → Python + FastAPI
CLI          → Typer + Rich
Git parsing  → GitPython
GitHub API   → PyGitHub
Dashboard    → Next.js + Tailwind + react-force-graph-2d
Deploy       → Render (backend) + Vercel (dashboard)
</code></pre>
<hr />
<h2>Links</h2>
<p><strong>Try Capi:</strong> <a href="https://capi-bay.vercel.app">capi-bay.vercel.app</a></p>
<p><strong>GitHub:</strong> <a href="https://github.com/Akarshkushwaha/Capi">github.com/Akarshkushwaha/Capi</a></p>
<p><strong>Cognee:</strong> <a href="https://cognee.ai">cognee.ai</a> · <a href="https://github.com/topoteretes/cognee">GitHub</a> · <a href="https://docs.cognee.ai">Docs</a></p>
<hr />
<h2>Why This Matters</h2>
<p>Config values are boring. Nobody writes about them. But a lot of production incidents have "someone changed a config value they didn't fully understand" somewhere in the timeline.</p>
<p>The context that would have prevented it existed. It was just never connected into something queryable.</p>
<p>Capi is an attempt to fix that — a memory layer that persists, learns from outcomes, and gets smarter over time instead of just being a fancier grep over your git history.</p>
<p>If you've ever stared at a mystery config value at 2am wondering if touching it will break everything — that's who I built this for.</p>
<hr />
<p><em>Built for the Hangover Hackathon —</em> <a href="https://twitter.com/WeMakeDevs"><em>@WeMakeDevs</em></a> <em>x</em> <a href="https://x.com/cognee_">@cognee</a></p>
]]></content:encoded></item></channel></rss>