<?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: Sanidhya Dhangar</title>
    <description>The latest articles on DEV Community by Sanidhya Dhangar (@sanidhya_dhangar_ba74abfa).</description>
    <link>https://dev.to/sanidhya_dhangar_ba74abfa</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%2F3781406%2Ffe2f8e37-ea50-4658-92c6-4c0b6cd3ad0b.jpg</url>
      <title>DEV Community: Sanidhya Dhangar</title>
      <link>https://dev.to/sanidhya_dhangar_ba74abfa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanidhya_dhangar_ba74abfa"/>
    <language>en</language>
    <item>
      <title>RepoBrain: giving AI agents the context a senior engineer has, with a FalkorDB graph</title>
      <dc:creator>Sanidhya Dhangar</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:14:47 +0000</pubDate>
      <link>https://dev.to/sanidhya_dhangar_ba74abfa/repobrain-giving-ai-agents-the-context-a-senior-engineer-has-with-a-falkordb-graph-5gel</link>
      <guid>https://dev.to/sanidhya_dhangar_ba74abfa/repobrain-giving-ai-agents-the-context-a-senior-engineer-has-with-a-falkordb-graph-5gel</guid>
      <description>&lt;p&gt;&lt;em&gt;Built for Graph Hacks (WeMakeDevs × FalkorDB), Oct 2026 · &lt;a href="https://repobrain-j9c4.onrender.com" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt; · &lt;a href="https://github.com/SanidhyaDhangar/repobrain" rel="noopener noreferrer"&gt;Code&lt;/a&gt; · &lt;a href="https://youtu.be/vztPZL29JSs" rel="noopener noreferrer"&gt;Demo video&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every team has one person who just &lt;em&gt;knows&lt;/em&gt;. Ask them "can I change this function?" and they say: "Careful, the request dispatcher calls it, and it was rewritten last year to pass the context explicitly. Talk to David, he did that refactor." That answer doesn't live in any single file. It's a walk across the call graph, the PR history, the issue that motivated the change, and the people involved.&lt;/p&gt;

&lt;p&gt;AI coding agents don't have that walk. They see the file in front of them, maybe a vector search hit or two, and they forget everything when the session ends. So we built &lt;strong&gt;RepoBrain&lt;/strong&gt;: point it at any public GitHub repo and it builds a knowledge graph in FalkorDB. Agents answer questions and review PRs by traversing that graph, and every answer shows the path it took.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwfm44oahfas5rxwqqqct.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwfm44oahfas5rxwqqqct.jpg" alt="RepoBrain answering " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The graph
&lt;/h2&gt;

&lt;p&gt;One ingest turns a repo into four connected layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(:File)-[:DEFINES]-&amp;gt;(:Function)-[:CALLS]-&amp;gt;(:Function)                      code
(:Person)-[:AUTHORED|REVIEWED]-&amp;gt;(:PR)-[:MODIFIED]-&amp;gt;(:Function)             history
(:PR)-[:FIXES]-&amp;gt;(:Issue)&amp;lt;-[:OPENED]-(:Person)                              intent
(:Fact)-[:ABOUT]-&amp;gt;(any)   (:Episode)-[:USED]-&amp;gt;(any)   (:Note)-[:FOR]-&amp;gt;(:Task)   memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt; comes from Python's own &lt;code&gt;ast&lt;/code&gt; module: functions, methods, calls and imports, resolved by name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;History&lt;/strong&gt; comes from GitHub's GraphQL API: the last 200 merged PRs, their reviewers, the issues they closed, and every file in their diffs. A PR is linked to the functions it touched through the diff's hunk headers and changed &lt;code&gt;def&lt;/code&gt; lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intent&lt;/strong&gt; is the part most tools miss: the issue a PR fixed usually says &lt;em&gt;why&lt;/em&gt; the code is the way it is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt; is the agents' own knowledge, stored in the same graph as everything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each repo gets its own graph inside one FalkorDB instance (&lt;code&gt;pallets__flask&lt;/code&gt;, &lt;code&gt;psf__requests&lt;/code&gt;, …). Isolated tenants cost nothing extra.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a graph
&lt;/h2&gt;

