<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gowtham</title>
    <description>The latest articles on DEV Community by Gowtham (@gowtham09).</description>
    <link>https://dev.to/gowtham09</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3925620%2F0575366f-a40c-434b-95e8-b6939b70bd79.jpg</url>
      <title>DEV Community: Gowtham</title>
      <link>https://dev.to/gowtham09</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gowtham09"/>
    <language>en</language>
    <item>
      <title>Building a Local Markdown Memory Layer for AI Agents</title>
      <dc:creator>Gowtham</dc:creator>
      <pubDate>Mon, 11 May 2026 18:34:24 +0000</pubDate>
      <link>https://dev.to/gowtham09/building-a-local-markdown-memory-layer-for-ai-agents-544</link>
      <guid>https://dev.to/gowtham09/building-a-local-markdown-memory-layer-for-ai-agents-544</guid>
      <description>&lt;p&gt;I kept running into the same problem with AI coding agents.&lt;/p&gt;

&lt;p&gt;The agents were getting better, but every new session still felt like starting&lt;br&gt;
from zero.&lt;/p&gt;

&lt;p&gt;I would explain the repo again. Then my preferences again. Then the decisions we&lt;br&gt;
already made. Then why we avoided some shortcut. Then the source material I&lt;br&gt;
wanted the agent to use.&lt;/p&gt;

&lt;p&gt;After doing that enough times, I started thinking less about "better prompts"&lt;br&gt;
and more about memory.&lt;/p&gt;

&lt;p&gt;Not memory as a magic model feature. Not memory hidden inside some hosted black&lt;br&gt;
box. I wanted something boring and inspectable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;raw sources on disk
compiled Markdown wiki
agent tools that query the wiki
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That became &lt;a href="https://github.com/gowtham0992/link" rel="noopener noreferrer"&gt;Link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Link is a local-first Markdown wiki and MCP server for agent memory. The goal is&lt;br&gt;
simple: keep useful context outside the chat window, but still make it visible,&lt;br&gt;
editable, source-backed, and owned by the user.&lt;/p&gt;

&lt;p&gt;This is one approach. It is not the only correct architecture for agent memory.&lt;br&gt;
But it is the one I wanted as a developer using local agents every day.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem: Agents Forget The Work Around The Work
&lt;/h2&gt;

&lt;p&gt;When people talk about agent memory, the first examples are usually preferences:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use short answers.
Prefer TypeScript.
Use pytest.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those matter, but they are only part of the problem.&lt;/p&gt;

&lt;p&gt;The more expensive context is the work around the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why a project is structured a certain way&lt;/li&gt;
&lt;li&gt;which decisions were already made&lt;/li&gt;
&lt;li&gt;which paths were tried and rejected&lt;/li&gt;
&lt;li&gt;what the user cares about&lt;/li&gt;
&lt;li&gt;what source material supports a claim&lt;/li&gt;
&lt;li&gt;what should be remembered globally versus only for one project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an agent does not know that context, it can still produce code. But it often&lt;br&gt;
produces the kind of code you have to steer back into place.&lt;/p&gt;

&lt;p&gt;So I wanted memory that was not just "store a fact." I wanted memory with shape:&lt;br&gt;
scope, source, review status, graph links, and a way to explain why it exists.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I Did Not Start With A Database
&lt;/h2&gt;

&lt;p&gt;I like databases. Link even uses SQLite FTS for fast local search when it is&lt;br&gt;
available.&lt;/p&gt;

&lt;p&gt;But I did not want the primary storage format to be a database.&lt;/p&gt;

&lt;p&gt;For personal agent memory, I wanted the source of truth to be boring files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;easy to inspect&lt;/li&gt;
&lt;li&gt;easy to diff&lt;/li&gt;
&lt;li&gt;easy to back up&lt;/li&gt;
&lt;li&gt;easy to edit by hand&lt;/li&gt;
&lt;li&gt;usable in Obsidian or any Markdown editor&lt;/li&gt;
&lt;li&gt;safe to keep local&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why Link uses Markdown as the storage layer.&lt;/p&gt;

&lt;p&gt;A database can be an index. A model can help compile. But the memory itself&lt;br&gt;
should not require trusting an opaque system.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Pattern: Raw Sources Become A Wiki
&lt;/h2&gt;

&lt;p&gt;The idea that pushed me in this direction was Andrej Karpathy's&lt;br&gt;
&lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;LLM Wiki pattern&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The pattern, as I understand it, is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;raw sources -&amp;gt; structured wiki -&amp;gt; better retrieval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The raw source stays around. The agent turns it into clean pages. The pages link&lt;br&gt;
to each other. Later, the agent can retrieve the compiled knowledge instead of&lt;br&gt;
reading a pile of random notes again.&lt;/p&gt;

