<?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: Priyanshu Patel</title>
    <description>The latest articles on DEV Community by Priyanshu Patel (@priyanshupatel).</description>
    <link>https://dev.to/priyanshupatel</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%2F4156799%2Fe0b2f7b4-e05f-42fa-93cb-8c51e5f7be6e.png</url>
      <title>DEV Community: Priyanshu Patel</title>
      <link>https://dev.to/priyanshupatel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/priyanshupatel"/>
    <language>en</language>
    <item>
      <title>I got tired of checking my Mac, so I built a little 👻Halloween light to do it for me (Arduino UNO Q + Gemma)</title>
      <dc:creator>Priyanshu Patel</dc:creator>
      <pubDate>Sat, 31 Oct 2026 16:58:54 +0000</pubDate>
      <link>https://dev.to/priyanshupatel/ghost-load-4n1n</link>
      <guid>https://dev.to/priyanshupatel/ghost-load-4n1n</guid>
      <description>&lt;p&gt;This is the project which was made for week three, but what happened I submitted before time, but still when I edited few things in it after the deadline, it gets submitted for the week four, so now change it the whole idea with the theme of week four. You might also find the same two post as I am getting some errors that it is not submitted, so I had submitted it twice.&lt;/p&gt;

&lt;p&gt;I got my Arduino UNO Q at a Hacktoberfest meetup, and now I'm finally putting it to use! I'm building &lt;strong&gt;Still Loading...&lt;/strong&gt; as my project for Dev Challenge, giving the board a little Halloween Theme.&lt;/p&gt;

&lt;p&gt;My terminal has ghosts, so I built a little Halloween device to catch them (Arduino UNO Q + Gemma)&lt;/p&gt;

&lt;p&gt;I kept staring at a terminal for jobs that had already died.&lt;/p&gt;

&lt;p&gt;A job can look alive and still be gone. A download can crawl while I keep refreshing its percentage. A traceback can sit unnoticed in another terminal. Sometimes, it feels like my computer has a few ghosts of its own.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Still Loading...&lt;/strong&gt;: an Arduino UNO Q whose 8×13 LED matrix shows what my Mac is doing, so I can glance at my desk instead of constantly checking the screen. When a job fails, a local Gemma model explains why, and my code checks that the log line it quotes really exists.&lt;/p&gt;

&lt;p&gt;For Week Four, I gave the project a Halloween transformation. The underlying idea is the same, but its visual identity is now inspired by ghosts, skulls and other spooky illustrations. What started as a small status light now looks like a little haunted companion for my desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I got my Arduino UNO Q at a Hacktoberfest meetup. It was my first Arduino, and I had never built anything on one before. When this challenge came up, I wanted to use it for a real project instead of leaving it in a drawer.&lt;/p&gt;

&lt;p&gt;My first idea list was the obvious one: a plant-watering device, an email or message summarizer, and similar ideas. I looked around and saw that people had already built these, and built them well. I didn't want to make a copy of something that already existed just to have an Arduino in the photo.&lt;/p&gt;

&lt;p&gt;So I asked a different question: what do I keep doing by hand that a small light could do for me? The answer was already on my screen. I kept checking terminals and download bars to see whether something was still alive.&lt;/p&gt;

&lt;p&gt;That is where the idea of &lt;strong&gt;ghost jobs&lt;/strong&gt; came from: processes that look alive but have already stopped making progress or have failed without me noticing.&lt;/p&gt;

&lt;p&gt;I wanted a light that stays quiet while things are fine and gets my attention when something needs me. That is the problem Still Loading... tries to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  From status light to haunted desk companion
&lt;/h2&gt;

&lt;p&gt;The Halloween theme gave me a reason to rethink the illustrations throughout the project.&lt;/p&gt;

&lt;p&gt;Instead of relying on ordinary status symbols, I refreshed the visuals with spooky, horror-inspired artwork. The idea was to make the matrix feel like a small Halloween device rather than a conventional system monitor.&lt;/p&gt;

&lt;p&gt;The ghostly visual direction fits the project naturally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ghosts represent jobs that have disappeared or become unresponsive.&lt;/li&gt;
&lt;li&gt;Skulls and darker illustrations give failures a more recognisable visual identity.&lt;/li&gt;
&lt;li&gt;Pumpkins, bats and other Halloween-inspired artwork bring personality to the ordinary status displays.&lt;/li&gt;
&lt;li&gt;The overall look makes the device feel like a little haunted companion sitting beside my computer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a visual transformation of the existing project. The underlying monitoring, communication and diagnosis flow remains the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A little ghost watcher for my desk.&lt;/strong&gt; The matrix shows idle, running, completed, failed, suspected stall, battery, charging and download.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Halloween makeover.&lt;/strong&gt; The illustrations have been refreshed with a spooky visual identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real data, not animations.&lt;/strong&gt; It showed a live Chrome download climbing from 0% to 15%, and real macOS battery readings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma explains, code verifies.&lt;/strong&gt; &lt;code&gt;gemma2:2b&lt;/code&gt; runs locally on my Mac and quotes a log line. Plain code checks the quote is in the redacted log and marks the answer VERIFIED or UNVERIFIED. One live call took about 4.6 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tested.&lt;/strong&gt; 20 captured failure logs as a baseline. The latest full run passed 202 Mac-agent tests, 2 relay tests, the web tests, the demo suite and the production build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest boundary.&lt;/strong&gt; Gemma runs on the Mac. The UNO Q receives state and displays it. VERIFIED means the quote exists, not that the diagnosis is right.&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg7ms0zlgpab4zn54wvea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg7ms0zlgpab4zn54wvea.png" alt=" " width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
Updated visuals for the Halloween&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The computer does the work. The board makes the state visible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser Control Deck → Mac backend (battery, Chrome downloads, jobs, Gemma)
      → UNO Q HTTP receiver → App Lab bridge → 8×13 LED matrix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;Battery reader (&lt;code&gt;pmset&lt;/code&gt;), Chrome download monitor, job runner, log redaction, Gemma, evidence check, Control Deck backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UNO Q Linux&lt;/td&gt;
&lt;td&gt;HTTP receiver and App Lab bridge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LED matrix&lt;/td&gt;
&lt;td&gt;Draws each state as a pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;Control Deck&lt;/strong&gt; is a browser page with six buttons: Battery, Download, Run Job, Failed, Reset and Stop. Each calls a fixed backend operation. The browser never runs arbitrary shell commands. The same state drives a matrix preview on the page and the physical matrix.&lt;/p&gt;

&lt;p&gt;The Halloween illustrations change how the information looks, not what the underlying states mean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemma explains, code verifies
&lt;/h2&gt;

&lt;p&gt;A small model can invent a log line that sounds right, so it has to prove its answer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Failure log → redaction → local Gemma → diagnosis + quoted line → exact-match check → VERIFIED / UNVERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran &lt;code&gt;python3 run_job.py --gemma -- python3 -c "import non_existent_pkg_xyz"&lt;/code&gt;. The log ended in &lt;code&gt;ModuleNotFoundError: No module named 'non_existent_pkg_xyz'&lt;/code&gt;. Gemma called it a missing dependency, severity &lt;code&gt;error&lt;/code&gt;, and quoted that line. The checker found it in the log and returned &lt;code&gt;verified&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If Gemma times out or returns malformed output, a rules-based explainer takes over. The failure state never waits for the AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence
&lt;/h2&gt;

&lt;p&gt;I tested Still Loading... against captured failure logs and real system activity, rather than relying only on simulated progress or an AI answer that sounds convincing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Failure logs captured&lt;/td&gt;
&lt;td&gt;20 examples covering Python, Node.js, Git, a non-executable script and refused connections. Two empty excerpts were excluded from text-based analysis.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma diagnosis&lt;/td&gt;
&lt;td&gt;In a live test, a deliberately triggered &lt;code&gt;ModuleNotFoundError&lt;/code&gt; was classified as &lt;code&gt;missing_dependency&lt;/code&gt;, with severity &lt;code&gt;error&lt;/code&gt; and confidence around &lt;code&gt;0.9&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence verification&lt;/td&gt;
&lt;td&gt;In that example, Gemma quoted the missing-module error and the checker found the quoted text in the redacted log, returning &lt;code&gt;VERIFIED&lt;/code&gt;. Tests also cover genuine and fabricated quotes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma response time&lt;/td&gt;
&lt;td&gt;One observed live call took approximately 4.6 seconds. The configured timeout is 8 seconds, with a rules-based fallback for timeouts or invalid responses.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome download progress&lt;/td&gt;
&lt;td&gt;Real progress updates were observed from 0% to 15%, including intermediate percentage changes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Download test coverage&lt;/td&gt;
&lt;td&gt;Automated tests cover progress values including 0%, 1%, 50%, 86%, 99% and 100%, unknown totals, zero-byte cases, completion, failure, cancellation and duplicate-update handling.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS battery&lt;/td&gt;
&lt;td&gt;Real readings of 100% and 99% were observed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automated software tests&lt;/td&gt;
&lt;td&gt;The latest reported run passed 202 Mac-agent tests and 2 relay tests, along with the web tests, demo suite and production build.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What these results prove
&lt;/h3&gt;

&lt;p&gt;The live failure example demonstrates that Gemma can explain a deliberately triggered failure and that the evidence checker can verify its quoted text against the redacted log. The captured logs and automated tests provide a starting point for evaluating more cases.&lt;/p&gt;

&lt;p&gt;These results are &lt;strong&gt;not an overall accuracy benchmark&lt;/strong&gt;. I have not established aggregate figures for diagnosis agreement, quote-verification rate or Gemma timeout frequency across the 20-log fixture. I also have not established measured watchdog catch rates for genuine stalls or false alarms on slow-but-healthy jobs, so I am not claiming those numbers.&lt;/p&gt;

&lt;p&gt;One hardware distinction matters: the receiver returned &lt;code&gt;200 OK&lt;/code&gt; to an authenticated request, confirming network reachability. The full Control Deck-to-physical-matrix path was subsequently recorded on the board on 26 October.&lt;/p&gt;