&lt;p&gt;Here's the question "why does &lt;code&gt;full_dispatch_request&lt;/code&gt; look like this, and who do I ask?" written as one Cypher query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;t:&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;t.qname&lt;/span&gt; &lt;span class="k"&gt;ENDS&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="s1"&gt;'Flask.full_dispatch_request'&lt;/span&gt;
&lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;a:&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:AUTHORED&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;pr:&lt;/span&gt;&lt;span class="n"&gt;PR&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:MODIFIED&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;OPTIONAL&lt;/span&gt; &lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pr&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:FIXES&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;i:&lt;/span&gt;&lt;span class="n"&gt;Issue&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pr.merged_at&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;left&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pr.body&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="ss"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;left&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i.body&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;pr.merged_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Flask, that returns PR #5818 ("pass context through dispatch methods", by @davidism), which fixed Issue #5815 ("pass context internally instead of using contextvars"). Between them, the PR and the issue explain the design: pass one &lt;code&gt;AppContext&lt;/code&gt; through every dispatch method instead of reading context proxies, an idea @pgjones first proposed to speed up async views. In a relational store this is four joins. In a vector store it's a guess. In the graph it's one hop pattern that runs in about 0.1 s against FalkorDB Cloud.&lt;/p&gt;

&lt;p&gt;Every agent tool is a query like that:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;The graph work&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;impact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;(:Function)-[:CALLS*1..3]-&amp;gt;(target)&lt;/code&gt;: the blast radius, split into tests and non-tests, plus open issues that mention anything in it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;experts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;people ranked by PRs they authored or reviewed that changed the target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the PRs and issues behind the target, with their text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;critical&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CALL algo.pageRank('Function', 'CALLS')&lt;/code&gt;, plus who has ever changed each function, which surfaces knowledge silos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;connect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the shortest chain linking any two entities, e.g. a person to a function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FalkorDB full-text indexes over PR and issue text, with stemming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The LLM (gpt-oss-120b on Groq) only chooses which tool to call and writes up the result. The facts come from the graph, so the answers come with receipts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory that knows when it's out of date
&lt;/h2&gt;

&lt;p&gt;Track 2 asks for memory that persists across sessions and updates over time. We store two kinds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Episodes&lt;/strong&gt;: every question and answer, linked with &lt;code&gt;USED&lt;/code&gt; edges to the code, PRs and people the agent touched. Ask a follow-up in the same session and the history comes back out of the graph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facts&lt;/strong&gt;: durable lessons ("@davidism owns the AppContext design, PR #5818") linked with &lt;code&gt;ABOUT&lt;/code&gt; edges to what they describe. The agent saves them with a &lt;code&gt;remember&lt;/code&gt; tool. If it forgets, a consolidation step distils them from its answer (episodic → semantic memory).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Facts surface automatically inside &lt;code&gt;impact&lt;/code&gt;, &lt;code&gt;experts&lt;/code&gt; and &lt;code&gt;history&lt;/code&gt; results, so a brand-new session starts out knowing what earlier sessions learned.&lt;/p&gt;

&lt;p&gt;The hard part is staleness. A fact about a function is only true until someone changes that function. So at ingest we store a fingerprint of each function's &lt;strong&gt;AST&lt;/strong&gt; (a hash of &lt;code&gt;ast.dump(node)&lt;/code&gt;, so reformatting doesn't count as a change). When a fact is saved, the &lt;code&gt;ABOUT&lt;/code&gt; edge records the fingerprint it saw:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="py"&gt;a:&lt;/span&gt;&lt;span class="n"&gt;ABOUT&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;a.hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t.hash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a re-sync, a fact is stale when the code moved under it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;m:&lt;/span&gt;&lt;span class="n"&gt;Fact&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="py"&gt;a:&lt;/span&gt;&lt;span class="n"&gt;ABOUT&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;m.text&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a.hash&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;t.hash&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;stale&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent is told to treat stale facts as leads to re-check, not truths to repeat. In the UI they get an amber "Stale: code changed" badge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three agents, one shared graph
&lt;/h2&gt;

