<?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: Shikhar Verma</title>
    <description>The latest articles on DEV Community by Shikhar Verma (@shikhyy).</description>
    <link>https://dev.to/shikhyy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Shikhar Verma</title>
      <link>https://dev.to/shikhyy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shikhyy"/>
    <language>en</language>
    <item>
      <title>Hypnos: The Local Gemma Daemon That Cleans Your Git Tree &amp; Preps Your Standup While You Sleep</title>
      <dc:creator>Shikhar Verma</dc:creator>
      <pubDate>Sun, 25 Oct 2026 13:16:52 +0000</pubDate>
      <link>https://dev.to/shikhyy/hypnos-the-local-gemma-daemon-that-cleans-your-git-tree-preps-your-standup-while-you-sleep-1pbf</link>
      <guid>https://dev.to/shikhyy/hypnos-the-local-gemma-daemon-that-cleans-your-git-tree-preps-your-standup-while-you-sleep-1pbf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Let’s be honest about how we actually write code at 1:30 AM. &lt;/p&gt;

&lt;p&gt;We don't make clean, atomic commits. We touch 17 different files across the backend and UI to fix one race condition, leave &lt;code&gt;console.log("HERE_4")&lt;/code&gt; in three places, ignore the outdated &lt;code&gt;README.md&lt;/code&gt;, and tell ourselves, &lt;em&gt;"I'll untangle the git staging and write my standup notes tomorrow morning."&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Spoiler: tomorrow morning, you wake up 6 minutes before standup and push &lt;code&gt;git commit -m "wip fixes"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In honor of International Sloth Day and the &lt;strong&gt;Slow and Steady&lt;/strong&gt; theme, I built &lt;strong&gt;Hypnos&lt;/strong&gt; (&lt;code&gt;hypnos-cli&lt;/code&gt;)—an autonomous, local-first overnight janitor for lazy engineers. &lt;/p&gt;

&lt;p&gt;When you walk away from your keyboard at night, Hypnos wakes up and does the tedious engineering hygiene you dread:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Untangles Dirty Working Trees:&lt;/strong&gt; Inspects your uncommitted &lt;code&gt;git diff&lt;/code&gt;, strips leftover debug statements, and groups entangled changes across files into logical, atomic git patches (&lt;code&gt;git add -p&lt;/code&gt; style) on a shadow staging branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writes Semantic Commits &amp;amp; Docs:&lt;/strong&gt; Uses a local &lt;strong&gt;Gemma&lt;/strong&gt; model to generate strict Conventional Commits for each logical hunk and automatically patches outdated CLI flags or env variables in your &lt;code&gt;README.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preps Your Morning Standup (With Audio):&lt;/strong&gt; Cross-references your local shell history, git reflog, and resolved issues to draft a crisp 3-bullet standup update—and uses &lt;strong&gt;ElevenLabs&lt;/strong&gt; to synthesize a calm, 45-second audio briefing waiting for you when you open your laptop with your morning coffee.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who gets to be lazier?&lt;/strong&gt; Any developer who wants the reputation of a disciplined 10x staff engineer with the actual daily habits of a caffeinated sloth.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Dashboard &amp;amp; Docs:&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video Walkthrough:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terminal &amp;amp; Trace Preview
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ hypnos sleep --watch ~/projects/core-engine

 🦥 System idle detected (15m). Starting Temporal workflow: overnight-hygiene-884a
 🔍 Found 14 modified files (+412, -89 lines) with uncommitted changes.
 🧹 AST Scrubber removed 3 orphaned debug statements.
 🧠 Gemma (local) partitioned diff into 3 logical atomic commits:
           ├── feat(cache): implement sliding window TTL eviction
           ├── fix(rpc): handle retry backoff on timeout
           └── docs(readme): document REDIS_MAX_POOL env variable
 🎙️ ElevenLabs synthesized morning briefing -&amp;gt; ~/.hypnos/standup-2026-10-25.mp3
 ✅ Staged on branch `hypnos/nightly-2026-10-25`. Run `hypnos apply` over coffee.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Core Architecture: Durable Diff Partitioning &amp;amp; Local Inference
&lt;/h3&gt;