&lt;p&gt;These are early engineering results, not a benchmark. They document what I have tested and leave the unmeasured results clearly identified as work still to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong on the hardware
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wrong address.&lt;/strong&gt; SSH to &lt;code&gt;192.168.1.5&lt;/code&gt; was refused. The board was at &lt;code&gt;192.168.1.10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong Python.&lt;/strong&gt; Running the App Lab script with system Python gave &lt;code&gt;No module named 'arduino'&lt;/code&gt;. It needs the App Lab runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing token.&lt;/strong&gt; The receiver refused to start until its bearer token was set. After that it listened on port 8090 and answered &lt;code&gt;200 OK&lt;/code&gt; on &lt;code&gt;/v1/lights&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson: when the web preview changes but the board does not, trace the state link by link instead of rewriting the renderer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open matters
&lt;/h2&gt;

&lt;p&gt;Failure logs hold tokens, private paths and URLs. I redact known secret patterns, cap what Gemma sees at about 6,000 characters, and keep inference on my Mac, so the raw log never goes to someone else's server. Open parts also let me inspect why the matrix changed and exactly what the model was shown. A hosted model might diagnose hard failures better and faster. For a one-sentence explanation checked by code, local was enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gemma runs on the Mac, not on the UNO Q.&lt;/li&gt;
&lt;li&gt;VERIFIED proves the quote exists, not that the diagnosis is correct.&lt;/li&gt;
&lt;li&gt;Redaction is pattern-based and can miss unusual secrets.&lt;/li&gt;
&lt;li&gt;Battery readings are whole-number percentages. If the Mac sleeps, monitoring pauses and the board keeps its last state.&lt;/li&gt;
&lt;li&gt;20 logs is a small baseline, not an accuracy study.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The lazy payoff
&lt;/h2&gt;

&lt;p&gt;I wanted a device that would let me stop checking whether every process was still alive.&lt;/p&gt;

&lt;p&gt;Now, instead of constantly watching terminals and download bars, I can glance at a little Halloween-themed display on my desk. When everything is fine, it quietly shows the status. When a job fails or becomes unresponsive, the ghostly visuals make the change harder to miss.&lt;/p&gt;

&lt;p&gt;A ghost is the job I used to keep checking. Now the light does it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Arduino.&lt;/strong&gt; The UNO Q is the physical end of the system: it receives state and shows progress, completion, failure, battery, charging, download and suspected stall on its 8×13 LED matrix. The Halloween illustrations give that physical feedback a distinctive visual identity. The model currently runs on my Mac, not on the UNO Q, so my entry focuses on the physical-agent side of the category: using the board to turn real system activity into a visible, glanceable signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma explains redacted failure logs with severity and a recommended action, and its quoted evidence is checked in code.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI use
&lt;/h2&gt;

&lt;p&gt;I used AI assistance to build this. Gemma is also a runtime part of the project, running locally. It never controls the hardware, and the light does not depend on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to try Still Loading...?
&lt;/h2&gt;

&lt;p&gt;You can check out the &lt;strong&gt;live version here: &lt;a href="https://spry-sulfur-5k3f8xu.tmp.now" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Want to run it on your own Mac? Head over to the &lt;a href="https://github.com/priyanshuspatel/Still_Loading..." rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;, where the README includes the setup instructions and steps to get the project running on your computer. Give it a try! 👻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/priyanshuspatel/Still_Loading..." rel="noopener noreferrer"&gt;https://github.com/priyanshuspatel/Still_Loading...&lt;/a&gt;&lt;br&gt;&lt;br&gt;
· &lt;strong&gt;License:&lt;/strong&gt; MIT Licence ·&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Demo video:&lt;/strong&gt; &lt;a href="https://youtu.be/WynEIrjoguQ" rel="noopener noreferrer"&gt;https://youtu.be/WynEIrjoguQ&lt;/a&gt; ·&lt;br&gt;&lt;br&gt;
Updated with Halloween version: &lt;a href="https://youtu.be/ZAkOoChQL1U" rel="noopener noreferrer"&gt;https://youtu.be/ZAkOoChQL1U&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; Priyanshu Patel&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>arduino</category>
      <category>gemma</category>
    </item>
    <item>
      <title>I got tired of checking my Mac, so I built a little 👻Halloween light to do it for me (Arduino UNO Q + Gemma)</title>
      <dc:creator>Priyanshu Patel</dc:creator>
      <pubDate>Mon, 26 Oct 2026 03:02:46 +0000</pubDate>
      <link>https://dev.to/priyanshupatel/still-loading-your-downloads-without-the-constant-checking-535p</link>
      <guid>https://dev.to/priyanshupatel/still-loading-your-downloads-without-the-constant-checking-535p</guid>
      <description>&lt;p&gt;This is the project which was made for week three, but what happened I submitted before time, but still when I edited few things in it after the deadline, it gets submitted for the week four, so now change it the whole idea with the theme of week four. You might also find the same two post as I am getting some errors that it is not submitted, so I had submitted it twice.&lt;/p&gt;

&lt;p&gt;I got my Arduino UNO Q at a Hacktoberfest meetup, and now I'm finally putting it to use! I'm building &lt;strong&gt;Still Loading...&lt;/strong&gt; as my project for Dev Challenge, giving the board a little Halloween Theme.&lt;/p&gt;

&lt;p&gt;My terminal has ghosts, so I built a little Halloween device to catch them (Arduino UNO Q + Gemma)&lt;/p&gt;

&lt;p&gt;I kept staring at a terminal for jobs that had already died.&lt;/p&gt;

&lt;p&gt;A job can look alive and still be gone. A download can crawl while I keep refreshing its percentage. A traceback can sit unnoticed in another terminal. Sometimes, it feels like my computer has a few ghosts of its own.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Still Loading...&lt;/strong&gt;: an Arduino UNO Q whose 8×13 LED matrix shows what my Mac is doing, so I can glance at my desk instead of constantly checking the screen. When a job fails, a local Gemma model explains why, and my code checks that the log line it quotes really exists.&lt;/p&gt;

&lt;p&gt;For Week Four, I gave the project a Halloween transformation. The underlying idea is the same, but its visual identity is now inspired by ghosts, skulls and other spooky illustrations. What started as a small status light now looks like a little haunted companion for my desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I got my Arduino UNO Q at a Hacktoberfest meetup. It was my first Arduino, and I had never built anything on one before. When this challenge came up, I wanted to use it for a real project instead of leaving it in a drawer.&lt;/p&gt;

&lt;p&gt;My first idea list was the obvious one: a plant-watering device, an email or message summarizer, and similar ideas. I looked around and saw that people had already built these, and built them well. I didn't want to make a copy of something that already existed just to have an Arduino in the photo.&lt;/p&gt;

&lt;p&gt;So I asked a different question: what do I keep doing by hand that a small light could do for me? The answer was already on my screen. I kept checking terminals and download bars to see whether something was still alive.&lt;/p&gt;

&lt;p&gt;That is where the idea of &lt;strong&gt;ghost jobs&lt;/strong&gt; came from: processes that look alive but have already stopped making progress or have failed without me noticing.&lt;/p&gt;

&lt;p&gt;I wanted a light that stays quiet while things are fine and gets my attention when something needs me. That is the problem Still Loading... tries to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  From status light to haunted desk companion
&lt;/h2&gt;

&lt;p&gt;The Halloween theme gave me a reason to rethink the illustrations throughout the project.&lt;/p&gt;

&lt;p&gt;Instead of relying on ordinary status symbols, I refreshed the visuals with spooky, horror-inspired artwork. The idea was to make the matrix feel like a small Halloween device rather than a conventional system monitor.&lt;/p&gt;

&lt;p&gt;The ghostly visual direction fits the project naturally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ghosts represent jobs that have disappeared or become unresponsive.&lt;/li&gt;
&lt;li&gt;Skulls and darker illustrations give failures a more recognisable visual identity.&lt;/li&gt;
&lt;li&gt;Pumpkins, bats and other Halloween-inspired artwork bring personality to the ordinary status displays.&lt;/li&gt;
&lt;li&gt;The overall look makes the device feel like a little haunted companion sitting beside my computer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a visual transformation of the existing project. The underlying monitoring, communication and diagnosis flow remains the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A little ghost watcher for my desk.&lt;/strong&gt; The matrix shows idle, running, completed, failed, suspected stall, battery, charging and download.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Halloween makeover.&lt;/strong&gt; The illustrations have been refreshed with a spooky visual identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real data, not animations.&lt;/strong&gt; It showed a live Chrome download climbing from 0% to 15%, and real macOS battery readings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma explains, code verifies.&lt;/strong&gt; &lt;code&gt;gemma2:2b&lt;/code&gt; runs locally on my Mac and quotes a log line. Plain code checks the quote is in the redacted log and marks the answer VERIFIED or UNVERIFIED. One live call took about 4.6 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tested.&lt;/strong&gt; 20 captured failure logs as a baseline. The latest full run passed 202 Mac-agent tests, 2 relay tests, the web tests, the demo suite and the production build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest boundary.&lt;/strong&gt; Gemma runs on the Mac. The UNO Q receives state and displays it. VERIFIED means the quote exists, not that the diagnosis is right.&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg7ms0zlgpab4zn54wvea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg7ms0zlgpab4zn54wvea.png" alt=" " width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
Updated visuals for the Halloween&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The computer does the work. The board makes the state visible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser Control Deck → Mac backend (battery, Chrome downloads, jobs, Gemma)
      → UNO Q HTTP receiver → App Lab bridge → 8×13 LED matrix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;Battery reader (&lt;code&gt;pmset&lt;/code&gt;), Chrome download monitor, job runner, log redaction, Gemma, evidence check, Control Deck backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UNO Q Linux&lt;/td&gt;
&lt;td&gt;HTTP receiver and App Lab bridge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LED matrix&lt;/td&gt;
&lt;td&gt;Draws each state as a pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;Control Deck&lt;/strong&gt; is a browser page with six buttons: Battery, Download, Run Job, Failed, Reset and Stop. Each calls a fixed backend operation. The browser never runs arbitrary shell commands. The same state drives a matrix preview on the page and the physical matrix.&lt;/p&gt;

