<?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: Ashwin Jadhav</title>
    <description>The latest articles on DEV Community by Ashwin Jadhav (@aj615).</description>
    <link>https://dev.to/aj615</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%2F4193223%2F9dd30994-691e-4cb1-8629-8ec5540d7e8e.jpg</url>
      <title>DEV Community: Ashwin Jadhav</title>
      <link>https://dev.to/aj615</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aj615"/>
    <language>en</language>
    <item>
      <title>How We Used FalkorDB to Make a Security Alert Explain Itself</title>
      <dc:creator>Ashwin Jadhav</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:26:38 +0000</pubDate>
      <link>https://dev.to/aj615/how-we-used-falkordb-to-make-a-security-alert-explain-itself-3dbd</link>
      <guid>https://dev.to/aj615/how-we-used-falkordb-to-make-a-security-alert-explain-itself-3dbd</guid>
      <description>&lt;p&gt;title: How We Used FalkorDB to Make a Security Alert Explain Itself&lt;br&gt;
published: true&lt;br&gt;
tags: falkordb, ai, security, hackathon&lt;/p&gt;

&lt;p&gt;Our entry for Graph Hacks by WeMakeDevs × FalkorDB.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where this started
&lt;/h2&gt;

&lt;p&gt;Picture a security analyst looking at an alert that says "suspicious network activity on a workstation." Is that nothing, or is it the middle of an attack? The alert alone can't tell you. What helps is context: whose machine is it, what has it been involved in before, and is any of that linked to an incident someone already confirmed?&lt;/p&gt;

&lt;p&gt;That's really a question about connections, so we built GraphGuard around a graph database, FalkorDB.&lt;/p&gt;
&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;GraphGuard is a small security investigation tool. There's a Streamlit page you click around in, a FastAPI backend, an agent that runs the investigation, and FalkorDB running in one Docker container.&lt;/p&gt;

&lt;p&gt;The data is all made up: users, devices, IP addresses, alerts, incidents and evidence, about 76 nodes and 81 relationships to start with. The links look like this:&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="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&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;:USED&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;Device&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Device&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;:INVOLVED_IN&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;Alert&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Alert&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;:ASSOCIATED_WITH&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;Incident&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Incident&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;:SUPPORTED_BY&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;Evidence&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent has four graph tools: one to fetch a node, one to walk outwards up to two hops, one to find past incidents that share an entity with the alert, and one to save the finished investigation back into the graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the graph actually does
&lt;/h2&gt;

&lt;p&gt;When we investigated &lt;code&gt;alert_004&lt;/code&gt;, the traversal turned up this path:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;alert_004 → user_eve → dev_w005 → evidence → inc_001 → alert_001&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can read that like a short story. The same user and device sit next to a confirmed credential-theft incident and an earlier alert. The risk score comes from the alert's own severity plus what the graph turns up (devices, confirmed incidents, evidence, earlier investigations), and suggestions like "isolate device dev_w005" come from the entities the traversal found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory
&lt;/h2&gt;

&lt;p&gt;Every investigation gets saved into FalkorDB. When we ran &lt;code&gt;alert_004&lt;/code&gt; again later, the tool pulled up four earlier investigations as context. Nothing is kept in the app's memory, it's all stored in the graph, so it's still there after a restart.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing that broke
&lt;/h2&gt;

&lt;p&gt;Our first query used &lt;code&gt;last(r)&lt;/code&gt; on variable-length paths, and FalkorDB didn't accept it. We swapped it for separate depth-1 and depth-2 queries. A scratch file, &lt;code&gt;tmp_debug.py&lt;/code&gt;, is still in the repo from that debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it isn't
&lt;/h2&gt;

&lt;p&gt;I'd rather be upfront about this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The demo runs in a deterministic mode. It runs real graph queries but doesn't call an LLM. There's an Anthropic mode in the code that we haven't tested.&lt;/li&gt;
&lt;li&gt;The risk score is a simple heuristic, not tuned on real security data.&lt;/li&gt;
&lt;li&gt;Two alerts can differ in risk partly because of their own severity, not only because of how they're connected.&lt;/li&gt;
&lt;li&gt;The data is tiny and synthetic, and there's no authentication. It's a local demo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About us
&lt;/h2&gt;

&lt;p&gt;We're AI students, and this project was a team effort. Working through GraphGuard, from the graph model to the investigation flow, taught us a lot about how graph databases can give an agent real context. It was a fun project to learn from.&lt;/p&gt;

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

&lt;p&gt;Start FalkorDB with &lt;code&gt;docker compose up -d&lt;/code&gt;, load the data, then start the backend and frontend. Setup steps and the graph schema are in the repo: &lt;a href="https://github.com/AJ615/graphguard" rel="noopener noreferrer"&gt;https://github.com/AJ615/graphguard&lt;/a&gt;&lt;/p&gt;

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