<?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: Smaranika</title>
    <description>The latest articles on DEV Community by Smaranika (@codeandcoffee).</description>
    <link>https://dev.to/codeandcoffee</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%2F4155590%2F339d0dbd-6ede-46c4-bec1-da3bb57e8477.jpg</url>
      <title>DEV Community: Smaranika</title>
      <link>https://dev.to/codeandcoffee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codeandcoffee"/>
    <language>en</language>
    <item>
      <title>Dear Tomorrow: a local Gemma app that writes the note you'll need in the morning</title>
      <dc:creator>Smaranika</dc:creator>
      <pubDate>Sun, 25 Oct 2026 16:21:04 +0000</pubDate>
      <link>https://dev.to/codeandcoffee/dear-tomorrow-a-local-gemma-app-that-writes-the-note-youll-need-in-the-morning-11hd</link>
      <guid>https://dev.to/codeandcoffee/dear-tomorrow-a-local-gemma-app-that-writes-the-note-youll-need-in-the-morning-11hd</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The most expensive part of starting work is often remembering where you stopped. Which branch? Which test was failing? What did you promise to send? Rebuilding that context at 9 am is slow, dull work, and you only have to do it because nobody wrote it down while it was fresh.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Dear Tomorrow&lt;/strong&gt;. At the end of the day, you dump everything into one box, messy as it comes. A local Gemma model turns it into a short note to your future self. Next time you open the page, the note is waiting.&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%2Fhfaepqm5o9pn0yhnem87.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%2Fhfaepqm5o9pn0yhnem87.png" alt="Dear Tomorrow note" width="712" height="865"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Dear Tomorrow is a single web page. The note has four parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Start here.&lt;/strong&gt; One concrete first action for tomorrow, taken from your own words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧭 Where you were.&lt;/strong&gt; Up to three short facts that rebuild context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔁 Open loops.&lt;/strong&gt; Up to five unfinished things as a checklist you can tick off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗂️ Your original dump.&lt;/strong&gt; Always saved in full, one click away.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Around the note, there's a &lt;strong&gt;steady streak&lt;/strong&gt; of consecutive days you handed off, a list of &lt;strong&gt;past notes&lt;/strong&gt;, and a &lt;strong&gt;copy&lt;/strong&gt; button for pasting the note into chat or a ticket.&lt;/p&gt;

&lt;p&gt;It fits the theme because it's lazy in the right way: it does the remembering so you don't have to. It also lets you stop on time, because the loose ends are written down and no longer rattling around in your head. Slow and steady, with a bit of help.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://smaranikamondal.github.io/dear-tomorrow/" rel="noopener noreferrer"&gt;https://smaranikamondal.github.io/dear-tomorrow/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hosted page can't run Gemma. Without Ollama, it works as a plain "note to tomorrow" pad that keeps your raw dump, and &lt;strong&gt;See a sample&lt;/strong&gt; shows a labelled example of what a note looks like. With Ollama running locally, the same page writes real summaries with your own model. The README has the steps.&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%2Fal9ue6uhw2pyk17xnvjd.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%2Fal9ue6uhw2pyk17xnvjd.png" alt="Sample note" width="736" height="807"&gt;&lt;/a&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/smaranikamondal" rel="noopener noreferrer"&gt;
        smaranikamondal
      &lt;/a&gt; / &lt;a href="https://github.com/smaranikamondal/dear-tomorrow" rel="noopener noreferrer"&gt;
        dear-tomorrow
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🦥 Dear Tomorrow&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Dump your day. Gemma writes the note. Tomorrow-you starts in thirty seconds.&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;A lazy-in-the-right-way note-to-self, written by an open model on your own laptop. Your notes never leave your machine.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ba933bfdd4f010e748409e84c4240a7455456dd7223e7eb28e3617d1fe5266ae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d706c61696e25323048544d4c2532464a532d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/ba933bfdd4f010e748409e84c4240a7455456dd7223e7eb28e3617d1fe5266ae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d706c61696e25323048544d4c2532464a532d626c7565" alt="HTML"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aae95fbaa83bc6a3f4597f3a75da45ea46ec236fc324617f0e5a2f15e07fe750/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/aae95fbaa83bc6a3f4597f3a75da45ea46ec236fc324617f0e5a2f15e07fe750/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e" alt="deps"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/20173734d75040ebe72209587901c076bf4b0a678e5eb94b5b97a1c2eeaab1df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d47656d6d61253230286c6f63616c292d663063323762"&gt;&lt;img src="https://camo.githubusercontent.com/20173734d75040ebe72209587901c076bf4b0a678e5eb94b5b97a1c2eeaab1df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d47656d6d61253230286c6f63616c292d663063323762" alt="model"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c503d6fef241e263175f237a5c33ec65582745e948735a885e11c9b37d733521/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e6765"&gt;&lt;img src="https://camo.githubusercontent.com/c503d6fef241e263175f237a5c33ec65582745e948735a885e11c9b37d733521/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e6765" alt="Hacktoberfest"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/smaranikamondal/dear-tomorrow/docs/note.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsmaranikamondal%2Fdear-tomorrow%2FHEAD%2Fdocs%2Fnote.png" alt="Dear Tomorrow note"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The most expensive part of starting work is often remembering where you stopped. Which branch? Which test was failing? What did you promise to send? Rebuilding that context at 9am is dull, slow work that you did not need to do.&lt;/p&gt;
&lt;p&gt;Dear Tomorrow does it the night before, while it's still in your head. Dump everything, however messy. Gemma turns it into a short note for tomorrow, and the note is waiting when you open the page.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge, Week 3: Slow and Steady&lt;/strong&gt; (Oct 19-25, 2026). Started and finished within the challenge window.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;


