<?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: Om Kawale</title>
    <description>The latest articles on DEV Community by Om Kawale (@om_kawale_b6627244a50e4b6).</description>
    <link>https://dev.to/om_kawale_b6627244a50e4b6</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%2F2614249%2F3d26e5ca-40ee-40c0-8ca8-4e2080a9df80.jpg</url>
      <title>DEV Community: Om Kawale</title>
      <link>https://dev.to/om_kawale_b6627244a50e4b6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/om_kawale_b6627244a50e4b6"/>
    <language>en</language>
    <item>
      <title>KODA Format: A Schema-First Data Format to Reduce LLM Token Usage ( 40%)</title>
      <dc:creator>Om Kawale</dc:creator>
      <pubDate>Mon, 04 May 2026 08:28:00 +0000</pubDate>
      <link>https://dev.to/om_kawale_b6627244a50e4b6/koda-a-schema-first-data-format-to-reduce-llm-token-usage-40-30mf</link>
      <guid>https://dev.to/om_kawale_b6627244a50e4b6/koda-a-schema-first-data-format-to-reduce-llm-token-usage-40-30mf</guid>
      <description>&lt;p&gt;When building applications with large language models (LLMs), one of the most overlooked costs is how structured data is represented.&lt;/p&gt;

&lt;p&gt;Most systems use JSON.&lt;/p&gt;

&lt;p&gt;And JSON is inefficient for LLM input.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is KODA?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;KODA (Knowledge-Oriented Data Abstraction)&lt;/strong&gt; is a schema-first data format designed to reduce token usage when sending structured data to LLMs.&lt;/p&gt;

&lt;p&gt;It works by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defining structure once (schema-first)&lt;/li&gt;
&lt;li&gt;Encoding values positionally&lt;/li&gt;
&lt;li&gt;Eliminating repeated keys found in JSON&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KODA is optimized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG pipelines&lt;/li&gt;
&lt;li&gt;Tool calling systems&lt;/li&gt;
&lt;li&gt;Agent workflows&lt;/li&gt;
&lt;li&gt;High-volume structured LLM input&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Problem with JSON in LLM Pipelines
&lt;/h2&gt;

&lt;p&gt;JSON repeats field names for every record.&lt;/p&gt;

&lt;p&gt;Example:&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="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open"&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="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"closed"&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;Each object repeats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id&lt;/li&gt;
&lt;li&gt;title&lt;/li&gt;
&lt;li&gt;state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you send 1000 records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;those keys are repeated 1000 times&lt;/li&gt;
&lt;li&gt;tokens are wasted&lt;/li&gt;
&lt;li&gt;costs increase&lt;/li&gt;
&lt;li&gt;context window shrinks&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  KODA Equivalent
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KODA/1
@META
schemas:issue
counts:issue=3

@SCHEMA
issue:id title state

@DATA:issue
1|Bug|open
2|Fix|closed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No repeated keys.&lt;/p&gt;

&lt;p&gt;Only structure + values.&lt;/p&gt;




&lt;h2&gt;
  
  
  Token Reduction Benchmark
&lt;/h2&gt;

&lt;p&gt;Measured using a gpt-4o-mini tokenizer on real datasets.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;JSON Tokens&lt;/th&gt;
&lt;th&gt;KODA Tokens&lt;/th&gt;
&lt;th&gt;Reduction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repetitive Logs&lt;/td&gt;
&lt;td&gt;3202&lt;/td&gt;
&lt;td&gt;1233&lt;/td&gt;
&lt;td&gt;61.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Issues&lt;/td&gt;
&lt;td&gt;4137&lt;/td&gt;
&lt;td&gt;2576&lt;/td&gt;
&lt;td&gt;37.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small Dataset&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;-34.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Key insight
&lt;/h3&gt;

&lt;p&gt;KODA performs best on large, repetitive structured data.&lt;/p&gt;

&lt;p&gt;For small datasets, schema overhead can outweigh benefits.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;In LLM systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tokens = cost&lt;/li&gt;
&lt;li&gt;Tokens = latency&lt;/li&gt;
&lt;li&gt;Tokens = context capacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reducing tokens by ~30–40%:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lowers API costs&lt;/li&gt;
&lt;li&gt;increases usable context&lt;/li&gt;
&lt;li&gt;improves system efficiency&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How KODA Works
&lt;/h2&gt;

