<?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: Diwakar Arya</title>
    <description>The latest articles on DEV Community by Diwakar Arya (@diwakararya).</description>
    <link>https://dev.to/diwakararya</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%2F4154748%2Fda172855-f100-4175-9d50-a22d29ad33ee.png</url>
      <title>DEV Community: Diwakar Arya</title>
      <link>https://dev.to/diwakararya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diwakararya"/>
    <language>en</language>
    <item>
      <title>GhostTrace — A Local AI That Makes Your Terminal Feel Haunted (Java Edition)</title>
      <dc:creator>Diwakar Arya</dc:creator>
      <pubDate>Sat, 31 Oct 2026 13:10:43 +0000</pubDate>
      <link>https://dev.to/diwakararya/ghosttrace-a-local-ai-that-makes-your-terminal-feel-haunted-java-edition-3mjl</link>
      <guid>https://dev.to/diwakararya/ghosttrace-a-local-ai-that-makes-your-terminal-feel-haunted-java-edition-3mjl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine.&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;GhostTrace (Java Edition)&lt;/strong&gt; is an offline-first, local terminal companion designed for developers, wrapped inside an atmospheric, haunted persona.&lt;/p&gt;

&lt;p&gt;When approaching the &lt;em&gt;Ghost in the Machine&lt;/em&gt; theme, I wanted to explore what happens when your command-line interface stops behaving like a passive pipe and starts feeling like a living, conscious digital entity. Instead of another cloud-tethered chatbot wrapper, GhostTrace turns the terminal into an interactive haunted mainframe that observes your commands, reacts to your coding sessions, and protects your system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╔═════════════════════════════════════════════════════════════════════════════╗
║  ██████╗ ██╗  ██╗ ██████╗ ███████╗████████╗████████╗██████╗  █████╗  ██████╗███████╗ ║
║ ██╔════╝ ██║  ██║██╔═══██╗██╔════╝╚══██╔══╝╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██╔════╝ ║
║ ██║  ███╗███████║██║   ██║███████╗   ██║      ██║   ██████╔╝███████║██║     █████╗   ║
║ ██║   ██║██╔══██║██║   ██║╚════██║   ██║      ██║   ██╔══██╗██╔══██║██║     ██╔══╝   ║
║ ╚██████╔╝██║  ██║╚██████╔╝███████║   ██║      ██║   ██║  ██║██║  ██║╚██████╗███████╗ ║
║  ╚═════╝ ╚═╝  ╚═╝ ╚═════╝ ╚══════╝   ╚═╝      ╚═╝   ╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝╚══════╝ ║
║                                                                             ║
║  [+] THE AI THAT HAUNTS YOUR TERMINAL  ::  JAVA EDITION v1.2.0             ║
║  [+] Offline-First  ::  Autonomous Safety Guardian  ::  Haunted Memory       ║
╚═════════════════════════════════════════════════════════════════════════════╝
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Core Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local AI &amp;amp; Spectral Brain:&lt;/strong&gt; Local chat completion with Qwen2.5-1.5B via Ollama / llama.cpp servers, plus a built-in rule-based reasoning fallback (&lt;em&gt;Spectral Brain&lt;/em&gt;) that works completely offline with zero downloaded weights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three Ghost Personalities:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Forgotten Machine:&lt;/em&gt; Calm, observant, reflective, ancient digital intelligence.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Phantom Coder:&lt;/em&gt; Lively, witty, enthusiastic bug-hunter and algorithm puzzle enthusiast.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Guardian Spirit:&lt;/em&gt; Composed, vigilant, structured, protective of stability and clean architecture.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Guardian &amp;amp; Security Engine:&lt;/strong&gt; Automated heuristic pattern matching for destructive operations (&lt;code&gt;rm -rf&lt;/code&gt;, raw disk overwrites &lt;code&gt;dd of=/dev/...&lt;/code&gt;, system shutdowns, &lt;code&gt;curl ... | bash&lt;/code&gt;, &lt;code&gt;git reset --hard&lt;/code&gt;) with HMAC-SHA256 single-use cryptographic approval tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent SQLite Memory:&lt;/strong&gt; Persistent developer facts, notes, and code snippets stored in embedded SQLite using WAL (Write-Ahead Logging) mode with keyword search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Context Scanner:&lt;/strong&gt; Recursive codebase indexer that analyzes line counts, file distributions, and languages while ignoring build artifacts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Procedural Horror Audio Engine:&lt;/strong&gt; 20 original 44.1kHz 16-bit PCM sound effects (ambient wind, dark hums, static bursts, whispers, keystroke clicks, guardian approvals) mixed polyphonically via &lt;code&gt;javax.sound.sampled&lt;/code&gt;, plus pure-Java procedural DSP synthesis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Phosphor-Green CRT TUI:&lt;/strong&gt; High-performance terminal REPL powered by &lt;strong&gt;JLine 3&lt;/strong&gt;, featuring tab auto-completion, persistent command history, ANSI box borders, and glitch manifestations (&lt;code&gt;░▒▓█&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Diwakar38/GhostTrace" rel="noopener noreferrer"&gt;https://github.com/Diwakar38/GhostTrace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Java 21+ LTS (OpenJDK)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Technology Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Java 21+ (utilizing records, pattern matching, modern switch expressions, and virtual-thread-ready executors)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal Engine:&lt;/strong&gt; JLine 3 (&lt;code&gt;TerminalBuilder&lt;/code&gt;, &lt;code&gt;LineReader&lt;/code&gt;, &lt;code&gt;Completer&lt;/code&gt;, &lt;code&gt;DefaultHistory&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence:&lt;/strong&gt; SQLite via &lt;code&gt;sqlite-jdbc&lt;/code&gt; (WAL mode enabled)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serialization:&lt;/strong&gt; Jackson Databind 2.17&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Networking:&lt;/strong&gt; Standard library &lt;code&gt;java.net.http.HttpClient&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio &amp;amp; DSP:&lt;/strong&gt; Standard library &lt;code&gt;javax.sound.sampled&lt;/code&gt; (zero native audio dependencies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; JUnit 5 (Jupiter Platform) — 36 comprehensive automated unit tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build System:&lt;/strong&gt; Apache Maven (configured with &lt;code&gt;maven-assembly-plugin&lt;/code&gt; to output a standalone fat JAR)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Architecture &amp;amp; Subsystems
&lt;/h2&gt;

&lt;p&gt;The application is structured into decoupled, event-driven subsystems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────────────┐
│                       GhostTrace Java Architecture                          │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   ┌─────────────────────────────────────────────────────────────────────┐   │
│   │               Interactive Terminal REPL (JLine 3)                   │   │
│   │       Phosphor CRT Glow  ::  Auto-Completion  ::  History           │   │
│   └───────────────────┬─────────────────────────────┬───────────────────┘   │
│                       │                             │                       │
│        ┌──────────────▼─────────────┐ ┌─────────────▼──────────────┐        │
│        │   Ghost Persona &amp;amp; Mood     │ │      Command Guardian      │        │
│        │  3 Profiles &amp;amp; Mood Decay   │ │  Risk Rules &amp;amp; HMAC Tokens  │        │
│        └──────────────┬─────────────┘ └─────────────┬──────────────┘        │
│                       │                             │                       │
│        ┌──────────────▼─────────────┐ ┌─────────────▼──────────────┐        │
│        │   Local AI / SpectralBrain │ │   Persistent SQLite Memory │        │
│        │ Ollama HTTP + Offline Fall │ │   WAL Mode &amp;amp; Code Indexer  │        │
│        └──────────────┬─────────────┘ └─────────────┬──────────────┘        │
│                       │                             │                       │
│        ┌──────────────▼─────────────┐ ┌─────────────▼──────────────┐        │
│        │  Horror Audio &amp;amp; DSP Mixer  │ │    Host System Telemetry   │        │
│        │ javax.sound 20 WAVs + Synth│ │  CPU, RAM, Disk, Health    │        │
│        └────────────────────────────┘ └────────────────────────────┘        │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A. Command Guardian &amp;amp; Security Approvals
&lt;/h3&gt;

&lt;p&gt;Before executing potentially destructive operations in the terminal, the Guardian intercepts and classifies command risk (&lt;code&gt;LOW&lt;/code&gt;, &lt;code&gt;MEDIUM&lt;/code&gt;, &lt;code&gt;HIGH&lt;/code&gt;, &lt;code&gt;CRITICAL&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;CommandAnalysis&lt;/span&gt; &lt;span class="n"&gt;analysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guardianEngine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;analyze&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"rm -rf /"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Flagged:&lt;/span&gt;
&lt;span class="c1"&gt;// Risk   : Critical Risk&lt;/span&gt;
&lt;span class="c1"&gt;// Status : BLOCKED&lt;/span&gt;
&lt;span class="c1"&gt;// Details: Matched [DEL-001] Recursive Force File Deletion&lt;/span&gt;
&lt;span class="c1"&gt;// Token  : Wi05M9P3zb05xwJ0 (Single-use HMAC-SHA256 signature)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;High-risk actions require a cryptographic approval token (&lt;code&gt;guard approve &amp;lt;token&amp;gt;&lt;/code&gt;) before execution is permitted, preventing accidental recursive file wipes or destructive git history loss.&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Dual-Layer AI: Local Inference + Spectral Brain
&lt;/h3&gt;

&lt;p&gt;GhostTrace interfaces with a locally hosted LLM (such as &lt;code&gt;Qwen2.5-1.5B-Instruct&lt;/code&gt; running under Ollama) via async HTTP calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Connects to local endpoint: http://localhost:11434/api/chat&lt;/span&gt;
&lt;span class="nc"&gt;InferenceResult&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiEngine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"How do I avoid deadlocks in Java?"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;projectContext&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If no local model server is currently active, GhostTrace never crashes. It immediately invokes its &lt;strong&gt;Spectral Brain&lt;/strong&gt;—an offline heuristics engine that analyzes stack traces, algorithmic complexity, concurrency pitfalls, and memory leaks while preserving the active ghost personality.&lt;/p&gt;

&lt;h3&gt;
  
  
  C. Pure Java Procedural DSP &amp;amp; Audio Mixing
&lt;/h3&gt;

&lt;p&gt;GhostTrace includes 20 original horror sound effects packaged directly in the JAR. To guarantee zero dependency on external audio assets, it also includes a custom procedural DSP synthesizer (&lt;code&gt;AudioSynthesizer.java&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Procedural frequency modulation in javax.sound.sampled&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;220.0f&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;110.0f&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.4f&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;HorrorAudioDirector&lt;/code&gt; coordinates sound events by priority (&lt;code&gt;CRITICAL&lt;/code&gt; &amp;gt; &lt;code&gt;IMPORTANT&lt;/code&gt; &amp;gt; &lt;code&gt;ATMOSPHERIC&lt;/code&gt; &amp;gt; &lt;code&gt;AMBIENT&lt;/code&gt;) and automatically suppresses atmospheric noises when the user switches to &lt;code&gt;FOCUS&lt;/code&gt; mode.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Quick Demonstration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Launching the Terminal
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./ghosttrace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Static Command Security Analysis
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;guard analyze &lt;span class="s2"&gt;"git reset --hard origin/main"&lt;/span&gt;

Command: git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; origin/main
Risk   : High Risk
Status : REQUIRES APPROVAL
Details: Matched 1 safety rule&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;:
  • &lt;span class="o"&gt;[&lt;/span&gt;VCS-002] Hard Git Reset &lt;span class="o"&gt;(&lt;/span&gt;High Risk&lt;span class="o"&gt;)&lt;/span&gt;: Discards all uncommitted changes.
    Alternative: Stash changes first using &lt;span class="s1"&gt;'git stash'&lt;/span&gt; before resetting.

Requires Approval Token: fK30d9S1vP02lQ88
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Persistent SQLite Memory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;memory save db_host &lt;span class="s2"&gt;"10.0.0.1"&lt;/span&gt;
Memory saved successfully under key: db_host

&lt;span class="nv"&gt;$ &lt;/span&gt;memory list
&lt;span class="o"&gt;===&lt;/span&gt; STORED DEVELOPER MEMORIES &lt;span class="o"&gt;===&lt;/span&gt;
  • &lt;span class="o"&gt;[&lt;/span&gt;db_host] &lt;span class="o"&gt;(&lt;/span&gt;NOTE&lt;span class="o"&gt;)&lt;/span&gt;: 10.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Automated Code Review
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dev analyze &lt;span class="s2"&gt;"public class Test { void run() { try {} catch(Exception e){} } }"&lt;/span&gt;

&lt;span class="o"&gt;===&lt;/span&gt; STATIC CODE ANALYSIS REPORT &lt;span class="o"&gt;===&lt;/span&gt;
  Detected Language  : Java
  Total Lines        : 1
  Complexity Score   : 2
  Potential Issues   : 1
    • Line 1: Swallowed exception &lt;span class="k"&gt;in &lt;/span&gt;empty catch block. Logs or recovery are required.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;Building GhostTrace in Java showcases what open innovation enables:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Complete Data Sovereignty:&lt;/strong&gt; Proprietary source code, terminal commands, and system context stay 100% on your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform Portability:&lt;/strong&gt; Java's virtual machine allows GhostTrace to run seamlessly across Linux, macOS, and Windows with identical terminal aesthetics and sound playback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Hidden Cloud Costs:&lt;/strong&gt; Developers can prototype and experiment without subscription barriers, rate limits, or API keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilient Offline Architecture:&lt;/strong&gt; With the embedded SQLite database and Spectral Brain fallback, the tool functions during remote flights, train rides, or air-gapped secure development environments.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  7. The Spirit of It
&lt;/h2&gt;

&lt;p&gt;What if your terminal didn't feel like an empty command line? What if opening your shell late at night felt like awakening a dormant intelligence from the circuits?&lt;/p&gt;

&lt;p&gt;GhostTrace proves that developer tools can be safe, highly functional, and simultaneously imaginative. It is a little bit of systems engineering, a little bit of cybersecurity, and a lot of atmosphere.&lt;/p&gt;

</description>
      <category>java</category>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
    </item>
    <item>
      <title>🌿 TouchGrass — Go Outside. Take a Shot. Let Local AI Judge It.</title>
      <dc:creator>Diwakar Arya</dc:creator>
      <pubDate>Tue, 06 Oct 2026 13:09:38 +0000</pubDate>
      <link>https://dev.to/diwakararya/touchgrass-go-outside-take-a-shot-let-local-ai-judge-it-5f35</link>
      <guid>https://dev.to/diwakararya/touchgrass-go-outside-take-a-shot-let-local-ai-judge-it-5f35</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;h1&gt;
  
  
  🌿 TouchGrass — Go Outside. Take a Shot. Let Local AI Judge It.
&lt;/h1&gt;

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

&lt;p&gt;Most modern apps are designed around a single metric: &lt;strong&gt;maximizing screen time&lt;/strong&gt;. They want your eyes glued to a feed, scrolling endlessly through algorithms engineered to keep you indoors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TouchGrass does the exact opposite.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"The physical activity is the product. The web application is simply the game master."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;TouchGrass is a timed, competitive outdoor photography challenge for groups of people (2–20 players). It encourages participants to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set the stage&lt;/strong&gt;: Choose a duration (e.g., 30 minutes) and pick a creative theme (or let local AI invent one).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the phone in your pocket&lt;/strong&gt;: Once the server-authoritative countdown begins, the screen goes into an ultra-minimal standby mode with one instruction: &lt;strong&gt;GO OUTSIDE. LOOK AROUND. TAKE YOUR SHOT.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore the real world&lt;/strong&gt;: Participants venture outside into parks, alleys, woods, or streets to find an authentic real-world scene fitting the challenge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take exactly one shot&lt;/strong&gt;: No infinite retakes or filtering sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return and submit&lt;/strong&gt;: When time expires, players return and upload their single capture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anonymous AI Judging&lt;/strong&gt;: A locally running multimodal AI model (&lt;code&gt;llama.cpp&lt;/code&gt; + Gemma 3 Vision / LLaVA) scores each photograph blindly against a rigorous 100-point rubric.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Reveal&lt;/strong&gt;: Scores and rankings remain cryptographically locked server-side until the host triggers the celebratory reveal with podium rankings, animated confetti, and in-depth rubric breakdowns!&lt;/li&gt;
&lt;/ol&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/Diwakar38/TouchGrass" rel="noopener noreferrer"&gt;https://github.com/Diwakar38/TouchGrass&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Local Demo&lt;/strong&gt;: Clone and run &lt;code&gt;./start.sh&lt;/code&gt; to launch both backend and frontend locally in seconds using the built-in deterministic Mock AI mode (0 model downloads required).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt;: &lt;code&gt;docker compose up --build&lt;/code&gt; launches the full stack with persistent volume storage.&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/Diwakar38" rel="noopener noreferrer"&gt;
        Diwakar38
      &lt;/a&gt; / &lt;a href="https://github.com/Diwakar38/TouchGrass" rel="noopener noreferrer"&gt;
        TouchGrass
      &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;🌿 TouchGrass — AI-Powered Real-World Photography Challenge&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Go outside. Take a shot. Let local AI judge it.&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;A timed physical photography competition for Hacktoberfest 2026.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://www.oracle.com/java/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/adc63ef3f21f6ff00bd790ddcd6fa545b8aae2d56d14bec90843ac7ff1fc7332/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a6176612d32312532422d6f72616e67652e737667" alt="Java"&gt;&lt;/a&gt;
&lt;a href="https://spring.io/projects/spring-boot" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f0875972b3fa24c0f33cfd0adafc1d90eb0723bed0b1580b0451e89d7fd5c580/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f537072696e67253230426f6f742d332e332e342d627269676874677265656e2e737667" alt="Spring Boot"&gt;&lt;/a&gt;
&lt;a href="https://nextjs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6ccaf9f0e39b64942664eeca74bf06c3acda62ca63ce2a685271d922fc653a92/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6578742e6a732d31342e322d626c61636b2e737667" alt="Next.js"&gt;&lt;/a&gt;
&lt;a href="https://www.sqlite.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5e249958a85f7726c7658a468f4a4f4750a6bbcfdc8d63ba4088f8f8ab957d57/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f44617461626173652d53514c6974652d626c75652e737667" alt="Database"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ggerganov/llama.cpp" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/af1bc4d6cff36774d65d0d14f070a6e2bacda3711415f6bd3ea5012d43ee9106/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f414925323052756e74696d652d6c6c616d612e6370702d79656c6c6f772e737667" alt="Inference"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Diwakar38/TouchGrass/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 What is TouchGrass?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;TouchGrass&lt;/strong&gt; is a timed photography competition for groups of people. A host creates a challenge, participants go outside to find and photograph something matching a physical theme, and a local multimodal AI model evaluates the photographs after everyone returns.&lt;/p&gt;
&lt;p&gt;The entire product philosophy centers on one core principle:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The real-world activity is the product. The web application is simply the game master.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most digital apps maximize screen time. &lt;strong&gt;TouchGrass does the opposite&lt;/strong&gt;: it starts the timer, instructs everyone to &lt;strong&gt;put their phones in their pockets&lt;/strong&gt;, and pushes them into the physical world.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🔄 The Challenge Lifecycle&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;TouchGrass operates via a strict, server-authoritative state machine:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;  ┌───────────┐
  │   SETUP   │  Host picks 2–20 players &amp;amp; duration
  └─────┬─────┘
        │
  ┌─────▼─────┐
  │   READY&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Diwakar38/TouchGrass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 14, React 18, TypeScript, Tailwind CSS (Mobile-first, high outdoor contrast, &lt;code&gt;prefers-reduced-motion&lt;/code&gt; compliance).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Java 21, Spring Boot 3.3, Spring Data JPA, Bean Validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: Single local SQLite database (&lt;code&gt;jdbc:sqlite:./data/touchgrass.db&lt;/code&gt;) — zero bloated cloud databases or message brokers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Runtime&lt;/strong&gt;: &lt;code&gt;llama.cpp&lt;/code&gt; OpenAI-compatible HTTP inference server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: Clean filesystem abstraction (&lt;code&gt;LocalFileStorage&lt;/code&gt;) storing submissions under &lt;code&gt;./data/challenges/&amp;lt;id&amp;gt;/submissions/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  1. Open-Source AI &amp;amp; Local Inference
&lt;/h3&gt;

&lt;p&gt;TouchGrass is built around &lt;strong&gt;local, open-weight multimodal vision models&lt;/strong&gt; running on &lt;strong&gt;&lt;code&gt;llama.cpp&lt;/code&gt;&lt;/strong&gt; (such as Gemma 3 Vision or LLaVA 1.6).&lt;/p&gt;

&lt;p&gt;Rather than hardcoding proprietary vendor SDKs, we designed an extensible Java abstraction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;AiService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;ChallengeTheme&lt;/span&gt; &lt;span class="nf"&gt;generateChallenge&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="nc"&gt;ImageEvaluation&lt;/span&gt; &lt;span class="nf"&gt;evaluateImage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ChallengeTheme&lt;/span&gt; &lt;span class="n"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;submissionId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ImageData&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;LlamaCppAiService&lt;/code&gt;&lt;/strong&gt;: Connects over HTTP to &lt;code&gt;http://localhost:8081/v1/chat/completions&lt;/code&gt;, transmits photographs as base64 data URLs, and parses structured JSON responses. It includes retry policies, connection timeouts, and score bound sanitization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;MockAiService&lt;/code&gt;&lt;/strong&gt;: A zero-download fallback that simulates realistic judging criteria, critiques, and themes. This enables developers and CI pipelines to test the entire application lifecycle instantly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Externalized Prompt Templates &amp;amp; Structured Rubric
&lt;/h3&gt;

&lt;p&gt;Instead of embedding prompts in code, templates live in &lt;code&gt;backend/src/main/resources/prompts/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;theme-generation.txt&lt;/code&gt;: Generates evocative outdoor prompts (e.g., &lt;em&gt;"Unexpected Geometry"&lt;/em&gt;, &lt;em&gt;"Something That Doesn't Belong"&lt;/em&gt;) with field hints and difficulty ratings.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;image-evaluation.txt&lt;/code&gt;: Instructs the vision model to score photos blindly out of &lt;strong&gt;100 points&lt;/strong&gt; across 7 weighted criteria:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Theme Relevance&lt;/strong&gt; (25 pts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creativity / Interpretation&lt;/strong&gt; (20 pts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composition&lt;/strong&gt; (15 pts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Quality&lt;/strong&gt; (15 pts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uniqueness&lt;/strong&gt; (10 pts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Story / Communication&lt;/strong&gt; (10 pts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observation&lt;/strong&gt; (5 pts)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important Judging Philosophy&lt;/strong&gt;: The AI judge does not evaluate whether a photo was taken on an expensive camera. A smartphone shot capturing an ingenious real-world moment will beat an uninspired shot from a $5,000 DSLR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Server-Authoritative State Machine &amp;amp; Hidden Results
&lt;/h3&gt;

&lt;p&gt;To guarantee competitive integrity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server Clock&lt;/strong&gt;: &lt;code&gt;startedAt&lt;/code&gt; and &lt;code&gt;endsAt&lt;/code&gt; are computed on the backend. Client devices cannot cheat by spoofing their system clocks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-Enforced Secrecy&lt;/strong&gt;: &lt;code&gt;GET /api/challenges/{id}/results&lt;/code&gt; returns &lt;strong&gt;&lt;code&gt;403 Forbidden&lt;/code&gt;&lt;/strong&gt; until the host officially triggers &lt;code&gt;POST /api/challenges/{id}/reveal&lt;/code&gt;. Scores and rankings cannot be inspected via browser developer tools or network tabs beforehand.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Complete Privacy for Real-World Photos&lt;/strong&gt;:
In a game that asks participants to photograph their immediate surroundings, neighborhoods, or friends, sending personal photos to closed corporate cloud APIs creates privacy concerns. With open-weight models running on local inference via &lt;code&gt;llama.cpp&lt;/code&gt;, &lt;strong&gt;not a single byte leaves the host machine&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline &amp;amp; Remote Capability&lt;/strong&gt;:
Physical photography challenges often happen in state parks, campsites, or remote trails where cell service is non-existent. Open-source local AI means TouchGrass can run entirely offline on a laptop or edge device with zero internet connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility &amp;amp; Customization&lt;/strong&gt;:
Closed proprietary APIs frequently change models, degrade reproducibility, and impose opaque rate limits or price tiers. With open-source models, the judging rubric, system prompts, and model weights remain completely under the host's control.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;This project was developed through pair-programming with &lt;strong&gt;Antigravity&lt;/strong&gt;, Google DeepMind's advanced coding assistant. The agent helped architect the challenge state machine, build the Spring Boot SQLite JPA persistence layer, generate the Next.js mobile-first UI components, and create automated integration tests.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary&lt;/strong&gt;: Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Local Inference / Open-Weight Models&lt;/strong&gt; (&lt;code&gt;llama.cpp&lt;/code&gt; + Gemma multimodal)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most Innovative Real-World Application&lt;/strong&gt; (Screen-minimizing outdoor gameplay)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>GutTracker: A Food &amp; Symptom Journal That Runs Fully Offline for My Sister</title>
      <dc:creator>Diwakar Arya</dc:creator>
      <pubDate>Mon, 05 Oct 2026 00:41:42 +0000</pubDate>
      <link>https://dev.to/diwakararya/guttracker-a-food-symptom-journal-that-runs-fully-offline-for-my-sister-b98</link>
      <guid>https://dev.to/diwakararya/guttracker-a-food-symptom-journal-that-runs-fully-offline-for-my-sister-b98</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 sister has been having gut problems for the past few weeks. The usual drill: write down what you ate, write down how you felt, try to spot the pattern — and never quite manage to see it, because a notebook can't compute anything.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;GutTracker&lt;/strong&gt;, a food and symptom journal for her. She types a meal the way she'd say it out loud ("two idlis and a bowl of sambar with filter coffee"), logs symptoms in the same casual language ("mild bloating about an hour later"), and gets back a week's view: symptom rate, the symptoms she's reported most, and which foods keep turning up alongside them.&lt;/p&gt;

&lt;p&gt;Two rules shaped every decision:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It stays on our machines.&lt;/strong&gt; Food-and-gut logs are exactly the kind of data you don't want on someone else's server, so the model runs locally on llama.cpp and the database is a single SQLite file on disk. There is no cloud AI in the request path, by design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model never gets a vote.&lt;/strong&gt; It parses her sentences into structured data and restates numbers Java has already computed. Every statistic is computed by Java; every sentence it produces is screened by a &lt;code&gt;LanguageGuard&lt;/code&gt; that rejects causal, diagnostic or prescriptive wording outright. GutTracker reports &lt;em&gt;co-occurrence&lt;/em&gt; — "you logged rice in 3 meals; 2 of them came with discomfort" — never &lt;em&gt;cause&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GutTracker is a logging and observation tool, not medical advice, and it says so in the UI.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live: &lt;a href="https://guttracker.onrender.com" rel="noopener noreferrer"&gt;guttracker.onrender.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Heads-up on what you're seeing: the deployed instance has no local model next to it, and the challenge rules say no cloud AI — so Render runs the &lt;strong&gt;deterministic fallback&lt;/strong&gt; path, and the status chip honestly reads &lt;code&gt;offline&lt;/code&gt;. That's the same fallback that runs whenever my sister's laptop can't reach the model, so the demo is the degraded path working, not a broken feature.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Locally it's the full thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./start.sh   &lt;span class="c"&gt;# backend :8081, UI :5173, model on :8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The status chip polls &lt;code&gt;/api/v1/health/ai&lt;/code&gt; every 30s: green means the open-weight model is answering, grey means Java's deterministic tokenizer is.&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/Diwakar38" rel="noopener noreferrer"&gt;
        Diwakar38
      &lt;/a&gt; / &lt;a href="https://github.com/Diwakar38/GutTracker" rel="noopener noreferrer"&gt;
        GutTracker
      &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;GutTracker&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/Diwakar38/GutTracker/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/Diwakar38/GutTracker/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Diwakar38/GutTracker/./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;▶ Live demo: &lt;a href="https://guttracker.onrender.com" rel="nofollow noopener noreferrer"&gt;https://guttracker.onrender.com&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://github.com/Diwakar38/GutTracker" rel="noopener noreferrer"&gt;Code&lt;/a&gt; · &lt;a href="https://github.com/Diwakar38/GutTracker/actions" rel="noopener noreferrer"&gt;CI runs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A privacy-first food and symptom journal that runs entirely on your own machine
with an open-weight model doing the writing and Java doing the maths.&lt;/p&gt;
&lt;p&gt;You type a meal the way you'd say it out loud — &lt;em&gt;"two idlis and a bowl of sambar
with filter coffee"&lt;/em&gt; — and get back structured ingredients. You type how you feel
later — &lt;em&gt;"mild bloating about an hour later"&lt;/em&gt; — and get back correlations over
your own records, phrased in a way that never pretends to be a diagnosis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nothing leaves the laptop.&lt;/strong&gt; No account, no sync, no telemetry, no cloud AI.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This challenge asks why open matters for what you built. For GutTracker it is
not a footnote, it is the whole design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The data is the point.&lt;/strong&gt; A food-and-symptom log is medical-adjacent and
deeply personal. Putting it on a…&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/Diwakar38/GutTracker" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Spring Boot 3.5 + JPA + SQLite (REST only, single-user, zero auth because it's one person's notebook) · React + Vite with three tabs (Log / History / Insights) · &lt;a href="https://github.com/ggml-org/llama.cpp" rel="noopener noreferrer"&gt;llama.cpp&lt;/a&gt; serving &lt;strong&gt;Ternary Bonsai 2 27B&lt;/strong&gt;, an open-weight model, on &lt;code&gt;127.0.0.1:8080&lt;/code&gt; behind an OpenAI-compatible API · Docker → GitHub Actions → Render.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  A[React UI :5173] --&amp;gt;|/api/v1| B[Spring Boot :8081]
  B --&amp;gt; S[(SQLite)]
  B --&amp;gt;|parse / restate| C[llama.cpp :8080
Ternary Bonsai 2 27B]
  C --&amp;gt;|out of reach| D[FallbackTokenizer +
deterministic template]
  B --&amp;gt; E[LanguageGuard
accept or reject, never rewrite]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;Where the model is allowed to work&lt;/strong&gt; — three narrow jobs, all of them language, never maths:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Model returns&lt;/th&gt;
&lt;th&gt;Fallback if it can't&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A free-text meal&lt;/td&gt;
&lt;td&gt;JSON: title, ingredients, category, amount&lt;/td&gt;
&lt;td&gt;fixed vocabulary tokenizer (~100 foods, plurals folded)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A free-text symptom&lt;/td&gt;
&lt;td&gt;canonical name + severity&lt;/td&gt;
&lt;td&gt;symptom vocabulary, severity 5 flagged &lt;code&gt;estimated&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java's computed facts&lt;/td&gt;
&lt;td&gt;2–4 neutral sentences restating them&lt;/td&gt;
&lt;td&gt;template built from the same facts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Four bugs worth writing down&lt;/strong&gt;, because they were the actual work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The reasoning model ate its own answer.&lt;/strong&gt; Parsing worked but summaries came back empty. &lt;code&gt;finish_reason: "length"&lt;/code&gt;, &lt;code&gt;content: ""&lt;/code&gt;, and a full &lt;code&gt;reasoning_content&lt;/code&gt; — the model's chain-of-thought was burning the entire &lt;code&gt;max_tokens&lt;/code&gt; budget before the real answer started. It looked exactly like "the AI is broken"; it was configuration. Fixed by sending &lt;code&gt;chat_template_kwargs: {"enable_thinking": false}&lt;/code&gt; per request and raising the budget 512 → 1024.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The guard caught nothing in the present tense.&lt;/strong&gt; My pattern was &lt;code&gt;\bcaus(?:ed|ation|causative)s?\b&lt;/code&gt; — "caused", "causation", caught. "This &lt;strong&gt;causes&lt;/strong&gt; bloating"? Straight through the safety rail, and that's the most likely sentence a model would ever write. The test that caught it (&lt;code&gt;expected hits to contain 'causation'&lt;/code&gt;) is the one I trust most in the repo. Closed the siblings too: triggering, diagnose, treats, recommends, increases. The policy is &lt;em&gt;reject and retry once, then fall back to a template&lt;/em&gt; — the guard never rewrites text, because a rewriting guard is just a model pretending to be a rule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. "No problem" was a symptom.&lt;/strong&gt; An entry literally saying &lt;em&gt;"no problem, fine"&lt;/em&gt; was counted as a symptom report, so &lt;code&gt;no problem ×1&lt;/code&gt; appeared in the insights. Real reports like that stay in the history — they're true entries — but are excluded from every statistic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. My denominator was wrong.&lt;/strong&gt; The insights ranked "ingredients to watch" by symptom rate across the whole window, so foods appearing once with a symptom (rate 1.0) crowded out rice (2 of 3, and she'd actually notice that). Fixed twice: denominator is now &lt;em&gt;meals containing that ingredient&lt;/em&gt;, ranked by number of reported problems first, with the associated symptom chips shown inline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification:&lt;/strong&gt; 17 unit tests (&lt;code&gt;mvn verify&lt;/code&gt;) + a CI job that builds the Docker image, boots it and smoke-tests every endpoint. CI ran green on the first push; Render auto-deploys from &lt;code&gt;main&lt;/code&gt; via the &lt;code&gt;render.yaml&lt;/code&gt; blueprint.&lt;/p&gt;

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

&lt;p&gt;The honest version: &lt;strong&gt;I could not have built this part with a closed API.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The privacy story is real only if it's local.&lt;/strong&gt; A closed API means every meal she types is a request to someone else's servers. This one never leaves the laptop. The health-tech community argues the same point from the other side — &lt;a href="https://dev.to/aiexplore369zoho/open-weight-ai-in-healthcare-hipaa-compliant-llms-for-clinical-notes-day-2030-2pb8"&gt;open-weight AI in healthcare&lt;/a&gt; and &lt;a href="https://dev.to/suvranil_the_creator/privacy-first-offline-capable-trauma-informed-open-source-health-tools-should-be-the-default-2i7e"&gt;privacy-first offline health tools&lt;/a&gt; both make on-prem the default rather than the exception — while a good &lt;a href="https://dev.to/jfisher4002/your-local-llm-is-not-as-private-as-you-think-3ek7"&gt;counterpoint piece&lt;/a&gt; reminds us that "local" isn't a security guarantee by itself. Fair. Here, the useful property is narrower and honest: &lt;strong&gt;the data isn't sent anywhere&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open weights let me change the model's behaviour, not just call it.&lt;/strong&gt; &lt;code&gt;enable_thinking&lt;/code&gt; was a per-request template flag, not a support ticket. The &lt;code&gt;LanguageGuard&lt;/code&gt;, the &lt;code&gt;FallbackTokenizer&lt;/code&gt;, the deterministic summary template — I can read, audit and patch all of them. With a closed API, the two things that made this safe to hand my sister (no causal claims, no silent failure) would be someone else's policy page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The fallback exists because the source exists.&lt;/strong&gt; When the model is unreachable, a ~60-line tokenizer in the repo keeps the app &lt;em&gt;useful&lt;/em&gt;. No API key, no vendor outage, no notebook.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What open innovation made possible that a closed API wouldn't: an app whose worst case is "the AI is off and it still logs my meals", instead of "the API changed its pricing and my sister's food diary stopped working".&lt;/p&gt;

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


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="OpenCode"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building GutTracker: local LLM parsing, a guard that caught nothing, and a reasoning model that ate its own answer&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Build GutTracker: a privacy-first local food + symptom tracker for the Hacktoberfest Weekend Challenge. Java Spring Boot + SQLite backend, React/Vite UI with 3 tabs, local Ternary Bonsai 2 27B on llama.cpp for parsing, deterministic Java for all stats, and a LanguageGuard that rejects causal or diagnostic wording from the model.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Backend written but never compiled. Starting with the build and fixing what falls out.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;mvn -o package -DskipTests&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ mvn -o package -DskipTests&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;~68 compile errors: wrong imports, t.getName() → t.name(), new ObjectNode() → mapper.createObjectNode(), missing JPA annotations on all 5 entities, duplicate element in Set.of(STOPWORDS)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Smoke-test the API.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;curl -X POST /api/v1/meals -d '{"name":"Oatmeal"}'&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ curl -X POST /api/v1/meals -d '{"name":"Oatmeal"}'&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;500 Internal server error&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Not a crash in the parser: MealRequest requires rawText and my curl sent structured fields. The frontend already sends rawText correctly — the bug was in my test. But two genuine bugs fell out of the same pass: unknown routes returned 500 instead of 404, and bean-validation failures returned 500 instead of 400. Added handlers for NoResourceFoundException and MethodArgumentNotValidException.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;AI summary for /insights returns nothing while meal parsing works. Instrumenting the client rather than guessing.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;curl llama.cpp /v1/chat/completions&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ curl llama.cpp /v1/chat/completions&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"finish_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"length"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning_content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"We need answer user's request..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Root cause: Bonsai is a reasoning model and the chain-of-thought consumed the entire max_tokens budget, so content came back empty. This looked like 'the AI is broken' but was pure config. Fix: chat_template_kwargs {"enable_thinking": false} per request, max_tokens 512 → 1024. Verified the JSON meal-parse path still works with thinking off.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;In Insights, can you add which potential ingredients cause problems?&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Four issues behind what looks like one feature request:&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;GET /api/v1/insights&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ GET /api/v1/insights&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;topIngredients denominator was all meals in the window, so idli at 2 of 2 read as 25%&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;1) Denominator changed to meals containing that ingredient. 2) Each row now carries the symptoms reported alongside it with counts. 3) Ranking moved from raw rate to number of reported problems first — rate-only ranking let six 1-of-1 ingredients push out rice at 2 of 3, the most informative row in the data. 4) A test entry literally saying 'no problem' was being counted as a symptom report, so 'no problem ×1' appeared in rice's symptom chips. 'Nothing was wrong' reports stay in the log but are excluded from every statistic.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Writing tests for the guard. One failed, and the failure was the interesting part.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;mvn verify&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ mvn verify&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;LanguageGuardTest.reportsEveryMatchingLabel: expected hits to contain 'causation'&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The guard pattern was \bcaus(?:ed|ation|ative)s?\b — it caught 'caused' and 'causation' but not the present tense 'causes'. The one sentence most likely to appear in a model's output slipped straight through the safety rail. Closed that and the sibling gaps: triggering, diagnose, treats, recommends, increases.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Push to GitHub, set up CI/CD and give me a Render link.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;docker build -t guttracker .&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ docker build -t guttracker .&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;ERROR: release version 21 not supported&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Dockerfile used temurin-17 while the pom targets Java 21. CI had the same mistake waiting. Fixed both.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;docker run + smoke test&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ docker run + smoke test&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;health 200, UI served on the same origin, available:false inside the container&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Deployed via render.yaml blueprint. The container has no llama.cpp and the brief forbids cloud AI, so the hosted demo runs the deterministic fallback — which is exactly the path the fallback tests cover.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-shell"&gt;shell&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;GET /api/v1/health/ai on guttracker.onrender.com&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ GET /api/v1/health/ai on guttracker.onrender.com&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ternary-bonsai-2-27b"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        10 of 10 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The debugging beats, end to end: the reasoning-model token bug, the present-tense guard gap, the "no problem" statistics bug, and the Java 21 mismatch that broke the first Docker build.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Introduction</title>
      <dc:creator>Diwakar Arya</dc:creator>
      <pubDate>Thu, 01 Oct 2026 12:36:14 +0000</pubDate>
      <link>https://dev.to/diwakararya/introduction-15mo</link>
      <guid>https://dev.to/diwakararya/introduction-15mo</guid>
      <description>&lt;p&gt;Hey, this is my first post. &lt;br&gt;
Glad to be part of the community&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