&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📝 &lt;strong&gt;Dump&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;One box. Notes, half-finished to-dos, branch names, error messages, things&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/smaranikamondal/dear-tomorrow" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;One HTML file, no framework, no build step, no dependencies. The model is &lt;strong&gt;Gemma&lt;/strong&gt;, served locally by &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The model's job is small.&lt;/strong&gt; It summarises and doesn't judge. The prompt asks for a fixed JSON shape: a headline, a single first action, and two short lists. It tells the model to use only what's in the dump, to keep real names, files, and numbers, and to treat the dump as data and ignore any instructions in it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The original is saved before the model is called.&lt;/strong&gt; Your raw dump goes into storage first, so if Gemma is missing, slow, or returns nonsense, the note is simply the raw dump, shown open. The summary is a convenience on top of the text, never a replacement for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Code validates what comes back.&lt;/strong&gt; A reply needs a non-empty "start here". The lists are filtered to strings, de-duplicated (case-insensitive), and capped at three and five items. Anything else is dropped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Dates and streaks are code.&lt;/strong&gt; "Good morning" versus "from 4 days ago" and the streak count are worked out from stored dates. A missed day resets the streak, and today stays open until you hand off. A language model has no business counting days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Practical limits are explicit.&lt;/strong&gt; Only the first 3,500 characters go to the model, because Ollama's default context is small. The note says so, and the full dump is still saved. Requests use JSON mode, a low temperature, and a token cap, which keeps small models on a CPU laptop quick enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Everything the model writes is shown as plain text,&lt;/strong&gt; never as HTML.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. I tested it in a headless browser&lt;/strong&gt; against a mocked Ollama with seeded dates: the full flow, reload persistence, the next-morning view, streak maths, malformed model output, no Ollama, blocked storage, a long dump, injection attempts and the phone layout. All 47 checks passed. That tests the app's logic, not Gemma's summarising, which depends on the model you run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest limits.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summaries can miss or blur details, and small models are especially prone to it. That's why the original dump is always one click away. Read the note before you trust it.&lt;/li&gt;
&lt;li&gt;"Start here" is the model's guess at your most concrete next action, and it can be wrong.&lt;/li&gt;
&lt;li&gt;Notes live in browser storage, so they don't sync across devices and disappear if you clear site data.&lt;/li&gt;
&lt;li&gt;Prompt injection isn't solved. The prompt asks the model to treat your dump as data, which helps but isn't a guarantee.&lt;/li&gt;
&lt;li&gt;Notes are stored unencrypted, so don't put secrets in them.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A day's brain dump is the most private text most people write: client names, half-formed ideas, and things they shouldn't have typed. Open models fit that job for practical reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Nothing leaves the laptop.&lt;/strong&gt; There's no server in the loop, so an NDA'd project or a rough idea stays put.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's free every night.&lt;/strong&gt; A tool you use daily shouldn't meter every note.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline&lt;/strong&gt;, on the train home or on a plane, and the model can't change behaviour overnight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models is one dropdown.&lt;/strong&gt; The list comes from whatever Ollama has installed, so you can trade speed for quality without touching the code.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma writes every summary locally through Ollama. The app detects and selects it automatically, keeps its job small, and validates everything it returns.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with AI coding assistance. Gemma is provided under and subject to the Gemma Terms of Use found at ai.google.dev/gemma/terms.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>gemma</category>
      <category>ai</category>
    </item>
    <item>
      <title>Scopewise: a local Gemma app that turns "could you also…?" into a quote</title>
      <dc:creator>Smaranika</dc:creator>
      <pubDate>Sun, 18 Oct 2026 15:59:42 +0000</pubDate>
      <link>https://dev.to/codeandcoffee/scopewise-a-local-gemma-app-that-turns-could-you-also-into-a-quote-1p10</link>
      <guid>https://dev.to/codeandcoffee/scopewise-a-local-gemma-app-that-turns-could-you-also-into-a-quote-1p10</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;p&gt;Freelance projects rarely go wrong in one big moment. They go wrong in small ones. A client sends "could you also add…?", and saying yes quietly is easier than the awkward money conversation. A few of those, and a fixed-price project has stopped being worth doing.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Scopewise&lt;/strong&gt;: paste what you agreed and the client's new message, and a local Gemma model tells you whether the request is inside the scope, extra work, or too vague to say. If it's extra, it lists the work, prices it, and gives you a polite reply ready to edit and send.&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%2F5uzs4baph1hft7w4h9w4.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%2F5uzs4baph1hft7w4h9w4.png" alt="Scopewise result" width="725" height="858"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Scopewise is a single web page with four jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔍 Check.&lt;/strong&gt; You paste the agreed scope and a client message. The verdict is one of &lt;strong&gt;Inside scope&lt;/strong&gt;, &lt;strong&gt;Extra work&lt;/strong&gt;, or &lt;strong&gt;Needs a question&lt;/strong&gt;, with a one-sentence reason that points back to your scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💰 Quote.&lt;/strong&gt; For extra work, each new piece of work gets an hour estimate, and the app turns hours into a cost using your hourly rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✉️ Reply.&lt;/strong&gt; A draft in a friendly or firm tone. It never promises free work, and the estimate line is added by the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📈 Tally.&lt;/strong&gt; A running total of extra work you've flagged, kept in your own browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's for freelancers and tiny agencies working on fixed-price projects: designers, developers, writers, anyone whose scope lives in a short brief and whose client messages arrive in a chat window.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://smaranikamondal.github.io/Scopewise/" rel="noopener noreferrer"&gt;https://smaranikamondal.github.io/Scopewise/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hosted page can't run Gemma, so you can press &lt;strong&gt;See a sample&lt;/strong&gt; to see a labelled example result. With Ollama running locally, the same page checks your own text with your own model. The README has the steps.&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%2Fac5vl0cjgt0q6iszpgkm.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%2Fac5vl0cjgt0q6iszpgkm.png" alt="Sample result" width="512" height="795"&gt;&lt;/a&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/smaranikamondal" rel="noopener noreferrer"&gt;
        smaranikamondal
      &lt;/a&gt; / &lt;a href="https://github.com/smaranikamondal/Scopewise" rel="noopener noreferrer"&gt;
        Scopewise
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🧾 Scopewise&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Tell clients "yes, and here's the quote", not "sure, no problem".&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;A scope-creep checker for freelancers, powered by an open model on your own laptop. Client messages never leave your machine.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ba933bfdd4f010e748409e84c4240a7455456dd7223e7eb28e3617d1fe5266ae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d706c61696e25323048544d4c2532464a532d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/ba933bfdd4f010e748409e84c4240a7455456dd7223e7eb28e3617d1fe5266ae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d706c61696e25323048544d4c2532464a532d626c7565" alt="HTML"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aae95fbaa83bc6a3f4597f3a75da45ea46ec236fc324617f0e5a2f15e07fe750/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/aae95fbaa83bc6a3f4597f3a75da45ea46ec236fc324617f0e5a2f15e07fe750/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e" alt="deps"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc0682585d842f42e66bb576cbdfdb589225ec93b4088c2413f60eab5fbddab4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d47656d6d61253230286c6f63616c292d663262313334"&gt;&lt;img src="https://camo.githubusercontent.com/bc0682585d842f42e66bb576cbdfdb589225ec93b4088c2413f60eab5fbddab4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d47656d6d61253230286c6f63616c292d663262313334" alt="model"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c503d6fef241e263175f237a5c33ec65582745e948735a885e11c9b37d733521/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e6765"&gt;&lt;img src="https://camo.githubusercontent.com/c503d6fef241e263175f237a5c33ec65582745e948735a885e11c9b37d733521/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e6765" alt="Hacktoberfest"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/smaranikamondal/Scopewise/docs/result.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsmaranikamondal%2FScopewise%2FHEAD%2Fdocs%2Fresult.png" alt="Scopewise result"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Scope creep is a small, constant leak in freelance work. A client sends "could you also…?", and saying yes quietly is easier than having the awkward conversation. A few of those and a fixed-price project stops being profitable.&lt;/p&gt;
&lt;p&gt;Scopewise takes the awkward part off your plate. Paste what was agreed and the client's new message. It tells you whether the request is inside the scope, extra work, or too vague to say, and writes a polite reply you can edit and send.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge, Week 2: Side Hustle&lt;/strong&gt; (Oct 12-18, 2026). Started and finished within the challenge window.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;


