<?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: Sudeepta Sarmah</title>
    <description>The latest articles on DEV Community by Sudeepta Sarmah (@sudeepsarmah).</description>
    <link>https://dev.to/sudeepsarmah</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%2F1172233%2F19e99391-62af-4794-ae07-9577b4ad2021.png</url>
      <title>DEV Community: Sudeepta Sarmah</title>
      <link>https://dev.to/sudeepsarmah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sudeepsarmah"/>
    <language>en</language>
    <item>
      <title>FinZ: a first-paycheck desk that runs Gemma on the laptop</title>
      <dc:creator>Sudeepta Sarmah</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:43:42 +0000</pubDate>
      <link>https://dev.to/sudeepsarmah/finz-a-first-paycheck-desk-that-runs-gemma-on-the-laptop-a9b</link>
      <guid>https://dev.to/sudeepsarmah/finz-a-first-paycheck-desk-that-runs-gemma-on-the-laptop-a9b</guid>
      <description>

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;FinZ is a money desk for a first real paycheck. You write the note the way you would text a friend.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$14 matcha after a bad standup, felt like a treat.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Gemma, running on your computer through Ollama, turns that into an amount, a direction, a short label, and a feeling. You can change any of those before it is saved. The note hits the desk only when you say so.&lt;/p&gt;

&lt;p&gt;The desk is one pay period. Cash in, cash out, what's left. In the sample below, take-home is $2,800 every other week. The matcha landed at $16, the paycheck got dropped in, and $2,784 was left. The feeling mix is one survival note and one treat. Leftover cash fills dreams smallest first, so an $800 fridge is full and "Japan with my sister" sits at $1,984 of $4,000. Her reason for the trip is on the card: she turns 30, and the point is to be in the room.&lt;/p&gt;

&lt;p&gt;Open the dream and FinZ will do two more jobs. A money mood is a short read of the notes already on the desk, held up against that dream. A starter split is three buckets for money she might set aside later: an emergency buffer, cash, and a broad index fund. The page says "not financial advice" before the button and again on the sketch. There are no tickers, and nobody places a trade.&lt;/p&gt;

&lt;p&gt;The person who would pay for this is in their first year of getting paid, and wants that note read on their own machine. The job is small on purpose. Read a messy line, show the period, move leftover cash toward a named dream, and sketch a boring split when they ask. After &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;, those model calls cost nothing, so the thing for sale is the desk. A metered API on every note would eat a product this small before anyone paid for it.&lt;/p&gt;

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

&lt;p&gt;The screenshots are FinZ and Gemma on the same laptop. That is the path where the Mastra agent, the weights, and the ledger share a machine.&lt;/p&gt;

&lt;p&gt;The public desk is &lt;a href="https://finz-omega.vercel.app" rel="noopener noreferrer"&gt;finz-omega.vercel.app&lt;/a&gt;. The page is hosted. Gemma runs on the visitor's computer. The guide at &lt;a href="https://finz-omega.vercel.app/guide" rel="noopener noreferrer"&gt;finz-omega.vercel.app/guide&lt;/a&gt; is the setup: install Ollama, pull &lt;code&gt;gemma3:4b&lt;/code&gt;, then start Ollama so the browser is allowed to reach localhost (&lt;code&gt;OLLAMA_ORIGINS&lt;/code&gt;). A note can then be read on that machine, and the ledger for the demo stays in the browser.&lt;/p&gt;