&lt;p&gt;Link follows that pattern, but with a stronger product frame:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The wiki is the storage format.
The product is local memory for agents.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction mattered a lot while building it. If Link is only a wiki, the&lt;br&gt;
user still has to imagine how an agent should use it. If Link is agent memory,&lt;br&gt;
then the system needs lifecycle, review, recall, explain, and validation.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Storage Model
&lt;/h2&gt;

&lt;p&gt;The on-disk layout is intentionally plain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;link/
  raw/
  wiki/
    sources/
    concepts/
    entities/
    explorations/
    comparisons/
    memories/
    _backlinks.json
    index.md
    log.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer has a job.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;raw/&lt;/code&gt; is for original material: notes, transcripts, articles, PDFs,&lt;br&gt;
screenshots, project notes, session captures, anything the user wants the agent&lt;br&gt;
to learn from.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wiki/sources/&lt;/code&gt; is for normalized source pages. One raw file should map to one&lt;br&gt;
source page, so the provenance stays clear.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wiki/concepts/&lt;/code&gt;, &lt;code&gt;wiki/entities/&lt;/code&gt;, &lt;code&gt;wiki/explorations/&lt;/code&gt;, and&lt;br&gt;
&lt;code&gt;wiki/comparisons/&lt;/code&gt; are compiled knowledge pages.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wiki/memories/&lt;/code&gt; is for durable memory: preferences, decisions, project facts,&lt;br&gt;
and notes the user explicitly wants future agents to recall.&lt;/p&gt;

&lt;p&gt;This separation is important. A raw source is not automatically a memory. A&lt;br&gt;
source can support many pages. A memory should be tighter and more intentional.&lt;/p&gt;

&lt;p&gt;For example, one meeting note might become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a source page for the meeting&lt;/li&gt;
&lt;li&gt;a concept page for the feature&lt;/li&gt;
&lt;li&gt;a memory saying the project chose option B&lt;/li&gt;
&lt;li&gt;backlinks between the project, people, feature, and decision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is much more useful than dumping the original meeting note into every&lt;br&gt;
future prompt.&lt;/p&gt;
&lt;h2&gt;
  
  
  "Remember This" Is Not Just A Write
&lt;/h2&gt;

&lt;p&gt;One thing I underestimated early: memory needs a lifecycle.&lt;/p&gt;

&lt;p&gt;The naive version is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user says remember -&amp;gt; write text somewhere -&amp;gt; retrieve later
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not enough.&lt;/p&gt;

&lt;p&gt;Real memory needs something closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;capture -&amp;gt; propose -&amp;gt; approve -&amp;gt; recall -&amp;gt; explain -&amp;gt; update -&amp;gt; archive/forget
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Link, a memory is a Markdown page with metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;type: preference, decision, project, fact, or note&lt;/li&gt;
&lt;li&gt;scope: user, project, or global&lt;/li&gt;
&lt;li&gt;project key when relevant&lt;/li&gt;
&lt;li&gt;source/provenance&lt;/li&gt;
&lt;li&gt;review status&lt;/li&gt;
&lt;li&gt;active or archived lifecycle state&lt;/li&gt;
&lt;li&gt;tags and aliases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This lets an agent ask better questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this memory reviewed?&lt;/li&gt;
&lt;li&gt;Is it project-specific?&lt;/li&gt;
&lt;li&gt;Does it conflict with another memory?&lt;/li&gt;
&lt;li&gt;Should this update an existing memory instead of creating a duplicate?&lt;/li&gt;
&lt;li&gt;Why does Link know this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last question matters. If an agent is going to use memory, I want to be&lt;br&gt;
able to ask where it came from and whether it is still safe to rely on.&lt;/p&gt;
&lt;h2&gt;
  
  
  MCP Is The Interface Agents Needed
&lt;/h2&gt;

&lt;p&gt;Markdown is good for storage, but agents need tools.&lt;/p&gt;