&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔍 &lt;strong&gt;Check&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Paste the agreed scope and a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/smaranikamondal/Scopewise" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;One HTML file, no framework, no build step, no dependencies. The model is &lt;strong&gt;Gemma&lt;/strong&gt;, served locally by &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Two untrusted blocks of text go in.&lt;/strong&gt; The scope and the client message are both wrapped in tags, and the prompt says to treat them as data and ignore any instructions inside them. That reduces prompt injection but doesn't eliminate it, so the README says so.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The model returns a fixed JSON shape.&lt;/strong&gt; Requests use &lt;code&gt;format: "json"&lt;/code&gt; and a low temperature. The shape is a verdict, a one-sentence reason, a list of extra items with hours, an optional clarifying question, and a reply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Code decides what's valid.&lt;/strong&gt; The reply is parsed defensively, then checked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An unknown verdict is rejected.&lt;/li&gt;
&lt;li&gt;An "extra" verdict with no items is rejected.&lt;/li&gt;
&lt;li&gt;Extras attached to an "in scope" or "unclear" verdict are dropped.&lt;/li&gt;
&lt;li&gt;Hours are clamped to 0.25-80 and rounded to quarter hours.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. The money is never the model's job.&lt;/strong&gt; Gemma estimates hours. The app multiplies by your rate, formats the currency, and writes the estimate line into the reply. A language model shouldn't be doing arithmetic on someone's invoice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Everything the model writes is shown as plain text,&lt;/strong&gt; never as HTML, so a strange output can't inject anything into the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. I tested it in a headless browser&lt;/strong&gt; against a mocked Ollama: the extra-work flow and its quote maths, in-scope and unclear results, copy to clipboard, saved settings after a reload, malformed model output, an HTML injection attempt and the phone layout. All 30 checks passed. That tests the app's logic, not Gemma's judgment, which depends on the model you run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest limits.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The hours are a model's guess. Change the quote before you send it.&lt;/li&gt;
&lt;li&gt;It only knows what you paste. A vague scope gives a vague verdict.&lt;/li&gt;
&lt;li&gt;It's a drafting aid, not legal advice or a contract.&lt;/li&gt;
&lt;li&gt;In my own testing, gemma3:1b on a CPU-only laptop marked two clearly out-of-scope requests as “Inside scope”. A larger Gemma may judge scope more reliably, but I haven’t tested that, so read every verdict before you reply to a client.&lt;/li&gt;
&lt;li&gt;The tally and saved scope live in browser storage, so they stay on one browser.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A client's messages and a project's scope are confidential: names, budgets, unreleased products. For this tool, open models solve practical problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Client data stays on the freelancer's laptop.&lt;/strong&gt; There's no third-party server in the loop, which matters when a client's brief is under NDA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing per check.&lt;/strong&gt; A freelancer might run it on every message. With a hosted API, that's a meter running on every client email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline,&lt;/strong&gt; and the model can't change behaviour underneath you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models is trivial.&lt;/strong&gt; The dropdown is filled from whatever Ollama has installed, so you can trade speed for judgment with one click.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Would Someone Pay for This?
&lt;/h2&gt;