&lt;p&gt;The Halloween illustrations change how the information looks, not what the underlying states mean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemma explains, code verifies
&lt;/h2&gt;

&lt;p&gt;A small model can invent a log line that sounds right, so it has to prove its answer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Failure log → redaction → local Gemma → diagnosis + quoted line → exact-match check → VERIFIED / UNVERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran &lt;code&gt;python3 run_job.py --gemma -- python3 -c "import non_existent_pkg_xyz"&lt;/code&gt;. The log ended in &lt;code&gt;ModuleNotFoundError: No module named 'non_existent_pkg_xyz'&lt;/code&gt;. Gemma called it a missing dependency, severity &lt;code&gt;error&lt;/code&gt;, and quoted that line. The checker found it in the log and returned &lt;code&gt;verified&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If Gemma times out or returns malformed output, a rules-based explainer takes over. The failure state never waits for the AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence
&lt;/h2&gt;

&lt;p&gt;I tested Still Loading... against captured failure logs and real system activity, rather than relying only on simulated progress or an AI answer that sounds convincing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Failure logs captured&lt;/td&gt;
&lt;td&gt;20 examples covering Python, Node.js, Git, a non-executable script and refused connections. Two empty excerpts were excluded from text-based analysis.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma diagnosis&lt;/td&gt;
&lt;td&gt;In a live test, a deliberately triggered &lt;code&gt;ModuleNotFoundError&lt;/code&gt; was classified as &lt;code&gt;missing_dependency&lt;/code&gt;, with severity &lt;code&gt;error&lt;/code&gt; and confidence around &lt;code&gt;0.9&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence verification&lt;/td&gt;
&lt;td&gt;In that example, Gemma quoted the missing-module error and the checker found the quoted text in the redacted log, returning &lt;code&gt;VERIFIED&lt;/code&gt;. Tests also cover genuine and fabricated quotes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma response time&lt;/td&gt;
&lt;td&gt;One observed live call took approximately 4.6 seconds. The configured timeout is 8 seconds, with a rules-based fallback for timeouts or invalid responses.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome download progress&lt;/td&gt;
&lt;td&gt;Real progress updates were observed from 0% to 15%, including intermediate percentage changes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Download test coverage&lt;/td&gt;
&lt;td&gt;Automated tests cover progress values including 0%, 1%, 50%, 86%, 99% and 100%, unknown totals, zero-byte cases, completion, failure, cancellation and duplicate-update handling.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS battery&lt;/td&gt;
&lt;td&gt;Real readings of 100% and 99% were observed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automated software tests&lt;/td&gt;
&lt;td&gt;The latest reported run passed 202 Mac-agent tests and 2 relay tests, along with the web tests, demo suite and production build.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What these results prove
&lt;/h3&gt;

&lt;p&gt;The live failure example demonstrates that Gemma can explain a deliberately triggered failure and that the evidence checker can verify its quoted text against the redacted log. The captured logs and automated tests provide a starting point for evaluating more cases.&lt;/p&gt;

&lt;p&gt;These results are &lt;strong&gt;not an overall accuracy benchmark&lt;/strong&gt;. I have not established aggregate figures for diagnosis agreement, quote-verification rate or Gemma timeout frequency across the 20-log fixture. I also have not established measured watchdog catch rates for genuine stalls or false alarms on slow-but-healthy jobs, so I am not claiming those numbers.&lt;/p&gt;

&lt;p&gt;One hardware distinction matters: the receiver returned &lt;code&gt;200 OK&lt;/code&gt; to an authenticated request, confirming network reachability. The full Control Deck-to-physical-matrix path was subsequently recorded on the board on 26 October.&lt;/p&gt;

&lt;p&gt;These are early engineering results, not a benchmark. They document what I have tested and leave the unmeasured results clearly identified as work still to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong on the hardware
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wrong address.&lt;/strong&gt; SSH to &lt;code&gt;192.168.1.5&lt;/code&gt; was refused. The board was at &lt;code&gt;192.168.1.10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong Python.&lt;/strong&gt; Running the App Lab script with system Python gave &lt;code&gt;No module named 'arduino'&lt;/code&gt;. It needs the App Lab runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing token.&lt;/strong&gt; The receiver refused to start until its bearer token was set. After that it listened on port 8090 and answered &lt;code&gt;200 OK&lt;/code&gt; on &lt;code&gt;/v1/lights&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson: when the web preview changes but the board does not, trace the state link by link instead of rewriting the renderer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open matters
&lt;/h2&gt;

&lt;p&gt;Failure logs hold tokens, private paths and URLs. I redact known secret patterns, cap what Gemma sees at about 6,000 characters, and keep inference on my Mac, so the raw log never goes to someone else's server. Open parts also let me inspect why the matrix changed and exactly what the model was shown. A hosted model might diagnose hard failures better and faster. For a one-sentence explanation checked by code, local was enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gemma runs on the Mac, not on the UNO Q.&lt;/li&gt;
&lt;li&gt;VERIFIED proves the quote exists, not that the diagnosis is correct.&lt;/li&gt;
&lt;li&gt;Redaction is pattern-based and can miss unusual secrets.&lt;/li&gt;
&lt;li&gt;Battery readings are whole-number percentages. If the Mac sleeps, monitoring pauses and the board keeps its last state.&lt;/li&gt;
&lt;li&gt;20 logs is a small baseline, not an accuracy study.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The lazy payoff
&lt;/h2&gt;

&lt;p&gt;I wanted a device that would let me stop checking whether every process was still alive.&lt;/p&gt;

&lt;p&gt;Now, instead of constantly watching terminals and download bars, I can glance at a little Halloween-themed display on my desk. When everything is fine, it quietly shows the status. When a job fails or becomes unresponsive, the ghostly visuals make the change harder to miss.&lt;/p&gt;

&lt;p&gt;A ghost is the job I used to keep checking. Now the light does it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Arduino.&lt;/strong&gt; The UNO Q is the physical end of the system: it receives state and shows progress, completion, failure, battery, charging, download and suspected stall on its 8×13 LED matrix. The Halloween illustrations give that physical feedback a distinctive visual identity. The model currently runs on my Mac, not on the UNO Q, so my entry focuses on the physical-agent side of the category: using the board to turn real system activity into a visible, glanceable signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma explains redacted failure logs with severity and a recommended action, and its quoted evidence is checked in code.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI use
&lt;/h2&gt;

&lt;p&gt;I used AI assistance to build this. Gemma is also a runtime part of the project, running locally. It never controls the hardware, and the light does not depend on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to try Still Loading...?
&lt;/h2&gt;

&lt;p&gt;You can check out the &lt;strong&gt;live version here: &lt;a href="https://spry-sulfur-5k3f8xu.tmp.now" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Want to run it on your own Mac? Head over to the &lt;a href="https://github.com/priyanshuspatel/Still_Loading..." rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;, where the README includes the setup instructions and steps to get the project running on your computer. Give it a try! 👻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/priyanshuspatel/Still_Loading..." rel="noopener noreferrer"&gt;https://github.com/priyanshuspatel/Still_Loading...&lt;/a&gt;&lt;br&gt;&lt;br&gt;
· &lt;strong&gt;License:&lt;/strong&gt; MIT Licence ·&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Demo video:&lt;/strong&gt; &lt;a href="https://youtu.be/WynEIrjoguQ" rel="noopener noreferrer"&gt;https://youtu.be/WynEIrjoguQ&lt;/a&gt; ·&lt;br&gt;&lt;br&gt;
Updated with Halloween version: &lt;a href="https://youtu.be/ZAkOoChQL1U" rel="noopener noreferrer"&gt;https://youtu.be/ZAkOoChQL1U&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; Priyanshu Patel&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>arduino</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Proveniq: An AI License Review Is Only Useful When It Can Show Its Evidence</title>
      <dc:creator>Priyanshu Patel</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:47:26 +0000</pubDate>
      <link>https://dev.to/priyanshupatel/proveniq-an-ai-license-review-is-only-useful-when-it-can-show-its-evidence-112f</link>
      <guid>https://dev.to/priyanshupatel/proveniq-an-ai-license-review-is-only-useful-when-it-can-show-its-evidence-112f</guid>
      <description>&lt;p&gt;&lt;strong&gt;What happens when you download an asset, use AI to review its license, and discover later that you cannot prove where the information came from?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine finding the perfect illustration, icon, font, or code snippet for a project. You save it, start building, and move on. A few weeks later, you need to answer some basic questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where did this asset come from?&lt;/li&gt;
&lt;li&gt;Who created it?&lt;/li&gt;
&lt;li&gt;What license applies to it?&lt;/li&gt;
&lt;li&gt;Does that license permit my intended use?&lt;/li&gt;
&lt;li&gt;Can I prove why I believe it is safe to use?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes, the information is scattered across webpages, README files, license notices, and personal notes. Sometimes the creator is unknown. Sometimes the license is ambiguous.&lt;/p&gt;

&lt;p&gt;And sometimes, an AI confidently gives you an answer that sounds correct but has no reliable evidence behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That last problem is what I wanted to address.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Proveniq&lt;/strong&gt;, an open-source, AI-assisted asset provenance and license-screening tool designed to help developers organize asset information, inspect license terms, and identify issues that need human review.&lt;/p&gt;

&lt;p&gt;The idea is simple: &lt;strong&gt;AI can help interpret license information, but it should not be allowed to invent evidence or make the final decision.&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;Proveniq lets you record an asset's name, source URL, creator information, license details, and intended use in one place.&lt;/p&gt;

&lt;p&gt;It then helps turn the available license text into structured information, connects extracted details to supporting quotations, and checks supported license conditions against the intended use.&lt;/p&gt;

&lt;p&gt;The goal is not to replace legal review. It is to make missing information, potential conflicts, and uncertainty easier to see before they become problems.&lt;/p&gt;