&lt;p&gt;That is where MCP became useful. Link ships an MCP server called&lt;br&gt;
&lt;a href="https://pypi.org/project/link-mcp/" rel="noopener noreferrer"&gt;&lt;code&gt;link-mcp&lt;/code&gt;&lt;/a&gt;, listed on the MCP Registry as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;io.github.gowtham0992/link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important tools are workflow-shaped, not just search-shaped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;link_status&lt;/code&gt;: check whether Link is ready&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;starter_prompts&lt;/code&gt;: tell a new user what to ask next&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ingest_status&lt;/code&gt;: inspect raw files and guided ingest state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;query_link&lt;/code&gt;: build an answer-ready context packet&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;memory_brief&lt;/code&gt;: prime an agent before work&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;remember_memory&lt;/code&gt;: save explicit memory with duplicate/conflict checks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;propose_memories&lt;/code&gt;: generate candidates without writing them&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;memory_inbox&lt;/code&gt;: show memories needing review&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;explain_memory&lt;/code&gt;: audit why a memory exists&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;validate_wiki&lt;/code&gt;: validate generated pages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_graph_summary&lt;/code&gt;: inspect a bounded graph neighborhood&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means Codex, Kiro, Claude, Cursor, VS Code, Copilot, or any MCP-capable&lt;br&gt;
client can use the same local memory.&lt;/p&gt;

&lt;p&gt;The memory does not belong to one chat app. It lives on disk.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Query Packet Was The Key Product Detail
&lt;/h2&gt;

&lt;p&gt;One easy mistake is to treat memory retrieval as "find everything relevant and&lt;br&gt;
stuff it into context."&lt;/p&gt;

&lt;p&gt;That sounds reasonable until the wiki grows.&lt;/p&gt;

&lt;p&gt;So Link's main retrieval path is &lt;code&gt;query_link&lt;/code&gt;. It returns a budgeted packet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;relevant memories&lt;/li&gt;
&lt;li&gt;ranked wiki pages&lt;/li&gt;
&lt;li&gt;graph-neighborhood context&lt;/li&gt;
&lt;li&gt;why each item was selected&lt;/li&gt;
&lt;li&gt;estimated packet size&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;has_more&lt;/code&gt; indicators&lt;/li&gt;
&lt;li&gt;follow-up actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;link &lt;/span&gt;query &lt;span class="s2"&gt;"what should I know before changing the MCP tools?"&lt;/span&gt; &lt;span class="nt"&gt;--budget&lt;/span&gt; small
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Through MCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"query_link"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"what should I know before changing the MCP tools?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"budget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"small"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"link"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent gets enough context to move, but not so much that the answer becomes a&lt;br&gt;
giant context dump. If it needs more, the packet includes follow-up actions.&lt;/p&gt;

&lt;p&gt;That design decision made Link feel more like an agent memory layer and less&lt;br&gt;
like a folder search wrapper.&lt;/p&gt;
&lt;h2&gt;
  
  
  Trust And Safety Are Part Of Memory
&lt;/h2&gt;

&lt;p&gt;If memory is wrong, stale, or mysterious, it becomes dangerous.&lt;/p&gt;

&lt;p&gt;So Link tries to keep the trust model practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no telemetry&lt;/li&gt;
&lt;li&gt;no hosted backend&lt;/li&gt;
&lt;li&gt;no required cloud account&lt;/li&gt;
&lt;li&gt;raw files stay local&lt;/li&gt;
&lt;li&gt;generated pages are plain Markdown&lt;/li&gt;
&lt;li&gt;memory writes check duplicates and conflicts&lt;/li&gt;
&lt;li&gt;secret-looking values are detected before ingest/capture&lt;/li&gt;
&lt;li&gt;validation checks frontmatter, required sections, dead links, and backlinks&lt;/li&gt;
&lt;li&gt;backups exclude raw sources by default unless the user explicitly includes them&lt;/li&gt;
&lt;li&gt;the local web server binds to &lt;code&gt;127.0.0.1&lt;/code&gt; and is not meant to be exposed publicly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is intentional. Link's web UI is a local viewer, not a hosted&lt;br&gt;
team app. It has no login system. That is fine for loopback personal use. It&lt;br&gt;
would not be fine as a public server.&lt;/p&gt;

&lt;p&gt;I would rather state that boundary clearly than pretend the tool is something it&lt;br&gt;
is not.&lt;/p&gt;
&lt;h2&gt;
  
  
  Performance: Good Enough For Personal Memory, Not Magic
&lt;/h2&gt;

&lt;p&gt;The current version is fast for the scale I am targeting right now: personal and&lt;br&gt;
project memory.&lt;/p&gt;