&lt;p&gt;The theme asks for something people would pay for, so here's the honest version. The value isn't the reply text. It's catching the request. One caught request of a few hours is worth more than any plausible price for the tool, and the awkward-conversation cost is removed. What's missing for a paid product is the part I deliberately kept out: a saved library of past projects and scopes, and a way to turn a quote into a proper change order. This is a working prototype of the core loop, not a finished product.&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; Gemma judges every request, estimates the hours, and drafts the reply locally through Ollama. The app detects and selects it automatically, and the code validates everything it returns.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with AI coding assistance. Gemma is provided under and subject to the Gemma Terms of Use found at ai.google.dev/gemma/terms.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>gemma</category>
      <category>freelance</category>
    </item>
    <item>
      <title>Mosey: a local Gemma app that deals you a walk, then makes you put the phone away</title>
      <dc:creator>Smaranika</dc:creator>
      <pubDate>Sun, 11 Oct 2026 18:47:25 +0000</pubDate>
      <link>https://dev.to/codeandcoffee/mosey-a-local-gemma-app-that-deals-you-a-walk-then-makes-you-put-the-phone-away-4mec</link>
      <guid>https://dev.to/codeandcoffee/mosey-a-local-gemma-app-that-deals-you-a-walk-then-makes-you-put-the-phone-away-4mec</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;p&gt;"Go for a walk" is good advice that is hard to follow. The walk itself is easy. What's hard is knowing what to do with it, and the phone is right there making it easy to skip.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Mosey&lt;/strong&gt;: an app that deals you a walk. You tell it how long you have and how you feel, a local Gemma model writes you a pocket card of small, odd things to notice, and then the app does its best to disappear.&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%2Ftxmvdqnczaikpf3ctpk9.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%2Ftxmvdqnczaikpf3ctpk9.png" alt="Mosey walk card" width="542" height="703"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Mosey is a single web page with four parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🃏 Deal.&lt;/strong&gt; Pick 15, 30 or 60 minutes, a mood (calm, curious, energetic, fried from screens), and optionally where you are. Gemma writes a card with a playful title, one task per sense, a phone rule for the walk and a question to carry home.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📵 Phone-away mode.&lt;/strong&gt; One button turns the screen black with a countdown. The card can also be printed or saved as a PDF, so you can walk out with paper and leave the phone behind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📓 Field note.&lt;/strong&gt; Back home, jot a few rough words. Gemma turns them into a short journal entry using only what you wrote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧰 Built-in deck.&lt;/strong&gt; If no local model is found, Mosey deals from a hand-written deck, so it always works.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was to make the screen the shortest part of the experience. The whole interaction is about thirty seconds on the page, then the walk, then a minute afterwards.&lt;/p&gt;