&lt;p&gt;The PR reviewer is three agents run in sequence, and they don't pass Python objects to each other. They hand off through the graph:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;RepoBrain maps the PR's diff hunks onto function line ranges, so it knows exactly which functions changed, and creates a &lt;code&gt;(:Task)-[:TARGETS]-&amp;gt;(:Function)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;impact agent&lt;/strong&gt; walks the call graph and writes a &lt;code&gt;(:Note)-[:FOR]-&amp;gt;(:Task)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;historian&lt;/strong&gt; reads that note &lt;em&gt;from the graph&lt;/em&gt;, digs up the PRs and issues behind the changed code, and flags anything the PR might undo.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;reviewer&lt;/strong&gt; reads both notes, picks human reviewers with &lt;code&gt;experts&lt;/code&gt;, and writes the PR comment. A GitHub Action posts it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On Flask's open PR #5918 ("automatic options as separate route"), the historian found PR #5917, which had just fixed &lt;code&gt;provide_automatic_options&lt;/code&gt; override logic (Issue #5916), and PR #5496, which added the config option. That's exactly the history a reviewer of that PR needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seeing the path
&lt;/h2&gt;

&lt;p&gt;"Show the path behind an answer" was the brief, so the UI streams it. While the agent works, each tool call appears as a chip and the graph grows live on the right, with new nodes flashing as they're found. In the finished answer, every &lt;code&gt;PR #&lt;/code&gt;, &lt;code&gt;Issue #&lt;/code&gt; and &lt;code&gt;@login&lt;/code&gt; is a citation: hover it and the graph flies to that node. Expand "graph queries behind this answer" to see the exact Cypher and raw results.&lt;/p&gt;

&lt;p&gt;All the tools are also served over &lt;strong&gt;MCP&lt;/strong&gt; (&lt;code&gt;mcp_server.py&lt;/code&gt;), so Claude Desktop, Cursor or any MCP client can query the same graph and memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things we learned about FalkorDB
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;shortestPath&lt;/code&gt; is directed-only&lt;/strong&gt; and has to sit in &lt;code&gt;WITH&lt;/code&gt;/&lt;code&gt;RETURN&lt;/code&gt;. For "how is this person connected to that function", paths zig-zag (&lt;code&gt;AUTHORED →&lt;/code&gt;, &lt;code&gt;← CALLS&lt;/code&gt;), so &lt;code&gt;connect&lt;/code&gt; widens an undirected &lt;code&gt;[*k]&lt;/code&gt; match one hop at a time and stops at the first hit. Because it stops early, the first path it finds is a shortest one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-text indexes are great for agent search.&lt;/strong&gt; &lt;code&gt;db.idx.fulltext.queryNodes('PR', 'retries')&lt;/code&gt; matched "retry" through stemming, which beats &lt;code&gt;CONTAINS&lt;/code&gt; for natural-language questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;GRAPH.RO_QUERY&lt;/code&gt; is a free safety net.&lt;/strong&gt; The agent's raw &lt;code&gt;cypher&lt;/code&gt; tool uses it, so even a confused (or prompt-injected) model can't write to the graph through it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;UNWIND $rows&lt;/code&gt; batches&lt;/strong&gt; keep ingest fast. Flask's 831 functions, 983 calls and 200 PRs load into FalkorDB Cloud in about 30 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One client gotcha:&lt;/strong&gt; with redis-py 8, &lt;code&gt;FalkorDB.from_url&lt;/code&gt; opened a RESP3 pool that dropped large replies partway through. Building the client with the constructor (RESP2) fixed it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Live: &lt;a href="https://repobrain-j9c4.onrender.com:" rel="noopener noreferrer"&gt;https://repobrain-j9c4.onrender.com:&lt;/a&gt; pick &lt;code&gt;pallets/flask&lt;/code&gt;, or ingest any public Python repo.&lt;/li&gt;
&lt;li&gt;Demo video: &lt;a href="https://youtu.be/vztPZL29JSs" rel="noopener noreferrer"&gt;https://youtu.be/vztPZL29JSs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code, data model and every Cypher query: &lt;a href="https://github.com/SanidhyaDhangar/repobrain" rel="noopener noreferrer"&gt;https://github.com/SanidhyaDhangar/repobrain&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Built by Sanidhya Dhangar and Aditya Sikarwar, with Claude Code as a coding assistant.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>falkordb</category>
      <category>ai</category>
      <category>graphdatabase</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