&lt;p&gt;KODA separates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schema → defined once&lt;/li&gt;
&lt;li&gt;Data → streamed positionally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This removes structural redundancy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Python Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;koda&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;

&lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optional&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;active&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alice@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;koda_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;koda_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  KODA vs JSON vs YAML vs TOON
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Token Efficiency&lt;/th&gt;
&lt;th&gt;Readability&lt;/th&gt;
&lt;th&gt;Best Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Config files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOON&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;LLM structured data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KODA&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;LLM pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  When to Use KODA
&lt;/h2&gt;

&lt;p&gt;Use KODA if you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sending large structured datasets to LLMs&lt;/li&gt;
&lt;li&gt;building RAG pipelines&lt;/li&gt;
&lt;li&gt;working with tool calls or agents&lt;/li&gt;
&lt;li&gt;optimizing token usage in production systems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When NOT to Use KODA
&lt;/h2&gt;

&lt;p&gt;Do not use KODA for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;small datasets (1–2 records)&lt;/li&gt;
&lt;li&gt;irregular or deeply nested JSON&lt;/li&gt;
&lt;li&gt;human-authored configuration files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JSON is better in those cases.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design Principles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Schema-first design&lt;/li&gt;
&lt;li&gt;Positional encoding&lt;/li&gt;
&lt;li&gt;Deterministic parsing&lt;/li&gt;
&lt;li&gt;No repeated keys&lt;/li&gt;
&lt;li&gt;Optimized for LLM input&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Is KODA a JSON Replacement?
&lt;/h2&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;KODA is a transport format for LLM pipelines.&lt;/p&gt;

&lt;p&gt;Typical workflow:&lt;/p&gt;

&lt;p&gt;JSON → KODA → LLM&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is KODA?
&lt;/h3&gt;

&lt;p&gt;KODA is a schema-first data format that reduces token usage for structured data in LLM systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is KODA better than JSON?
&lt;/h3&gt;

&lt;p&gt;For LLM input, yes. For general use, JSON is still better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does KODA always reduce tokens?
&lt;/h3&gt;

&lt;p&gt;No. It works best on large structured datasets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where should I use KODA?
&lt;/h3&gt;

&lt;p&gt;RAG pipelines, tool calls, and structured LLM input.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Om7035/koda" rel="noopener noreferrer"&gt;https://github.com/Om7035/koda&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;koda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If you're sending structured data to LLMs, you're likely wasting tokens.&lt;/p&gt;

&lt;p&gt;KODA is a simple way to reduce that overhead.&lt;/p&gt;

&lt;p&gt;It’s not a replacement for JSON it’s an optimization layer for LLM pipelines.&lt;/p&gt;




&lt;p&gt;Feedback and contributions are welcome.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>python</category>
      <category>json</category>
      <category>ai</category>
    </item>
    <item>
      <title>Stop Building Stale RAG: Meet Sentinel, the "Self-Healing" Knowledge Graph</title>
      <dc:creator>Om Kawale</dc:creator>
      <pubDate>Tue, 06 Jan 2026 19:28:14 +0000</pubDate>
      <link>https://dev.to/om_kawale_b6627244a50e4b6/stop-building-stale-rag-meet-sentinel-the-self-healing-knowledge-graph-25hl</link>
      <guid>https://dev.to/om_kawale_b6627244a50e4b6/stop-building-stale-rag-meet-sentinel-the-self-healing-knowledge-graph-25hl</guid>
      <description>&lt;p&gt;We all know the dirty secret of RAG (Retrieval-Augmented Generation) applications: &lt;strong&gt;They are great on Day 1, and broken on Day 30.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why? &lt;strong&gt;Data Staleness.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You scrape your documentation, embed it into a Vector DB, and build a chatbot. It works perfectly. But two weeks later, the documentation changes. A price updates. A policy is rewritten.&lt;/p&gt;