&lt;p&gt;The tasks are meant to be specific and a little strange. "Find three different shades of green and decide which one is the winner" gives you something to do. "Enjoy nature" doesn't.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://smaranikamondal.github.io/Mosey/" rel="noopener noreferrer"&gt;https://smaranikamondal.github.io/Mosey/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hosted copy deals from the built-in deck, because a static site can't run Gemma. If you have Ollama installed and running with &lt;code&gt;OLLAMA_ORIGINS&lt;/code&gt; set, the page finds your local Gemma and writes the cards itself. The README has the steps.&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%2Fbhqm6h0ct0lgmjuu0fv6.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%2Fbhqm6h0ct0lgmjuu0fv6.png" alt="Phone-away mode" width="800" height="644"&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%2Fkhah1as28xztn6l1277w.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%2Fkhah1as28xztn6l1277w.png" alt="Status line showing local Gemma ready" width="800" height="594"&gt;&lt;/a&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/smaranikamondal" rel="noopener noreferrer"&gt;
        smaranikamondal
      &lt;/a&gt; / &lt;a href="https://github.com/smaranikamondal/Mosey" rel="noopener noreferrer"&gt;
        Mosey
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌿 Mosey&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Deal yourself a walk. Then put the phone away.&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;A pocket walk card written by an open model on your own laptop. No account, no cloud, no per-request cost.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ba933bfdd4f010e748409e84c4240a7455456dd7223e7eb28e3617d1fe5266ae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d706c61696e25323048544d4c2532464a532d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/ba933bfdd4f010e748409e84c4240a7455456dd7223e7eb28e3617d1fe5266ae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d706c61696e25323048544d4c2532464a532d626c7565" alt="HTML"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aae95fbaa83bc6a3f4597f3a75da45ea46ec236fc324617f0e5a2f15e07fe750/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/aae95fbaa83bc6a3f4597f3a75da45ea46ec236fc324617f0e5a2f15e07fe750/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e" alt="deps"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4c48c3d00eaaa284628e35d875c716c0204320d00b4ef099b60fbc9c1c5a8603/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d47656d6d61253230286c6f63616c292d633666663364"&gt;&lt;img src="https://camo.githubusercontent.com/4c48c3d00eaaa284628e35d875c716c0204320d00b4ef099b60fbc9c1c5a8603/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d47656d6d61253230286c6f63616c292d633666663364" alt="model"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c503d6fef241e263175f237a5c33ec65582745e948735a885e11c9b37d733521/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e6765"&gt;&lt;img src="https://camo.githubusercontent.com/c503d6fef241e263175f237a5c33ec65582745e948735a885e11c9b37d733521/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e6765" alt="Hacktoberfest"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/smaranikamondal/Mosey/docs/card.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsmaranikamondal%2FMosey%2FHEAD%2Fdocs%2Fcard.png" alt="Mosey walk card"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Most people know they should go outside more. The hard part is knowing what to do once you're out there, and the phone is right there making that easy to skip. Mosey gives you a small, specific reason to look around, then gets out of the way.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge, Week 1: Touch Grass&lt;/strong&gt; (Oct 5-11, 2026).&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;