&lt;p&gt;The money mood and the starter split are the Mastra agent. They run when you start FinZ yourself, next to Ollama:&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 gemma3:4b
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open &lt;a href="http://localhost:47291" rel="noopener noreferrer"&gt;http://localhost:47291&lt;/a&gt;. The repo README has the same steps, including the smaller &lt;code&gt;gemma3:1b&lt;/code&gt; switch if the laptop is tight on memory.&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%2F9gv0mu1njwoenfvw4huf.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%2F9gv0mu1njwoenfvw4huf.png" alt="Mina's desk after one paycheck and a $16 matcha. $2,784 left, the fridge dream full, Japan halfway." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cash in $2,800, cash out $16. Surplus fills the smaller dream first.&lt;/em&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%2Fneqmokr9039gnf4ygxr0.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%2Fneqmokr9039gnf4ygxr0.png" alt="A money mood for Japan with my sister, written from the paycheck that is actually on the desk." width="799" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Gemma's read was titled "Sister's Trip Still Calling." It names the $2,800 paycheck, then the trip, and it signs off "FinZ, on this laptop."&lt;/em&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%2F17u7tsohyjyr59v089ff.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%2F17u7tsohyjyr59v089ff.png" alt="A starter split for a this-year dream: 30% emergency buffer, 45% cash, 25% broad index funds." width="404" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Emergency plus cash is 75%. The index is 25%. A dream happening this year has to come out that way.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sudeepsarmah" rel="noopener noreferrer"&gt;
        sudeepsarmah
      &lt;/a&gt; / &lt;a href="https://github.com/sudeepsarmah/FinZ" rel="noopener noreferrer"&gt;
        FinZ
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A local-first personal finance website for Gen Z people who just entered the workforce.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;FinZ&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Live site: &lt;a href="https://finz-omega.vercel.app" rel="nofollow noopener noreferrer"&gt;https://finz-omega.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A local-first money desk for the first real paycheck. Dreams and feelings up front, a spreadsheet nowhere. Gemma reads a messy note on your laptop. Mastra is the agent harness. Income, expenses, and dreams stay in a SQLite file on the machine.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run on your laptop&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;You need Node.js 22 or newer (FinZ uses the built-in &lt;code&gt;node:sqlite&lt;/code&gt;) and &lt;a href="https://ollama.com/download" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pull the model FinZ runs here:&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma3:4b&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If Ollama did not start a background service (common when systemd is not running), start it in another terminal:&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama serve&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install
npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open &lt;a href="http://localhost:47291" rel="nofollow noopener noreferrer"&gt;http://localhost:47291&lt;/a&gt;. The dev server binds &lt;code&gt;0.0.0.0:47291&lt;/code&gt;. The first page explains the desk. Start Gemma is a plain-language setup guide at &lt;code&gt;/guide&lt;/code&gt;. Onboarding includes a currency (USD, INR, EUR, or GBP).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gemma3:1b&lt;/code&gt; was the first try. It parsed a matcha note, then invented a purchase when…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sudeepsarmah/FinZ" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/sudeepsarmah/FinZ" rel="noopener noreferrer"&gt;github.com/sudeepsarmah/FinZ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent is one Mastra &lt;code&gt;Agent&lt;/code&gt; in &lt;code&gt;lib/agent.ts&lt;/code&gt;. The model is whatever &lt;code&gt;OLLAMA_MODEL&lt;/code&gt; says. The default is &lt;code&gt;gemma3:4b&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;finzAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;finz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FinZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You are FinZ, the money friend on someone's laptop. They just got a first real paycheck.
Be warm, specific, and a little irreverent. Short sentences. No shame. No corporate tone. No hashtags. No bullet lectures.
Never invent amounts, entries, or dreams that are not in the prompt.
You are not a financial advisor. Allocation sketches only use three buckets: an emergency buffer, cash, and a broad index fund. Never name a ticker, fund company, coin, or individual stock.
When asked for JSON, reply with one JSON object and no markdown.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ollama&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MODEL_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;think&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instructions are not a guarantee. A small model will still invent a purchase, so a finished reflection has to mention the dream, mention a real entry label, and only use dollar amounts that were actually logged. The sketch has its own rule for a dream happening this year:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;safe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;allocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emergencyPercent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;allocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cashPercent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;dreams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;dream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;dream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timeline&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;this year&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nx"&gt;allocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexPercent&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;safe&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A this-year dream needs emergency plus cash to be greater than the index percent.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fail the check and FinZ asks Gemma once more, with the reason in the prompt. Fail again and the request errors. The bad sketch is not saved.&lt;/p&gt;

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