&lt;p&gt;Link uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQLite FTS-backed search when available&lt;/li&gt;
&lt;li&gt;token-index fallback when SQLite FTS is unavailable&lt;/li&gt;
&lt;li&gt;persistent parsed-page cache&lt;/li&gt;
&lt;li&gt;incremental cache reuse&lt;/li&gt;
&lt;li&gt;bounded graph summaries&lt;/li&gt;
&lt;li&gt;large-wiki smoke tests&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;link benchmark&lt;/code&gt; for local performance checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test suite includes a synthetic 1,000-page wiki smoke test. On my machine,&lt;br&gt;
interactive operations are fast at that size.&lt;/p&gt;

&lt;p&gt;But I do not want to overclaim. Link is not designed today for a 100,000-page&lt;br&gt;
enterprise corpus. Some indexes are still materialized in memory. For local&lt;br&gt;
personal/project use, that tradeoff is fine. For much larger wikis, I would want&lt;br&gt;
more persistent and lazy indexing.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Trying It Looks Like
&lt;/h2&gt;

&lt;p&gt;On macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;gowtham0992/link/link
&lt;span class="nb"&gt;link &lt;/span&gt;demo
&lt;span class="nb"&gt;link &lt;/span&gt;serve link-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/gowtham0992/link.git
&lt;span class="nb"&gt;cd link
&lt;/span&gt;python3 link.py demo
python3 link.py serve link-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The demo creates a finished local wiki with raw sources, wiki pages, one starter&lt;br&gt;
memory, backlinks, graph data, and query packets.&lt;/p&gt;

&lt;p&gt;After that, the CLI loop looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;link &lt;/span&gt;ingest-status
&lt;span class="nb"&gt;link &lt;/span&gt;brief &lt;span class="s2"&gt;"working on Link release"&lt;/span&gt;
&lt;span class="nb"&gt;link &lt;/span&gt;query &lt;span class="s2"&gt;"what should I know before changing the graph view?"&lt;/span&gt; &lt;span class="nt"&gt;--budget&lt;/span&gt; small
&lt;span class="nb"&gt;link &lt;/span&gt;remember &lt;span class="s2"&gt;"Use short release notes for public updates."&lt;/span&gt; &lt;span class="nt"&gt;--type&lt;/span&gt; preference &lt;span class="nt"&gt;--scope&lt;/span&gt; project &lt;span class="nt"&gt;--project&lt;/span&gt; &lt;span class="nb"&gt;link
link &lt;/span&gt;validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside an MCP-enabled agent, it can be more natural:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;is Link ready?
brief me from Link before we continue
ingest raw/notes.md into Link
remember that I prefer short release notes
query Link for the release process
what does Link remember about local personal memory?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user should not have to memorize all the paths. The agent should learn the&lt;br&gt;
workflow and use the tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The main lesson: agent memory is less about storing text and more about&lt;br&gt;
discipline.&lt;/p&gt;

&lt;p&gt;It is easy to save something.&lt;/p&gt;

&lt;p&gt;It is harder to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;should this be remembered?&lt;/li&gt;
&lt;li&gt;who approved it?&lt;/li&gt;
&lt;li&gt;what source supports it?&lt;/li&gt;
&lt;li&gt;is it project-specific?&lt;/li&gt;
&lt;li&gt;is it stale?&lt;/li&gt;
&lt;li&gt;does it conflict with something older?&lt;/li&gt;
&lt;li&gt;can the agent explain why it knows this?&lt;/li&gt;
&lt;li&gt;can the user archive or delete it later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions pushed Link toward simple primitives: files, frontmatter,&lt;br&gt;
backlinks, validation, review state, and MCP tools.&lt;/p&gt;

&lt;p&gt;That may not be the flashiest design. But I think boring is underrated here.&lt;/p&gt;

&lt;p&gt;If an AI agent is going to remember things about me and my work, I want that&lt;br&gt;
memory to be visible, source-backed, correctable, and mine.&lt;/p&gt;

&lt;p&gt;If you try it, I’d love feedback on the memory workflow more than anything else: what should be remembered, what should stay as source-backed wiki knowledge, and where the review step feels too heavy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/gowtham0992/link" rel="noopener noreferrer"&gt;https://github.com/gowtham0992/link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://gowtham0992.github.io/link/" rel="noopener noreferrer"&gt;https://gowtham0992.github.io/link/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP Registry: &lt;a href="https://registry.modelcontextprotocol.io/?q=io.github.gowtham0992%2Flink" rel="noopener noreferrer"&gt;https://registry.modelcontextprotocol.io/?q=io.github.gowtham0992%2Flink&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/link-mcp/" rel="noopener noreferrer"&gt;https://pypi.org/project/link-mcp/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Karpathy's LLM Wiki gist: &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
