<?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: BV Nagi Reddy</title>
    <description>The latest articles on DEV Community by BV Nagi Reddy (@bv_niteesh_be2c0eccc9a5fd).</description>
    <link>https://dev.to/bv_niteesh_be2c0eccc9a5fd</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%2F1468796%2F5d4626bb-2a69-4362-b996-05a128ef1ee7.jpeg</url>
      <title>DEV Community: BV Nagi Reddy</title>
      <link>https://dev.to/bv_niteesh_be2c0eccc9a5fd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bv_niteesh_be2c0eccc9a5fd"/>
    <language>en</language>
    <item>
      <title>Giving Kubernetes Dashboard a Graph Brain: How We Integrated FalkorDB for Autonomous SRE</title>
      <dc:creator>BV Nagi Reddy</dc:creator>
      <pubDate>Sun, 18 Oct 2026 15:56:19 +0000</pubDate>
      <link>https://dev.to/bv_niteesh_be2c0eccc9a5fd/giving-kubernetes-dashboard-a-graph-brain-how-we-integrated-falkordb-for-autonomous-sre-knk</link>
      <guid>https://dev.to/bv_niteesh_be2c0eccc9a5fd/giving-kubernetes-dashboard-a-graph-brain-how-we-integrated-falkordb-for-autonomous-sre-knk</guid>
      <description>&lt;h2&gt;
  
  
  The 2:00 AM Kubernetes Outage
&lt;/h2&gt;

&lt;p&gt;Every engineer who has managed a production Kubernetes cluster knows this scenario:&lt;/p&gt;