&lt;p&gt;The open-weight model is Google's Gemma 3, tag &lt;code&gt;gemma3:4b&lt;/code&gt;, served by &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; at &lt;code&gt;127.0.0.1:11434&lt;/code&gt;. The agent harness is &lt;a href="https://mastra.ai" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt; (&lt;code&gt;@mastra/core&lt;/code&gt;), connected with &lt;code&gt;ollama-ai-provider-v2&lt;/code&gt;. I did not fine-tune anything. The model is stock. The behavior comes from the prompt, a loose JSON schema, and the checks above.&lt;/p&gt;

&lt;p&gt;Three calls:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Parse a note&lt;/strong&gt; into amount, direction, label, emotion, and one sentence. Feelings are a fixed set: survival, treat, glow-up, ick, soft-launch, chaos. Temperature stays low. Rent and a paycheck come out as survival. "Felt like a treat" comes out as treat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a money mood.&lt;/strong&gt; Two sentences. The first names a real entry. The second names the dream. If the desk is empty, the first sentence has to say so, and it is not allowed to invent a purchase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sketch the three buckets&lt;/strong&gt; as integers that sum to 100. If risk is set to steady, the index cannot be the biggest bucket. If risk is set high, the emergency buffer still stays at least 15%.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I tried &lt;code&gt;gemma3:1b&lt;/code&gt; first. It parsed the matcha note correctly, then invented a purchase when I asked for a mood. &lt;code&gt;gemma3:4b&lt;/code&gt; stayed on the entries that were actually there. That is the bar. The smaller tag is still a switch, &lt;code&gt;OLLAMA_MODEL=gemma3:1b&lt;/code&gt;, for a laptop that cannot hold the 4B weights. The harness stays put.&lt;/p&gt;

&lt;p&gt;Around the model, the app is Next.js 16, TypeScript, and Tailwind. Amounts are integer cents. Onboarding asks for a name, a currency (USD, INR, EUR, or GBP), take-home, how often it lands, how much movement you can stand, and one to three dreams. The note box will finish the word under the cursor from a local list, so &lt;code&gt;spe&lt;/code&gt; can become &lt;code&gt;spent&lt;/code&gt;. That completion is the word list.&lt;/p&gt;

&lt;p&gt;Run it yourself and Node 22's built-in &lt;code&gt;node:sqlite&lt;/code&gt; stores the profile, the dreams, and the notes in &lt;code&gt;data/finz.db&lt;/code&gt;. The hosted demo cannot keep that file, so its copy of the ledger lives in the browser, and a note that the server cannot read falls back to a direct call from the page to local Ollama. The Mastra path, the one with the repair step, is the app and Ollama on the same computer. A 4B model on a laptop is allowed to be slow: each call can take up to 150 seconds a step.&lt;/p&gt;

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

&lt;p&gt;This desk is pointless if the note leaves the laptop. The dream in the screenshot is a sister turning 30, and the wish is to be in the room rather than the group chat. That sentence, next to a paycheck, is a bad thing to drop into a request log someone else owns. A closed API can publish a retention policy. Ollama on localhost is a stronger promise: the weights are already on the machine, and the call is to &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A side hustle this small also dies if every note has a meter on it. Reading a line, writing two sentences, and sketching three numbers will not support a token bill. One &lt;code&gt;ollama pull&lt;/code&gt; and the marginal cost of a mood is electricity. I can charge for the desk, or wait until someone asks to pay, and a vendor's price change does not decide whether the project still runs.&lt;/p&gt;

&lt;p&gt;I needed to be able to throw the model out. &lt;code&gt;gemma3:1b&lt;/code&gt; lied about a purchase. I pointed the same Mastra agent at &lt;code&gt;gemma3:4b&lt;/code&gt; and kept the checks. A closed default model would have left me waiting on someone else's changelog, or paying up a SKU, to fix a failure I could already see. The check that rejects an invented dollar amount is there because an open model will wander, and I get to decide what counts as a finished answer.&lt;/p&gt;