&lt;p&gt;A typical workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Record the asset.&lt;/strong&gt; Add its source, known creator, license information, and intended use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract candidate information.&lt;/strong&gt; Gemma analyzes the supplied license text and returns structured fields.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the evidence.&lt;/strong&gt; Extracted conditions need supporting quotations from the provided text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluate the rules.&lt;/strong&gt; Deterministic application code checks supported license conditions against the declared use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flag uncertainty.&lt;/strong&gt; Unsupported licenses, ambiguous terms, and insufficient evidence go to manual review instead of receiving a confident-looking approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate a report.&lt;/strong&gt; Produce a Markdown report or print/save a PDF containing the recorded information, evidence, missing fields, and unresolved warnings.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important part is what happens when the system &lt;em&gt;cannot&lt;/em&gt; establish an answer.&lt;/p&gt;

&lt;p&gt;It should expose the uncertainty—not hide it behind a polished AI response.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Design Decision That Shaped Proveniq
&lt;/h2&gt;

&lt;p&gt;My first priority was deciding what the language model should &lt;strong&gt;not&lt;/strong&gt; control.&lt;/p&gt;

&lt;p&gt;Gemma is useful for extracting candidate information from unstructured text. But extracting a license identifier is not the same as proving that an asset can legally be used in a particular situation.&lt;/p&gt;

&lt;p&gt;Those are different responsibilities.&lt;/p&gt;

&lt;p&gt;In Proveniq:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gemma extracts candidate information.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evidence quotations show what supports that information.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deterministic code evaluates supported rules.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing or unsupported information triggers manual review.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The model does not decide the final review status.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation matters because a model can produce valid-looking structured output while still getting the underlying facts wrong.&lt;/p&gt;

&lt;p&gt;A JSON response is not proof. A plausible license name is not proof. Even a correct license identifier does not automatically establish that a specific use complies with every applicable condition.&lt;/p&gt;

&lt;p&gt;I wanted the system to make those distinctions visible.&lt;/p&gt;




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

&lt;p&gt;The stack is intentionally straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js and TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI and Python&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence:&lt;/strong&gt; SQLite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI inference:&lt;/strong&gt; Gemma 2 2B through Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; Pydantic schemas and deterministic application rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment preparation:&lt;/strong&gt; Docker and Render configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model works with the license text supplied to the application. The system validates the structure of its response and checks supporting quotations rather than blindly trusting the generated fields.&lt;/p&gt;

&lt;p&gt;I also worked on failure handling and evidence integrity.&lt;/p&gt;

&lt;p&gt;For example, when the source license text or source URL changes, stale extraction results are cleared. When relevant evidence or the intended use changes, an earlier assessment can become outdated. Quotations are checked against the supplied text, and unsupported cases are not treated as successful reviews.&lt;/p&gt;

&lt;p&gt;The application also handles inference failures without pretending an extraction succeeded.&lt;/p&gt;

&lt;p&gt;These details are less exciting than a flashy AI demo, but they are central to a tool whose output people may rely on when managing software and creative assets.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing the Idea Instead of Trusting the Demo
&lt;/h2&gt;

&lt;p&gt;I wanted to evaluate more than whether the application could return JSON.&lt;/p&gt;

&lt;p&gt;I created a versioned fixture set containing &lt;strong&gt;28 license notices&lt;/strong&gt;. Of these, 27 were sent to Gemma; the blank notice was rejected with an HTTP 422 response.&lt;/p&gt;

&lt;p&gt;Here are the results from that evaluation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measurement&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nonblank notices evaluated by Gemma&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License identifiers extracted&lt;/td&gt;
&lt;td&gt;27/27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attribution requirements extracted&lt;/td&gt;
&lt;td&gt;21/27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creator information extracted&lt;/td&gt;
&lt;td&gt;12/27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invented creator or attribution details&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documented rule-engine outcomes matched&lt;/td&gt;
&lt;td&gt;15/15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The results highlight an important distinction.&lt;/p&gt;

&lt;p&gt;The model extracted a license identifier from every nonblank fixture, but attribution and creator information were not always available. Those missing fields are not something an application should silently fill in.&lt;/p&gt;

&lt;p&gt;The fixture suite also covers unsupported or ambiguous cases—including MIT/WTFPL cases, prompt-injection attempts, draft studio terms, and ambiguous license tokens—that should lead to an unknown result or manual review rather than an invented clearance.&lt;/p&gt;

&lt;p&gt;The rule-engine result measures agreement with the documented outcomes in that test set. It does &lt;strong&gt;not&lt;/strong&gt; establish universal legal correctness.&lt;/p&gt;

&lt;p&gt;The automated suite currently passes &lt;strong&gt;118 backend tests and 19 frontend tests&lt;/strong&gt;. Type checking, linting, and the production build also passed in the recorded checks.&lt;/p&gt;

&lt;p&gt;There are still limits to what these results establish: the final automated suite uses mocked inference rather than a live Ollama evaluation, and a successful build is not the same as a verified production deployment.&lt;/p&gt;

&lt;p&gt;I would rather state those limitations clearly than make the project look more complete than it is.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned While Building It
&lt;/h2&gt;

&lt;p&gt;The most important lesson was that reliability cannot come from prompting alone.&lt;/p&gt;

&lt;p&gt;A better prompt can improve extraction, but it cannot guarantee that every answer is correct. The application needs checks outside the model: schema validation, evidence verification, explicit handling of unsupported cases, and rules that can be tested independently.&lt;/p&gt;

&lt;p&gt;I also learned that missing data deserves first-class treatment.&lt;/p&gt;

&lt;p&gt;If Proveniq cannot establish the creator, it should say the creator is unknown. If it cannot support a license interpretation, it should request review. If the source changes, the old assessment should not quietly remain authoritative.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The absence of evidence is a result the application must preserve, not a gap for AI to fill.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That principle influenced the product more than any individual prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open Innovation Matters Here
&lt;/h2&gt;

&lt;p&gt;License and provenance information can be part of a developer's workflow every day. I wanted to explore whether a small open-weight model could make that workflow more organized without turning the model into an unquestioned authority.&lt;/p&gt;

&lt;p&gt;Using Gemma through Ollama gives the project an inspectable, replaceable inference layer rather than making the core workflow dependent on a closed, metered model API.&lt;/p&gt;

&lt;p&gt;The deterministic checks remain ordinary application code. The data model, validation logic, and evaluation fixtures can be inspected and improved independently of the model.&lt;/p&gt;

&lt;p&gt;That separation also makes the project easier to challenge. Developers can question a rule, add a fixture, reproduce a failure, or improve extraction without needing to accept a black-box verdict.&lt;/p&gt;

&lt;p&gt;Open source does not automatically make an AI system reliable. But it makes the system's assumptions and limitations easier to examine—and gives other developers a way to improve them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Is Proveniq For?
&lt;/h2&gt;

&lt;p&gt;I am building it for developers, indie makers, and small teams who reuse code or creative assets and want a more disciplined way to track provenance and review license information.&lt;/p&gt;

&lt;p&gt;A team could use it as an early screening step before incorporating an asset into a project. It could also help create a record of what was known, which evidence supported a decision, and which questions remained unanswered.&lt;/p&gt;

&lt;p&gt;It is not a substitute for legal advice, and a generated report is not a guarantee that an asset is legally cleared. The value is in organizing the evidence and surfacing uncertainty earlier.&lt;/p&gt;




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

&lt;p&gt;My next priorities are to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run and document a repeatable evaluation against live local Gemma inference.&lt;/li&gt;
&lt;li&gt;Expand the fixture set with more license formats, missing fields, and difficult edge cases.&lt;/li&gt;
&lt;li&gt;Improve the report so that evidence and unresolved questions are easy to audit.&lt;/li&gt;
&lt;li&gt;Verify the deployed application and document a reproducible setup for contributors.&lt;/li&gt;
&lt;li&gt;Get feedback from developers who regularly manage third-party code and creative assets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would especially like feedback on the cases where a license-screening tool should stop automatically and ask a human to decide.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo and Source Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; [Add your verified public demo URL]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub repository:&lt;/strong&gt; &lt;a href="https://github.com/priyanshuspatel/proveniq" rel="noopener noreferrer"&gt;https://github.com/priyanshuspatel/proveniq&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation fixtures and test results:&lt;/strong&gt; [Add a direct link to the evaluation documentation]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short demo video:&lt;/strong&gt; [Add a recording of the actual workflow]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The live demo and repository links should be filled in before publishing. I don't want to present a deployment as live until it has been verified.&lt;/p&gt;




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

&lt;p&gt;These are the challenge categories I would consider for Proveniq, subject to the official rules and verification that the final submission qualifies.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma :&lt;/strong&gt; Gemma 2 2B is the open-weight model used for license-information extraction, with structured validation and evidence checks around its output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render :&lt;/strong&gt; Include this if the deployed project actually meets the challenge's Render criteria. Configuration files alone are not proof of a qualifying deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of a .tech Domain :&lt;/strong&gt; Include this only after claiming an eligible domain through the Hacktoberfest promotion, putting the project live on that domain, and linking to it here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are potential category entries, not a claim that the project has already qualified for every track. I will list only the categories supported by the final, verified submission.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;AI is very good at making incomplete information look complete.&lt;/p&gt;

&lt;p&gt;For a license-screening tool, that is exactly the behavior I want to guard against.&lt;/p&gt;

&lt;p&gt;Proveniq is my attempt to build a more careful alternative: use AI to help extract information, preserve the evidence behind it, let deterministic code handle supported rules, and make uncertainty visible when the system cannot justify a conclusion.&lt;/p&gt;

&lt;p&gt;It is still a work in progress, and the evaluation is deliberately limited. But I think that is a worthwhile place to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you build software with third-party assets, what would you need to see before trusting an AI-assisted license review?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love feedback on the evidence model, the edge cases, and where the tool should draw the line between automation and human review.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>opensource</category>
      <category>gemma</category>
    </item>
    <item>
      <title>⏳Little Time Machine:- Your Past Is Waiting Outside Your Screen</title>
      <dc:creator>Priyanshu Patel</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:50:57 +0000</pubDate>
      <link>https://dev.to/priyanshupatel/little-time-machine-your-past-is-waiting-outside-your-screen-1b0g</link>
      <guid>https://dev.to/priyanshupatel/little-time-machine-your-past-is-waiting-outside-your-screen-1b0g</guid>
      <description>&lt;h2&gt;
  
  
  The Places That Remember Us: Building Little Time Machine with Open-Weight AI 🌿⏳
