<?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: slxca</title>
    <description>The latest articles on DEV Community by slxca (@sluca).</description>
    <link>https://dev.to/sluca</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1302551%2Fd862a793-b912-41a0-abdb-45f5396ba87e.jpeg</url>
      <title>DEV Community: slxca</title>
      <link>https://dev.to/sluca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sluca"/>
    <language>en</language>
    <item>
      <title>Why I Stopped Using Vector RAG for Coding Agents (And Used Git Markdown Instead)</title>
      <dc:creator>slxca</dc:creator>
      <pubDate>Sun, 30 Aug 2026 21:38:22 +0000</pubDate>
      <link>https://dev.to/sluca/why-i-stopped-using-vector-rag-for-coding-agents-and-used-git-markdown-instead-4ob1</link>
      <guid>https://dev.to/sluca/why-i-stopped-using-vector-rag-for-coding-agents-and-used-git-markdown-instead-4ob1</guid>
      <description>&lt;p&gt;If you use Cursor, Claude Code, or Windsurf daily, you’ve probably hit this wall:&lt;/p&gt;

&lt;p&gt;You spend 45 minutes explaining your architecture, your API contracts, and why you &lt;em&gt;never&lt;/em&gt; use a certain library pattern. The agent gets it, writes great code, and you finish the feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next morning, in a fresh session:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Let's implement this! I will use [the exact pattern you ruled out yesterday] and rebuild [a helper function that already exists]."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It feels like babysitting a brilliant junior engineer with amnesia.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Two Usual "Solutions" (And Why They Break)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. The Giant &lt;code&gt;CLAUDE.md&lt;/code&gt; / &lt;code&gt;.cursorrules&lt;/code&gt; Dump
&lt;/h4&gt;

&lt;p&gt;The first instinct is dumping every rule, schema, and architectural pattern into a project instructions file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem:&lt;/strong&gt; It murders your baseline token usage. Every single prompt sends 4,000+ tokens of context before you even type "fix this bug". Worse, models suffer from &lt;strong&gt;context dilution&lt;/strong&gt;—when everything is in the prompt, nothing is prioritized.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Vector DBs &amp;amp; Semantic RAG
&lt;/h4&gt;

&lt;p&gt;The second instinct is building or adopting a vector-based memory tool (embedding chunks of past chats/code).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem:&lt;/strong&gt; &lt;strong&gt;Semantic similarity $\neq$ authoritative truth.&lt;/strong&gt;
If you refactored an auth flow three times, a vector search for &lt;em&gt;"how does auth work"&lt;/em&gt; will retrieve all three versions with near-identical similarity scores. The agent cannot distinguish between a deprecated experiment and today’s standard.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What Actually Works: Deterministic, Topic-Scoped Markdown via MCP
&lt;/h3&gt;

&lt;p&gt;Instead of guessing via embeddings or overloading the system prompt, the cleanest architecture treats &lt;strong&gt;agent memory like codebase documentation&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
.opencontext/
├── architecture.md
├── api-contracts.md
├── state-management.md
└── rejected-approaches.md

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  How it works under the hood:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
[New Coding Session]
│
▼

1. Agent queries MCP index (~100 tokens)
("Available topics: architecture, api-contracts, state-management...")
│
▼
2. Agent fetches ONLY what it needs for the current task
(e.g., read_context("api-contracts"))
│
▼
3. Agent writes code adhering to exact invariants
│
▼
4. Architectural change? Agent mutates the markdown file in-place

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  The 3 Core Principles
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Index-First Token Gating
&lt;/h4&gt;

&lt;p&gt;Instead of dumping 15 KB of architectural docs into the system prompt, the agent starts every session with a tiny, auto-generated index:&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;"topics"&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="s2"&gt;"auth-flow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error-handling"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"database-conventions"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&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;&lt;em&gt;Cost: ~100 tokens.&lt;/em&gt; The model calls &lt;code&gt;read_context("auth-flow")&lt;/code&gt; &lt;strong&gt;only if&lt;/strong&gt; the prompt touches authentication.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. In-Place Mutation over Infinite Append
&lt;/h4&gt;

&lt;p&gt;Vectors fail because they append indefinitely. With topic-scoped markdown files, the agent updates the existing document when an architectural decision changes. &lt;strong&gt;There are no competing versions in vector space.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Git as the Universal Sync Layer
&lt;/h4&gt;