&lt;p&gt;An alert fires. Pods are crash-looping or throwing &lt;code&gt;504 Gateway Timeout&lt;/code&gt; errors. You open the Kubernetes Dashboard and start frantically jumping between tabs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tab 1: &lt;strong&gt;Pods&lt;/strong&gt; (they are crash-looping with exit code 137).&lt;/li&gt;
&lt;li&gt;Tab 2: &lt;strong&gt;Services&lt;/strong&gt; (which service selects these pods?).&lt;/li&gt;
&lt;li&gt;Tab 3: &lt;strong&gt;Ingresses&lt;/strong&gt; (did the routing rule or port change?).&lt;/li&gt;
&lt;li&gt;Tab 4: &lt;strong&gt;ConfigMaps &amp;amp; Secrets&lt;/strong&gt; (did a credential update break the database connection?).&lt;/li&gt;
&lt;li&gt;Tab 5: &lt;strong&gt;RBAC&lt;/strong&gt; (does the pod's service account have permission to talk to the API?).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a modern microservices cluster running hundreds of pods, &lt;strong&gt;resources do not fail in isolation&lt;/strong&gt;. A failure in Pod A is almost always caused by an upstream service, an expired secret, or an invalid selector three hops away.&lt;/p&gt;

&lt;p&gt;Yet traditional dashboards present the cluster as a set of &lt;strong&gt;disconnected inventory tables&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Even worse, when engineers paste error logs into generic AI assistants like ChatGPT, the AI hallucinates. It doesn't have a map of your cluster. It blindly tells you to &lt;em&gt;"restart the pod"&lt;/em&gt; or &lt;em&gt;"increase replica memory"&lt;/em&gt;—completely unaware that restarting will cause cascading timeouts across three upstream microservices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes is fundamentally a graph.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To solve cluster troubleshooting, we decided to give the Kubernetes Dashboard an active relational nervous system. Here is the engineering story of &lt;strong&gt;Pilot Kubernetes&lt;/strong&gt;, built for the &lt;strong&gt;Graph Hacks&lt;/strong&gt; hackathon (&lt;em&gt;Agents That Act on Connected Data&lt;/em&gt; track).&lt;/p&gt;




&lt;h2&gt;
  
  
  The Big Picture: From Flat Tables to a Live Knowledge Graph
&lt;/h2&gt;

&lt;p&gt;Instead of building a toy standalone CLI, we forked the Go + Angular &lt;a href="https://github.com/kubernetes/dashboard" rel="noopener noreferrer"&gt;Kubernetes Dashboard&lt;/a&gt; repository and embedded &lt;strong&gt;FalkorDB&lt;/strong&gt; directly into the cluster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Live K8s State (API Server) ──┐
                              ├──► FalkorDB Graph (6379/TCP) ◄──► Autonomous AI SRE Agent
Live Telemetry (Logs/Metrics) ─┘     (In-Memory Cypher Engine)         (Multi-Hop Graph Tools)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FalkorDB continuously maintains a property graph of the cluster. When an issue occurs, our Autonomous SRE Agent doesn't read a flat dump. It executes openCypher graph queries as internal tools to discover:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upstream Root Causes:&lt;/strong&gt; Traversing 1 to 4 hops upstream to see what prerequisite failed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downstream Blast Radius:&lt;/strong&gt; Finding every microservice and dependent workload that will break before taking any action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceable Fixes:&lt;/strong&gt; Delivering explainable root causes with exact Cypher verification queries and 1-click YAML patches.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Key Architectural Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Why Fork the Official Kubernetes Dashboard?
&lt;/h3&gt;

&lt;p&gt;We could have started an empty repo from scratch with a toy Python script. But production operators do not want another throwaway CLI.&lt;/p&gt;

&lt;p&gt;By building inside the official Kubernetes Dashboard codebase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We inherited battle-tested &lt;code&gt;client-go&lt;/code&gt; authentication, token handling, and multi-namespace security.&lt;/li&gt;
&lt;li&gt;We preserved the clean Angular Material interface enterprise teams are already familiar with.&lt;/li&gt;
&lt;li&gt;We proved that graph intelligence can be seamlessly retrofitted into existing, mature cloud-native tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Why FalkorDB Over Traditional Graph Databases?
&lt;/h3&gt;

&lt;p&gt;Kubernetes state is ephemeral and high-velocity. Pods scale up, fail, and restart in seconds. Heavy, Java-based graph databases introduce massive memory footprints and slow startup times that make in-cluster deployment impractical.&lt;/p&gt;

&lt;p&gt;FalkorDB was the clear choice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redis Protocol Speed:&lt;/strong&gt; Built on Redis in C, it delivers sub-millisecond Cypher query execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-Memory Efficiency:&lt;/strong&gt; A single lightweight container (&lt;code&gt;falkordb/falkordb:v4.4.0&lt;/code&gt;) runs comfortably with minimal CPU and memory requests (100m CPU / 200Mi RAM).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;openCypher Expressiveness:&lt;/strong&gt; Cypher makes writing complex, variable-length path traversals (&lt;code&gt;&amp;lt;-[*1..4]-&lt;/code&gt;) intuitive and readable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Tool Selection Over Blind Prompting
&lt;/h3&gt;

&lt;p&gt;Instead of stuffing thousands of lines of raw logs into an LLM context window (which leads to token limits and hallucinations), our agent uses a &lt;strong&gt;Tool-Augmented Graph RAG&lt;/strong&gt; pattern implemented in &lt;code&gt;modules/api/pkg/ai/agent.go&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;falkordb_explore(resource)&lt;/code&gt;: Grabs immediate 1-hop topology neighbors.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;falkordb_blast_radius(resource, maxHops=4)&lt;/code&gt;: Discovers upstream dependencies and downstream dependents.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;falkordb_diagnose_service(service)&lt;/code&gt;: Traces &lt;code&gt;(:Service)-[:SELECTS]-&amp;gt;(:Pod)-[:EMITTED]-&amp;gt;(:LogEvent)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;falkordb_attack_paths(namespace)&lt;/code&gt;: Uncovers transitive RBAC privilege escalation chains.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Zero-Hassle Helm Packaging
&lt;/h3&gt;

&lt;p&gt;Rule 10 of Graph Hacks requires easy local or live deployment. We packaged FalkorDB's Deployment, PVC, and Service directly into the official Helm chart templates (&lt;code&gt;charts/kubernetes-dashboard/templates/falkordb/&lt;/code&gt;). &lt;br&gt;
One &lt;code&gt;helm upgrade --install&lt;/code&gt; command deploys the Web UI, API, and FalkorDB together with zero external database configuration.&lt;/p&gt;


&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. The Continuous Topology Syncer (&lt;code&gt;pkg/graph/syncer.go&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A dedicated background goroutine runs inside the Go API pod. Every 60 seconds, it fetches cluster state via &lt;code&gt;k8s.io/client-go&lt;/code&gt; and runs atomic Cypher &lt;code&gt;MERGE&lt;/code&gt; queries:&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="py"&gt;n:&lt;/span&gt;&lt;span class="n"&gt;Pod&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="n"&gt;$name&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;namespace:&lt;/span&gt; &lt;span class="n"&gt;$namespace&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;n.status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$status&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n.ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$ip&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n.nodeName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$nodeName&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It maps relationships across all architectural tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(:Service)-[:SELECTS]-&amp;gt;(:Pod)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:Ingress)-[:ROUTES_TO]-&amp;gt;(:Service)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:Deployment)-[:MANAGES]-&amp;gt;(:Pod)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:Pod)-[:RUNS_ON]-&amp;gt;(:Node)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:Pod)-[:MOUNTS_CONFIG]-&amp;gt;(:ConfigMap)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:Pod)-[:USES_ACCOUNT]-&amp;gt;(:ServiceAccount)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:ServiceAccount)-[:BOUND_BY]-&amp;gt;(:RoleBinding)-[:GRANTS]-&amp;gt;(:Role)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Live Telemetry &amp;amp; Log Ingestion (&lt;code&gt;pkg/graph/telemetry.go&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;A secondary syncer ingests live CPU usage rate (&lt;code&gt;cpuMilli&lt;/code&gt;) and memory consumption (&lt;code&gt;memoryMi&lt;/code&gt;) directly onto &lt;code&gt;Node&lt;/code&gt; and &lt;code&gt;Pod&lt;/code&gt; nodes. &lt;/p&gt;

&lt;p&gt;Simultaneously, it tails pod logs, filters warning and error lines, and creates rolling &lt;code&gt;LogEvent&lt;/code&gt; nodes:&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="nc"&gt;:Pod&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="s2"&gt;"api-7d4db"&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;:EMITTED&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="nc"&gt;:LogEvent&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;level:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;"dial tcp: connection refused"&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Old log events are automatically culled after 30 minutes, keeping FalkorDB fast and bounded.&lt;/p&gt;




&lt;h2&gt;
  
  
  Production Cypher Queries in Action
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-Hop Blast Radius Calculation
&lt;/h3&gt;

&lt;p&gt;When an operator investigates a degraded service, FalkorDB calculates both upstream causes and downstream impact in a single traversal:&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="c1"&gt;// Downstream Blast Radius: What workloads will break? (1 to 4 hops)&lt;/span&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;n:&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="n"&gt;$name&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;namespace:&lt;/span&gt; &lt;span class="n"&gt;$namespace&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="m"&gt;4&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="n"&gt;dependent&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;dependent.name&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dependent.namespace&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;labels&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dependent&lt;/span&gt;&lt;span class="ss"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dependent.status&lt;/span&gt;&lt;span class="ss"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Upstream Dependencies: What prerequisites does this service need?&lt;/span&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;n:&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="n"&gt;$name&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;namespace:&lt;/span&gt; &lt;span class="n"&gt;$namespace&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="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="m"&gt;4&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;dependency&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;dependency.name&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dependency.namespace&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;labels&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dependency&lt;/span&gt;&lt;span class="ss"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dependency.status&lt;/span&gt;&lt;span class="ss"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Uncovering Transitive RBAC Attack Paths
&lt;/h3&gt;

&lt;p&gt;Kubernetes RBAC is notoriously difficult to audit. A pod's ServiceAccount might appear unprivileged, but it can inherit cluster-admin permissions through nested RoleBindings:&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;sa:&lt;/span&gt;&lt;span class="n"&gt;ServiceAccount&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;namespace:&lt;/span&gt; &lt;span class="n"&gt;$namespace&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;:BOUND_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;b&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;:GRANTS&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;r&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;r:&lt;/span&gt;&lt;span class="n"&gt;Role&lt;/span&gt; &lt;span class="ow"&gt;OR&lt;/span&gt; &lt;span class="py"&gt;r:&lt;/span&gt;&lt;span class="n"&gt;ClusterRole&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;r.sensitive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'true'&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;sa.name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;serviceAccount&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; 
       &lt;span class="n"&gt;b.name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; 
       &lt;span class="n"&gt;r.name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; 
       &lt;span class="nf"&gt;labels&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="ss"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;roleKind&lt;/span&gt;&lt;span class="ss"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⏱️ The 2:00 AM Bug: Feature-by-Feature, How We Solve It in Under 2 Minutes
&lt;/h2&gt;

&lt;p&gt;Let's walk through an actual incident scenario:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The Alert:&lt;/strong&gt; &lt;code&gt;@service/checkout-api&lt;/code&gt; is throwing &lt;code&gt;504 Gateway Timeout&lt;/code&gt; errors and child pods are in &lt;code&gt;CrashLoopBackOff&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here is how each feature in Pilot Kubernetes turns a 45-minute nightmare into a 2-minute fix:&lt;/p&gt;
&lt;h3&gt;
  
  
  Minute 0:00 – Feature 1: Interactive 5-Tier Topology Canvas (&lt;code&gt;/ai/traffic&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traditional Way:&lt;/strong&gt; You log into the dashboard, open the Pods tab, see 200 pods, search for "checkout", click on it, check events, go to Services tab, check endpoints... 15 minutes wasted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With Pilot Kubernetes:&lt;/strong&gt; You open the Topology Canvas. The cluster is automatically organized into 5 clear tiers: &lt;strong&gt;Ingress ➔ Service ➔ Workloads ➔ Pods ➔ Config/Storage&lt;/strong&gt;. In 1 click, you isolate the &lt;code&gt;checkout-api&lt;/code&gt; stack. You immediately see the red degraded indicator on the pod and notice its bezier connection to the database &lt;code&gt;pg-cluster&lt;/code&gt; is glowing red.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Minute 0:30 – Feature 2: Multi-Hop Blast Radius Engine (&lt;code&gt;pkg/graph/result.go&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traditional Way:&lt;/strong&gt; In panic mode at 2 AM, engineers are tempted to immediately restart pods or roll back deployments. Doing this blindly often takes down other downstream services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With Pilot Kubernetes:&lt;/strong&gt; You click &lt;strong&gt;Blast Radius&lt;/strong&gt; on &lt;code&gt;checkout-api&lt;/code&gt;. FalkorDB runs a 1-to-4 hop Cypher traversal:
&lt;/li&gt;
&lt;/ul&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;n:&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'checkout-api'&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="m"&gt;4&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="n"&gt;dependent&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;dependent&lt;/span&gt;&lt;span class="ss"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In 3 milliseconds, FalkorDB warns you: &lt;em&gt;3 dependent microservices (&lt;code&gt;payment-gateway&lt;/code&gt;, &lt;code&gt;order-processor&lt;/code&gt;, and &lt;code&gt;mobile-api&lt;/code&gt;) depend directly on this service.&lt;/em&gt; You now know exactly what is at risk and avoid making blind changes that cause cascading outages.&lt;/p&gt;
&lt;h3&gt;
  
  
  Minute 1:00 – Feature 3: Live Telemetry Graph &amp;amp; Log Correlation (&lt;code&gt;pkg/graph/telemetry.go&lt;/code&gt;)
&lt;/h3&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%2F7e7idfsoyqwazx2qtdgd.png" 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%2F7e7idfsoyqwazx2qtdgd.png" alt=" " width="799" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traditional Way:&lt;/strong&gt; You run 5 terminal tabs with &lt;code&gt;kubectl logs -n prod checkout-api-7d8f -f --tail=500&lt;/code&gt; trying to parse thousands of lines of noisy JSON logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With Pilot Kubernetes:&lt;/strong&gt; The telemetry syncer has already filtered out the noise and created rolling &lt;code&gt;LogEvent&lt;/code&gt; nodes in FalkorDB linked directly to the pod:
&lt;/li&gt;
&lt;/ul&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="nc"&gt;:Pod&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="s2"&gt;"checkout-api-7d8f"&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;:EMITTED&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="nc"&gt;:LogEvent&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;level:&lt;/span&gt; &lt;span class="s2"&gt;"ERROR"&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;message:&lt;/span&gt; &lt;span class="s2"&gt;"FATAL: password authentication failed for user 'app'"&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The graph correlates CPU/memory spikes with the exact database authentication error timestamp.&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%2Fp281mon64562nafsqjqg.png" 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%2Fp281mon64562nafsqjqg.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Minute 1:30 – Feature 4: Autonomous AI SRE Agent (&lt;code&gt;pkg/ai/agent.go&lt;/code&gt;)
&lt;/h3&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%2F5p0rrvvkpb8ydxipzxhi.png" 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%2F5p0rrvvkpb8ydxipzxhi.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traditional Way:&lt;/strong&gt; You ask ChatGPT: &lt;em&gt;"Why is my pod crashing with code 137?"&lt;/em&gt; ChatGPT gives a generic 500-word essay suggesting memory leaks, JVM flags, or node pressure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With Pilot Kubernetes:&lt;/strong&gt; In the AI Diagnostics Studio, you type:
&lt;code&gt;@service/checkout-api is failing. What is the root cause and blast radius?&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent doesn't guess. It autonomously executes FalkorDB tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;falkordb_explore(@service/checkout-api)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;falkordb_diagnose_service(@service/checkout-api)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;falkordb_blast_radius(@service/checkout-api)&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent reveals the real truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The pod is crash-looping because an automated Secret rotation 10 minutes ago updated the Secret &lt;code&gt;db-credentials&lt;/code&gt;, but the &lt;code&gt;checkout-api&lt;/code&gt; Deployment template was still pointing to the legacy Secret key &lt;code&gt;POSTGRES_PASSWORD_V1&lt;/code&gt;. The pod cannot authenticate with PostgreSQL and exits upon boot."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Minute 2:00 – Feature 5: 1-Click YAML Remediation Patch
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; The agent doesn't just explain the bug; it provides:

&lt;ol&gt;
&lt;li&gt;The exact Cypher query to verify the relationship in FalkorDB.&lt;/li&gt;
&lt;li&gt;The exact &lt;code&gt;kubectl&lt;/code&gt; command to inspect the Secret.&lt;/li&gt;
&lt;li&gt;A ready-to-apply YAML patch updating the deployment secret key reference.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You apply the patch. The new pod boots, reconnects to PostgreSQL, and the FalkorDB topology canvas turns green. Incident resolved in under 2 minutes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Bonus – Feature 6: AI Security &amp;amp; RBAC Attack Path Analyzer (&lt;code&gt;/ai/security&lt;/code&gt;)
&lt;/h3&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%2Fygq6gj5jptqbix2f752t.png" 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%2Fygq6gj5jptqbix2f752t.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the 2 AM failure is a &lt;code&gt;403 Forbidden&lt;/code&gt; authorization failure, FalkorDB traces the RBAC path:
&lt;/li&gt;
&lt;/ul&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;sa:&lt;/span&gt;&lt;span class="n"&gt;ServiceAccount&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'checkout-sa'&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;:BOUND_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;b&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;:GRANTS&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;r&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;r.rules&lt;/span&gt;&lt;span class="ss"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It immediately spots missing verbs on required resources and generates a hardened, least-privilege Role manifest on the spot.&lt;/p&gt;


&lt;h2&gt;
  
  
  The "Rule 3" Test: Why FalkorDB is Essential
&lt;/h2&gt;

&lt;p&gt;Hackathon Rule 3 states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The graph has to do real work. If the product still works once FalkorDB is taken out, the graph is decoration rather than the thing the product runs on."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Pilot Kubernetes, if you take FalkorDB down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Blast Radius Calculations Halt:&lt;/strong&gt; The API has no graph traversal engine to calculate dependency paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The AI SRE Agent Loses Its Vision:&lt;/strong&gt; Tool execution fails. The agent cannot inspect graph neighborhoods and cannot ground its diagnoses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RBAC Attack Path Finding Stops:&lt;/strong&gt; Multi-hop permission chains cannot be evaluated with flat API calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telemetry Correlation Breaks:&lt;/strong&gt; Ingress-to-Service-to-Pod-to-LogEvent correlation fails.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FalkorDB is not a visualization cache; it is the &lt;strong&gt;reasoning engine&lt;/strong&gt; the product runs on.&lt;/p&gt;


&lt;h2&gt;
  
  
  Quickstart: How to Run It in 60 Seconds
&lt;/h2&gt;

&lt;p&gt;You can deploy the entire stack—including the Web UI, API, and in-cluster FalkorDB—with a single Helm command:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Deploy via Helm
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone https://github.com/Niteesh57/Pilot-Kubernetes.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Pilot-Kubernetes

&lt;span class="c"&gt;# Deploy Pilot Kubernetes with embedded FalkorDB&lt;/span&gt;
helm upgrade &lt;span class="nt"&gt;--install&lt;/span&gt; pilot-dashboard ./charts/kubernetes-dashboard &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; kubernetes-dashboard &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--create-namespace&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; falkordb.enabled&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; falkordb.persistence.enabled&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Access the Dashboard
&lt;/h3&gt;

&lt;p&gt;Forward local traffic to the web container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl port-forward &lt;span class="nt"&gt;-n&lt;/span&gt; kubernetes-dashboard &lt;span class="se"&gt;\&lt;/span&gt;
  svc/pilot-dashboard-kubernetes-dashboard-web 8080:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;strong&gt;&lt;code&gt;http://localhost:8080&lt;/code&gt;&lt;/strong&gt; in your browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Verify FalkorDB Connectivity
&lt;/h3&gt;

&lt;p&gt;Test that FalkorDB is actively synchronizing cluster topology:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://localhost:8080/api/v1/graph/status
&lt;span class="c"&gt;# Returns: {"connected":true,"graphName":"kubepilot","nodeCount":142,"edgeCount":318}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Agents are only as good as the context they work with. &lt;/p&gt;

&lt;p&gt;By giving our SRE agent FalkorDB's connected graph, decisions become explainable, verifiable, and free of hallucinations. An operator can see the exact graph path that led to a diagnosis, inspect the blast radius before applying a fix, and execute remediation with confidence.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Niteesh57/Pilot-Kubernetes" rel="noopener noreferrer"&gt;https://github.com/Niteesh57/Pilot-Kubernetes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Documentation:&lt;/strong&gt; &lt;a href="https://niteesh57.github.io/Pilot-Kubernetes/" rel="noopener noreferrer"&gt;https://niteesh57.github.io/Pilot-Kubernetes/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hackathon Track:&lt;/strong&gt; &lt;em&gt;Agents That Act on Connected Data&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; Apache 2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Have questions about our graph schema or Go syncer? Check out the repo or drop a comment below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>sre</category>
    </item>
    <item>
      <title>TigerDB: The Desktop Memory Agent That Never Lets Your Friend Forget Where They Left Off</title>
      <dc:creator>BV Nagi Reddy</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:19:17 +0000</pubDate>
      <link>https://dev.to/bv_niteesh_be2c0eccc9a5fd/tigerdb-the-desktop-memory-agent-that-never-lets-your-friend-forget-where-they-left-off-45pk</link>
      <guid>https://dev.to/bv_niteesh_be2c0eccc9a5fd/tigerdb-the-desktop-memory-agent-that-never-lets-your-friend-forget-where-they-left-off-45pk</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&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%2Fvdx2v28t8j2respllbsn.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%2Fvdx2v28t8j2respllbsn.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I built this for my friend — a freelance developer who routinely puts in 10-to-12-hour days across multiple machines, three monitors, and a chaos of browser tabs, Docker containers, and half-finished code sessions. His single biggest frustration is what he calls "the Monday morning blank screen": he sits down, opens his laptop, and has absolutely no idea what he was doing when he stopped. He loses 30-to-45 minutes every single morning just reconstructing context — what file was he editing, what Docker error was he chasing, what did he promise to send to a client before he closed the laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TigerDB&lt;/strong&gt; is a unified desktop memory intelligence system that watches his work sessions, stores every meaningful activity into a three-layer database, and hands him a concise morning briefing the moment he opens his machine.&lt;/p&gt;

&lt;p&gt;The three layers are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vector Engine&lt;/strong&gt; (&lt;code&gt;pgvector&lt;/code&gt; + HNSW index): encodes every file edit, terminal command, and browser visit as a 384-dimensional embedding for natural-language search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Property Graph Engine&lt;/strong&gt; (&lt;code&gt;tiger_graph&lt;/code&gt;): models each work session as a directed acyclic graph — activity nodes connected by typed edges (&lt;code&gt;ACCESSED_RESOURCE&lt;/code&gt;, &lt;code&gt;COMMITTED_TO&lt;/code&gt;) — so you can trace &lt;em&gt;exactly&lt;/em&gt; what led to what&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TimescaleDB Hypertable&lt;/strong&gt;: a time-partitioned telemetry log that tracks which workflows succeeded, which failed, and the GRPO reward signals that teach the agent to get smarter session over session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When my friend opens his laptop in the morning, a single click surfaces &lt;strong&gt;three tiles&lt;/strong&gt;: yesterday's unfinished threads with their progress percentage, any blockers or failed deployments that need Reflect-Replan, and today's auto-generated agenda. He can also speak a natural query — &lt;em&gt;"where did I put that Kafka config?"&lt;/em&gt; — and the agent retrieves the exact file path, code snippet, and the promise he made about it, ranked by a hybrid scoring formula that weights semantic similarity, past success rate, and recency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live Site: &lt;a href="https://tigerdb.onrender.com" rel="noopener noreferrer"&gt;TigerDB: The Desktop Memory Agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/32zZr0nrQWw" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The demo shows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TigerDB's memory architecture&lt;/li&gt;
&lt;li&gt;Property Graph execution trajectories&lt;/li&gt;
&lt;li&gt;Live desktop activity insertion&lt;/li&gt;
&lt;li&gt;Vector memory retrieval&lt;/li&gt;
&lt;li&gt;Equation 4 memory ranking&lt;/li&gt;
&lt;li&gt;Positive and Negative Paradigms&lt;/li&gt;
&lt;li&gt;TimescaleDB telemetry&lt;/li&gt;
&lt;li&gt;Voice-based memory retrieval&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Running Locally
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
npm run dev
uvicorn tiger_agent.api:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The application runs locally with PostgreSQL, pgvector, TimescaleDB, React, and FastAPI.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Niteesh57" rel="noopener noreferrer"&gt;
        Niteesh57
      &lt;/a&gt; / &lt;a href="https://github.com/Niteesh57/tigerdb" rel="noopener noreferrer"&gt;
        tigerdb
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;TigerDB: Unified Graph &amp;amp; Vector Database for Memory Intelligence Agent (MIA)&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://fastapi.tiangolo.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/71cccd94531a630809e793a8b59883cea2039d7b590891398f57996d0c5ed727/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d302e3131302b2d3030393638383f7374796c653d666c6174266c6f676f3d66617374617069" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://react.dev" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e29ad264fd317cd8486ec970d6e4c4297dc8b31deb613f5f5958da8c8a480a95/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31392d3631444146423f7374796c653d666c6174266c6f676f3d7265616374" alt="React"&gt;&lt;/a&gt;
&lt;a href="https://www.postgresql.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6afdbe0c9498dc22bff2b3bb95fe94f29170c2aa76b0b58b84266af49f54d619/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506f737467726553514c2d31382d3333363739313f7374796c653d666c6174266c6f676f3d706f737467726573716c" alt="PostgreSQL"&gt;&lt;/a&gt;
&lt;a href="https://www.timescale.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/74aaccc7320ddaeaf3dc18a5b548ef26b6aa6fb51cdf53e8dc06f93a18451ee6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54696d657363616c6544422d48415f706731382d4644423531353f7374796c653d666c6174266c6f676f3d74696d657363616c65" alt="TimescaleDB"&gt;&lt;/a&gt;
&lt;a href="https://github.com/pgvector/pgvector" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0d27dcb9f0f4909d6f02fa1e2a121f3fd34a5f14b299ee3e8210cfb6cd053679/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7067766563746f722d302e382b2d626c75653f7374796c653d666c6174" alt="pgvector"&gt;&lt;/a&gt;
&lt;a href="https://build.nvidia.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/55dc7ddcb8c7d7edeb8b81caac05ff0f81da16a75323e09944873724bdf8939c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e56494449415f4e494d2d4c4c4d5f476174657761792d3736423930303f7374796c653d666c6174266c6f676f3d6e7669646961" alt="NVIDIA NIM"&gt;&lt;/a&gt;
&lt;a href="https://render.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/573f5b961aba82c85cef35f57f75661fb2df684ec3972e321216ef1fabe42195/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656e6465722d446f636b65725f4465706c6f7961626c652d3436453342373f7374796c653d666c6174266c6f676f3d72656e646572" alt="Render"&gt;&lt;/a&gt;
&lt;a href="https://arxiv.org/abs/2604.04503" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/90a223e0f5c596ec2f2d0f762d018c120baf6635479b861f1ae586e8b6fc570c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f61725869762d323630342e30343530332d4233314231423f7374796c653d666c6174266c6f676f3d6172786976" alt="Paper"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An enterprise-grade implementation of the &lt;strong&gt;Memory Intelligence Agent (MIA)&lt;/strong&gt; lifelong learning framework (&lt;a href="https://arxiv.org/abs/2604.04503" rel="nofollow noopener noreferrer"&gt;arXiv:2604.04503v4&lt;/a&gt;), powered by &lt;strong&gt;TigerDB&lt;/strong&gt; — a unified multi-model engine combining &lt;strong&gt;PostgreSQL 18&lt;/strong&gt;, &lt;strong&gt;TimescaleDB HA&lt;/strong&gt;, &lt;strong&gt;pgvector&lt;/strong&gt;, and a native &lt;strong&gt;Property Graph Model&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Includes a full-stack &lt;strong&gt;Desktop Memory Agent Web HUD&lt;/strong&gt; with real-time Graph DAG visualization, speech-enabled AI assistant, morning briefings, in-situ WebMCP auto-healing, and a zero-downtime deployment container for Render.com.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📑 Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Niteesh57/tigerdb#1-theoretical-foundations-mia-paper-arxiv260404503" rel="noopener noreferrer"&gt;1. Theoretical Foundations (MIA Paper arXiv:2604.04503)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#11-equation-4-non-parametric-hybrid-retrieval-scoring" rel="noopener noreferrer"&gt;1.1 Equation 4: Non-Parametric Hybrid Retrieval Scoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#12-multimodal-semantic-similarity-eq-9" rel="noopener noreferrer"&gt;1.2 Multimodal Semantic Similarity (Eq. 9)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#13-dual-paradigm-extraction-positive-vs-negative-paradigms" rel="noopener noreferrer"&gt;1.3 Dual Paradigm Extraction (Positive vs. Negative Paradigms)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#14-shortest-path-execution-prioritization" rel="noopener noreferrer"&gt;1.4 Shortest Path Execution Prioritization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#15-high-semantic-similarity-knowledge-replacement" rel="noopener noreferrer"&gt;1.5 High Semantic Similarity Knowledge Replacement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#16-reflect-replan-mechanism" rel="noopener noreferrer"&gt;1.6 Reflect-Replan Mechanism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#17-grpo-trajectory-telemetry-in-timescaledb" rel="noopener noreferrer"&gt;1.7 GRPO Trajectory Telemetry in TimescaleDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Niteesh57/tigerdb#2-system-architecture" rel="noopener noreferrer"&gt;2. System Architecture&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#21-architectural-flow-diagram" rel="noopener noreferrer"&gt;2.1 Architectural Flow Diagram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#22-the-4-storage-layers-of-tigerdb" rel="noopener noreferrer"&gt;2.2 The 4 Storage Layers of TigerDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Niteesh57/tigerdb#3-application-features--web-hud" rel="noopener noreferrer"&gt;3. Application Features &amp;amp; Web HUD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Niteesh57/tigerdb#4-deployment-modes" rel="noopener noreferrer"&gt;4.&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Niteesh57/tigerdb" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Key files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Niteesh57/tigerdb/blob/main/tiger_agent/desktop_memory.py" rel="noopener noreferrer"&gt;&lt;code&gt;tiger_agent/desktop_memory.py&lt;/code&gt;&lt;/a&gt; — core activity recorder: creates graph nodes + vector embeddings in a single transaction&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Niteesh57/tigerdb/blob/main/tiger_agent/morning_assistant.py" rel="noopener noreferrer"&gt;&lt;code&gt;tiger_agent/morning_assistant.py&lt;/code&gt;&lt;/a&gt; — morning briefing engine: unfinished threads, blockers, today's agenda&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Niteesh57/tigerdb/blob/main/tiger_agent/llm_client.py" rel="noopener noreferrer"&gt;&lt;code&gt;tiger_agent/llm_client.py&lt;/code&gt;&lt;/a&gt; — NVIDIA NIM gateway with structured JSON output and local fallback&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Niteesh57/tigerdb/tree/main/tiger_mia" rel="noopener noreferrer"&gt;&lt;code&gt;tiger_mia/&lt;/code&gt;&lt;/a&gt; — Memory Intelligence Agent core: Manager, Planner, Executor, Judger&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The architecture implements the &lt;strong&gt;Memory Intelligence Agent (MIA)&lt;/strong&gt; framework (&lt;a href="https://arxiv.org/abs/2604.04503" rel="noopener noreferrer"&gt;arXiv:2604.04503&lt;/a&gt;) on top of PostgreSQL 18. Every component is open-source:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inference layer — NVIDIA NIM (open-weight models via NIM API):&lt;/strong&gt;&lt;br&gt;
The agent uses &lt;code&gt;meta/llama-3.3-70b-instruct&lt;/code&gt; served through NVIDIA NIM — an open-weight model that can be self-hosted on any NVIDIA GPU. The LLM client (&lt;code&gt;llm_client.py&lt;/code&gt;) uses &lt;code&gt;langchain_openai&lt;/code&gt; pointed at the NIM endpoint and requests structured JSON output via Pydantic schemas, so the response is always parseable into &lt;code&gt;{ format, speakingtext, content }&lt;/code&gt; without hallucinated formatting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Embedding layer — &lt;code&gt;sentence-transformers&lt;/code&gt; (local inference):&lt;/strong&gt;&lt;br&gt;
Every desktop activity is encoded into a 384-dimensional vector using &lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt;, running fully locally via the &lt;code&gt;sentence-transformers&lt;/code&gt; library. No activity text ever leaves the machine at embedding time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory layer — TigerDB (PostgreSQL 18 + pgvector + TimescaleDB):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pgvector 0.8.6&lt;/code&gt; provides HNSW indexing (&lt;code&gt;vector_cosine_ops&lt;/code&gt;) for sub-millisecond cosine similarity search&lt;/li&gt;
&lt;li&gt;A custom &lt;code&gt;tiger_graph&lt;/code&gt; schema stores execution DAGs in plain PostgreSQL tables, traversed with recursive CTEs&lt;/li&gt;
&lt;li&gt;TimescaleDB hypertable partitions the trajectory log into 7-day chunks with 90% columnar compression&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Agent runtime — four-role architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory Manager&lt;/td&gt;
&lt;td&gt;Hybrid retrieval (Eq. 4), knowledge replacement at threshold θ=0.92, workflow compression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Planner&lt;/td&gt;
&lt;td&gt;Few-shot in-context learning with Positive &amp;amp; Negative Paradigms, Reflect-Replan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Executor&lt;/td&gt;
&lt;td&gt;ReAct loop tool interactions, logging execution graphs into TigerDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Judger&lt;/td&gt;
&lt;td&gt;Evaluates correctness, computes multi-signal GRPO rewards (r₁ correctness, r₂ tool efficiency, r₃ format)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The hybrid scoring formula (Equation 4 from the MIA paper) ranks retrieved memories by:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Score&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.50&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Sim&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.35&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.15&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;This means a memory that was &lt;em&gt;correct&lt;/em&gt; and &lt;em&gt;short&lt;/em&gt; rises above memories that were merely &lt;em&gt;semantically close&lt;/em&gt; — the agent genuinely learns which workflows worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  🐯 Tiger Data: Best Use of Tiger Data
&lt;/h2&gt;

&lt;p&gt;TigerDB was designed from the ground up around exactly the three patterns the Tiger Data prize calls out: &lt;strong&gt;store embeddings with pgvector&lt;/strong&gt;, &lt;strong&gt;run hybrid keyword and vector search for an agent&lt;/strong&gt;, and &lt;strong&gt;let an agent manage a database&lt;/strong&gt;. Here is precisely how each one works.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Storing Embeddings with pgvector
&lt;/h3&gt;

&lt;p&gt;Every desktop activity — a file edit, a terminal command, a browser tab, a promise made to a client — is encoded into a &lt;strong&gt;384-dimensional vector&lt;/strong&gt; using &lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt; and persisted into &lt;code&gt;tiger_mia.memory_units&lt;/code&gt; via &lt;code&gt;pgvector&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# tiger_agent/desktop_memory.py — record_activity()
&lt;/span&gt;&lt;span class="n"&gt;q_embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;activity_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path_or_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;snippet&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;promise_text&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;insert_sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    INSERT INTO tiger_mia.memory_units (
        modality, category, question, caption,
        question_embedding,          -- vector(384)
        trajectory_graph_id,
        compressed_workflow, judgment_label,
        execution_length, usage_count, success_count
    ) VALUES (
        &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;desktop_activity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, %s, %s, %s,
        %s::vector, %s,
        %s::jsonb, %s,
        1, 1, 1
    ) RETURNING id;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The HNSW index (&lt;code&gt;vector_cosine_ops&lt;/code&gt;) makes every lookup sub-millisecond even as memories accumulate across months of work sessions.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Hybrid Keyword + Vector Search for an Agent
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;search_timeline&lt;/code&gt; method — called every time the agent answers a voice query — runs a &lt;strong&gt;true hybrid&lt;/strong&gt; scoring formula directly in SQL, combining pgvector cosine similarity with PostgreSQL full-text &lt;code&gt;similarity()&lt;/code&gt; in a single query:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- tiger_agent/desktop_memory.py — search_timeline()&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;question&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;caption&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;snippet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;activity_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;compressed_workflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;trajectory_graph_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;-- Hybrid score: 70% keyword (pg_trgm similarity) + 30% vector (pgvector cosine)&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;GREATEST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;caption&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question_embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;composite_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question_embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tiger_mia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory_units&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;modality&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'desktop_activity'&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;composite_score&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When the Planner retrieves memories for in-context learning, it uses &lt;strong&gt;Equation 4 from the MIA paper&lt;/strong&gt; — a three-signal scoring formula that weighs semantic similarity, historical success rate, and access frequency together:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Score&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.50&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Sim&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="accent-body"&gt;&lt;span class="mord"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.35&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.15&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;u&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;p&gt;This means the agent doesn't just retrieve what's &lt;em&gt;similar&lt;/em&gt; — it retrieves what &lt;em&gt;worked&lt;/em&gt;, actively separating &lt;strong&gt;Positive Paradigms&lt;/strong&gt; (correct past workflows) from &lt;strong&gt;Negative Paradigms&lt;/strong&gt; (failed patterns to avoid).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Agent Managing the Database Through WebMCP
&lt;/h3&gt;

&lt;p&gt;TigerDB includes a &lt;strong&gt;WebMCP Action Engine&lt;/strong&gt; — a direct agent-to-database execution layer that lets the agent manage system state without the user copy-pasting commands. When the morning briefing surfaces a failed Docker deployment (stored as a Negative Paradigm in TigerDB), the agent calls &lt;code&gt;docker_heal&lt;/code&gt; directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# tiger_agent/webmcp_actions.py
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WebMCPActionEngine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Dispatches action to the appropriate handler.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;handler_map&lt;/span&gt; &lt;span class="o"&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;docker_heal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heal_docker_container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# auto-restarts containers
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docker_status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_docker_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;# live container table
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open_file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_local_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;# reveals file in explorer
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft_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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_draft_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# creates draft from promise
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resume_session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resume_session&lt;/span&gt;          &lt;span class="c1"&gt;# restores work contexts
&lt;/span&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And on the database side, the agent writes every action outcome — whether the Docker heal succeeded or failed — back into &lt;code&gt;tiger_mia.memory_units&lt;/code&gt; as a new judgment-labeled memory, and logs the reward signals to the TimescaleDB hypertable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- TimescaleDB Hypertable: agent self-updates its own memory after each action&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;tiger_mia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trajectory_logs&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_steps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;correctness_reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool_reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;format_reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;total_reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;advantage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;jsonb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is a closed loop: the agent reads from TigerDB, acts on the world, and writes the outcome back to TigerDB — with no human in the middle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;My friend's computer is his livelihood. Every file path, every client name in a browser tab, every half-written email draft is private business data. The core insight of this project is that &lt;strong&gt;desktop memory is the most personal data a person generates&lt;/strong&gt;, and it should never leave their machine by default.&lt;/p&gt;

&lt;p&gt;With closed AI APIs, continuous desktop activity monitoring would require streaming every file name, every snippet of code, every URL visited to a third-party server for embedding and inference. That is a non-starter for a freelancer with NDAs and client confidentiality obligations.&lt;/p&gt;

&lt;p&gt;Open-source AI made three things possible that a closed API never could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local embedding inference.&lt;/strong&gt; &lt;code&gt;sentence-transformers&lt;/code&gt; with &lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt; runs entirely on the CPU. Every activity is vectorized locally. The data never moves off the machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-hostable LLM.&lt;/strong&gt; NVIDIA NIM serves open-weight models like Llama 3.3 70B. My friend can run this on his own NVIDIA GPU at home. The morning briefing LLM call — the part that reads his unfinished tasks and failed deployments — stays on his own hardware.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inspectable, modifiable memory.&lt;/strong&gt; Because TigerDB is built on PostgreSQL with documented schemas, my friend can open &lt;code&gt;psql&lt;/code&gt;, see exactly what the agent remembers about him, delete rows he doesn't want, and modify the scoring weights. A closed memory API gives you none of that transparency or control.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open innovation didn't just make TigerDB cheaper — it made it &lt;em&gt;ethically possible&lt;/em&gt; to build a tool that watches someone's work all day.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🐯 &lt;strong&gt;Tiger Data — Best Use of Tiger Data&lt;/strong&gt;: pgvector HNSW embeddings for all desktop activities + hybrid keyword/vector SQL search + WebMCP agent that reads, acts, and writes outcomes back to TigerDB autonomously&lt;/li&gt;
&lt;li&gt;🟢 &lt;strong&gt;NVIDIA&lt;/strong&gt;: Uses NVIDIA NIM API with open-weight Llama 3.3 70B for structured LLM responses&lt;/li&gt;
&lt;li&gt;🐘 &lt;strong&gt;TimescaleDB / PostgreSQL&lt;/strong&gt;: Core storage layer — pgvector HNSW + TimescaleDB hypertable + recursive CTE property graph, all on PostgreSQL 18&lt;/li&gt;
&lt;li&gt;🦜 &lt;strong&gt;LangChain&lt;/strong&gt;: &lt;code&gt;langchain_openai&lt;/code&gt; used as the LLM client interface to NVIDIA NIM&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built during Hacktoberfest Weekend 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>Kindy: A friendly voice companion that helps you find ways to give back</title>
      <dc:creator>BV Nagi Reddy</dc:creator>
      <pubDate>Mon, 07 Sep 2026 01:50:37 +0000</pubDate>
      <link>https://dev.to/bv_niteesh_be2c0eccc9a5fd/kindy-a-friendly-voice-companion-that-helps-you-find-ways-to-give-back-294j</link>
      <guid>https://dev.to/bv_niteesh_be2c0eccc9a5fd/kindy-a-friendly-voice-companion-that-helps-you-find-ways-to-give-back-294j</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-09-03"&gt;Weekend Challenge: Generosity Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Whenever I look at charity websites, almost all of them immediately ask for money. But what if you're a student or just tight on cash right now? &lt;/p&gt;

&lt;p&gt;It often makes people feel guilty or like they have nothing to offer.&lt;br&gt;
The truth is, generosity isn't just about writing a check. You can give your time, your skills, your advice, or just a listening ear.&lt;/p&gt;

&lt;p&gt;For this challenge, I built &lt;strong&gt;Kindy&lt;/strong&gt; — an interactive 2D animated avatar you can actually talk to. &lt;/p&gt;

&lt;p&gt;Instead of filling out a boring form, you have a quick voice chat with Kindy. You tell it what you like doing, what skills you have, or how much free time you have this weekend. Kindy then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reacts with funny, exaggerated emotions (crying when you say you're tired, hyping you up when you doubt yourself, and celebrating your ideas).&lt;/li&gt;
&lt;li&gt;Gives you 6 simple, realistic ways you can make an impact.&lt;/li&gt;
&lt;li&gt;Uses Google Maps to look up real community centers, food banks, and volunteer spots near your city.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fiira8emha1gqah3cb5qz.png" 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%2Fiira8emha1gqah3cb5qz.png" alt="Kindy Avatar Studio interface showing an animated human-like avatar and voice interaction controls" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://kindy-avatar-studio-619077244859.us-central1.run.app/" rel="noopener noreferrer"&gt;Kindy Avatar Studio&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The application is deployed on Google Cloud Run. Since Cloud Run may scale down when there is no activity, the first request can take a few seconds to start the application. Please wait a few seconds if the page takes time to load.&lt;/p&gt;

&lt;p&gt;Once the application opens, you can enter any random/demo data you like. &lt;strong&gt;This entered information is stored only in your browser.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The avatar supports direct speech interaction. Simply open the URL and start speaking—you don't need to configure or think about anything else.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;You can find the full code on GitHub:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Niteesh57" rel="noopener noreferrer"&gt;
        Niteesh57
      &lt;/a&gt; / &lt;a href="https://github.com/Niteesh57/Kindy" rel="noopener noreferrer"&gt;
        Kindy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Understand how you're feeling and what you have to offer, then help you find a meaningful way to help someone else.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/Niteesh57/Kindy/main/assets/cover.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FNiteesh57%2FKindy%2Fmain%2Fassets%2Fcover.png" alt="Kindy - The Generosity Companion" width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kindy — The Generosity Companion 🎨✨&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://kindy-avatar-studio-619077244859.us-central1.run.app" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3a7cdd61a9af117f9408f517d67f7db7263954092240a8eae3ea4ee8b9befeee/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c69766525323044656d6f2d436c6f756425323052756e2d3432383546343f6c6f676f3d676f6f676c652d636c6f7564266c6f676f436f6c6f723d7768697465" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://youtu.be/jI_YRfRIlqo" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a041cd9151923e13718e93a17a960170504b14d4b92eb7b118b2d1e39f8b8e1b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f596f75547562652d566964656f25323044656d6f2d7265643f6c6f676f3d796f7574756265266c6f676f436f6c6f723d7768697465" alt="YouTube Demo"&gt;&lt;/a&gt;
&lt;a href="https://vitejs.dev/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/27653f82fb5f70c6b7d07ccf44cffe7030b6cd5d2b09d4568878ed55733ba72c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f46726f6e74656e642d56697465253230253242253230526561637425323031382d3634364346463f6c6f676f3d76697465266c6f676f436f6c6f723d7768697465" alt="Vite"&gt;&lt;/a&gt;
&lt;a href="https://nodejs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c3a7a02868fe4c3fa08b117edafbef9cde09144b10e326ece33d7b7756063b4f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4261636b656e642d4e6f64652e6a73253230253242253230457870726573732d3333393933333f6c6f676f3d6e6f64652e6a73266c6f676f436f6c6f723d7768697465" alt="Node.js"&gt;&lt;/a&gt;
&lt;a href="https://cloud.google.com/vertex-ai" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f4413560f7099b824e1958b9ecfecb131d6fd65a5cf25bab695b002267a39ce/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492532304d6f64656c2d47656d696e69253230332e38253230466c6173682d4646364630303f6c6f676f3d676f6f676c65266c6f676f436f6c6f723d7768697465" alt="Gemini Flash"&gt;&lt;/a&gt;
&lt;a href="https://cloud.google.com/vertex-ai" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f178659040294cb8e1688b4ebe09737cd54408d3f892b896fbbcd0d6a480f156/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566f6963652d47656d696e69253230332e31253230466c6173682532305454532d3030414343313f6c6f676f3d676f6f676c65266c6f676f436f6c6f723d7768697465" alt="Gemini TTS"&gt;&lt;/a&gt;
&lt;a href="https://cloud.google.com/run" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c5ddfcb59f9ff494e8275ccc617c8c53cd1ac56c47c5ff56695326cb5772998d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4465706c6f796d656e742d446f636b6572253230253242253230436c6f756425323052756e2d3234393645443f6c6f676f3d646f636b6572266c6f676f436f6c6f723d7768697465" alt="Docker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kindy&lt;/strong&gt; is a real-time, voice-driven AI companion and avatar studio. Powered by &lt;strong&gt;Google Gemini 3.8 Flash&lt;/strong&gt; and &lt;strong&gt;Gemini 3.1 Flash TTS&lt;/strong&gt;, it brings a stylized 2D cartoon avatar to life through audio-driven lip sync, multi-emotion acting, spatial hand gestures, Google Search &amp;amp; Maps grounding, and a 6-card interactive action HUD.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌟 Live Deployment &amp;amp; Demo Video&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Live Web Application&lt;/strong&gt;: &lt;strong&gt;&lt;a href="https://kindy-avatar-studio-619077244859.us-central1.run.app" rel="nofollow noopener noreferrer"&gt;https://kindy-avatar-studio-619077244859.us-central1.run.app&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🎬 &lt;strong&gt;Video Walkthrough (YouTube)&lt;/strong&gt;: &lt;strong&gt;&lt;a href="https://youtu.be/jI_YRfRIlqo" rel="nofollow noopener noreferrer"&gt;Watch the Demo Video&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://youtu.be/jI_YRfRIlqo" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c503476a0b8855c02e5c73b8617106255605a988feb15e615f033e9407c61e65/68747470733a2f2f696d672e796f75747562652e636f6d2f76692f6a495f59526652496c716f2f6d617872657364656661756c742e6a7067" alt="Watch Kindy in Action"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 Core Purpose &amp;amp; Persona&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;The Generosity Companion &amp;amp; Comic Well-Wisher&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Kindy operates on a simple philosophy:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Everyone has something meaningful to give."&lt;/strong&gt;
Whether it is 20 minutes of spare time, professional skills, tutoring, attention, physical presence, surplus items, or mentorship.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;The High-Drama Comic Well-Wisher&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Kindy is not a monotone chatbot. It embodies a &lt;strong&gt;passionate comic well-wisher and benchmark mentor&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark Face (&lt;code&gt;[serious, hands_up]&lt;/code&gt;)&lt;/strong&gt;: When users doubt themselves…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Niteesh57/Kindy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;strong&gt;Tech stack:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React, Vite, and custom SVG animations for avatar expressions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice &amp;amp; Audio&lt;/strong&gt;: Web Audio API and browser's &lt;code&gt;SpeechRecognition&lt;/code&gt; for automatic voice detection (so you can just talk naturally).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js + Express with WebSockets for real-time streaming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI&lt;/strong&gt;: Google GenAI SDK with Gemini 3.8 Flash and Gemini 3.1 TTS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Multi-stage Dockerfile ready for Cloud Run.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I wanted Kindy to feel like a real conversation with an encouraging friend, not a dry chatbot:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Avatar &amp;amp; Expressions&lt;/strong&gt;:
I built a custom face overlay in React with different SVG states (crying eyes, sweat drops, anime-style anger veins, star eyes, and waving hands). The backend sends emotion tags like &lt;code&gt;[crying]&lt;/code&gt; or &lt;code&gt;[excited]&lt;/code&gt; alongside the text, and the frontend switches expressions as words are spoken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Voice &amp;amp; WebSockets&lt;/strong&gt;:
Instead of clicking buttons for every turn, I used browser's built-in SpeechRecognition to detect when you start and stop talking. Your voice goes through a WebSocket to the Node server, which streams both text and audio back simultaneously so there is very little lag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounding in the Real World&lt;/strong&gt;:
General advice like "go volunteer" isn't very helpful. By connecting Google Search and Google Maps tools to Gemini, Kindy can check where you live and suggest actual local libraries, youth mentoring groups, or neighborhood kitchens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple Docker Setup&lt;/strong&gt;:
I wrapped the React build and the Node server together in one Docker container so anyone can run it locally with &lt;code&gt;docker compose up&lt;/code&gt; or deploy it to Google Cloud Run in one command.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Best Use of Google AI
&lt;/h3&gt;

&lt;p&gt;Kindy relies on Google AI for its brain and voice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.8 Flash&lt;/strong&gt;: Handles the conversation, keeps track of the user's profile, and outputs real-time emotion cues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.1 Flash TTS&lt;/strong&gt;: Generates the expressive voice output so Kindy can speak out loud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Search &amp;amp; Google Maps Tools&lt;/strong&gt;: Powers the local search so Kindy recommends verified places and groups in your city.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google GenAI SDK (&lt;code&gt;@google/genai&lt;/code&gt;)&lt;/strong&gt;: Connects everything cleanly in Node.js.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Lessons Learned
&lt;/h3&gt;

&lt;p&gt;Building this over the weekend showed me that giving back feels much more approachable when someone helps you break it down into small, doable steps. Even spending 20 minutes sharing advice with someone starting out in your field counts as generosity.&lt;/p&gt;

&lt;p&gt;Thanks for checking out Kindy!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>gemini</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