&lt;/h2&gt;

&lt;p&gt;Imagine what if AI could help us reconnect not just with the places we miss, but with the people, objects, and moments that made those places feel like home? &lt;/p&gt;

&lt;p&gt;There are places we visit every day without realizing how much they mean to us.&lt;/p&gt;

&lt;p&gt;An old oak tree beside a quiet road.The school gate where a best friend always waited.A small house that no longer belongs to us.A familiar street that still looks the same, even though the people who once walked along it have changed.&lt;/p&gt;

&lt;p&gt;And sometimes, there are objects.&lt;br&gt;
A faded photograph. A childhood toy. A book with someone's handwriting in the margins. An old gift that has lost its practical purpose but somehow remains impossible to throw away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To someone else, these things might look ordinary.&lt;br&gt;
To us, they can feel like pieces of a life we once lived.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine returning to the street/ground where you and your childhood friends once played until sunset, or discovering an old belonging tucked away in a drawer—a faded photograph, a handwritten note, or a toy you carried everywhere. The place may have changed, and the object might seem ordinary to everyone else, but to you, they hold pieces of a life you once lived: shared laughter, familiar faces, forgotten conversations, and a version of yourself that still feels close when those memories come alive again.&lt;/p&gt;

&lt;p&gt;And that is where Little Time Machine begins.&lt;/p&gt;
&lt;h2&gt;
  
  
  1.The Problem: We Save Everything Except the Feeling
&lt;/h2&gt;

&lt;p&gt;We live in a world where saving a moment takes less than a second. We capture birthdays, trips, and everyday experiences, storing thousands of memories on our phones.&lt;/p&gt;

&lt;p&gt;Yet, years later, we may remember what a place looked like without remembering how it felt to be there. A familiar playground, a street where we once played with friends, or a childhood belonging can bring back emotions we never expected to feel again.&lt;/p&gt;

&lt;p&gt;These memories are more than what we see. They hold the people, experiences, and feelings that made those moments special.&lt;/p&gt;

&lt;p&gt;Little Time Machine was born from this idea: helping people reconnect with the stories behind their memories and rediscover what those moments still mean to them today.&lt;/p&gt;
&lt;h2&gt;
  
  
  2.The Idea: Return to the Moment, Not Just the Location
&lt;/h2&gt;

&lt;p&gt;Little Time Machine is built around a simple idea: using AI to help people turn real-world experiences into personal, narrated memories.&lt;/p&gt;

&lt;p&gt;The journey begins away from the screen. You might revisit a familiar place, sit beneath an old tree, or find a childhood belonging that still holds special meaning. You take a photograph and write a few words about the memory it brings back.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
“I came back to the playground where my friends and I used to race to the swings, take turns pushing each other higher, and laugh until the sun went down. We have all grown up, but for a moment, sitting here made me feel like that carefree child again.”&lt;/p&gt;

&lt;p&gt;Those few words give the photograph something an image alone cannot capture: your personal story and the emotions behind it.&lt;/p&gt;

&lt;p&gt;Little Time Machine uses your experience text to generate an AI-written reflection, narrate it as audio, and save it alongside your photograph so you can revisit the memory later.&lt;/p&gt;

&lt;p&gt;The goal is not to recreate the past perfectly, but to help you reconnect with what it meant to you.&lt;/p&gt;

&lt;p&gt;A familiar place becomes more than a location. An ordinary moment becomes a personal story. And a photograph becomes the beginning of a journey back in time.&lt;/p&gt;
&lt;h2&gt;
  
  
  3.Why the Past Feels Personal
&lt;/h2&gt;

&lt;p&gt;The most meaningful memories are not always about big events. Sometimes, they live in ordinary places, familiar objects, and moments we wish we could experience one more time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The places where childhood lives&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Remember the playground where you raced your friends to the swings, played until sunset, and laughed over the smallest things? Years later, the playground may look different, and your friends may be far away. But standing there can bring back a little piece of the childhood you thought you had left behind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The places that belonged to two people&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
A park bench, a school corridor, or a familiar meeting spot can hold the story of a friendship or a relationship. Returning there may bring a smile, along with the ache of missing someone who once made that place feel special.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The belongings that hold our memories&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
An old toy, a childhood watch, or a familiar object can carry a meaning no one else understands. Its value is not in what it costs, but in the people, feelings, and moments it brings back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Meeting the person we used to be&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Sometimes, revisiting the past reminds us how much we have grown. An old school or childhood home can bring back forgotten dreams, old friendships, and the simpler version of ourselves we still carry inside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Little Time Machine&lt;/strong&gt; is inspired by these connections. It helps us pause, reflect on the moments that shaped us, and remember not just where we came from, but what those memories still mean to us today.&lt;/p&gt;
&lt;h2&gt;
  
  
  4.Why “Touch Grass” Fits This Idea
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest 2026 Week 1’s “Touch Grass” theme encouraged building technology that connects people with the real world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Little Time Machine&lt;/strong&gt; brings this idea to life by encouraging people to step away from their screens, revisit familiar places, and reconnect with meaningful memories.&lt;/p&gt;

&lt;p&gt;Take a walk through your old neighbourhood, sit beneath a familiar tree, or revisit a place from your childhood. Capture the moment and write a few words about what it means to you.&lt;/p&gt;

&lt;p&gt;AI then helps turn your experience into a personal reflection, complete with audio narration.&lt;/p&gt;

&lt;p&gt;The goal is simple: let real-world experiences inspire the memory, and let technology help preserve its meaning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step outside to reconnect with your past. Use technology to keep its meaning alive.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  5.From a Personal Moment to a Narrated Memory
&lt;/h2&gt;

&lt;p&gt;The current implementation turns a photograph and a written account of an experience into a saved memory card.&lt;/p&gt;

&lt;p&gt;The flow is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;- A person visits a place or encounters an object that means something to them.&lt;/li&gt;
&lt;li&gt;- They take a photograph.&lt;/li&gt;
&lt;li&gt;- They provide the related quest text and a short written description of their experience.&lt;/li&gt;
&lt;li&gt;- A locally run Gemma model generates a reflection through Ollama.&lt;/li&gt;
&lt;li&gt;- ElevenLabs turns that reflection into audio narration.&lt;/li&gt;
&lt;li&gt;- The application stores the memory information in MongoDB Atlas          and makes the media available through the backend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The emotional context comes from the person's own description. The AI generates a reflection based on that input; it does not independently know the history of a tree, identify the people involved, or retrieve forgotten events.&lt;/p&gt;

&lt;p&gt;This distinction matters. A personal memory should begin with the person who lived it, not with an AI inventing a story on their behalf.&lt;/p&gt;
&lt;h2&gt;
  
  
  6. The Technology Behind Little Time Machine
&lt;/h2&gt;

&lt;p&gt;Little Time Machine brings together local AI inference, audio narration, and persistent memory storage to transform everyday experiences into meaningful, revisitable stories. Each technology serves a specific role in the journey, from processing a user’s experience to generating a reflection and preserving it for the future.&lt;/p&gt;
&lt;h4&gt;
  
  
  Technology Stack &amp;amp; Their Role in the Project
&lt;/h4&gt;
&lt;h4&gt;
  
  
  TypeScript &amp;amp; Node.js
&lt;/h4&gt;

&lt;p&gt;Power the backend application with type-safe development and server-side processing.&lt;/p&gt;
&lt;h4&gt;
  
  
  Express.js
&lt;/h4&gt;

&lt;p&gt;Handles API endpoints, incoming requests, input validation, and communication between services.&lt;/p&gt;
&lt;h4&gt;
  
  
  Gemma 2 2B via Ollama
&lt;/h4&gt;

&lt;p&gt;Runs a locally hosted, open-weight language model that generates personalized reflections from the user’s experience.&lt;/p&gt;
&lt;h4&gt;
  
  
  ElevenLabs
&lt;/h4&gt;

&lt;p&gt;Converts generated reflections into natural-sounding audio narration.&lt;/p&gt;
&lt;h4&gt;
  
  
  MongoDB Atlas
&lt;/h4&gt;

&lt;p&gt;Stores persistent memory records and their associated metadata.&lt;/p&gt;
&lt;h4&gt;
  
  
  Local File System
&lt;/h4&gt;

&lt;p&gt;Stores uploaded photographs and generated audio files, which are served through the application’s media endpoints.&lt;/p&gt;
&lt;h4&gt;
  
  
  Sentry
&lt;/h4&gt;

&lt;p&gt;Provides error monitoring and tracing integration to help identify and investigate application issues.&lt;/p&gt;

&lt;p&gt;The project combines local model inference with external services. Gemma runs locally through Ollama, while narration and cloud database storage depend on their respective services.&lt;br&gt;
That makes the application a practical exploration of open-weight AI, not a claim that the entire experience works offline.&lt;/p&gt;

&lt;p&gt;The project combines local model inference with external services. Gemma runs locally through Ollama, while narration and cloud database storage depend on their respective services.&lt;br&gt;
That makes the application a practical exploration of open-weight AI, not a claim that the entire experience works offline.&lt;/p&gt;
&lt;h2&gt;
  
  
  7.Little Time Machine in Action: Screenshots &amp;amp; Demo🎬🌿