&lt;p&gt;Because memory is just flat &lt;code&gt;.md&lt;/code&gt; files inside the repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Cloud Lock-in:&lt;/strong&gt; No API keys, no external vector databases, no extra monthly subscriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR Reviews for AI Memory:&lt;/strong&gt; When an agent updates &lt;code&gt;.opencontext/api-contracts.md&lt;/code&gt;, it shows up directly in your GitHub pull request diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Agent Parity:&lt;/strong&gt; You can start a task in Claude Code, commit your branch, open Cursor, and Cursor's MCP server immediately reads the exact same context.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Example: Setting Up Local MCP Memory
&lt;/h3&gt;

&lt;p&gt;You can connect a lightweight local MCP server to Cursor or Claude Code in seconds.&lt;/p&gt;

&lt;p&gt;In your &lt;code&gt;claude.json&lt;/code&gt; or Cursor MCP settings:&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;"mcpServers"&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;"opencontext"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"opencontext-mcp"&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="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;Now, instead of re-explaining constraints, you can simply tell your agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Check the database conventions in our context and scaffold the new user billing schema."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent checks the index, reads &lt;code&gt;.opencontext/database-conventions.md&lt;/code&gt;, adheres to your patterns, and moves on.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion &amp;amp; Discussion
&lt;/h3&gt;

&lt;p&gt;We don't need complex vector pipelines for single-repository agent memory.&lt;/p&gt;

&lt;p&gt;Plain text in Git has been the source of truth for software engineering for 20 years. Giving agents deterministic read/write access to structured markdown via MCP solves context persistence without the overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How are you currently preventing your coding agents from losing context across sessions? Are you sticking with static rule files, using RAG, or building internal tools?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>coding</category>
      <category>llm</category>
    </item>
    <item>
      <title>Why WHOIS is Deprecating and How to Use RDAP in Java</title>
      <dc:creator>slxca</dc:creator>
      <pubDate>Thu, 16 Jul 2026 02:17:13 +0000</pubDate>
      <link>https://dev.to/sluca/why-whois-is-deprecating-and-how-to-use-rdap-in-java-58lg</link>
      <guid>https://dev.to/sluca/why-whois-is-deprecating-and-how-to-use-rdap-in-java-58lg</guid>
      <description>&lt;h2&gt;
  
  
  The Problem with WHOIS
&lt;/h2&gt;

&lt;p&gt;For decades, the WHOIS protocol was the go-to solution to check domain ownership, IP address allocations, and Autonomous System Numbers (ASNs). However, WHOIS has a massive flaw: it lacks a standardized format. Parsing plain text responses from hundreds of different registries is an absolute nightmare.&lt;br&gt;
Enter RDAP (Registration Data Access Protocol). It’s the official, modern successor to WHOIS. It runs over HTTP and delivers responses in structured JSON.&lt;/p&gt;
&lt;h2&gt;
  
  
  Introducing rdap-java
&lt;/h2&gt;

&lt;p&gt;While working on infrastructure and DNS monitoring utilities, I realized that existing Java solutions for RDAP were either part of massive, bloated frameworks or heavily outdated.&lt;br&gt;
To solve this, I built rdap-java—a lightweight, dependency-minimal client specifically designed to fetch and map RDAP data cleanly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Quick Code Example
&lt;/h2&gt;

&lt;p&gt;Here is how simple it is to look up a domain using the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Quick draft example of querying a domain&lt;/span&gt;
&lt;span class="nc"&gt;RdapClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RdapClient&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;DomainResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queryDomain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"github.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Registrar: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRegistrarName&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Status: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStatus&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Note: Feel free to adjust this snippet to match your exact API syntax!)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source &amp;amp; Feedback
&lt;/h2&gt;

&lt;p&gt;The project is fully open-source under the MIT license. If you are building anything in the networking, DevOps, or cybersecurity space with Java, I’d love for you to try it out.&lt;br&gt;
Check out the repository here: &lt;a href="https://github.com/slxca/rdap-java" rel="noopener noreferrer"&gt;https://github.com/slxca/rdap-java&lt;/a&gt;&lt;br&gt;
What features should I add next? Let me know in the comments!&lt;/p&gt;

</description>
      <category>java</category>
      <category>opensource</category>
      <category>networking</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