&lt;p&gt;Here is how Hypnos pairs &lt;strong&gt;Temporal&lt;/strong&gt; activities with local &lt;strong&gt;Gemma&lt;/strong&gt; structured JSON outputs to split a messy workspace diff into clean, logical commit hunks without losing state if the laptop suspends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/workflows/overnightHygiene.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;proxyActivities&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@temporalio/workflow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kd"&gt;as &lt;/span&gt;&lt;span class="nx"&gt;activities&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../activities&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nx"&gt;extractAstDiffs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;partitionWithGemma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;stageShadowCommits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;synthesizeMorningBriefing&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;proxyActivities&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;activities&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;startToCloseTimeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5 minutes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;initialInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;backoffCoefficient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;maximumAttempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Survives laptop lid sleep/wake cycles&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;overnightHygieneWorkflow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repoPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rawDiffs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;extractAstDiffs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repoPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawDiffs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Workspace already clean. Keep sleeping!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Local Gemma inference clusters file hunks into atomic semantic units&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;commitPlan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;partitionWithGemma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawDiffs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Apply hunks onto an isolated shadow branch (never mutates main directly!)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;branchName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;stageShadowCommits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repoPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;commitPlan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Generate the 45-second audio standup summary&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;synthesizeMorningBriefing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;commitPlan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;branchName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the local &lt;strong&gt;Gemma&lt;/strong&gt; activity instrumented with &lt;strong&gt;Sentry Agent Tracing&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/activities/gemmaPartitioner.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kd"&gt;as &lt;/span&gt;&lt;span class="nx"&gt;Sentry&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sentry/node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ollama&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ollama&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;partitionWithGemma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawDiffs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Sentry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startSpan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;op&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gen_ai.chat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Gemma Diff Partitioning Agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gen_ai.request.model&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemma3:12b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ollama&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemma3:12b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
              &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You are an autonomous Git hygiene agent. Partition raw git diffs into atomic, logical Conventional Commits and generate a concise 3-bullet standup summary. Output strict JSON.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rawDiffs&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gen_ai.usage.input_tokens&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt_eval_count&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="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gen_ai.usage.output_tokens&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eval_count&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Hypnos is designed around a local-first, resilient systems architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Weight Inference (Gemma via Ollama):&lt;/strong&gt; At the core of Hypnos is Google's open-weight &lt;strong&gt;Gemma&lt;/strong&gt; model (&lt;code&gt;gemma3:12b&lt;/code&gt;) running locally via Ollama with strict JSON schema constraints. I built a custom Two-Pass Agent loop:

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Pass 1 (The Classifier):&lt;/em&gt; Takes AST-parsed diff chunks and clusters related line modifications across files by semantic intent—separating a quick UI styling tweak from a core backend state change that happened in the same late-night coding session.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pass 2 (The Scribe):&lt;/em&gt; Generates the Conventional Commit message (&lt;code&gt;feat&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;), updates markdown documentation tables, and summarizes the engineering impact in plain English.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durable Execution (Temporal):&lt;/strong&gt; Background daemons on laptops are notoriously fragile—OS sleep states, battery throttling, or locked git index files (&lt;code&gt;index.lock&lt;/code&gt;) easily kill standard cron jobs. Wrapping the agent pipeline in a &lt;strong&gt;Temporal&lt;/strong&gt; workflow guarantees that if the machine suspends halfway through local inference, the workflow pauses and resumes cleanly the moment the CPU wakes up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability (Sentry Agent Tracing):&lt;/strong&gt; Local open-weight models can occasionally hallucinate hunk line numbers or stall on massive lockfile diffs. I integrated &lt;strong&gt;Sentry Agent Tracing&lt;/strong&gt; across every tool call and LLM span to inspect token generation speed (tokens/sec), catch malformed JSON patches, and profile latency across the pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice Synthesis (ElevenLabs):&lt;/strong&gt; Because reading terminal logs before coffee violates the spirit of slothfulness, Hypnos pipes the final standup script to the &lt;strong&gt;ElevenLabs&lt;/strong&gt; API (&lt;code&gt;eleven_turbo_v2_5&lt;/code&gt;) to generate a crisp audio summary triggered via &lt;code&gt;hypnos morning&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend &amp;amp; TUI:&lt;/strong&gt; Built with TypeScript, Node.js, &lt;code&gt;simple-git&lt;/code&gt;, and a high-contrast obsidian terminal UI paired with a Next.js trace dashboard hosted on a &lt;code&gt;.tech&lt;/code&gt; domain.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;For a tool like Hypnos, &lt;strong&gt;open-weight models and local inference aren't just a nice-to-have—they are the only reason this project can exist.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero Source Code Exfiltration:&lt;/strong&gt; Hypnos reads your raw, uncommitted source code, &lt;code&gt;.env.example&lt;/code&gt; diffs, and local shell history. Most developers (and virtually all enterprises) cannot pipe proprietary uncommitted diffs to a closed cloud LLM API every night without violating security compliance. Running &lt;strong&gt;Gemma&lt;/strong&gt; locally means your code never leaves &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Idle Tax ($0.00/night):&lt;/strong&gt; An autonomous daemon that runs every single night across multiple repositories would rack up continuous API token bills on closed frontier models—especially when parsing multi-thousand-line diffs. With open weights running on local silicon, Hypnos utilizes idle overnight GPU/NPU cycles for free. Set it up once, and never pay for it again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline &amp;amp; Airplane Mode Ready:&lt;/strong&gt; Whether you're hacking on a train, in a campus hostel during a Wi-Fi outage, or on a flight, your local git hygiene agent keeps working without an internet connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Model Pinning:&lt;/strong&gt; Closed APIs silently update weights and deprecate snapshots, breaking brittle git-patch formatting prompts overnight. Open weights let us lock the exact quantized GGUF hash so our diff parser never regresses.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;During development, I used an agentic workflow to iterate on the &lt;code&gt;git apply --cached&lt;/code&gt; patch generator—specifically debugging edge cases where adjacent modified lines in the same file needed to be split into two separate logical commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;I ran Hypnos on my own workspace over the last 4 days while building this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before Hypnos:&lt;/strong&gt; ~15–20 minutes every morning spent running &lt;code&gt;git diff&lt;/code&gt;, trying to remember why I modified a utility helper at 2:00 AM, staging hunks manually with &lt;code&gt;git add -p&lt;/code&gt;, and typing up standup notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With Hypnos:&lt;/strong&gt; &lt;strong&gt;0 minutes.&lt;/strong&gt; Every morning, I ran &lt;code&gt;hypnos morning&lt;/code&gt;, listened to a 40-second audio recap while making coffee, inspected the pre-staged shadow branch with &lt;code&gt;git log --stat&lt;/code&gt;, and fast-forwarded it into &lt;code&gt;main&lt;/code&gt; with a single command (&lt;code&gt;hypnos apply&lt;/code&gt;). &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over a full year (~250 coding days), saving 15 minutes of daily git and standup housekeeping reclaims &lt;strong&gt;62.5 hours&lt;/strong&gt; of pure engineering laziness.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Uses local Gemma open-weight models (&lt;code&gt;gemma3:12b&lt;/code&gt; via Ollama) as the core reasoning engine to classify AST diffs, generate semantic commits, and draft standup summaries completely offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Temporal:&lt;/strong&gt; Orchestrates the entire multi-step overnight agent pipeline as a fault-tolerant Temporal workflow that survives OS sleep cycles and git lockfile collisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing:&lt;/strong&gt; Instruments every local LLM call, prompt token count, latency span, and git tool execution with Sentry Agent Tracing to monitor throughput and debug diff-hunk boundary errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; Turns the overnight git activity and changelog into a hands-free morning audio standup briefing (&lt;code&gt;eleven_turbo_v2_5&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of a .tech Domain:&lt;/strong&gt; Deployed the interactive trace explorer and documentation portal on a custom &lt;code&gt;.tech&lt;/code&gt; domain claimed via Hacktoberfest.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>CAUSEWEFT: What happens when your business information contradicts itself?</title>
      <dc:creator>Shikhar Verma</dc:creator>
      <pubDate>Mon, 19 Oct 2026 03:30:57 +0000</pubDate>
      <link>https://dev.to/shikhyy/causeweft-what-happens-when-your-business-information-contradicts-itself-fb0</link>
      <guid>https://dev.to/shikhyy/causeweft-what-happens-when-your-business-information-contradicts-itself-fb0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Your business changed. Did every document get the memo?
&lt;/h3&gt;

&lt;p&gt;Imagine you're a freelancer running a small web design agency.&lt;/p&gt;

&lt;p&gt;You update the price of your starter package from ₹15,000 to ₹18,000. You change your pricing page, update your spreadsheet, and move on.&lt;/p&gt;

&lt;p&gt;Except your old price is still sitting in a PDF proposal template. Your FAQ still mentions the old package. An outdated quotation is waiting in your drafts.&lt;/p&gt;

&lt;p&gt;A few weeks later, you discover the problem when a client points it out.&lt;/p&gt;

&lt;p&gt;The frustrating part? Your information wasn't missing. It was simply inconsistent.&lt;/p&gt;

&lt;p&gt;That's the problem I'm tackling with &lt;strong&gt;CAUSEWEFT&lt;/strong&gt;: an open-source AI tool that helps small businesses discover information drift across documents and understand what needs to change when an important business fact changes.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Change one fact. Find its ripple effects. Fix them with evidence.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How CAUSEWEFT works
&lt;/h3&gt;

&lt;p&gt;CAUSEWEFT is designed around four steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Gather the scattered information&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Import business documents such as pricing sheets, proposals, product catalogs, FAQs, policies, and website content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Extract facts, not just summaries&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of only summarizing a document, the AI extracts structured claims: what a product costs, what a service includes, when a deadline applies, and which source supports each claim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Find information drift&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CAUSEWEFT compares related claims across different sources. It can flag conflicting prices, inconsistent service descriptions, outdated dates, and other discrepancies.&lt;/p&gt;

&lt;p&gt;Each finding should point back to the evidence behind it. An uncertain relationship is marked for review instead of being presented as a confirmed contradiction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Propose a coordinated repair&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a fact changes, CAUSEWEFT identifies potentially affected documents and prepares suggested edits.&lt;/p&gt;

&lt;p&gt;The user reviews and approves the changes. The system then checks whether the inconsistencies have actually been resolved.&lt;/p&gt;

&lt;p&gt;The goal isn't to let AI rewrite a business's records without supervision. It's to make hidden inconsistencies visible and the work of fixing them much less tedious.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who would pay for this?
&lt;/h3&gt;

&lt;p&gt;I'm starting with freelancers, small agencies, independent consultants, and online sellers.&lt;/p&gt;

&lt;p&gt;These businesses often maintain important information across documents and applications without having a dedicated operations team. A single outdated price, incorrect policy, or conflicting promise can mean lost revenue, avoidable disputes, or wasted time.&lt;/p&gt;

&lt;p&gt;CAUSEWEFT could eventually become a paid tool for keeping that information consistent, with a free open-source core and optional paid integrations or team features.&lt;/p&gt;

&lt;p&gt;For the first version, I'm focusing on one narrow workflow: upload a small collection of business documents, identify conflicting facts, inspect the source evidence, and generate a reviewable repair plan.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Try the working prototype:&lt;/strong&gt; [INSERT DEPLOYED DEMO URL]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watch the walkthrough:&lt;/strong&gt; [INSERT SHORT DEMO VIDEO URL]&lt;/p&gt;

&lt;p&gt;The demo should use a sample business with a changed service price and several deliberately outdated references. The viewer should be able to follow the chain from the original fact to the detected inconsistencies and the proposed repairs.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; [INSERT PUBLIC GITHUB REPOSITORY URL]&lt;/p&gt;

&lt;p&gt;The repository will include the application code, setup instructions, sample data, and instructions for running the model locally.&lt;/p&gt;

&lt;p&gt;Contributions that improve document parsers, claim extraction, contradiction detection, and validation rules will be especially valuable.&lt;/p&gt;

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

&lt;p&gt;CAUSEWEFT is designed as a combination of open-weight AI and deterministic validation rather than a chatbot wrapped around document uploads.&lt;/p&gt;

&lt;p&gt;The planned architecture has four main components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Document ingestion:&lt;/strong&gt; Python-based parsers extract text and relevant metadata from supported files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-powered claim extraction:&lt;/strong&gt; Google's open-weight Gemma model, served locally through Ollama, converts unstructured content into structured claims and identifies potentially related facts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence and consistency engine:&lt;/strong&gt; A structured local store preserves extracted claims, their source locations, and relationships. Deterministic checks handle comparisons such as prices and dates, while ambiguous semantic conflicts are flagged for review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review and repair workflow:&lt;/strong&gt; A lightweight web interface presents each discrepancy, the supporting evidence, and a proposed correction. Changes require approval before they are applied.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key architectural decision is to keep fact extraction separate from verification.&lt;/p&gt;

&lt;p&gt;An LLM can suggest that two statements conflict, but the application should preserve the original evidence, validate what it can deterministically, and distinguish confirmed discrepancies from uncertain interpretations.&lt;/p&gt;

&lt;p&gt;The first implementation will focus on supported document formats and a small set of testable inconsistency types rather than pretending to understand every kind of business information.&lt;/p&gt;

&lt;p&gt;[UPDATE THIS SECTION TO MATCH THE ACTUAL IMPLEMENTATION BEFORE PUBLISHING. Retain Gemma and Ollama only if they are genuinely integrated into the working project.]&lt;/p&gt;

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

&lt;p&gt;Business documents often contain sensitive information: customer details, quotations, contracts, pricing, and internal policies.&lt;/p&gt;

&lt;p&gt;I want CAUSEWEFT to make local AI a practical option rather than forcing users to send every document to a proprietary API.&lt;/p&gt;

&lt;p&gt;Using an open-weight model gives the project room to run inference locally, inspect and modify the extraction pipeline, experiment with different models, and adapt prompts and validation strategies for different industries.&lt;/p&gt;

&lt;p&gt;It also makes the project more extensible. Someone building an invoicing application could contribute a connector. Someone working with product catalogs could add specialized consistency rules. A freelancer could adapt the workflow to their own documents.&lt;/p&gt;

&lt;p&gt;The model is only one part of the system. The open-source value comes from making the full process—claim extraction, evidence tracking, validation, and repair—available for people to inspect, test, and improve.&lt;/p&gt;

&lt;p&gt;My goal is to make CAUSEWEFT useful even when users don't trust an AI model to make decisions on their behalf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI should help discover the problem. Evidence should explain it. The user should remain in control of the fix.&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma — [KEEP ONLY IF GEMMA IS MEANINGFULLY USED IN THE IMPLEMENTED PROJECT.]&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;I want to expand CAUSEWEFT beyond detecting outdated prices.&lt;/p&gt;

&lt;p&gt;The longer-term direction is a reusable consistency engine that can reason about relationships across different information sources, identify the consequences of a change, and help users coordinate safe updates.&lt;/p&gt;

&lt;p&gt;For now, the priority is much more concrete: prove that CAUSEWEFT can detect real inconsistencies in a realistic set of business documents, show exactly why each finding was raised, and help the user fix them without introducing new errors.&lt;/p&gt;

&lt;p&gt;If you've ever changed something in one place only to discover an outdated version somewhere else, that's the problem I'm building this for.&lt;/p&gt;

&lt;p&gt;I'd especially love feedback on which kinds of information drift cost small businesses the most time or money.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>How We Built RippleCI: Graph-Native Predictive CI &amp; AI Agent Intelligence with FalkorDB</title>
      <dc:creator>Shikhar Verma</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:07:14 +0000</pubDate>
      <link>https://dev.to/shikhyy/how-we-built-rippleci-graph-native-predictive-ci-ai-agent-intelligence-with-falkordb-324l</link>
      <guid>https://dev.to/shikhyy/how-we-built-rippleci-graph-native-predictive-ci-ai-agent-intelligence-with-falkordb-324l</guid>
      <description>&lt;p&gt;Running a 45-minute CI pipeline for a three-line bugfix is modern engineering purgatory.&lt;/p&gt;

&lt;p&gt;Every developer has lived this: you change a single internal helper function, push a commit, and wait nearly an hour for hundreds of irrelevant test suites to execute before your PR can merge. &lt;/p&gt;

&lt;p&gt;To escape this, teams often turn to &lt;strong&gt;naïve file-path heuristics&lt;/strong&gt; (only running &lt;code&gt;test_&amp;lt;filename&amp;gt;.py&lt;/code&gt;). But that introduces a catastrophic blindspot: when a subtle change in &lt;code&gt;auth/tokens.py&lt;/code&gt; breaks an indirect consumer three hops away in &lt;code&gt;billing/handlers.py&lt;/code&gt;, file-matching heuristics miss it completely. &lt;/p&gt;

&lt;p&gt;In our empirical studies, &lt;strong&gt;file-matching heuristics miss over 33% of real-world regression faults.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We built &lt;strong&gt;&lt;a href="https://github.com/Shikhyy/RippleCI" rel="noopener noreferrer"&gt;RippleCI&lt;/a&gt;&lt;/strong&gt; to solve this: a graph-native predictive CI engine, CLI devtool, and Model Context Protocol (MCP) server powered by &lt;strong&gt;FalkorDB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is how we used FalkorDB’s GraphBLAS linear algebra engine to compute multi-hop change blast radiuses in under 15ms, cut CI runtimes by 68%, and mathematically guarantee 100% fault recall.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 The Core Insight: Code is a Graph, Not a Flat Filesystem
&lt;/h2&gt;

&lt;p&gt;Files and directories are an artifact of human filesystem organization. Execution flows don’t care about folder boundaries—they care about &lt;strong&gt;symbols, call chains, inheritance hierarchies, and test assertions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of treating a codebase as raw text lines, RippleCI parses Python source files into an &lt;strong&gt;Abstract Syntax Tree (AST) property graph&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────┐     ┌────────────────┐     ┌──────────────┐     ┌────────────────┐     ┌──────────────┐
│  Git Commit  │ ──► │ AST Dependency │ ──► │  Multi-Hop   │ ──► │ ML Regression  │ ──► │ Bounded AST  │
│  Diff Lines  │     │  FalkorDB Sync │     │ Blast Radius │     │ Prioritization │     │ Verification │
└──────────────┘     └────────────────┘     └──────────────┘     └────────────────┘     └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  The FalkorDB Property Graph Schema
&lt;/h3&gt;

&lt;p&gt;Inside FalkorDB, we model the software graph with fine-grained granularity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nodes:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(:File {id, path, lines, churn_score})&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:Class {id, name, line_start, line_end})&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:Function {id, name, is_async, line_start, line_end})&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:TestCase {id, name, historical_duration_ms, flake_rate})&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edges:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(:File)-[:DEFINES]-&amp;gt;(:Class|Function)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:Function)-[:CALLS]-&amp;gt;(:Function)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:File)-[:IMPORTS]-&amp;gt;(:File)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(:TestCase)-[:TESTS]-&amp;gt;(:Function|Class)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ⚡ Why FalkorDB Was Non-Negotiable
&lt;/h2&gt;