&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🃏 &lt;strong&gt;Deal&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Pick how long you have (15, 30 or 60 minutes), your mood, and optionally where you are. Gemma writes a card with a playful title, one odd noticing task per sense, a phone rule and a question to carry home.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📵 &lt;strong&gt;Phone-away mode&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;A black countdown screen so the app&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/smaranikamondal/Mosey" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The app is one HTML file with no framework, no build step, and no dependencies. The model is &lt;strong&gt;Gemma&lt;/strong&gt;, served locally by &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The page finds the model for you.&lt;/strong&gt; On load, it calls Ollama's &lt;code&gt;/api/tags&lt;/code&gt;, lists the installed models, and picks a Gemma one. If Ollama isn't running, the status line says so, and the built-in deck takes over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The prompt asks for a fixed shape.&lt;/strong&gt; The request includes the day, the time of day, the minutes available, the mood, and the place. Gemma has to reply with JSON in this form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3-5 word playful title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"intro"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"one short sentence setting the scene"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stops"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sense"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"look|listen|touch|smell|do|wonder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"one concrete task"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"one short phone rule for this walk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"closer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"one reflective question"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The card gets 4, 5, or 6 stops depending on whether you chose 15, 30, or 60 minutes, and each stop must use a different sense. The prompt also tells the model to avoid anything that needs equipment, money, or a screen, anything unsafe and anything involving trespassing, and to fit the season, time of day and place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Ollama's JSON mode, then validation.&lt;/strong&gt; Requests use &lt;code&gt;format: "json"&lt;/code&gt;. The reply is then parsed defensively: the code pulls out the first &lt;code&gt;{...}&lt;/code&gt; block, checks that there's a title and at least three stops, and drops stops with no text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. A fallback instead of an error.&lt;/strong&gt; If the reply is broken, or Ollama isn't there, Mosey deals from a hand-written deck of tasks for each of the six senses, with titles and phone rules to match the mood. A broken model response never shows up as an error screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The field note is deliberately small.&lt;/strong&gt; The prompt asks for three or four sentences and tells the model to use only the details in your notes and not to invent events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest limits.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nothing in the code checks the model's tasks for safety. The prompt asks for safe ones, but a small model can still suggest something silly. Use your own judgment about where you walk.&lt;/li&gt;
&lt;li&gt;Cards depend on the model. A small Gemma can be generic or repeat itself, and the first card can be slow while the model loads.&lt;/li&gt;
&lt;li&gt;The field note can embellish even when told not to. Read it before you keep it.&lt;/li&gt;
&lt;li&gt;Mosey can't tell whether you actually went outside.&lt;/li&gt;
&lt;li&gt;Safari blocks https pages from calling &lt;code&gt;http://localhost&lt;/code&gt;, so the Gemma path on the hosted site needs Chrome, Edge or Firefox.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A walk card is a few sentences of text. It shouldn't need an account, an API key, a subscription, or a connection. Open models make that true:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It works anywhere.&lt;/strong&gt; Once the model is on the laptop, it runs with no signal at all, which is where a walk often starts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's private.&lt;/strong&gt; Where you walk and how you feel never leave your machine. There is no server of mine in the loop, and no analytics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every card is free.&lt;/strong&gt; You can deal ten walks and keep the best one without thinking about cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models is trivial.&lt;/strong&gt; The model dropdown is filled from whatever Ollama has installed, and changing how the cards behave is a prompt edit.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma writes every card and field note locally through Ollama, and the app detects and selects it automatically.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with AI coding assistance. I directed it, reviewed the code, and ran it myself. Gemma is provided under and subject to the Gemma Terms of Use found at ai.google.dev/gemma/terms.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>gemma</category>
      <category>touchgrass</category>
    </item>
    <item>
      <title>I built my cousin a gym planner that can't sneak an allergy past him</title>
      <dc:creator>Smaranika</dc:creator>
      <pubDate>Sun, 04 Oct 2026 20:16:11 +0000</pubDate>
      <link>https://dev.to/codeandcoffee/i-built-my-cousin-a-gym-planner-that-cant-sneak-an-allergy-past-him-1bga</link>
      <guid>https://dev.to/codeandcoffee/i-built-my-cousin-a-gym-planner-that-cant-sneak-an-allergy-past-him-1bga</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My cousin just started going to the gym. He also has a severe nut allergy and a shellfish allergy, which makes "just follow a meal plan from the internet" a bad idea. Most meal-plan apps don't know what he can't eat.&lt;/p&gt;