&lt;p&gt;Nothing in that loop needs an account, a key, or a network I trust. Pull the weights once. On a plane, on cafe wifi, or on a laptop that has never held an API key, FinZ still reads the note.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Parsing, the money mood, and the starter split are calls to &lt;code&gt;gemma3:4b&lt;/code&gt; through Ollama. The 4B tag replaced 1B because the smaller one invented a purchase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Mastra.&lt;/strong&gt; One Mastra agent, &lt;code&gt;id: "finz"&lt;/code&gt;, is the harness over that local model. It asks for JSON, and it gets one repair step when a reflection or a split fails the check.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>mastra</category>
    </item>
    <item>
      <title>TrailDex: Turn a Walk into a Pocket Nature Deck</title>
      <dc:creator>Sudeepta Sarmah</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:48:37 +0000</pubDate>
      <link>https://dev.to/sudeepsarmah/traildex-turn-a-walk-into-a-pocket-nature-deck-4hp3</link>
      <guid>https://dev.to/sudeepsarmah/traildex-turn-a-walk-into-a-pocket-nature-deck-4hp3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;TrailDex is an Android field guide game for people who want a small reason to notice more on a walk. Pick two points on the map to preview an open walking route, start a GPS walk, and collect a bird, plant, fungus, insect, or other observation as a retro pocket-monster card. Each card has simple battle stats and a short field haiku. You can save and share cards, keep a local field journal, and use the collection in an offline practice battle.&lt;/p&gt;

&lt;p&gt;The intended rhythm is short: plan the walk, put the phone away, stop briefly when something catches your eye, then look through the cards and battle after the walk. TrailDex does not identify species in the background; photo suggestions happen only when the user asks the configured model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;These screenshots are from the Android demo build. The map and route screen requires internet for map tiles and route planning; GPS logs and cards remain on the device.&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%2Fjlgpshahf8537ewna3c5.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%2Fjlgpshahf8537ewna3c5.png" alt="TrailDex nature card collection" width="800" height="1778"&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%2Fdz2nlzlitgkbbcgth7tp.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%2Fdz2nlzlitgkbbcgth7tp.png" alt="TrailDex local practice battle" width="800" height="1778"&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%2Fic6eoypp7zkphvehtnw9.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%2Fic6eoypp7zkphvehtnw9.png" alt="TrailDex scout log and badges" width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Download the &lt;a href="https://raw.githubusercontent.com/sudeepsarmah/traildex/main/downloads/traildex-debug.apk" rel="noopener noreferrer"&gt;TrailDex Android APK&lt;/a&gt; and follow the &lt;a href="https://github.com/sudeepsarmah/traildex#try-traildex-on-your-android-phone" rel="noopener noreferrer"&gt;phone installation guide&lt;/a&gt;. The APK is a debug demo distributed directly from GitHub; it is not a Play Store release and does not update automatically.&lt;/p&gt;

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

&lt;p&gt;The complete Android project, build steps, and tester guide are in the &lt;a href="https://github.com/sudeepsarmah/traildex" rel="noopener noreferrer"&gt;TrailDex GitHub repository&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;TrailDex is written in Kotlin with Jetpack Compose. The interactive map is rendered with the open-source &lt;a href="https://leafletjs.com/" rel="noopener noreferrer"&gt;Leaflet&lt;/a&gt; library in an Android WebView, using &lt;a href="https://www.openstreetmap.org/copyright" rel="noopener noreferrer"&gt;OpenStreetMap tiles&lt;/a&gt;. Walking route geometry comes from the public &lt;a href="https://routing.openstreetmap.de/about.html" rel="noopener noreferrer"&gt;FOSSGIS Open Source Routing Machine foot profile&lt;/a&gt; and is drawn in TrailDex; no Google Maps or Mapbox API key or billing account is involved. The public map and routing services are community resources with fair-use limits and no uptime guarantee.&lt;/p&gt;