&lt;p&gt;Your Vector DB doesn't know. It happily retrieves the old chunks, and your LLM confidently hallucinates an answer based on outdated facts.&lt;/p&gt;

&lt;p&gt;Re-indexing everything is expensive and slow. Building custom "update scripts" is boring.&lt;/p&gt;

&lt;p&gt;I got tired of this problem, so I built &lt;strong&gt;Sentinel&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡️ What is Sentinel?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Om7035/Sentinel-The-Self-Healing-Knowledge-Graph" rel="noopener noreferrer"&gt;&lt;strong&gt;Sentinel&lt;/strong&gt;&lt;/a&gt; is an open-source, autonomous ETL pipeline that treats your RAG data as a &lt;strong&gt;Living Knowledge Graph&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of a "snapshot" vector store, Sentinel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Watches&lt;/strong&gt; your source URLs for changes.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Detects&lt;/strong&gt; differences (byte-level hashing).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Heals&lt;/strong&gt; the graph by extracting &lt;em&gt;only&lt;/em&gt; the new facts using LLMs.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Maintains History&lt;/strong&gt; using "Time Travel" edges.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is &lt;strong&gt;pip-installable&lt;/strong&gt;, &lt;strong&gt;model-agnostic&lt;/strong&gt; (works with Ollama, OpenAI, Anthropic), and runs locally or in the cloud.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Real-World Example: SaaS Pricing Update
&lt;/h2&gt;

&lt;p&gt;Imagine you are tracking a competitor's pricing page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 1:&lt;/strong&gt; The page says "Pro Plan is $29/mo".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Sentinel Graph:&lt;/em&gt; &lt;code&gt;(Pro Plan) --[COSTS {valid_from: Day 1}]--&amp;gt; ($29)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Day 15:&lt;/strong&gt; They silently raise the price to $49/mo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Sentinel Graph:&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;Sentinel detects the hash change.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;retires&lt;/strong&gt; the old edge: &lt;code&gt;(Pro Plan) --[COSTS {valid_to: Day 15}]--&amp;gt; ($29)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;creates&lt;/strong&gt; a new edge: &lt;code&gt;(Pro Plan) --[COSTS {valid_from: Day 15}]--&amp;gt; ($49)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standard RAG:&lt;/strong&gt; Returns both $29 and $49, confusing the user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentinel:&lt;/strong&gt; Knows exactly which price is current, AND knows the price history.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⏳ The Killer Feature: "Time Travel"
&lt;/h2&gt;

&lt;p&gt;Most RAG systems overwrite old data. Sentinel uses &lt;strong&gt;Bitemporal Versioning&lt;/strong&gt; in Neo4j. This unlocks a whole new class of questions your AI can answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"How has the pricing structure changed since last month?"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"What were the safety guidelines before the 2024 update?"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Show me the evolution of this compliance policy."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🎯 Top Use Cases
&lt;/h2&gt;

&lt;p&gt;We built Sentinel for developers who need &lt;strong&gt;high-accuracy&lt;/strong&gt; retrieval over changing data.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Legal &amp;amp; Compliance Tech
&lt;/h3&gt;

&lt;p&gt;Laws and company policies change constantly. Sentinel ensures your bot never cites a repealed law or an outdated HR policy.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Market Intelligence
&lt;/h3&gt;

&lt;p&gt;Track competitor websites, earnings reports, or news feeds. Sentinel builds a timeline of events automatically, allowing you to query "What happened to Competitor X in Q3?"&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Developer Documentation Bots
&lt;/h3&gt;

&lt;p&gt;APIs change. If a library deprecates a function, Sentinel updates the graph so your bot stops recommending broken code.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ How It Works (The Loop)
&lt;/h2&gt;

&lt;p&gt;Sentinel runs an autonomous "Healing Loop" in the background:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Monitor:&lt;/strong&gt; It checks the content hash of watched URLs. If the hash matches the database, it sleeps. &lt;strong&gt;Cost: $0.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Diff:&lt;/strong&gt; If the hash changes, it scrapes the new content.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Extract:&lt;/strong&gt; It uses an LLM (via &lt;code&gt;LiteLLM&lt;/code&gt; + &lt;code&gt;Instructor&lt;/code&gt;) to extract nodes and relationships.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Upsert:&lt;/strong&gt; It updates the Graph Database, handling the temporal logic automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🚀 Quick Start
&lt;/h2&gt;