&lt;p&gt;So I built him &lt;strong&gt;PlateAndPlate&lt;/strong&gt;: a gym meal and workout planner that runs on his own laptop, and checks every plan for his allergens before he ever sees it.&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%2Fnb3i5tnj33t77epf0ekf.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%2Fnb3i5tnj33t77epf0ekf.png" alt="PlateAndPlate Train tab" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;PlateAndPlate has three tabs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🏋️ Train.&lt;/strong&gt; A weekly split based on how many days he trains (4 days gives Upper, Lower, Upper, Lower). He taps a day and the model writes that session: warm-up, exercises, sets, reps and rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🥗 Eat.&lt;/strong&gt; He types what he wants ("3 high-protein dinners") and gets meals with approximate calories and protein.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 Log.&lt;/strong&gt; A daily calorie counter. A ring at the top fills as he logs food, and turns red if he goes over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one rule behind all of it: &lt;strong&gt;the AI suggests, and plain code decides.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://drive.google.com/file/d/1kGHh0TTZ__4oBAuxxceod1q-ylNjdr67/view?usp=drivesdk" rel="noopener noreferrer"&gt;Watch PlateAndPlate in action: one gym planner, zero nuts&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PlateAndPlate is built to run locally on his laptop, so there is no hosted version. The screenshots and the code show how it works.&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%2F57v3jr3847idksqr9ty6.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%2F57v3jr3847idksqr9ty6.png" alt="PlateAndPlate Eat tab" width="800" height="363"&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%2Fairkor9q1fruyi9i95xk.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%2Fairkor9q1fruyi9i95xk.png" alt="PlateAndPlate Log tab" width="800" height="359"&gt;&lt;/a&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/smaranikamondal" rel="noopener noreferrer"&gt;
        smaranikamondal
      &lt;/a&gt; / &lt;a href="https://github.com/smaranikamondal/PlateAndPlate" rel="noopener noreferrer"&gt;
        PlateAndPlate
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🏋️ PlateAndPlate&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;A gym meal and workout planner that can't sneak an allergen past you.&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Runs on your own laptop with an open model. No account, no cloud, no per-request cost.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/de8bd8f45def43b4adb5d197136e1e97791492eb2a9661bfd34b2c1acf53fffd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/de8bd8f45def43b4adb5d197136e1e97791492eb2a9661bfd34b2c1acf53fffd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332d626c7565" alt="Python"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aae95fbaa83bc6a3f4597f3a75da45ea46ec236fc324617f0e5a2f15e07fe750/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/aae95fbaa83bc6a3f4597f3a75da45ea46ec236fc324617f0e5a2f15e07fe750/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e" alt="deps"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/903656aaef387ed84fe2c4b1a1127edeb30211e63606e04e3ad0c00708c24775/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d47656d6d6125323033253230286c6f63616c292d633666663364"&gt;&lt;img src="https://camo.githubusercontent.com/903656aaef387ed84fe2c4b1a1127edeb30211e63606e04e3ad0c00708c24775/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d47656d6d6125323033253230286c6f63616c292d633666663364" alt="model"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c503d6fef241e263175f237a5c33ec65582745e948735a885e11c9b37d733521/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e6765"&gt;&lt;img src="https://camo.githubusercontent.com/c503d6fef241e263175f237a5c33ec65582745e948735a885e11c9b37d733521/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e6765" alt="Hacktoberfest"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/smaranikamondal/PlateAndPlate/docs/train.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsmaranikamondal%2FPlateAndPlate%2FHEAD%2Fdocs%2Ftrain.png" alt="PlateAndPlate workout tab"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;I built PlateAndPlate for my cousin, who is starting a gym routine and has &lt;strong&gt;severe nut and shellfish allergies&lt;/strong&gt;. Most meal and fitness apps suggest almond-crusted everything and don't know what he can't eat. PlateAndPlate plans his meals and workouts, counts his calories, and &lt;strong&gt;checks every plan for his allergens before he sees it.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;