&lt;p&gt;The AI card flow uses Gemma 3 4B through Ollama. Ollama runs on a computer the user controls, and the phone connects to it when the host is reachable. With a photo, the model can suggest a visible organism and write a haiku; a text observation can be used to generate a haiku. If the model is unavailable, saving still works with varied bundled verse templates. Those fallback verses are not model output. TrailDex does not bundle the model or run Ollama on the phone.&lt;/p&gt;

&lt;p&gt;Cards, field notes, and saved GPS tracks are stored locally. There is no account system or multiplayer service. Map tiles and route requests need internet; route requests send the selected endpoints to FOSSGIS. See the README for the &lt;a href="https://github.com/sudeepsarmah/traildex#what-works-offline" rel="noopener noreferrer"&gt;map service limits&lt;/a&gt;, &lt;a href="https://github.com/sudeepsarmah/traildex#optional-open-weight-ai" rel="noopener noreferrer"&gt;Ollama setup&lt;/a&gt;, and &lt;a href="https://github.com/sudeepsarmah/traildex#scope-and-privacy" rel="noopener noreferrer"&gt;privacy scope&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The model is replaceable, and the prompt and client code are visible. A user can run Gemma on a computer they control instead of sending an observation photo to a hosted model API. That gives the user more control over where their photo and field note go, and avoids a per-request hosted AI bill for this flow. It does require the user to install Ollama and download a model, so this is not a one-tap offline AI app.&lt;/p&gt;

&lt;p&gt;Open map rendering and OpenStreetMap data also let TrailDex show a real map and pedestrian route without a proprietary map SDK or API key. Using a public tile or routing service is not unlimited free hosting: the community endpoints have usage policies, can be unavailable, and should be replaced by a suitable provider or self-hosted infrastructure if the demo grows.&lt;/p&gt;

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

&lt;p&gt;No shareable agent-session link is attached yet. This section is optional for the challenge.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — TrailDex uses Gemma 3 4B through Ollama for opt-in photo suggestions and haiku generation.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>android</category>
      <category>ai</category>
    </item>
    <item>
      <title># Nudge: I built my friend a productivity app that treats procrastination like a roguelike</title>
      <dc:creator>Sudeepta Sarmah</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:42:29 +0000</pubDate>
      <link>https://dev.to/sudeepsarmah/-nudge-i-built-my-friend-a-productivity-app-that-treats-procrastination-like-a-roguelike-1m5o</link>
      <guid>https://dev.to/sudeepsarmah/-nudge-i-built-my-friend-a-productivity-app-that-treats-procrastination-like-a-roguelike-1m5o</guid>
      <description>&lt;p&gt;Hacktoberfest Weekend Challenge: Build for a Friend Submission&lt;/p&gt;

&lt;p&gt;This is my submission for the &lt;strong&gt;Hacktoberfest Weekend Challenge: Build&lt;br&gt;
for a Friend&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I (tried to) Built
&lt;/h2&gt;

&lt;p&gt;My friend is an MBA student. Her problem isn't that she doesn't know&lt;br&gt;
what she needs to do.&lt;/p&gt;

&lt;p&gt;It's that the list of things she needs to do can become overwhelming&lt;br&gt;
enough that starting any one of them feels difficult.&lt;/p&gt;

&lt;p&gt;There are classes, assignments, presentations, deadlines, and a phone&lt;br&gt;
full of apps designed to make ten minutes disappear.&lt;/p&gt;