&lt;p&gt;You can add this to your existing Python project in minutes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;sentinel-core

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sentinel_core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Sentinel&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize (uses standard env vars for Neo4j &amp;amp; LLM)
&lt;/span&gt;&lt;span class="n"&gt;sentinel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Sentinel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Start watching a URL
# Sentinel will scrape, extract, and build the initial graph
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sentinel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[https://docs.example.com/pricing](https://docs.example.com/pricing)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run the autonomous healing loop
# It will check for updates every 24 hours
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sentinel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_healing_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval_hours&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;That's it. You now have a self-updating knowledge graph.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Open Source &amp;amp; Roadmap
&lt;/h2&gt;

&lt;p&gt;I built the core engine, but there is so much potential here. I am looking for contributors to help with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entity Resolution:&lt;/strong&gt; Smarter merging of duplicate nodes (e.g., "Tesla" vs "Tesla Inc").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Dashboard:&lt;/strong&gt; We have a basic API, but a visualization of the graph "healing" in real-time would be epic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More Scrapers:&lt;/strong&gt; Adding support for Playwright or Selenium.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌟 Support the Project
&lt;/h2&gt;

&lt;p&gt;If you think "Self-Healing RAG" is a cool concept, please consider starring the repo! It helps us gain visibility and attracts more contributors to make the tool better for everyone.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/Om7035/Sentinel-The-Self-Healing-Knowledge-Graph" rel="noopener noreferrer"&gt;Star Sentinel on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm active in the comments—let me know what you think about the "Temporal Graph" approach vs standard Vector Stores!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>rag</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>Stop Building Auth From Scratch: Try AuthKit Instead</title>
      <dc:creator>Om Kawale</dc:creator>
      <pubDate>Tue, 21 Oct 2025 08:54:11 +0000</pubDate>
      <link>https://dev.to/om_kawale_b6627244a50e4b6/stop-building-auth-from-scratch-try-authkit-instead-44k8</link>
      <guid>https://dev.to/om_kawale_b6627244a50e4b6/stop-building-auth-from-scratch-try-authkit-instead-44k8</guid>
      <description>&lt;p&gt;Spend 30 seconds setting up production-ready authentication instead of 3+ weeks of headaches.&lt;/p&gt;

&lt;p&gt;Auth is a pain. JWT token rotation, OAuth flows, secure password hashing, CORS issues, XSS vulnerabilities… it never ends. AuthKit fixes all of that in one setup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/Om7035/AuthKit.git
cd AuthKit
docker-compose up -d
# Visit http://localhost:3000
# Login: demo@authkit.com / password
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why AuthKit?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enterprise security: JWT + httpOnly cookies, bcrypt, token refresh, rate limiting, SQL injection protection&lt;/li&gt;
&lt;li&gt;Developer-friendly: One-command Docker setup, React+Tailwind UI, Google OAuth &amp;amp; Firebase ready, PostgreSQL included&lt;/li&gt;
&lt;li&gt;Flexible backend: Choose Google OAuth for simplicity or Firebase Auth for full features&lt;/li&gt;
&lt;li&gt;Complete API docs and live demo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Who should use AuthKit?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solo devs &amp;amp; startups: Ship MVPs faster&lt;/li&gt;
&lt;li&gt;Enterprise teams: Secure, scalable, production-ready&lt;/li&gt;
&lt;li&gt;Learning devs: Study, contribute, and build on real auth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Get involved! AuthKit is open source and thrives on community support.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Report bugs
&lt;/li&gt;
&lt;li&gt;Suggest features
&lt;/li&gt;
&lt;li&gt;Improve documentation
&lt;/li&gt;
&lt;li&gt;Submit pull requests
&lt;/li&gt;
&lt;li&gt;Star the repo to show your support
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visit and contribute:&lt;br&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/Om7035/AuthKit" rel="noopener noreferrer"&gt;https://github.com/Om7035/AuthKit&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;AuthKit — Stop building, start shipping.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