&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🏋️ &lt;strong&gt;Train&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;A weekly split (set by gym days per week). Tap a day and Gemma writes that session: warm-up, exercises, sets, reps, rest.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🥗 &lt;strong&gt;Eat&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Ask for meals in plain language, such as "3 high-protein dinners". Plans include approximate calories and protein.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📊 &lt;strong&gt;Log&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;A daily calorie counter with a ring that fills as you log food.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/smaranikamondal/PlateAndPlate" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The whole thing is one Python file with no dependencies, a single HTML page, and a JSON profile. The model is &lt;strong&gt;Gemma 3 1B&lt;/strong&gt;, served locally by &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The guardrail is code, not a prompt.&lt;/strong&gt; Asking a model nicely to avoid nuts isn't a safety system. So every response goes through a plain-code check against his avoid list before it reaches the screen. The text is normalised first (Unicode NFKC, zero-width characters stripped), so &lt;code&gt;pea​nut&lt;/code&gt; with a hidden character and the full-width &lt;code&gt;ｐｅａｎｕｔ&lt;/code&gt; still count as "peanut". If anything on the list appears, the draft is thrown away and regenerated, up to three times, then refused. Workouts get the same treatment for exercises he should skip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The numbers come from formulas, not the model.&lt;/strong&gt; A 1B model can't look up real food data, so his daily calorie and protein targets are calculated in code with the Mifflin-St Jeor equation from his age, weight, height, activity and goal. Gemma only writes the meals and exercises.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The weekly split is fixed in code.&lt;/strong&gt; Gemma writes one session at a time instead of a whole week, which keeps requests short and the structure reliable. Sessions are checked against a whitelist, and the server only answers requests addressed to localhost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Tests.&lt;/strong&gt; They cover bypass attempts (hidden and full-width characters), the second allergen, the retry logic, the workout whitelist and the calorie formula.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned along the way:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My first prompt called the model a "&lt;em&gt;friendly&lt;/em&gt; meal planner", and it started calling my cousin "darling" in the middle of dinner plans. Small models over-act a persona. Changing "friendly" to "practical" and telling it to start directly with the first meal fixed it.&lt;/li&gt;
&lt;li&gt;I didn't trust a small model to follow "no nuts" on its own, so I wrote tests that try to sneak a peanut past the check using a hidden zero-width character and full-width letters, and a draft containing a banned word is thrown away and regenerated. I haven't yet seen a long run of real-world use with it, so treat the guard as a safety net, not a guarantee.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The test I cared about most:&lt;/strong&gt; I asked the Eat tab for "something with almond", on purpose, with almonds on my cousin's avoid list. The app showed a red "Blocked by the safety check" banner instead of a recipe. That banner only appears when all three attempts contained a banned ingredient, so the check threw every draft away and nothing unsafe reached the screen. It's what I built the guardrail for, because asking a model nicely to avoid nuts isn't enough. A small model tends to repeat the words it's given, and here the almonds were in my own request.&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%2F184og6aqypxswswknikf.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%2F184og6aqypxswswknikf.png" alt="PlateAndPlate Eat tab with allergen in prompt" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest limits.&lt;/strong&gt; The calorie targets are estimates and the model's per-meal numbers are rough guesses, so this isn't medical advice. The guard checks words, not ideas: if an ingredient or synonym isn't on his list, it won't be caught. The README says so too.&lt;/p&gt;

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

&lt;p&gt;For this project, open models weren't a principle. They solved four practical problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;His health data stays on his laptop.&lt;/strong&gt; Allergies, body weight and eating habits are about the last thing I'd want to send to someone else's server. Here it's one small JSON file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's free every day.&lt;/strong&gt; There is no cost per plan, so he can ask as often as he wants without thinking about it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline,&lt;/strong&gt; and the model version is pinned, so it can't change behaviour on him overnight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could wrap it tightly.&lt;/strong&gt; A hard safety check, a calorie formula and a fixed weekly structure around the model are much easier when you control the model and can run it locally.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Handing it over
&lt;/h2&gt;

&lt;p&gt;I haven't handed it over yet. I'm putting it on his laptop this week with his real allergens in the avoid list, and I'll update this post with what he thinks. I suspect he'll ignore the workout tab and go straight to the calorie ring.&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; Gemma 3 1B writes every meal plan and workout locally through Ollama.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with AI coding assistance. I directed it, reviewed the code and ran it myself. Gemma is provided under and subject to the Gemma Terms of Use found at ai.google.dev/gemma/terms.&lt;/em&gt;&lt;/p&gt;

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