&lt;p&gt;So I started building &lt;strong&gt;Nudge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nudge is a productivity companion designed around one simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't solve the whole task. Just make the next step easier to&lt;br&gt;
start.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The MVP combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  a Focus Shield for distracting apps,&lt;/li&gt;
&lt;li&gt;  simple task creation,&lt;/li&gt;
&lt;li&gt;  an AI task-slicing workflow,&lt;/li&gt;
&lt;li&gt;  voice-note capture,&lt;/li&gt;
&lt;li&gt;  XP for completed work,&lt;/li&gt;
&lt;li&gt;  and earned screen-time unlocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app is intentionally small. I wanted to build something that could&lt;br&gt;
actually be used by one person rather than another giant productivity&lt;br&gt;
dashboard.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;strong&gt;Under progress --- I wasn't able to finish the public&lt;br&gt;
AI demo before the submission deadline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I got the Android application running on an emulator and built the main&lt;br&gt;
product loop, but I ran out of time while finishing the live Gemma&lt;br&gt;
inference and public deployment.&lt;/p&gt;

&lt;p&gt;For now, these are screenshots from the working Android build.&lt;/p&gt;
&lt;h3&gt;
  
  
  Today
&lt;/h3&gt;

&lt;p&gt;The Today screen is deliberately simple: progress, current tasks, and&lt;br&gt;
Focus Shield status.&lt;/p&gt;

&lt;p&gt;The goal is to open Nudge and immediately understand what needs&lt;br&gt;
attention without being overwhelmed by another complicated productivity&lt;br&gt;
interface.&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%2Fg9l4hfi11act8p5vcy4r.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%2Fg9l4hfi11act8p5vcy4r.png" alt=" " width="376" height="830"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Tiny Steps
&lt;/h3&gt;

&lt;p&gt;Tasks are displayed as small steps rather than one intimidating block of&lt;br&gt;
work.&lt;/p&gt;

&lt;p&gt;The task-slicing flow is designed to turn something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Finish my final semester project."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;into a handful of actions that are easier to begin.&lt;/p&gt;
&lt;h3&gt;
  
  
  Focus Shield
&lt;/h3&gt;

&lt;p&gt;Focus Shield is the other half of the loop.&lt;/p&gt;

&lt;p&gt;Instead of treating app blocking as punishment, Nudge connects focused&lt;br&gt;
work with earned access to distracting apps.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;strong&gt;Under progress --- I am uploading the current codebase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the Android application, Node/Express API,&lt;br&gt;
native Android accessibility service, task-slicing logic, voice-note&lt;br&gt;
integration, and the project setup needed to continue development.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The MVP stack is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;React Native + Expo&lt;/strong&gt; for the Android application&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Node.js + Express&lt;/strong&gt; for the backend&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Gemma&lt;/strong&gt; as the intended open-weight model for task decomposition&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;ElevenLabs Scribe&lt;/strong&gt; for voice transcription&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Render&lt;/strong&gt; for the planned backend deployment&lt;/li&gt;
&lt;li&gt;  Android's native accessibility capabilities for Focus Shield&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also explored &lt;strong&gt;Ollama&lt;/strong&gt; for local Gemma inference during development.&lt;br&gt;
The backend is structured around an OpenAI-compatible model endpoint, so&lt;br&gt;
the model-serving layer can be swapped without rewriting the mobile&lt;br&gt;
application.&lt;/p&gt;
&lt;h3&gt;
  
  
  The AI Task Slicer
&lt;/h3&gt;

&lt;p&gt;The core AI idea is intentionally simple.&lt;/p&gt;

&lt;p&gt;A user gives Nudge a large or overwhelming task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I need to finish my final semester project."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intended flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Large task
    ↓
Gemma
    ↓
3–5 tiny actions
    ↓
Nudge task cards
    ↓
Complete one small step
    ↓
Earn XP / unlocks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I implemented the backend integration path for this workflow, but I&lt;br&gt;
wasn't able to get the live Gemma inference working reliably before the&lt;br&gt;
submission deadline. The current build therefore falls back to a simple&lt;br&gt;
task-splitting response when the model endpoint isn't available.&lt;/p&gt;

&lt;p&gt;I am leaving that limitation visible rather than presenting the fallback&lt;br&gt;
as completed AI inference.&lt;/p&gt;
&lt;h3&gt;
  
  
  Voice Capture
&lt;/h3&gt;