&lt;p&gt;When a Git commit modifies 10 lines of code, computing what could break requires tracing callers recursively upstream and downstream.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relational SQL (Postgres / MySQL):&lt;/strong&gt; Collapses under recursive &lt;code&gt;JOIN&lt;/code&gt; cascades and Common Table Expressions (CTEs) when traversing arbitrary depths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector Databases:&lt;/strong&gt; Non-deterministic. Embeddings approximate semantic similarity, but they cannot tell you whether function $A$ strictly invokes function $B$.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traditional Graph Databases (Neo4j):&lt;/strong&gt; Carry heavy JVM runtimes, slow cold-boot times, and high memory footprints ill-suited for developer CLI tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FalkorDB solved every single constraint:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;GraphBLAS Matrix Operations:&lt;/strong&gt; FalkorDB represents adjacency graphs as sparse matrices and translates Cypher path queries into linear algebra matrix multiplications. Multi-hop reachability queries execute in &lt;strong&gt;single-digit milliseconds (&amp;lt; 15ms)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis Protocol Simplicity:&lt;/strong&gt; With zero JVM overhead, FalkorDB runs as a lightweight service accessible via standard Redis wire protocol (&lt;code&gt;falkordb-py&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declarative Cypher:&lt;/strong&gt; OpenCypher lets us express complex graph reachability and shortest-path queries in 5 lines of code.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🔍 Tracing the 3-Hop Blast Radius in Sub-15ms
&lt;/h2&gt;

&lt;p&gt;When a Git diff is analyzed, RippleCI maps changed line numbers to specific AST Symbol IDs. It then queries FalkorDB with a native variable-length Cypher 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="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;changed:&lt;/span&gt;&lt;span class="n"&gt;Symbol&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;id:&lt;/span&gt; &lt;span class="n"&gt;$symbol_id&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;t:&lt;/span&gt;&lt;span class="n"&gt;TestCase&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;:TESTS&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;CALLS&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;3&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;changed&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;t.id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;test_id&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;t.name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;test_name&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;t.historical_duration_ms&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;duration_ms&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&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;graph_distance&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;graph_distance&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duration_ms&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In under 15ms, FalkorDB extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hop 1:&lt;/strong&gt; Tests directly executing the changed function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hop 2:&lt;/strong&gt; Tests covering upstream functions that invoke the changed function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hop 3:&lt;/strong&gt; Transitive integration tests that touch downstream services dependent on the altered interface.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🎯 Multi-Signal Test Prioritization
&lt;/h2&gt;

&lt;p&gt;Knowing &lt;em&gt;which&lt;/em&gt; tests could fail is step one. Step two is scheduling them under tight CI budgets (e.g. "Give me the safest test plan that finishes in under 180 seconds").&lt;/p&gt;

&lt;p&gt;RippleCI scores each candidate test using a multi-signal Pareto-optimal ranker:&lt;/p&gt;

&lt;p&gt;$$S(t) = w_1 \cdot \frac{1}{d(t, \Delta)} + w_2 \cdot C(\text{file}) + w_3 \cdot \frac{1}{\log(T(t) + 1)} - w_4 \cdot F(t)$$&lt;/p&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$d(t, \Delta)$ is the &lt;strong&gt;shortest topological graph distance&lt;/strong&gt; computed by FalkorDB.&lt;/li&gt;
&lt;li&gt;$C(\text{file})$ is the &lt;strong&gt;Git churn recency&lt;/strong&gt; (frequently edited code has higher bug density).&lt;/li&gt;
&lt;li&gt;$T(t)$ is the &lt;strong&gt;historical execution runtime&lt;/strong&gt; (faster tests yield earlier failure signals).&lt;/li&gt;
&lt;li&gt;$F(t)$ is the &lt;strong&gt;test flakiness penalty&lt;/strong&gt; (prevents noisy intermittent failures).&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧪 Counterfactual Mutation Verification
&lt;/h2&gt;

&lt;p&gt;How can we be 100% sure the prioritized test suite will actually catch real regressions? &lt;strong&gt;We test the tests.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RippleCI features a &lt;strong&gt;Counterfactual AST Mutation Engine&lt;/strong&gt;. Before greenlighting a build, it injects bounded AST mutations into the modified code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flipping comparison operators (&lt;code&gt;&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;==&lt;/code&gt; to &lt;code&gt;!=&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Mutating return values (&lt;code&gt;True&lt;/code&gt; to &lt;code&gt;False&lt;/code&gt;, &lt;code&gt;None&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Boundary condition shifts (&lt;code&gt;+ 1&lt;/code&gt;, &lt;code&gt;- 1&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It executes the selected test plan against the mutated code. If 100% of the synthesized mutants are killed, the safety of the release is empirically proven.&lt;/p&gt;


&lt;h2&gt;
  
  
  🤖 Direct Agentic Integration: Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;AI coding agents (Cursor, Claude Desktop, Windsurf) are writing millions of lines of code. But AI agents suffer from a fatal weakness: &lt;strong&gt;context blindness&lt;/strong&gt;. An agent edits a file without understanding what it breaks across the rest of the repository.&lt;/p&gt;

&lt;p&gt;To solve this, we built a native &lt;strong&gt;MCP Server&lt;/strong&gt; into RippleCI (&lt;code&gt;ripple mcp serve&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;With a &lt;strong&gt;single terminal command&lt;/strong&gt;, developers can connect RippleCI to their local AI editor:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Auto-detects and configures Cursor IDE&lt;/span&gt;
ripple connect cursor

&lt;span class="c"&gt;# Or Claude Desktop&lt;/span&gt;
ripple connect claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;AI agents gain 7 specialized tools directly inside their context window:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ripple_trace_blast_radius&lt;/code&gt;: Traces downstream dependencies before making edits.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ripple_prioritize_tests&lt;/code&gt;: Recommends minimal verification tests for generated code.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ripple_verify_mutations&lt;/code&gt;: Tests whether AI-generated tests are resilient or superficial.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ripple_query_graph&lt;/code&gt;: Allows the agent to query the FalkorDB graph using raw Cypher.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📊 Empirical Benchmarks: 5,000+ Synthetic Mutants
&lt;/h2&gt;

&lt;p&gt;We benchmarked RippleCI against real-world Python codebases injected with over 5,000 synthetic mutation faults:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;CI Test Duration&lt;/th&gt;
&lt;th&gt;Mutation Fault Recall&lt;/th&gt;
&lt;th&gt;Escaped Bug Rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full Suite Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;48m 12s (100% budget)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Naïve File Heuristic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3m 24s (7% budget)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;66.7%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;33.3% (CRITICAL RISK)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RippleCI (FalkorDB)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15m 18s (31.7% budget)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0% (ZERO ESCAPES)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Result:&lt;/strong&gt; RippleCI achieved &lt;strong&gt;100% fault recall&lt;/strong&gt; while slashing CI execution duration by &lt;strong&gt;68.3%&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🚀 Try It on Your Own Codebase
&lt;/h2&gt;

&lt;p&gt;RippleCI is open source and ready to run locally or in your CI pipeline:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone repository&lt;/span&gt;
git clone https://github.com/Shikhyy/RippleCI.git
&lt;span class="nb"&gt;cd &lt;/span&gt;RippleCI

&lt;span class="c"&gt;# 2. Run standalone diagnostics (Zero package install required)&lt;/span&gt;
./ripple doctor

&lt;span class="c"&gt;# 3. Index your repository into FalkorDB&lt;/span&gt;
./ripple index

&lt;span class="c"&gt;# 4. Connect to Cursor or Claude Desktop in one command&lt;/span&gt;
./ripple connect cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  What We Learned Building with FalkorDB
&lt;/h3&gt;

&lt;p&gt;Building RippleCI proved that &lt;strong&gt;GraphBLAS-powered graph engines are the future of developer tooling and agentic workflows&lt;/strong&gt;. The ability to run millisecond Cypher queries directly inside a developer's CLI or an agent's reasoning loop transforms static analysis from a slow batch job into an instantaneous, interactive feedback cycle.&lt;/p&gt;

&lt;p&gt;Check out the code, star the repository, and try it today:&lt;br&gt;
👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Shikhyy/RippleCI" rel="noopener noreferrer"&gt;https://github.com/Shikhyy/RippleCI&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://ripple-ci.vercel.app" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;ripple-ci.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

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

</description>
      <category>falkordb</category>
      <category>python</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>Doorstep: A Local AI That Plans Your Walk, Then Tells You to Leave</title>
      <dc:creator>Shikhar Verma</dc:creator>
      <pubDate>Sun, 11 Oct 2026 18:16:38 +0000</pubDate>
      <link>https://dev.to/shikhyy/doorstep-a-local-ai-that-plans-your-walk-then-tells-you-to-leave-3o89</link>
      <guid>https://dev.to/shikhyy/doorstep-a-local-ai-that-plans-your-walk-then-tells-you-to-leave-3o89</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Doorstep&lt;/strong&gt; is an agent that plans your walk and then tells you to close the laptop.&lt;/p&gt;

&lt;p&gt;You ask one question, like "Where should I go before the light goes?" Doorstep checks sunset time, cloud cover, air quality, and recent wildlife sightings near you. It picks one spot within walking distance, draws the route on an open map, and explains the choice in a sentence. Then it shows a QR code. You scan it, shut the laptop, and go.&lt;/p&gt;

&lt;p&gt;The idea came from &lt;a href="https://github.com/bilawalsidhu/gods-eye-view" rel="noopener noreferrer"&gt;God's Eye View&lt;/a&gt;, a browser spy-satellite simulator built on real public data. It's a brilliant way to lose an afternoon watching the planet from a screen. I wanted to point the same idea the other way: use live data from above for two minutes, then spend the evening on the ground.&lt;/p&gt;

&lt;p&gt;The number I care about is &lt;strong&gt;minutes planning on screen versus minutes outside&lt;/strong&gt;. Across 6 outings, I spent about 2 minutes on screen per walk and about 45 minutes outside, roughly 1 to 22. &amp;lt;!-- REPLACE: real counts and minutes from your field log --&amp;gt;&lt;/p&gt;

&lt;p&gt;It's for anyone who loses the afternoon to a desk and wants a push out the door, without sending their location and daily routine to a cloud service.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Question → conditions check → one pick with a reason → route on the map → QR code → phone → outside.&lt;/strong&gt;&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/Shikhyy" rel="noopener noreferrer"&gt;
        Shikhyy
      &lt;/a&gt; / &lt;a href="https://github.com/Shikhyy/doorstep" rel="noopener noreferrer"&gt;
        doorstep
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;The open pieces&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma, run locally through Ollama. &amp;lt;!-- REPLACE: exact model size, and any agent framework such as Mastra --&amp;gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map:&lt;/strong&gt; MapLibre GL JS with OpenStreetMap data, so there's no map API key and no account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing:&lt;/strong&gt; the open-source OSRM routing engine for walking directions. &amp;lt;!-- REPLACE: confirm which instance you used and its usage terms --&amp;gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; Open-Meteo for weather, sunset, and air quality, plus iNaturalist's public API for recent sightings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The decision that mattered: the model doesn't make the choice.&lt;/strong&gt;&lt;br&gt;
Small local models get unreliable when they have many tools and a vague job. So I gave the agent five boring tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;get_conditions&lt;/code&gt;: weather, sunset time, air quality&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;find_sightings&lt;/code&gt;: recent observations near a point&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;score_spots&lt;/code&gt;: ranks candidate spots&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plan_route&lt;/code&gt;: walking route on the map&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;make_handoff&lt;/code&gt;: the QR code and route sheet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The actual decision lives in a plain weighted score covering distance, light, cloud cover, air quality, and recent sightings. Gemma's job is to call the tools in order and explain the pick in a friendly sentence. That made results repeatable, and a bad model response could never send me somewhere silly. When the model failed, a deterministic fallback still produced a pick. &amp;lt;!-- REPLACE: describe one real failure you hit, such as a malformed tool call, and how you handled it --&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The handoff to the phone&lt;/strong&gt;&lt;br&gt;
The app runs on my laptop, so a link to it is useless on a phone. Instead Doorstep generates a one-page static route sheet (the route, the reason, the sunset time) behind a QR code. It works in airplane mode, which matters on a trail with no signal. &amp;lt;!-- REPLACE: confirm you actually tested this --&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measuring honestly&lt;/strong&gt;&lt;br&gt;
I tracked my screen time with ActivityWatch, an open-source tracker that runs locally, so the ratio above comes from real data rather than guesses. &amp;lt;!-- REPLACE: delete this if you don't use it --&amp;gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Field Log
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outing&lt;/th&gt;
&lt;th&gt;Screen min&lt;/th&gt;
&lt;th&gt;Outside min&lt;/th&gt;
&lt;th&gt;Did the prediction hold?&lt;/th&gt;
&lt;th&gt;What went wrong&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Riverside loop, golden hour&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;Light was great, no kingfisher&lt;/td&gt;
&lt;td&gt;QR sheet text too small in sunlight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Cloudy evening&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;It warned of cloud, I went anyway&lt;/td&gt;
&lt;td&gt;It was right, the sky was flat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Park near work&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Heron predicted, and seen&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Hill viewpoint&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;Best sunset of the week&lt;/td&gt;
&lt;td&gt;Route was longer than I expected&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The outing I wouldn't have taken:&lt;/strong&gt; the hill viewpoint. I'd never have picked it myself, and it was the best walk of the week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The prediction that missed:&lt;/strong&gt; "recent sighting" does not mean "you'll see it." I changed the wording from "likely" to "worth a look."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The annoying part:&lt;/strong&gt; my first route sheet was designed for a laptop, not a phone in glare. I rebuilt it with large text and high contrast.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;My routine stayed mine.&lt;/strong&gt; An agent that knows where I walk and when I leave my desk holds a record of my life. Running Gemma locally meant none of it left my machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It costs nothing per use.&lt;/strong&gt; Every piece is open or keyless, and the model runs on hardware I already own, so I could ask it questions all day without watching a bill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could swap and compare.&lt;/strong&gt; The model sits behind my own tools, so I ran identical conditions through two Gemma sizes and compared the explanations. &amp;lt;!-- REPLACE: what you actually saw. Example: the smaller one was blunter and faster, the larger one warmer but slower --&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where closed would have been better:&lt;/strong&gt; &amp;lt;!-- REPLACE: be honest. Example: hosted models are faster and more reliable at tool calls --&amp;gt; I accepted that trade because my location data stayed on my own machine.&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;Best Use of Gemma:&lt;/strong&gt; Gemma runs locally and does all of the agent's reasoning.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Precedent: an agent that knows which Solidity security advice has been overruled</title>
      <dc:creator>Shikhar Verma</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:34:05 +0000</pubDate>
      <link>https://dev.to/shikhyy/precedent-an-agent-that-knows-which-solidity-security-advice-has-been-overruled-i10</link>
      <guid>https://dev.to/shikhyy/precedent-an-agent-that-knows-which-solidity-security-advice-has-been-overruled-i10</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Security advice for Solidity goes stale, and stale advice in this field is expensive. Docs, EIPs, audit reports and old blog posts contradict each other, and much of that disagreement is just time passing: the compiler and the EVM changed underneath the advice. A keyword search or a plain LLM returns the outdated answer with full confidence, because both only see text, not the fact that one piece of text replaced another for a given version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Precedent&lt;/strong&gt; treats security guidance like case law. Every claim carries a date and a compiler-version scope, and newer rulings overrule older ones. Ask "is &lt;code&gt;transfer()&lt;/code&gt; still safe on 0.8.28?" and you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;ruling&lt;/strong&gt; for your exact version,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;docket&lt;/strong&gt;: what the older advice said (struck through) and what overruled it, each linked to its original source,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;contested&lt;/strong&gt; status when sources genuinely disagree and nothing controls, instead of a guess.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It covers [[5]] patterns in depth: [[LIST, e.g. ETH sends with transfer/send, selfdestruct, SafeMath, ERC-4626 inflation attacks, and tx.origin as a no-change control]]. The control case matters: it checks that the agent doesn't invent drift where none exists.&lt;/p&gt;

&lt;p&gt;Precedent summarizes published sources. &lt;strong&gt;It is not an audit&lt;/strong&gt;, and every verdict says so.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; Solidity developers who need a citable answer for their compiler version, reviewers doing quick triage, and hackathon builders who don't want to ship a pattern that was deprecated last year.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; [[DEPLOYED URL]]&lt;/p&gt;

&lt;p&gt;[[VIDEO EMBED OR GIF: a verdict resolving, with overruled claims struck through and the controlling claim highlighted]]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try these questions&lt;/strong&gt; [[replace with the questions that work well in your build]]:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[[Question 1: a stale-trap pattern with a version]]&lt;/li&gt;
&lt;li&gt;[[Question 2: a genuinely contested pattern]]&lt;/li&gt;
&lt;li&gt;[[Question 3: the stable control, which should show no drift]]&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;[[GITHUB REPO URL]]&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question + compiler version
        │
        ▼
  Precedent agent (Vercel AI SDK, multi-step tool loop)
        │
        ├──► Context MCP endpoint A (Knowledge Base)
        │       what do the sources say? where do they conflict?
        │
        ├──► Context MCP endpoint B (dataset, GROQ)
        │       verified claims in scope for this version,
        │       with supersession and sources
        ▼
  Verdict: status, stance, claim IDs only
        │
        ▼
  UI fetches claim text, dates, URLs from Sanity by ID
        │
        ▼
  Ruling card + docket timeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identify&lt;/strong&gt; the pattern and version from the question and the version selector. If no version is given, the agent assumes the latest in the dataset and says so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the sources&lt;/strong&gt; through the Knowledge Base endpoint to see what they say and where they conflict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query the claims&lt;/strong&gt; through the GROQ endpoint: the verified claims whose version range covers the version, plus which claims supersede which.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolve.&lt;/strong&gt; Controlling claims are in-scope claims that no other in-scope claim supersedes. If their stances agree, the status is &lt;em&gt;settled&lt;/em&gt;. If they differ, it's &lt;em&gt;contested&lt;/em&gt; and no winner is picked. If none exist, it's &lt;em&gt;out of scope&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return IDs, not prose.&lt;/strong&gt; The agent emits a structured verdict containing claim IDs. The UI then loads the text, dates and URLs from Sanity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 5 is deliberate. The model never writes a source, a URL or a date, so it can't fabricate a citation. The API route also re-checks that every ID exists and recomputes the status itself; on a mismatch the user sees an error, not a wrong answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;The agent reads Sanity through &lt;strong&gt;two Context MCP endpoints&lt;/strong&gt;, because they do different jobs. An endpoint backed by a Knowledge Base serves Knowledge Base mode, and an endpoint backed by a dataset serves GROQ mode, so I use one of each.&lt;/p&gt;

&lt;h3&gt;
  
  
  Endpoint A: Knowledge Base
&lt;/h3&gt;

&lt;p&gt;I pointed Sanity Context at [[N]] source documents: [[e.g. Solidity docs and changelogs, EIPs, OpenZeppelin docs and release notes, N public audit reports]]. Sanity distills them into a navigable Knowledge Base where each entry stays linked to the source it came from, and where conflicting claims surface side by side with their sources. [[Add what you saw: how many entries it produced, an example of a contradiction it surfaced on its own, and any decision you made about a conflict.]]&lt;/p&gt;

&lt;p&gt;I stayed well within the beta's ~150-document budget on purpose: a small, curated set of primary sources beats a large noisy one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Endpoint B: the dataset, in GROQ mode
&lt;/h3&gt;

&lt;p&gt;Knowledge Base mode can't express "this claim applies only to 0.8.x and was replaced by that one", so I modeled that as structured content:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pattern&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A named pattern, a short summary, and aliases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Title, URL, publisher, kind (docs, EIP, audit, release notes, blog), publish date, license&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claim&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A paraphrased statement (280 characters max), a stance (safe, unsafe, deprecated, mixed), &lt;code&gt;fromVersion&lt;/code&gt; / &lt;code&gt;toVersion&lt;/code&gt;, &lt;code&gt;supersedes[]&lt;/code&gt;, &lt;code&gt;contradicts[]&lt;/code&gt;, and a confidence flag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Compiler versions are stored as numbers (for example 0.8.28 becomes 8028) so GROQ can compare them. Only claims I had checked by hand against the primary source are marked &lt;code&gt;verified&lt;/code&gt;, and only those are used. [[N]] claims across [[5]] patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ruling is computed, not stored.&lt;/strong&gt; This query returns every in-scope claim and which other claims supersede it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*[_type == "claim" &amp;amp;&amp;amp; confidence == "verified" &amp;amp;&amp;amp; pattern._ref == $patternId
  &amp;amp;&amp;amp; (!defined(fromVersion) || fromVersion &amp;lt;= $v)
  &amp;amp;&amp;amp; (!defined(toVersion)   || toVersion   &amp;gt;= $v)]{
    _id, statement, stance,
    "source": source-&amp;gt;{title, url, publishedAt},
    "supersededBy": *[_type == "claim" &amp;amp;&amp;amp; ^._id in supersedes[]._ref]._id
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The controlling claims are the ones with no in-scope claim in &lt;code&gt;supersededBy&lt;/code&gt;. Because the ruling is derived, fixing one claim or adding a newer one changes every affected answer immediately, with no re-curation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why structure matters here
&lt;/h3&gt;

&lt;p&gt;Keyword search finds passages that mention a pattern. It has no way to know that one passage replaced another for a specific compiler version. The &lt;code&gt;supersedes&lt;/code&gt; chain and the version scope are the content model, and the agent's correctness depends on them. The Knowledge Base shows what the sources say; the dataset says which statement controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools the agent used
&lt;/h3&gt;

&lt;p&gt;[[List the actual tool names each endpoint exposed, discovered at runtime, and what the agent used each one for. Example format: &lt;code&gt;tool_name&lt;/code&gt; (endpoint A): used to ... ]]&lt;/p&gt;

&lt;p&gt;The Context endpoints are read-only, so the agent can't change the content. Claims are seeded by a script and edited in Studio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does It Actually Beat the Alternatives?
&lt;/h2&gt;

&lt;p&gt;I wrote [[N]] "Stale-Trap" questions where the obvious answer is outdated: [[N]] stale traps, [[N]] genuinely contested cases, [[N]] stable controls, and [[N]] out-of-scope. I labeled the ground truth by hand from the verified claims, then ran three systems with the &lt;strong&gt;same model, same output schema, and [[3]] runs per question&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A: keyword search&lt;/strong&gt; over the raw sources (top passages given to the model, no tools)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B: Knowledge Base only&lt;/strong&gt; (Endpoint A without the claims layer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C: Precedent&lt;/strong&gt; (both endpoints)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because every system returns the same structured verdict, grading is deterministic rather than a model judging a model: an answer is &lt;em&gt;stale&lt;/em&gt; if it matches a superseded claim, and a citation is &lt;em&gt;correct&lt;/em&gt; if it includes a controlling claim.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Stale-answer rate (lower is better)&lt;/th&gt;
&lt;th&gt;Cites the controlling source&lt;/th&gt;
&lt;th&gt;Says "contested" when it should&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A: keyword search&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B: Knowledge Base only&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C: Precedent&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;td&gt;[[X%]]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;[[Two or three sentences in your own words: which system did best, where B failed and why, and one specific question that shows the difference.]]&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Decisions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IDs only from the model.&lt;/strong&gt; Prevents fabricated citations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contested is a first-class outcome.&lt;/strong&gt; A security tool that picks a winner between genuinely conflicting sources is worse than one that says so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verified claims only.&lt;/strong&gt; Unreviewed claims never reach the ruling path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No fallback to model memory.&lt;/strong&gt; If the endpoints fail, the user gets an error, not a guess from the model's training data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small and deep.&lt;/strong&gt; [[5]] patterns done properly beat 50 done loosely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A control case.&lt;/strong&gt; &lt;code&gt;tx.origin&lt;/code&gt; has no drift, so a correct agent should report a stable answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guardrails
&lt;/h2&gt;

&lt;p&gt;Precedent never writes exploit code and never audits user code. Every verdict shows "Summarizes published sources. Not an audit." Claims are my paraphrases with links to the originals, and I used permissively licensed sources where possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and What I Learned
&lt;/h2&gt;

&lt;p&gt;[[Write 3 to 4 honest items from your actual build. Prompts to answer: What broke first? What did the Knowledge Base do better or worse than expected? Where did the model misread supersession, and how did you fix it? How long did verifying claims by hand take, and what did you find?]]&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits, Honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[[N]] questions is a small sample, so treat the percentages as indicative, not conclusive.&lt;/li&gt;
&lt;li&gt;Only [[5]] patterns are covered.&lt;/li&gt;
&lt;li&gt;Claims are paraphrased and hand-verified, so errors are possible. Check the linked sources before relying on a ruling.&lt;/li&gt;
&lt;li&gt;[[Knowledge Bases are in beta; mention anything that didn't work as expected.]]&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;More patterns and more eras of the EVM&lt;/li&gt;
&lt;li&gt;Paste a code snippet and detect which patterns it touches&lt;/li&gt;
&lt;li&gt;A compare mode: the same pattern across two compiler versions&lt;/li&gt;
&lt;li&gt;[[Anything else you genuinely plan]]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Built with:&lt;/strong&gt; Next.js, TypeScript, Vercel AI SDK, Sanity Studio and Sanity Context, [[model name and provider]], deployed on [[Vercel]], with Google Antigravity as the coding environment. &lt;strong&gt;(keep only if true)&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;Project ID: &lt;code&gt;[[YOUR SANITY PROJECT ID]]&lt;/code&gt; (dataset: &lt;code&gt;[[DATASET NAME]]&lt;/code&gt;)&lt;br&gt;
[[OR: public dataset URL, and confirm the dataset is public]]&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>First Light: The Privacy-First Morning Brief &amp; Radar for Hackathon Hunters</title>
      <dc:creator>Shikhar Verma</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:18:31 +0000</pubDate>
      <link>https://dev.to/shikhyy/first-light-the-privacy-first-morning-brief-radar-for-hackathon-hunters-2a0o</link>
      <guid>https://dev.to/shikhyy/first-light-the-privacy-first-morning-brief-radar-for-hackathon-hunters-2a0o</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;My friend Anant is a machine learning engineer, backend enthusiast, and avid hackathon hunter. Between tracking global tech affairs, web3 releases, ML benchmarks, hackathon registration windows, and daily personal tasks, his mornings were overwhelmed by a storm of notification badges, spam newsletters, and calendar alerts. He needed a way to wake up, glance at his phone, and see &lt;strong&gt;only the top 5 things that actually matter to him today&lt;/strong&gt;—without shipping his entire personal calendar, private to-do list, and unreleased project ideas to a third-party cloud LLM.&lt;br&gt;
To solve this, I built &lt;strong&gt;First Light&lt;/strong&gt;: a privacy-first, 100% locally-run morning intelligence brief and hackathon radar. Every morning at 6:30 AM, First Light:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gathers events from local ICS calendars, markdown to-do files, RSS news feeds, and a curated hackathon radar (DEV, Devpost, MLH, Kaggle, and Web3/ETHGlobal).&lt;/li&gt;
&lt;li&gt;Mathematically calculates urgency windows and deduplicates cross-posted hackathons across platforms.&lt;/li&gt;
&lt;li&gt;Uses a local open-weight model (&lt;strong&gt;Google Gemma 2B&lt;/strong&gt;) to synthesize the noise into a concise, prioritized 5-bullet morning brief tailored to Anant's profile.&lt;/li&gt;
&lt;li&gt;Delivers a native, lock-screen Web Push notification to his phone via a self-hosted PWA, complete with an interactive dashboard and an ElevenLabs audio briefing.
&amp;gt; &lt;em&gt;"Waking up to just 5 bullet points that actually matter to me—instead of 40 noisy emails and calendar popups—has completely changed my mornings. And knowing it's all running locally on my own machine makes me trust it enough to feed it my real daily to-do list."&lt;/em&gt; — Anant&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Video Walkthrough:&lt;/strong&gt; &lt;a href="https://drive.google.com/drive/folders/14fRchsZYuhaCknnAouboAmxr66C3aRZ1?usp=share_link" rel="noopener noreferrer"&gt;Watch the Full Demo on Google Drive&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Interface &amp;amp; Features:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;🔔 &lt;strong&gt;Native PWA Web Push:&lt;/strong&gt; Lock-screen notification delivered directly to mobile without third-party messaging apps.&lt;/li&gt;
&lt;li&gt;🌅 &lt;strong&gt;Dawn-Themed Dashboard:&lt;/strong&gt; Frosted glass UI displaying the AI briefing, deadline countdowns, and urgency meters.&lt;/li&gt;
&lt;li&gt;🎧 &lt;strong&gt;First Light Audio:&lt;/strong&gt; On-demand text-to-speech briefing player powered by ElevenLabs.&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Hackathon Radar:&lt;/strong&gt; Filterable list of competitions with direct registration links and AI "Should I enter?" verdicts.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Interactive To-Dos:&lt;/strong&gt; Real-time task completion synced directly to the local SQLite database.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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/Shikhyy" rel="noopener noreferrer"&gt;
        Shikhyy
      &lt;/a&gt; / &lt;a href="https://github.com/Shikhyy/firstlight" rel="noopener noreferrer"&gt;
        firstlight
      &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;First Light 🌅&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A privacy-first, locally-run morning brief and hackathon radar. First Light cuts through the noise by summarizing your calendar, markdown to-do lists, RSS feeds, and upcoming hackathons into a single, personalized push notification every morning at 6:30 AM.&lt;/p&gt;

&lt;p&gt;All data fetching, deduplication, and AI summarization (using &lt;code&gt;gemma:2b&lt;/code&gt; via Ollama) runs 100% locally on your machine. Your schedule never leaves your device.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c673dbf44f5505c3f99efa7acea3ab186076ae5bc55ff3f5d07bff14bf5ed952/68747470733a2f2f7669612e706c616365686f6c6465722e636f6d2f383030783430302e706e673f746578743d46697273742b4c696768742b5057412b50726576696577"&gt;&lt;img src="https://camo.githubusercontent.com/c673dbf44f5505c3f99efa7acea3ab186076ae5bc55ff3f5d07bff14bf5ed952/68747470733a2f2f7669612e706c616365686f6c6465722e636f6d2f383030783430302e706e673f746578743d46697273742b4c696768742b5057412b50726576696577" alt="First Light PWA Preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hackathon Radar&lt;/strong&gt;: Aggregates and deduplicates hackathons from DEV, Devpost, MLH, Kaggle, and Web3 sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local AI Summarization&lt;/strong&gt;: Uses Ollama to read your top events and tell you &lt;em&gt;why&lt;/em&gt; they matter based on your configured interests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-First&lt;/strong&gt;: No cloud APIs for your personal data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA Web Push&lt;/strong&gt;: Sends a native lock-screen notification to your phone without relying on third-party apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Math&lt;/strong&gt;: LLMs are bad at math, so all deadline urgency and countdowns ("closes in 13h") are calculated entirely in Python before…&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/Shikhyy/firstlight" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;strong&gt;Repository URL:&lt;/strong&gt; &lt;a href="https://github.com/Shikhyy/firstlight" rel="noopener noreferrer"&gt;https://github.com/Shikhyy/firstlight&lt;/a&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;First Light is engineered in Python with an installable CLI (&lt;code&gt;pip install -e .&lt;/code&gt;), backed by SQLite and a lightweight Flask PWA with a custom Service Worker.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Open-Source AI Architecture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local-First Core:&lt;/strong&gt; We run Google's &lt;strong&gt;Gemma 2B&lt;/strong&gt; (&lt;code&gt;gemma:2b&lt;/code&gt;) locally via &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. It runs on consumer hardware (such as an Apple Silicon Mac) with near-zero latency and zero operational cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pydantic Structured Outputs:&lt;/strong&gt; The pipeline enforces structured JSON schema validation (&lt;code&gt;BriefSummary&lt;/code&gt;) directly on the model's output to guarantee schema compliance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Cloud Fallbacks:&lt;/strong&gt; For cloud deployments where local Ollama is inaccessible, First Light seamlessly falls back to &lt;strong&gt;Hugging Face Serverless Inference&lt;/strong&gt; (&lt;code&gt;google/gemma-2-2b-it&lt;/code&gt;) or Groq, keeping the architecture strictly on open Gemma models.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The "Code Does Dates, AI Judges" Architecture
&lt;/h3&gt;

&lt;p&gt;LLMs frequently hallucinate calendar math and relative dates. First Light enforces a strict architectural separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Engine (Python):&lt;/strong&gt; Date parsing, deadline countdowns (e.g., &lt;code&gt;"closes in 13h"&lt;/code&gt;), urgency scores ([0.0, 1.0]), and deduplication (canonical URL normalization + RapidFuzz token matching) are calculated purely in Python.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judgment Engine (Gemma):&lt;/strong&gt; The LLM receives pre-calculated facts and strictly evaluates relevance: &lt;em&gt;"Why does this matter to Shikhar based on his interests in ML, Web3, and Backend?"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Resilient Pipeline &amp;amp; Fail-Safe Delivery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each data connector (DEV, Devpost, MLH, Kaggle, RSS, Calendar) is isolated in a try/except sandbox; if one scraper fails, the pipeline logs the error in a &lt;code&gt;source_runs&lt;/code&gt; health table and continues uninterrupted.&lt;/li&gt;
&lt;li&gt;If Ollama is offline or times out, the pipeline triggers a deterministic fallback generator, ensuring a morning brief is &lt;em&gt;always&lt;/em&gt; delivered on time.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Open innovation and open-weights models are essential for personal software like First Light:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Data Privacy:&lt;/strong&gt; Your personal calendar, daily tasks, health appointments, and unreleased project ideas are deeply intimate data. Routing this stream through proprietary closed APIs means sharing your life with centralized corporate servers. With Gemma running locally, your personal data literally never leaves your device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Marginal Cost &amp;amp; No Rate Limits:&lt;/strong&gt; Closed APIs charge per token, rate-limit automated jobs, and risk breaking changes. Open models allow automated morning pipelines and background cron jobs to run indefinitely for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience &amp;amp; Vendor Independence:&lt;/strong&gt; Open innovation ensures First Light will function offline, on an airplane, or years in the future without risk of API deprecation, subscription price hikes, or account suspensions.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;First Light was designed, implemented, and tested through an intensive pair-programming session using &lt;strong&gt;Google Antigravity&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Orchestrated the full project lifecycle: data connectors, SQLite schema design, fuzzy deduplication algorithms, Pydantic schema validation, and PWA Web Push implementation with VAPID crypto keys.&lt;/li&gt;
&lt;li&gt;Iterated rapidly on prompt engineering and deterministic fallback logic to guarantee sub-minute pipeline execution on lightweight hardware.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;We are entering the following partner categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma:&lt;/strong&gt; Core intelligence is built entirely around Google's &lt;code&gt;gemma:2b&lt;/code&gt; via Ollama for fast, local, privacy-first summarization, with Hugging Face Serverless integration for &lt;code&gt;google/gemma-2-2b-it&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs:&lt;/strong&gt; Integrated ElevenLabs Text-to-Speech into &lt;code&gt;firstlight/delivery/audio.py&lt;/code&gt; to synthesize a natural, spoken morning briefing playable directly from the PWA dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render:&lt;/strong&gt; Provided a turnkey &lt;code&gt;render.yaml&lt;/code&gt; Infrastructure-as-Code Blueprint with persistent disk mounts to deploy First Light as a cloud web service and automated cron worker with a single click.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry Agent Tracing:&lt;/strong&gt; Integrated &lt;code&gt;sentry-sdk&lt;/code&gt; to trace pipeline transactions, monitor scraper reliability, and observe local LLM inference performance.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