&lt;/h2&gt;
&lt;h4&gt;
  
  
  Step-by-step screenshots in our little time machine
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Step 1 -&lt;/strong&gt; This is the user interface where the user would select or get an random task&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp8wzj9ez2xhr4w4q4fhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp8wzj9ez2xhr4w4q4fhg.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 2 -&lt;/strong&gt; Here, the user sees the task and also can hear through the audio speak by ElevenLabs&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F70t2h1mzryxb77plt6hi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F70t2h1mzryxb77plt6hi.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 3 -&lt;/strong&gt; Then the user will see the option of uploading the image&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ude1tpdp97sa6ebznyk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ude1tpdp97sa6ebznyk.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 4 -&lt;/strong&gt; Then the user will click the upload image, it will redirect to the capturing page where your she can capture the moment&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdwuarkdmfbojwtabw9zg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdwuarkdmfbojwtabw9zg.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 5 -&lt;/strong&gt; After capturing it, the user will get option of changing it and then express its feeling and emotion to that moment&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy7qi9pn36sarzyibsd40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy7qi9pn36sarzyibsd40.png" alt=" " width="799" height="453"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 6 -&lt;/strong&gt; The moment will be saved as a stamp of memory in the memory library. This is the personal memory library for the user, where he would recreate his childhood memories.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2tmj6fz2ce1fku99l3aq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2tmj6fz2ce1fku99l3aq.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 7 -&lt;/strong&gt; Now, by clicking at home button or clicking at any empty stamp box, would redirect the user back to the homepage to make more memory stamps.And also gets the option(button) to directly jump to the saved memory stamps.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F04h3nh0ka679icq76awv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F04h3nh0ka679icq76awv.png" alt=" " width="799" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DEMO Link:- coming soon&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  8.Architecture &amp;amp; Open Source Code:-From Experience to Memory
&lt;/h2&gt;

&lt;p&gt;Little Time Machine is built as a modular AI-powered memory backend that connects outdoor quests, personal experiences, local language-model inference, narrated reflections, and persistent memory storage.&lt;/p&gt;

&lt;p&gt;The architecture combines a TypeScript and Express backend with Gemma 2 2B running locally through Ollama, ElevenLabs text-to-speech, MongoDB Atlas, and local media storage.&lt;/p&gt;
&lt;h4&gt;
  
  
  Project Structure
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;little-time-machine/
├── src/
│   ├── routes/                  # API endpoints
│   ├── services/                # AI reflection and audio generation
│   ├── database/                # MongoDB Atlas integration
│   └── server.ts                # Express server entry point
├── media/                       # Generated photos and audio (if stored here)
├── package.json                 # Dependencies and npm scripts
├── tsconfig.json                # TypeScript configuration
├── .env                         # Local environment variables (not committed)
├── .gitignore                   # Files excluded from Git
└── README.md                    # Project documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Note: This is a high-level structure. Replace the illustrative &lt;code&gt;src/&lt;/code&gt; entries with the actual directory and filenames from your repository before publishing.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Core Technology Stack
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; TypeScript, Node.js, and Express&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight AI:&lt;/strong&gt; Gemma 2 2B through Ollama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text-to-speech:&lt;/strong&gt; ElevenLabs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; MongoDB Atlas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Media storage:&lt;/strong&gt; Local filesystem for photographs and generated audio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring:&lt;/strong&gt; Sentry integration&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Key API Endpoints
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check backend availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /api/memory/process&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Process a photograph and written experience, generate a reflection and narration, and save the memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/media/...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieve uploaded photographs and generated audio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The memory-processing endpoint accepts a photograph, quest text, and experience description. It returns the generated reflection, media URLs, and timestamp after the main processing workflow succeeds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/priyanshuspatel/LittleTimeMachine.git" rel="noopener noreferrer"&gt;https://github.com/priyanshuspatel/LittleTimeMachine.git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT License&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;
  
  
  Running Locally
&lt;/h4&gt;

&lt;p&gt;You can run Little Time Machine on your local machine by installing the Node.js dependencies, configuring the required services, and starting the backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Clone the repository&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/priyanshuspatel/LittleTimeMachine.git
&lt;span class="nb"&gt;cd &lt;/span&gt;LittleTimeMachine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the placeholders with your actual GitHub URL and repository directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Install dependencies&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Set up the local AI model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install Ollama, then download Gemma 2 2B:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma2:2b
ollama list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure Ollama is running and the model is available to the backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Configure environment variables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file using the variable names specified in your project configuration. Add the required MongoDB Atlas connection string and ElevenLabs credentials, along with any configured Sentry or model settings.&lt;/p&gt;

&lt;p&gt;Keep your credentials private and never commit &lt;code&gt;.env&lt;/code&gt; to GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Start the backend&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The development server is expected to be available at &lt;code&gt;http://localhost:3000&lt;/code&gt;, provided the project uses the default port and starts successfully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Verify the backend&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; http://localhost:3000/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful health check returns HTTP &lt;code&gt;200 OK&lt;/code&gt; in the tested development setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Create a test memory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Replace the example image path with a valid local JPEG or PNG image.&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="nv"&gt;IMAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/Pictures/spot.jpg"&lt;/span&gt;

curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'\nHTTP Status: %{http_code}\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/api/memory/process &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"photo=@&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"questText=Find a quiet place outdoors."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"experienceText=Sat under the tree where I played as a child."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the required services are configured and the request succeeds, the API returns HTTP &lt;code&gt;201 Created&lt;/code&gt; with the saved memory information and media URLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Run development checks&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx tsc &lt;span class="nt"&gt;--noEmit&lt;/span&gt;
npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both checks passed in the tested development environment.&lt;/p&gt;




&lt;h4&gt;
  
  
  Cloud Deployment
&lt;/h4&gt;

&lt;p&gt;Little Time Machine can be adapted for cloud deployment, but the deployment configuration must account for its local AI model and media storage.&lt;/p&gt;

&lt;p&gt;Before deploying, ensure that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The hosting environment supports the Node.js application and its required dependencies.&lt;/li&gt;
&lt;li&gt;Ollama and Gemma are available to the backend, either on the same host or through an appropriately secured model service.&lt;/li&gt;
&lt;li&gt;MongoDB Atlas and ElevenLabs credentials are configured through secure environment variables.&lt;/li&gt;
&lt;li&gt;Uploaded photographs and generated audio use persistent storage if the hosting platform has an ephemeral filesystem.&lt;/li&gt;
&lt;li&gt;Authentication, access controls, and appropriate privacy protections are implemented before accepting sensitive personal memories from public users.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A platform such as Render can host the Node.js backend, subject to its resource and deployment constraints. However, a working one-click deployment blueprint should only be advertised after a corresponding deployment configuration has been added and tested.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment status:&lt;/strong&gt; Local backend execution and the core memory-processing workflow have been tested. Cloud deployment instructions and a production-ready deployment blueprint remain to be confirmed against the actual repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge Submission Categories
&lt;/h3&gt;

&lt;p&gt;This project is submitted to the following partner categories 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;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🌿 &lt;strong&gt;Primary Category: Best Use of Gemma&lt;/strong&gt; — Little Time Machine uses Google's open-weight Gemma 2 2B model locally through Ollama to transform a user's written real-world experience into a reflective memory. Whether someone returns to an old oak tree, revisits a familiar place shared with a loved one, or discovers a childhood belonging, Gemma helps turn the context they provide into a reflection they can revisit. Running inference locally gives the project control over its model workflow and demonstrates a practical use of open-weight AI beyond a conventional hosted-LLM integration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🎙️ &lt;strong&gt;Partner Category: Best Use of ElevenLabs&lt;/strong&gt; — ElevenLabs converts AI-generated memory reflections into MP3 narration, allowing users to listen to the stories connected to their experiences instead of only reading them on a screen. This adds an audio dimension to Little Time Machine's central idea: helping people reconnect with meaningful places, cherished objects, and personal moments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🗄️ &lt;strong&gt;Partner Category: Best Use of MongoDB Atlas&lt;/strong&gt; — MongoDB Atlas provides persistent storage for Little Time Machine's memory records. The application saves the experience text, generated reflection, photograph URL, narration URL, and timestamp together, creating a foundation for revisiting personal memories rather than treating each AI generation as a disposable response.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔎 &lt;strong&gt;Partner Category: Best Use of Sentry Agent Tracing&lt;/strong&gt; — Little Time Machine integrates Sentry into its backend for error monitoring and tracing-related observability. This supports the reliability of a multi-step workflow involving image uploads, local AI inference, audio generation, and database persistence. The goal is to make failures easier to investigate as the application evolves. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💚 A Little Thank You to the Hacktoberfest Team and DEV
&lt;/h2&gt;

&lt;p&gt;A heartfelt thank you to the Hacktoberfest team for creating this wonderful opportunity! I'm genuinely happy to be part of this journey—from brainstorming a creative idea to building Little Time Machine with open-weight AI and open-source technology. 🌿&lt;/p&gt;

&lt;p&gt;What makes this experience special is the chance to build something meaningful: a project that encourages people to step away from their screens, revisit familiar places, reconnect with cherished memories, and spend a little more time in the real world. I'm grateful for the opportunity to learn, create, experiment, and turn an idea into something that could genuinely make a difference. ❤️⏳&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>HealthMate AI: A Personal Health Companion Built for a Friend</title>
      <dc:creator>Priyanshu Patel</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:44:53 +0000</pubDate>
      <link>https://dev.to/priyanshupatel/healthmate-ai-a-personal-health-companion-built-for-a-friend-2pfi</link>
      <guid>https://dev.to/priyanshupatel/healthmate-ai-a-personal-health-companion-built-for-a-friend-2pfi</guid>
      <description>&lt;p&gt;Hacktoberfest Weekend Challenge: Build for a Friend Submission&lt;br&gt;