&lt;p&gt;Nudge also includes a voice-note path intended to turn a spoken thought&lt;br&gt;
into a task.&lt;/p&gt;

&lt;p&gt;The intended flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Voice note
    ↓
ElevenLabs Scribe
    ↓
Transcript
    ↓
Task slicer
    ↓
Tiny task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was another part of the MVP I started wiring together, but the&lt;br&gt;
submission-time build was not polished enough for me to call the&lt;br&gt;
complete voice-to-task pipeline finished.&lt;/p&gt;
&lt;h3&gt;
  
  
  Focus Shield
&lt;/h3&gt;

&lt;p&gt;The Android side includes a native accessibility service for Focus&lt;br&gt;
Shield.&lt;/p&gt;

&lt;p&gt;The app can maintain a list of distracting apps such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Instagram&lt;/li&gt;
&lt;li&gt;  YouTube&lt;/li&gt;
&lt;li&gt;  TikTok&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The product loop is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Focus
  ↓
Complete tasks
  ↓
Earn XP
  ↓
Earn unlock time
  ↓
Use distracting apps intentionally
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the part of the idea I wanted to make feel different from a&lt;br&gt;
normal app blocker.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;A productivity app like this can eventually know quite a lot about its&lt;br&gt;
user:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  what they need to do,&lt;/li&gt;
&lt;li&gt;  what deadlines they have,&lt;/li&gt;
&lt;li&gt;  how they plan their work,&lt;/li&gt;
&lt;li&gt;  what they struggle to start,&lt;/li&gt;
&lt;li&gt;  and potentially their voice notes and personal context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't want the AI layer of that experience to depend completely on a&lt;br&gt;
black-box model that I cannot change.&lt;/p&gt;

&lt;p&gt;Using an open-weight model gives Nudge the possibility to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  run inference locally,&lt;/li&gt;
&lt;li&gt;  change the prompts and task-decomposition logic,&lt;/li&gt;
&lt;li&gt;  swap models as better open models become available,&lt;/li&gt;
&lt;li&gt;  experiment with different serving setups,&lt;/li&gt;
&lt;li&gt;  and keep the AI workflow under the developer's control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this MVP, the important part is the architecture: the mobile app&lt;br&gt;
talks to a backend, and the backend can talk to a separately hosted&lt;br&gt;
open-weight model.&lt;/p&gt;

&lt;p&gt;The final production architecture I had planned was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Nudge Android App
                       │
                       ▼
                 Render API
                  /       \
                 /         \
                ▼           ▼
       Application Data    Gemma
                            │
                            ▼
                     GPU / Local Inference
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I didn't reach the final public deployment stage during the challenge&lt;br&gt;
window, but this separation is already reflected in the project&lt;br&gt;
structure.&lt;/p&gt;

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

&lt;p&gt;The hardest part wasn't designing a productivity app.&lt;/p&gt;

&lt;p&gt;It was keeping the scope small enough to finish.&lt;/p&gt;

&lt;p&gt;I started with a much larger idea involving planners, calendars,&lt;br&gt;
integrations, memory, and automation. The weekend challenge forced me to&lt;br&gt;
strip that down to the part that actually mattered for my friend:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Make starting a difficult task feel smaller.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also learned that getting an LLM into a project is only the beginning.&lt;/p&gt;

&lt;p&gt;The generated output has to fit the application's data model, UI, and&lt;br&gt;
user experience. A useful task decomposition needs to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  small,&lt;/li&gt;
&lt;li&gt;  actionable,&lt;/li&gt;
&lt;li&gt;  ordered,&lt;/li&gt;
&lt;li&gt;  realistic,&lt;/li&gt;
&lt;li&gt;  and short enough that the user doesn't feel like they have another
task manager to manage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reward loop raised another design question: how do you make app&lt;br&gt;
blocking feel motivating rather than punitive?&lt;/p&gt;

&lt;p&gt;That led to the idea of earned unlocks: focused work creates progress,&lt;br&gt;
and progress creates controlled access to distractions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Building Next
&lt;/h2&gt;

