<?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 WHOIS Is Dead in Modern Java (And How to Check Domains with RDAP)</title>
      <dc:creator>slxca</dc:creator>
      <pubDate>Thu, 17 Sep 2026 19:57:19 +0000</pubDate>
      <link>https://dev.to/sluca/why-whois-is-dead-in-modern-java-and-how-to-check-domains-with-rdap-38g4</link>
      <guid>https://dev.to/sluca/why-whois-is-dead-in-modern-java-and-how-to-check-domains-with-rdap-38g4</guid>
      <description>&lt;p&gt;If you have ever needed to programmatically check domain registration status or look up authoritative nameservers in Java, you likely ran into the same painful legacy protocol: &lt;strong&gt;WHOIS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For decades, checking a domain meant opening a raw TCP socket on &lt;strong&gt;port 43&lt;/strong&gt;, sending a query, and parsing completely unstructured plain-text responses. Every domain registry formats their output differently, meaning your code breaks the moment a registrar updates their whitespace, disclaimer, or field naming.&lt;/p&gt;

&lt;p&gt;Fortunately, ICANN designated WHOIS as deprecated and introduced &lt;strong&gt;RDAP (Registration Data Access Protocol)&lt;/strong&gt; as its official successor. &lt;/p&gt;

&lt;p&gt;Here is why RDAP is superior and how to use it cleanly in Java without framework bloat.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why RDAP Changes Everything
&lt;/h3&gt;

&lt;p&gt;RDAP modernizes registry lookups by replacing ad-hoc text streams with established web standards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standard HTTP(S):&lt;/strong&gt; Queries run over standard port &lt;code&gt;443&lt;/code&gt; using simple &lt;code&gt;GET&lt;/code&gt; requests. No firewall issues blocking port 43.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict JSON Schema:&lt;/strong&gt; Responses adhere to standardized JSON formats (defined in RFC 9083), eliminating brittle regex parsing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standardized Status Codes:&lt;/strong&gt; Determining whether a domain is taken is straightforward:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HTTP 200 OK&lt;/code&gt; = Registered / Exists&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HTTP 404 Not Found&lt;/code&gt; = Available&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universal Discovery via IANA:&lt;/strong&gt; You do not need to hardcode WHOIS server hostnames. IANA maintains a centralized bootstrap registry mapping TLDs to their authoritative RDAP endpoints.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Problem with Java RDAP Libraries
&lt;/h3&gt;

&lt;p&gt;While RDAP itself is a massive upgrade, the Java ecosystem historically lacked a simple, focused client:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Abandoned projects:&lt;/strong&gt; Several early RDAP implementations have not received updates in years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RFC Overkill:&lt;/strong&gt; Many attempts try to implement every single RFC extension (complex vCard parsers, ASN allocations, IPv6 subnet blocks), turning a simple domain check into a heavy multi-megabyte dependency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual Bootstrap Routing:&lt;/strong&gt; Writing the logic to query IANA bootstrap files, cache them thread-safely, and handle edge-case ccTLDs requires non-trivial boilerplate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To solve this, I built &lt;strong&gt;&lt;code&gt;rdap-java&lt;/code&gt;&lt;/strong&gt;—a lightweight (~5 KB) client built on top of native Java 11+ &lt;code&gt;HttpClient&lt;/code&gt; and basic JSON parsing.&lt;/p&gt;




&lt;h3&gt;
  
  
  Quick Implementation Guide
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Add Dependency
&lt;/h4&gt;

&lt;p&gt;Available directly on Maven Central:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maven:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.slxca&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;rdap-java&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gradle:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'com.slxca:rdap-java:1.0.0'&lt;/span&gt;

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

&lt;/div&gt;






&lt;h4&gt;
  
  
  2. Check Domain Availability
&lt;/h4&gt;

&lt;p&gt;Checking if a domain is registered takes just a few lines:&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="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.slxca.rdap.RDAPClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.slxca.rdap.RDAPResult&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.slxca.rdap.RDAPException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DomainService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&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="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;RDAPResult&lt;/span&gt; &lt;span class="n"&gt;result&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;checkDomain&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isRegistered&lt;/span&gt;&lt;span class="o"&gt;())&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="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDomain&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" is already taken."&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;"Queried Endpoint: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getServerUrl&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDomain&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" is available!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RDAPException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&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;err&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;"Lookup failed: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;






&lt;h4&gt;
  
  
  3. Inspect Nameservers
&lt;/h4&gt;

&lt;p&gt;If you are validating DNS setup or migration pipelines, you can extract authoritative nameservers directly from the parsed response:&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="nc"&gt;RDAPResult&lt;/span&gt; &lt;span class="n"&gt;result&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;checkDomain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cloudflare.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isRegistered&lt;/span&gt;&lt;span class="o"&gt;())&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;"Authoritative Nameservers:"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ns&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNameservers&lt;/span&gt;&lt;span class="o"&gt;())&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;" -&amp;gt; "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ns&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;






&lt;h3&gt;
  
  
  Handling Fallbacks &amp;amp; Custom Registries
&lt;/h3&gt;

&lt;p&gt;Most major gTLDs (&lt;code&gt;.com&lt;/code&gt;, &lt;code&gt;.net&lt;/code&gt;, &lt;code&gt;.org&lt;/code&gt;) and newer extensions are automatically resolved via the IANA bootstrap registry.&lt;/p&gt;

&lt;p&gt;However, some ccTLDs (such as &lt;code&gt;.de&lt;/code&gt;, &lt;code&gt;.ch&lt;/code&gt;, or &lt;code&gt;.nl&lt;/code&gt;) operate their own RDAP services outside the centralized IANA bootstrap list. &lt;code&gt;rdap-java&lt;/code&gt; comes with curated built-in fallbacks for these registries, and also allows manual overrides for private or internal registries:&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;// Register or override a custom endpoint at runtime&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;registerServer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"customtld"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[https://rdap.example-registry.net/rdap/](https://rdap.example-registry.net/rdap/)"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;RDAPResult&lt;/span&gt; &lt;span class="n"&gt;result&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;checkDomain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"app.customtld"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

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

&lt;/div&gt;






&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;If your Java application still relies on socket connections to port 43 or parsing raw WHOIS text files, migrating to RDAP is long overdue.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/slxca/rdap-java" rel="noopener noreferrer"&gt;slxca/rdap-java&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maven Central:&lt;/strong&gt; &lt;a href="https://central.sonatype.com/artifact/com.slxca/rdap-java" rel="noopener noreferrer"&gt;com.slxca:rdap-java&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feedback, edge-case TLD reports, and contributions are always welcome!&lt;/p&gt;

</description>
      <category>java</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <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>