This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.&lt;br&gt;
The Problem Was Not Another Fitness App&lt;br&gt;
My friend did not need another application showing a giant calorie counter.&lt;br&gt;
They needed something much simpler:&lt;br&gt;
"What should I actually do today?"&lt;br&gt;
Like many people trying to improve their health, they were dealing with food tracking, exercise, weight goals, calorie targets, and trying to understand whether the choices they made today were actually moving them toward their goal.&lt;br&gt;
The frustrating part was that the information was scattered.&lt;br&gt;
A meal might be written as:&lt;br&gt;
"I had 2 eggs, two slices of toast and a banana."&lt;br&gt;
Exercise might be logged separately.&lt;br&gt;
Weight might be tracked somewhere else.&lt;br&gt;
And at the end of the day, the person still had to manually connect everything together.&lt;br&gt;
That was the motivation behind HealthMate AI.&lt;br&gt;
Instead of building another static calorie tracker, I wanted to build a personal health companion that could understand natural language, calculate health metrics deterministically, learn patterns from structured historical data, and provide useful explanations.&lt;br&gt;
Most importantly, I wanted to build it for one person first.&lt;br&gt;
Not for everyone.&lt;br&gt;
For a friend.&lt;br&gt;
Meet HealthMate AI&lt;br&gt;
HealthMate AI is a predictive personal health and nutrition companion.&lt;br&gt;
The idea is simple:&lt;br&gt;
Your Health Data ↓ HealthMate ↓ Understand ↓ Calculate ↓ Predict ↓ Explain ↓ Take Action&lt;br&gt;
The system combines three technologies, each with a specific responsibility.&lt;br&gt;
Gemma&lt;br&gt;
Natural-language health assistant.&lt;br&gt;
Gemma 3:1B understands things such as:&lt;br&gt;
"I had 2 eggs, 2 slices of toast and 1 banana for breakfast."&lt;br&gt;
It converts that natural-language input into structured food information.&lt;br&gt;
TabPFN&lt;br&gt;
Predictive tabular intelligence.&lt;br&gt;
TabPFN is used for structured health-data prediction where enough historical data is available.&lt;br&gt;
Rather than asking an LLM to perform numerical prediction, HealthMate separates the prediction problem from the language problem.&lt;br&gt;
DigitalOcean&lt;br&gt;
Production infrastructure.&lt;br&gt;
DigitalOcean provides the infrastructure required to take HealthMate from a local AI prototype toward a production-ready deployment.&lt;br&gt;
This separation is important.&lt;br&gt;
Each technology does what it is good at.&lt;br&gt;
The First Interaction: "I Ate This..."&lt;br&gt;
One of the first things I wanted to fix was the traditional food logging experience.&lt;br&gt;
Instead of forcing my friend to search through a massive database:&lt;br&gt;
Search food → Select food → Select quantity → Select unit → Repeat → Save&lt;br&gt;
HealthMate allows natural language.&lt;br&gt;
For example:&lt;br&gt;
"I had 2 eggs, 2 slices of toast and 1 banana."&lt;br&gt;
The request travels through:&lt;br&gt;
Frontend ↓ FastAPI ↓ Ollama ↓ Gemma 3:1B ↓ Structured JSON&lt;br&gt;
Gemma identifies the food items and quantities.&lt;br&gt;
For example:&lt;br&gt;
{ "meal_type": "breakfast", "items": [ { "name": "eggs", "quantity": 2, "unit": "piece" }, { "name": "toast", "quantity": 2, "unit": "slice" }, { "name": "banana", "quantity": 1, "unit": "piece" } ] }&lt;br&gt;
But there is an important engineering decision here.&lt;br&gt;
I Don't Let the LLM Do the Math&lt;br&gt;
An LLM should understand:&lt;br&gt;
"2 eggs."&lt;br&gt;
It should not be trusted as the authoritative calculator for exact nutritional values.&lt;br&gt;
Therefore HealthMate separates language understanding from health calculations.&lt;br&gt;
The architecture is:&lt;br&gt;
Gemma ↓ Food + Quantity ↓ Deterministic Backend ↓ Calories + Macros ↓ User Review ↓ Confirm &amp;amp; Save&lt;br&gt;
This makes the system much more predictable.&lt;br&gt;
Gemma Runs Locally&lt;br&gt;
One of the most important design decisions was running Gemma locally.&lt;br&gt;
My development machine is a MacBook Air with an M4 chip and 16 GB RAM.&lt;br&gt;
I installed:&lt;br&gt;
Ollama Gemma 3:1B&lt;br&gt;
The local architecture is:&lt;br&gt;
MacBook ↓ Ollama ↓ Gemma 3:1B ↓ HealthMate FastAPI&lt;br&gt;
The local Ollama endpoint is:&lt;br&gt;
&lt;a href="http://localhost:11434" rel="noopener noreferrer"&gt;http://localhost:11434&lt;/a&gt;&lt;br&gt;
And the application uses:&lt;br&gt;
gemma3:1b&lt;br&gt;
There is no Gemma API key required for this local setup.&lt;br&gt;
The model runs locally instead of sending every meal log to a remote LLM service.&lt;br&gt;
That matters because health and nutrition information is personal.&lt;br&gt;
The "Don't Save It Yet" Rule&lt;br&gt;
Another important design decision was adding a confirmation layer.&lt;br&gt;
AI should not silently write information into someone's health history.&lt;br&gt;
When Gemma interprets a meal, HealthMate shows the interpretation first:&lt;br&gt;
Gemma understood your meal as:&lt;br&gt;
2 eggs 2 slices toast 1 banana&lt;br&gt;
[ Edit ] [ Confirm &amp;amp; Save ]&lt;br&gt;
The user can correct:&lt;br&gt;
food quantity unit meal type&lt;br&gt;
Only after confirmation is the information persisted.&lt;br&gt;
This creates a much safer interaction:&lt;br&gt;
AI interpretation ↓ Human verification ↓ Database&lt;br&gt;
rather than:&lt;br&gt;
AI ↓ Database&lt;br&gt;
HealthMate Is More Than a Calorie Counter&lt;br&gt;
Once food and activity data are structured, HealthMate can calculate useful metrics.&lt;br&gt;
The application keeps deterministic health calculations in backend logic.&lt;br&gt;
Examples include:&lt;br&gt;
calorie intake macronutrients BMR TDEE calorie balance activity information weight trends&lt;br&gt;
The important distinction is:&lt;br&gt;
Gemma = understands language&lt;br&gt;
Backend = performs calculations&lt;br&gt;
TabPFN = performs prediction&lt;br&gt;
Frontend = makes the result understandable&lt;br&gt;
From Tracking to Prediction&lt;br&gt;
Logging information is useful.&lt;br&gt;
But eventually I wanted HealthMate to answer a more interesting question:&lt;br&gt;
"What does my history suggest?"&lt;br&gt;
This is where TabPFN enters the architecture.&lt;br&gt;
HealthMate stores structured historical information such as:&lt;br&gt;
Date Weight Calories Protein Carbohydrates Fat Exercise Activity Other available health metrics&lt;br&gt;
Instead of treating every day independently, HealthMate can use the accumulated history as structured data.&lt;br&gt;
The intended prediction pipeline is:&lt;br&gt;
PostgreSQL ↓ Historical Health Data ↓ Feature Preparation ↓ TabPFN ↓ Prediction ↓ HealthMate Dashboard&lt;br&gt;
For time-dependent information, the architecture can also use appropriate TabPFN time-series functionality when supported by the installed environment.&lt;br&gt;
Why TabPFN?&lt;br&gt;
Personal health datasets are often small.&lt;br&gt;
A person does not necessarily have millions of rows of personal health information.&lt;br&gt;
They might have:&lt;br&gt;
30 days 60 days 90 days 180 days&lt;br&gt;
of structured personal history.&lt;br&gt;
Traditional machine-learning workflows often require substantial preprocessing, model selection, and hyperparameter tuning.&lt;br&gt;
TabPFN is interesting for this type of problem because it is specifically designed around tabular foundation-model inference.&lt;br&gt;
HealthMate therefore uses a different division of responsibility:&lt;br&gt;
Gemma&lt;br&gt;
"I understand what the user said."&lt;br&gt;
TabPFN&lt;br&gt;
"I analyze the structured historical data."&lt;br&gt;
Backend&lt;br&gt;
"I calculate deterministic health metrics."&lt;br&gt;
Frontend&lt;br&gt;
"I make the result understandable."&lt;br&gt;
Gemma + TabPFN&lt;br&gt;
This creates an interesting AI pipeline.&lt;br&gt;
Imagine TabPFN produces a structured result:&lt;br&gt;
{ "prediction": 72.1, "horizon_days": 7, "model": "TabPFN" }&lt;br&gt;
HealthMate can then pass the structured result to Gemma.&lt;br&gt;
Gemma's job is not to invent another prediction.&lt;br&gt;
Its job is to explain the existing one.&lt;br&gt;
The architecture becomes:&lt;br&gt;
Health Data ↓ TabPFN ↓ Structured Prediction ↓ Gemma ↓ Human-Friendly Explanation&lt;br&gt;
For example:&lt;br&gt;
"Based on your recent logged trend, your current trajectory is relatively stable over the next week."&lt;br&gt;
The numerical prediction remains owned by the predictive model.&lt;br&gt;
The HealthMate Dashboard&lt;br&gt;
The goal of the dashboard is not to overwhelm the user with AI terminology.&lt;br&gt;
It should answer a few simple questions.&lt;br&gt;
How am I doing today?&lt;br&gt;
Calories&lt;br&gt;
1,840 / 2,100 kcal&lt;br&gt;
What did I eat?&lt;br&gt;
Protein: 92g Carbs: 218g Fat: 61g&lt;br&gt;
What did I do?&lt;br&gt;
Exercise: 42 min Activity: 8,240 steps&lt;br&gt;
What is my recent trend?&lt;br&gt;
Weight Trend&lt;br&gt;
What does the AI think?&lt;br&gt;
Gemma&lt;br&gt;
"Your protein intake was strong today..."&lt;br&gt;
What does the predictive model say?&lt;br&gt;
TabPFN&lt;br&gt;
Prediction available&lt;br&gt;
The interface separates these pieces so the user knows what they are looking at.&lt;br&gt;
A Transparent AI System&lt;br&gt;
HealthMate explicitly communicates where information comes from.&lt;br&gt;
For example:&lt;br&gt;
Powered by Gemma 3:1B • Local AI&lt;br&gt;
For predictions:&lt;br&gt;
Powered by TabPFN&lt;br&gt;
For deterministic metrics:&lt;br&gt;
Calculated from your logged data&lt;br&gt;
If there is insufficient historical data:&lt;br&gt;
Not enough historical data yet.&lt;br&gt;
Keep logging your health data to unlock predictive insights.&lt;br&gt;
If a model is unavailable, the application should say so.&lt;br&gt;
No fake predictions.&lt;br&gt;
No hidden fallback.&lt;br&gt;
No pretending that a heuristic is machine learning.&lt;br&gt;
Privacy Was a Feature, Not an Afterthought&lt;br&gt;
Health information is different from ordinary application data.&lt;br&gt;
Weight.&lt;br&gt;
Food.&lt;br&gt;
Exercise.&lt;br&gt;
Goals.&lt;br&gt;
Personal habits.&lt;br&gt;
These are things people may not want uploaded to an arbitrary AI service.&lt;br&gt;
That is why the local development architecture is:&lt;br&gt;
User&lt;br&gt;
↓&lt;br&gt;
HealthMate&lt;br&gt;
↓&lt;br&gt;
FastAPI&lt;br&gt;
↓&lt;br&gt;
Ollama&lt;br&gt;
↓&lt;br&gt;
Gemma 3:1B&lt;/p&gt;