&lt;p&gt;Because I ran out of time before the final deployment, the next steps&lt;br&gt;
are clear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Finish reliable Gemma inference.&lt;/li&gt;
&lt;li&gt; Replace the fallback task slicer with the live model response.&lt;/li&gt;
&lt;li&gt; Finish and test the voice → transcript → task pipeline.&lt;/li&gt;
&lt;li&gt; Test Focus Shield against real installed distracting apps.&lt;/li&gt;
&lt;li&gt; Deploy the API publicly.&lt;/li&gt;
&lt;li&gt; Publish a live web demo of the task slicer.&lt;/li&gt;
&lt;li&gt; Test the complete focus → task → XP → unlock loop with my friend.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Handing It Over
&lt;/h2&gt;

&lt;p&gt;The real test isn't whether the demo looks polished.&lt;/p&gt;

&lt;p&gt;It's whether my friend actually opens Nudge when she has something&lt;br&gt;
stressful to do.&lt;/p&gt;

&lt;p&gt;If Nudge can turn:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I have an enormous assignment and I don't know where to start"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;into:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Just open the brief."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and then make that first step feel worth doing, it has done what I&lt;br&gt;
wanted.&lt;/p&gt;

&lt;p&gt;I didn't get the whole product finished within the challenge window.&lt;/p&gt;

&lt;p&gt;But I did get the core Android experience, the product loop, the native&lt;br&gt;
Focus Shield foundation, and the AI integration structure into a working&lt;br&gt;
project.&lt;/p&gt;

&lt;p&gt;The rest is now a much smaller engineering problem than the original&lt;br&gt;
idea.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;DevRelay / agent session:&lt;/strong&gt; &lt;code&gt;[OPTIONAL — ADD IF AVAILABLE]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;AI assistance was used during development, but the product decisions&lt;br&gt;
were driven by the real workflow I wanted to solve for my friend:&lt;br&gt;
reducing the friction of starting, making progress visible, and turning&lt;br&gt;
distraction access into an earned choice.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Nudge is designed around Gemma as the open-weight model for turning&lt;br&gt;
overwhelming tasks into small, structured actions.&lt;/p&gt;

&lt;p&gt;The Gemma integration path is implemented in the backend, but live model&lt;br&gt;
inference was not completed before the submission deadline. I am not&lt;br&gt;
claiming the unfinished inference stage as completed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of DigitalOcean
&lt;/h3&gt;

&lt;p&gt;DigitalOcean was part of the planned deployment architecture for hosting&lt;br&gt;
Gemma inference on a GPU.&lt;/p&gt;

&lt;p&gt;This deployment was not completed before the deadline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of MongoDB Atlas
&lt;/h3&gt;

&lt;p&gt;MongoDB Atlas was considered for persistent task and application data,&lt;br&gt;
but I intentionally removed it from the final MVP to keep the project&lt;br&gt;
within the weekend scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs Scribe was selected for the voice transcription layer. The&lt;br&gt;
voice-to-task flow was started, but the complete production-ready&lt;br&gt;
pipeline was not finished before submission.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Render
&lt;/h3&gt;

&lt;p&gt;Render was selected for the Node/Express backend deployment. The backend&lt;br&gt;
is structured for deployment, but the public deployment was not&lt;br&gt;
completed before the deadline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Submissions
&lt;/h2&gt;

&lt;p&gt;This is an individual submission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks for participating!
&lt;/h2&gt;

&lt;p&gt;Nudge started with one friend and one problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sometimes the hardest part of a huge task is doing the first five&lt;br&gt;
minutes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I didn't manage to ship every part of the original plan before the clock&lt;br&gt;
ran out.&lt;/p&gt;

&lt;p&gt;But I did build enough of the idea to see the product loop working on&lt;br&gt;
Android, and enough of the architecture to continue from here.&lt;/p&gt;

&lt;p&gt;That's what Nudge is for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;one small step.&lt;/strong&gt;&lt;/p&gt;

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