&lt;p&gt;rather than:&lt;/p&gt;

&lt;p&gt;User&lt;br&gt;
↓&lt;br&gt;
HealthMate&lt;br&gt;
↓&lt;br&gt;
External LLM API&lt;br&gt;
The local Gemma setup allows the core natural-language interaction to happen on the user's machine.&lt;br&gt;
For production, DigitalOcean provides the infrastructure layer needed to deploy the application and its AI/ML components in a controlled environment.&lt;br&gt;
Built on a Real Full-Stack Architecture&lt;br&gt;
HealthMate is not just a frontend prototype.&lt;/p&gt;

&lt;p&gt;healthmate/&lt;br&gt;
├── backend/&lt;br&gt;
│ ├── app/&lt;br&gt;
│ │ ├── ai/&lt;br&gt;
│ │ │ ├── factory.py&lt;br&gt;
│ │ │ ├── ollama.py&lt;br&gt;
│ │ │ └── ...&lt;br&gt;
│ │ │&lt;br&gt;
│ │ ├── health/&lt;br&gt;
│ │ │ └── nutrition.py&lt;br&gt;
│ │ │&lt;br&gt;
│ │ ├── api/&lt;br&gt;
│ │ │ └── assistant.py&lt;br&gt;
│ │ │&lt;br&gt;
│ │ └── ...&lt;br&gt;
│ │&lt;br&gt;
│ └── tests/&lt;br&gt;
│&lt;br&gt;
├── frontend/&lt;br&gt;
│ ├── components/&lt;br&gt;
│ │ └── MealAssistant.tsx&lt;br&gt;
│ └── ...&lt;br&gt;
│&lt;br&gt;
├── scripts/&lt;br&gt;
│ └── test_ollama_gemma.py&lt;br&gt;
│&lt;br&gt;
├── .env&lt;br&gt;
├── .env.example&lt;br&gt;
└── ...&lt;br&gt;
The exact repository structure may evolve as TabPFN and production infrastructure are completed.&lt;br&gt;
The Technology Stack&lt;br&gt;
Frontend: React / TypeScript Responsibility: Health dashboard&lt;br&gt;
Backend: FastAPI Responsibility: API and application logic&lt;br&gt;
Database: PostgreSQL Responsibility: Structured health history&lt;br&gt;
Local LLM: Gemma 3:1B Responsibility: Natural-language understanding&lt;br&gt;
Local inference: Ollama Responsibility: Runs Gemma locally&lt;br&gt;
Predictive ML: TabPFN Responsibility: Structured prediction&lt;br&gt;
Time-series ML: TabPFN-TS where supported Responsibility: Historical forecasting&lt;br&gt;
Infrastructure: DigitalOcean Responsibility: Production deployment&lt;br&gt;
Validation: Pydantic Responsibility: Structured AI outputs&lt;br&gt;
Current Implementation Status&lt;br&gt;
The first major milestone is already working.&lt;br&gt;
Gemma + Ollama&lt;br&gt;
Verified.&lt;br&gt;
The actual local pipeline has been tested:&lt;br&gt;
"2 eggs, 2 slices of toast and 1 banana"&lt;br&gt;
Gemma successfully identified three food items.&lt;br&gt;
The verification produced structured items including:&lt;br&gt;
eggs toast banana&lt;br&gt;
The application then validated the result through its Pydantic schemas.&lt;br&gt;
The current test suite also reports:&lt;br&gt;
40 passed&lt;br&gt;
Frontend typechecking and production build have also been successfully verified.&lt;br&gt;
What Is Still Being Built&lt;br&gt;
The project is intentionally being developed in stages.&lt;br&gt;
Completed:&lt;br&gt;
Full-stack HealthMate foundation FastAPI backend Frontend dashboard PostgreSQL integration Natural-language meal input Local Ollama integration Gemma 3:1B Structured meal parsing Pydantic validation Deterministic nutrition calculations BMR/TDEE-related health calculations User review/edit flow Confirm-before-save workflow AI assistant AI summaries Mock provider for testing Gemma/Ollama verification tests&lt;br&gt;
In Progress:&lt;br&gt;
Real TabPFN predictive pipeline Historical feature preparation TabPFN prediction APIs Time-series forecasting where compatible Predictive dashboard DigitalOcean production infrastructure&lt;br&gt;
I am deliberately not presenting the unfinished predictive components as completed features.&lt;br&gt;
Building It for a Friend&lt;br&gt;
The most important part of this project isn't the model.&lt;br&gt;
It's the person sitting behind the screen.&lt;br&gt;
[INSERT YOUR FRIEND'S REAL STORY HERE]&lt;br&gt;
For example:&lt;br&gt;
What problem were they actually having?&lt;br&gt;
How were they tracking food before?&lt;br&gt;
What frustrated them?&lt;br&gt;
What made you decide to build this?&lt;br&gt;
What did they say after trying it?&lt;br&gt;
Once you have real feedback, this section should contain an actual quote from your friend.&lt;br&gt;
For example:&lt;br&gt;
"[INSERT YOUR FRIEND'S REAL QUOTE HERE]"&lt;br&gt;
The story should be real.&lt;br&gt;
That's what makes a "Build for a Friend" project different from building another generic AI demo.&lt;br&gt;
Why Open AI Infrastructure Matters&lt;br&gt;
HealthMate is an experiment in combining open and controllable AI infrastructure.&lt;br&gt;
Gemma provides the language intelligence.&lt;br&gt;
TabPFN provides the predictive intelligence.&lt;br&gt;
DigitalOcean provides the production infrastructure.&lt;br&gt;
Together:&lt;br&gt;
Open/controllable AI + Structured health data + Deterministic calculations + Predictive ML + Human verification&lt;br&gt;
Personal Health Companion&lt;br&gt;
The goal isn't to replace doctors.&lt;br&gt;
It isn't to diagnose diseases.&lt;br&gt;
It isn't to pretend an AI knows someone's body better than they do.&lt;br&gt;
The goal is much more practical:&lt;br&gt;
Take the messy information people already generate about their health and turn it into something understandable and useful.&lt;br&gt;
What I Learned Building HealthMate&lt;br&gt;
The biggest lesson was that AI doesn't mean putting an LLM everywhere.&lt;br&gt;
Sometimes the correct answer is an LLM.&lt;br&gt;
Sometimes it is deterministic Python.&lt;br&gt;
Sometimes it is a tabular foundation model.&lt;br&gt;
Sometimes it is simply a database query.&lt;br&gt;
The engineering challenge is deciding which one belongs where.&lt;br&gt;
HealthMate ended up with this philosophy:&lt;br&gt;
Natural language?&lt;br&gt;
→ Gemma&lt;br&gt;
Exact calculation?&lt;br&gt;
→ Backend logic&lt;br&gt;
Structured prediction?&lt;br&gt;
→ TabPFN&lt;br&gt;
Historical forecasting?&lt;br&gt;
→ TabPFN-TS where appropriate&lt;br&gt;
Production infrastructure?&lt;br&gt;
→ DigitalOcean&lt;br&gt;
Human decision?&lt;br&gt;
→ The user&lt;br&gt;
What's Next?&lt;br&gt;
The next milestone is turning HealthMate from an intelligent health tracker into a genuinely predictive companion.&lt;br&gt;
The roadmap is:&lt;br&gt;
Natural-language health logging ↓ Local Gemma 3:1B ↓ Deterministic health calculations ↓ TabPFN prediction ↓ Time-series forecasting ↓ DigitalOcean production deployment ↓ HealthMate AI&lt;br&gt;
The ultimate goal is simple:&lt;br&gt;
"Your health data should help you understand tomorrow, not just record yesterday."&lt;br&gt;
Prize Categories&lt;br&gt;
This project is being submitted to the following partner tracks:&lt;br&gt;
Best Use of Gemma — Gemma 3:1B runs locally through Ollama and powers natural-language meal understanding and health explanations.&lt;br&gt;
Best Use of TabPFN — TabPFN is being integrated as the structured predictive ML layer for HealthMate's historical health data.&lt;br&gt;
Best Use of DigitalOcean — DigitalOcean is being used as the production infrastructure target for deploying HealthMate's backend and AI/ML services.&lt;br&gt;
Try HealthMate&lt;br&gt;
GitHub: [INSERT REPOSITORY URL]&lt;br&gt;
Live Demo: &lt;br&gt;
Screenshots: [INSERT SCREENSHOTS]&lt;br&gt;
Local Setup&lt;br&gt;
Install Ollama and the Gemma model:&lt;br&gt;
ollama pull gemma3:1b&lt;br&gt;
Verify:&lt;br&gt;
ollama list&lt;br&gt;
Run Gemma:&lt;br&gt;
ollama run gemma3:1b&lt;br&gt;
Configure:&lt;br&gt;
&lt;code&gt;AI_PROVIDER=ollama OLLAMA_BASE_URL=http://localhost:11434&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEMMA_MODEL=gemma3:1b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start the HealthMate backend and frontend using the project's existing development commands.&lt;br&gt;
Built for a Friend, Designed for Real Life&lt;br&gt;
I started HealthMate because one person I care about shouldn't have to become a nutrition expert, data analyst, and machine-learning engineer just to understand their own health information.&lt;br&gt;
The technology is complicated.&lt;br&gt;
The experience shouldn't be.&lt;br&gt;
Gemma understands what they say.&lt;br&gt;
The backend calculates what can be calculated reliably.&lt;br&gt;
TabPFN looks for patterns in structured history.&lt;br&gt;
DigitalOcean gives the project a path toward production.&lt;br&gt;
And the final decision?&lt;br&gt;
That still belongs to the person using it.&lt;br&gt;
That's HealthMate AI.&lt;/p&gt;

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