<?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: Cass Mazariegos</title>
    <description>The latest articles on DEV Community by Cass Mazariegos (@casmazariegos).</description>
    <link>https://dev.to/casmazariegos</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%2F3972794%2F40dbf8c9-06d1-47d2-9a11-cfb33d857129.jpg</url>
      <title>DEV Community: Cass Mazariegos</title>
      <link>https://dev.to/casmazariegos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/casmazariegos"/>
    <language>en</language>
    <item>
      <title>I Taught My Alarm Clock to Negotiate (Powered by Open-Weight Gemma)</title>
      <dc:creator>Cass Mazariegos</dc:creator>
      <pubDate>Sun, 25 Oct 2026 20:22:19 +0000</pubDate>
      <link>https://dev.to/casmazariegos/i-taught-my-alarm-clock-to-negotiate-powered-by-open-weight-gemma-nna</link>
      <guid>https://dev.to/casmazariegos/i-taught-my-alarm-clock-to-negotiate-powered-by-open-weight-gemma-nna</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&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I'm a snoozer. A serial, unapologetic snoozer. The trouble is that the snooze button is dumb. It gives me 9 minutes whether I can afford them or not.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Sleep Bargain&lt;/strong&gt;. When the alarm rings, you don't smash a button. You &lt;em&gt;bargain&lt;/em&gt;. "5 more minutes, I was up late." Meep, a tiny sassy alarm creature, checks your morning and answers.&lt;/p&gt;

&lt;p&gt;If you can afford it, you get it. If your excuse is "my bed is cozy," Meep counteroffers. If you're already cutting it close, Meep says no, warmly but firmly. Every deal lands in a &lt;strong&gt;Snooze Ledger&lt;/strong&gt;, so you can see how many minutes you won (and lost) this week.&lt;/p&gt;

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

&lt;p&gt;Try it: &lt;a href="https://sleep-bargain.casmazariegos.workers.dev" rel="noopener noreferrer"&gt;https://sleep-bargain.casmazariegos.workers.dev&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxhn1yku7he0x9sx1484r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxhn1yku7he0x9sx1484r.gif" alt="A full snooze negotiation with Meep on a phone: ring, excuse, counteroffer, haggle, deal, final refusal" width="390" height="844"&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%2Fugugweh2szjo1ehp47vd.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%2Fugugweh2szjo1ehp47vd.png" alt="Sleep Bargain setup on a phone: alarm 7:00 am, leave by 8:15 am, 35 minutes to get ready, 5 minute buffer, Gemma 4 on Workers AI as the brain" width="800" height="1731"&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%2Frdo1mc009c95eg0v65ax.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%2Frdo1mc009c95eg0v65ax.png" alt="The alarm ringing: Meep, feeling sassy, says " width="800" height="1731"&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%2F3abchqwuu2g7j4m01w3w.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%2F3abchqwuu2g7j4m01w3w.png" alt="Meep's first counteroffer: 6 minutes instead of 10, if I drink a full glass of water first, with Accept / Counter / No deal / Fine, I'm up chips" width="800" height="1567"&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%2Fro03i7gr2tvyb0alpmms.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%2Fro03i7gr2tvyb0alpmms.png" alt="Haggling: I ask for 9 minutes and Meep settles on 7" width="800" height="1567"&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%2Fyk0ekt6io2uo10cug7h5.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%2Fyk0ekt6io2uo10cug7h5.png" alt="Snooze 3: an exasperated Meep makes a 2 minute final offer if I turn the bedroom light on" width="800" height="1567"&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%2Fp1ybwy4st5u1mi2g90p3.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%2Fp1ybwy4st5u1mi2g90p3.png" alt="Snooze 4: a dramatic Meep refuses with zero minutes and rings again" width="800" height="1461"&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%2Fr3zh4i2dklguxgwng94v.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%2Fr3zh4i2dklguxgwng94v.png" alt="The Snooze Ledger: minutes won and lost, with each ask, grant and side quest" width="800" height="603"&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%2Fxd6b13nvb1w000lbdsr3.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%2Fxd6b13nvb1w000lbdsr3.png" alt="Desktop view of Sleep Bargain mid-negotiation" width="800" height="500"&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/CasMazariegos" rel="noopener noreferrer"&gt;
        CasMazariegos
      &lt;/a&gt; / &lt;a href="https://github.com/CasMazariegos/sleep-bargain" rel="noopener noreferrer"&gt;
        sleep-bargain
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Don't snooze. Negotiate. A sassy Meep alarm that bargains with you, powered by open-weight Gemma.
    &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;🐣 Sleep Bargain&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Don't hit snooze. &lt;strong&gt;Negotiate.&lt;/strong&gt; Tell the alarm "5 more minutes, I was up late" and Meep, a tiny alarm creature powered by &lt;strong&gt;Gemma running entirely in your browser&lt;/strong&gt;, bargains with you. It grants exactly as many minutes as your morning can afford, teases weak excuses, and makes counteroffers. Every deal goes in the &lt;strong&gt;Snooze Ledger&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 3 ("Slow and Steady").&lt;/p&gt;
&lt;p&gt;Live: &lt;a href="https://sleep-bargain.casmazariegos.workers.dev" rel="nofollow noopener noreferrer"&gt;https://sleep-bargain.casmazariegos.workers.dev&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two Gemma brains, one rulebook.&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default: ☁️ Gemma 4 on Cloudflare Workers AI&lt;/strong&gt; (&lt;code&gt;@cf/google/gemma-4-26b-a4b-it&lt;/code&gt;, thinking off), via &lt;code&gt;POST /api/negotiate&lt;/code&gt; in &lt;code&gt;src/worker.js&lt;/code&gt;. Works on every device, iPhone Safari included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional: 📱 on-device Gemma 2 2B with WebLLM&lt;/strong&gt;: a toggle that only appears when WebGPU exists (desktop Chrome/Edge). Nothing leaves the device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline: 📜 line bank&lt;/strong&gt; if the server can't be reached. The UI always shows which brain answered.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CasMazariegos/sleep-bargain" 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;My first version was a pushover. I tested it on my iPhone, said "I'm sleepy" five times, and Meep said yes five times. Rude. So I rebuilt her to fight back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma, two ways.&lt;/strong&gt; By default Meep's brain is &lt;strong&gt;Gemma 4 on Cloudflare Workers AI&lt;/strong&gt;, behind a tiny Worker endpoint, so she works on any phone. If your browser has WebGPU, you can flip a toggle and run &lt;strong&gt;Gemma 2 on-device with WebLLM&lt;/strong&gt;, so nothing leaves your laptop. The app always shows you which brain is talking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model never picks the number.&lt;/strong&gt; Plain code does the minutes: time until you leave, minus getting-ready time, minus a buffer. The same tested logic runs on the server and in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meep bargains hard.&lt;/strong&gt; Your first ask almost always gets a lower counteroffer and a side quest. "6 minutes if you drink a full glass of water first." Snooze two gets less. Snooze three is a stern FINAL OFFER. Snooze four? She refuses and rings again, louder. 🚨 Lame excuses get two minutes, then a flat no.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You have to answer.&lt;/strong&gt; No auto-accepting. You tap &lt;em&gt;Accept deal&lt;/em&gt;, &lt;em&gt;Counter&lt;/em&gt;, &lt;em&gt;No deal&lt;/em&gt;, or &lt;em&gt;Fine, I'm up&lt;/em&gt;. She'll meet you halfway once, then she holds the line. Turn her down and those minutes go in the ledger as &lt;em&gt;Lost&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma does the personality.&lt;/strong&gt; It sorts your excuse (tired, sick, cold, weekend-ish, lame, or creative) as tiny JSON. Then it writes Meep's reply, quoting your excuse and roasting it, with your real leave time in there. A guardrail tosses any reply that mentions a different number of minutes.&lt;/p&gt;

&lt;p&gt;Here's real Gemma, live: I typed "I'm sleepy" and Meep said: &lt;em&gt;"'I'm sleepy' is the most unoriginal thing I've ever heard. I'll give you 2 minutes if you promise to drink a full glass of water first."&lt;/em&gt; Finally, some backbone.&lt;/p&gt;

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

&lt;p&gt;An alarm lives in your bedroom. It hears your excuses at your sleepiest. That should stay on &lt;em&gt;your&lt;/em&gt; device.&lt;/p&gt;

&lt;p&gt;Because Gemma is open-weight, the same model family runs in two places: in the cloud on Workers AI for phones, and fully on-device through open-source WebLLM for anyone who'd rather keep their excuses private. Anyone can fork it, change Meep's personality, or swap in a different open model. Open tools let a small, silly idea like this exist without a cloud bill.&lt;/p&gt;

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

&lt;p&gt;I get to stay in bed and &lt;em&gt;feel&lt;/em&gt; productive. I negotiated! I won 7 minutes! And because the math is honest, those 7 minutes are actually free. No guilt, no sprinting to the car.&lt;/p&gt;

&lt;p&gt;Slow and steady wins the race. Slow and &lt;em&gt;strategic&lt;/em&gt; wins the snooze.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma 4 (on Workers AI) and Gemma 2 2B (on-device via WebLLM) classify every excuse and write every one of Meep's negotiation replies.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The houses on my list are my side hustle, so Gemma scores them and the list never leaves my phone</title>
      <dc:creator>Cass Mazariegos</dc:creator>
      <pubDate>Mon, 19 Oct 2026 03:03:53 +0000</pubDate>
      <link>https://dev.to/casmazariegos/the-houses-on-my-list-are-my-side-hustle-so-gemma-scores-them-and-the-list-never-leaves-my-phone-3if9</link>
      <guid>https://dev.to/casmazariegos/the-houses-on-my-list-are-my-side-hustle-so-gemma-scores-them-and-the-list-never-leaves-my-phone-3if9</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;Walk the Block is a phone tool for drive-for-dollars in Hemet, Riverside County. I research houses for wholesale. The job is simple and a little uncomfortable: you drive a neighborhood, look for a roof under a tarp or a yard that has gone to seed, and then you have to write to a person you have never met.&lt;/p&gt;

&lt;p&gt;The app lets me snap the front of the house. Gemma, an open-weight vision model, returns a 0 to 100 distress score and only the signals it can actually see: tarp or damaged roof, overgrown yard, boarded windows, peeling paint, piled mail, junk, a broken fence, a vacant look. It is told not to guess why the house looks that way. Then I get a short postcard in English or Spanish that does not mention the photo at all. No false urgency. No hint that the owner is in trouble. Just: I am a local buyer, there is no pressure, here is my number.&lt;/p&gt;

&lt;p&gt;The lead list, the photos, and the notes stay in the browser (IndexedDB). I can sort by score and export a CSV. The only things that leave the phone are the ones I trigger: the photo goes to the Gemma backend I picked, and if I tap &lt;strong&gt;Look up street&lt;/strong&gt;, the GPS pin (only the pin) goes to OpenStreetMap to fill in a street name. No analytics, no app server.&lt;/p&gt;

&lt;p&gt;Who would pay: wholesalers and small investors who already pay for driving-for-dollars software, around $19 a month. What they are paying for is a list. I would rather that list not sit in a vendor's cloud.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://walk-the-block.casmazariegos.workers.dev" rel="noopener noreferrer"&gt;https://walk-the-block.casmazariegos.workers.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo mode needs no key. Tap one of the four public-domain sample houses, read the score, switch the postcard to Spanish, and open Leads. Those sample scores are hand-labeled so the demo works with no key, and the app labels them that way. Scoring your own photo needs either Ollama or your own AI Studio key.&lt;/p&gt;

&lt;p&gt;Live readings run in the app with your own Gemma key (Google AI Studio) or a local Ollama model. The screenshots below are from Demo mode, so the readings in them are the hand-labeled samples, not live model output.&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%2F6mdqoey7wzvov8t3pu8k.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%2F6mdqoey7wzvov8t3pu8k.png" alt="The snap screen: snap a house, upload a photo, or try a sample" width="800" height="1362"&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%2Fq94bs53ng7ekke6bpks5.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%2Fq94bs53ng7ekke6bpks5.png" alt="A sample reading: the boarded-up house scores 72 with two marked signals" width="800" height="1362"&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%2Fsjim2u82wgsftflutjzl.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%2Fsjim2u82wgsftflutjzl.png" alt="The postcard for that house, which never mentions the photo" width="800" height="1362"&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%2Fsik7uyx9z7s5kywnur1v.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%2Fsik7uyx9z7s5kywnur1v.png" alt="The same postcard in Spanish" width="800" height="1362"&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%2Fbpcnmh7l1368u79z1aib.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%2Fbpcnmh7l1368u79z1aib.png" alt="The lead list, sorted by score, stored only on the phone" width="800" height="1362"&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/CasMazariegos" rel="noopener noreferrer"&gt;
        CasMazariegos
      &lt;/a&gt; / &lt;a href="https://github.com/CasMazariegos/walk-the-block" rel="noopener noreferrer"&gt;
        walk-the-block
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Walk the Block: on-device-friendly Gemma tool that scores distressed houses while driving for dollars and drafts owner letters
    &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;Walk the Block&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A phone-first field tool for &lt;strong&gt;drive for dollars&lt;/strong&gt;. You snap the front of a house. An open-weight Gemma model marks only the distress you can see, scores it from 0 to 100, and the app drafts a kind postcard that does not mention any of it. The lead list stays on the device.&lt;/p&gt;
&lt;p&gt;Built for Cassandra, a wholesaling researcher in Hemet, Riverside County. Wholesalers and small investors are the people who would pay, about &lt;strong&gt;$19 a month&lt;/strong&gt;, for a privacy-first alternative to cloud driving-for-dollars apps. The list of houses is the business. It should not have to live in someone else's database.&lt;/p&gt;
&lt;p&gt;This repository was &lt;strong&gt;started on October 18, 2026&lt;/strong&gt;, inside the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12" rel="nofollow"&gt;DEV Hacktoberfest Week 2 "Side Hustle"&lt;/a&gt; window, and finished the same day. Later commits, if any, will be noted here.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What you can do&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Snap or upload a photo. Address, notes, and…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CasMazariegos/walk-the-block" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT licensed.&lt;/p&gt;

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

&lt;p&gt;A static Vite + React + TypeScript app, deployed to Cloudflare Workers static assets (&lt;code&gt;npm run cf:deploy&lt;/code&gt;). No app server.&lt;/p&gt;

&lt;p&gt;One interface, two Gemma backends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Private:&lt;/strong&gt; Ollama, default model &lt;code&gt;gemma3:4b&lt;/code&gt; (vision starts at 4B). &lt;code&gt;gemma3:1b&lt;/code&gt; is text-only and the app says so. The browser sends the photo to an address I type, usually a laptop on the same Wi-Fi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosted:&lt;/strong&gt; Google AI Studio / Gemini API, default model &lt;code&gt;gemma-4-31b-it&lt;/code&gt;, with &lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt; as the other vision option. My key stays in localStorage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model must answer with JSON. The parser accepts fenced JSON, trailing commas, and scores that arrive as strings. If Gemma writes its own postcard, the app checks it word by word. A draft that mentions the roof, the yard, foreclosure, or urgency is thrown out, and a fixed, respectful script is used instead. The check works in Spanish too, without tripping on ordinary words like &lt;em&gt;sin embargo&lt;/em&gt;. Address, notes, and the GPS pin are never put in the model request.&lt;/p&gt;

&lt;p&gt;In-browser Gemma is not bundled. A vision model that is actually useful is a multi-gigabyte download, which is the wrong trade when you are standing at a curb.&lt;/p&gt;

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

&lt;p&gt;The photo of a stranger's house, tied to an address, is private business data. A closed app wants that pair in its database, because the list is the product. An open-weight model is what lets the scoring happen on a machine I control, with no per-photo bill and no lock-in to one vendor's vision API. If Ollama is down I can point the same screen at AI Studio, and if I stop paying Google I still have the weights. The open model is the part the product cannot lose.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>privacy</category>
    </item>
    <item>
      <title>"Good. Now put me away." An open Gemma app that measures how fast you can leave it</title>
      <dc:creator>Cass Mazariegos</dc:creator>
      <pubDate>Sun, 11 Oct 2026 05:15:53 +0000</pubDate>
      <link>https://dev.to/casmazariegos/good-now-put-me-away-an-open-gemma-app-that-measures-how-fast-you-can-leave-it-3m15</link>
      <guid>https://dev.to/casmazariegos/good-now-put-me-away-an-open-gemma-app-that-measures-how-fast-you-can-leave-it-3m15</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;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrjgjamhg79np8ghdvsp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrjgjamhg79np8ghdvsp.gif" alt="MERA in 20 seconds: one button, one breath, one mission from Gemma, then " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some moments, your head is so loud that you can't feel your own feet on the floor. If you've ever had a hard time grounding yourself, you know that feeling, and you know how a phone can make it worse: one more app, one more thing asking for your attention, when what you need is to come back to your body.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;MERA&lt;/strong&gt; for those moments, a grounding app with one job: get you to put it down. Most apps measure how long you stay. MERA measures how quickly you can leave.&lt;/p&gt;

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

&lt;p&gt;MERA (Meep Emotional Reset Assistant) is a small, installable web app for the moments when everything feels like too much. It has one big button: &lt;strong&gt;GROUND ME&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;"I'm here."&lt;/em&gt; Put both feet on the ground.&lt;/li&gt;
&lt;li&gt;Breathe together: in 4, hold 2, out 6. After &lt;strong&gt;one&lt;/strong&gt; breath MERA offers &lt;strong&gt;I'm ready to step away&lt;/strong&gt;. You can keep going through the 5-4-3-2-1 senses, but you never have to.&lt;/li&gt;
&lt;li&gt;One tap: what feels closest right now? Overwhelmed, anxious, overstimulated, drained…&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma&lt;/strong&gt; gives you &lt;strong&gt;one&lt;/strong&gt; small thing to do in the real world, based on what has actually helped &lt;em&gt;you&lt;/em&gt; before.&lt;/li&gt;
&lt;li&gt;Then the moment the whole app is built around:&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Now put me away.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Go touch grass. I'll be here when you get back.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The phone-down screen is boring on purpose: a quiet timer and &lt;em&gt;Audio · Haptics · End early&lt;/em&gt;. Nothing to read, nothing to scroll. When you come back, MERA asks if you feel better, the same, or worse, and shows the only number it ever shows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;6 minutes back in the world.&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Go live your life.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No streaks, points or badges. If it didn't help, MERA says &lt;em&gt;"Thanks for checking back in"&lt;/em&gt; and offers something different, or lets you finish for now. On the quick path, you're outside in under a minute.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Why this reset?"
&lt;/h3&gt;

&lt;p&gt;Under each mission there's a small, closed-by-default &lt;strong&gt;Why this reset?&lt;/strong&gt; It shows one sentence and the facts from &lt;em&gt;your own&lt;/em&gt; history it was based on. Here's a real mission Gemma wrote on the live site, from the demo's sample history (walks that helped, and a note saying &lt;em&gt;"Walking and the cool air helped"&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%2Fahobs0hqp9pdrdmetogv.jpg" 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%2Fahobs0hqp9pdrdmetogv.jpg" alt="A real Gemma mission, " width="780" height="1688"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  I took it outside
&lt;/h3&gt;

&lt;p&gt;I tried MERA myself, the way it was meant to be used. It really helped me feel connected and grounded again. That's the whole point: not to keep me on the screen, but to bring me back to the moment and let me put the phone away.&lt;/p&gt;

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


&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/R5IiZvp7Ykg" width="315" height="560"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Try it (Connected Gemma):&lt;/strong&gt; &lt;a href="https://mera.casmazariegos.workers.dev" rel="noopener noreferrer"&gt;https://mera.casmazariegos.workers.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Also live on Render:&lt;/strong&gt; &lt;a href="https://mera-6cer.onrender.com" rel="noopener noreferrer"&gt;https://mera-6cer.onrender.com&lt;/a&gt; (free plan, so the first visit can take a minute to wake up)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Judge path, about 90 seconds:&lt;/strong&gt; &lt;strong&gt;Privacy &amp;amp; AI → Set up judge demo&lt;/strong&gt; loads clearly labelled &lt;em&gt;sample&lt;/em&gt; resets, shortens the timers, and switches to Connected Gemma so there's nothing to download. Then &lt;strong&gt;GROUND ME&lt;/strong&gt; → one breath → &lt;strong&gt;I'm ready to step away&lt;/strong&gt; → &lt;strong&gt;Overstimulated&lt;/strong&gt; → open &lt;strong&gt;Why this reset?&lt;/strong&gt; → &lt;strong&gt;I'm going&lt;/strong&gt; → 30-second phone-down → &lt;strong&gt;Better&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Want to see exactly what Gemma gets? &lt;strong&gt;About → Run a mission request&lt;/strong&gt; shows the structured input built from your history and the checked output. There's no hidden model text.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hand-off&lt;/th&gt;
&lt;th&gt;Phone-down&lt;/th&gt;
&lt;th&gt;Done&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fx1erpiu6cu8tl3ia2kld.jpg" alt="Good. Now put me away." width="780" height="1688"&gt;&lt;/td&gt;
&lt;td&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%2Flqrzvbd8pjl41q76ersy.jpg" alt="A quiet timer and a tiny resting MERA" width="780" height="1688"&gt;&lt;/td&gt;
&lt;td&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%2Fu2opmai6m0o1t43ji6kk.jpg" alt="Seconds back in the world. Go live your life." width="780" height="1688"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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/CasMazariegos" rel="noopener noreferrer"&gt;
        CasMazariegos
      &lt;/a&gt; / &lt;a href="https://github.com/CasMazariegos/mera" rel="noopener noreferrer"&gt;
        mera
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      MERA — Meep Emotional Reset Assistant. Come back to yourself.
    &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;MERA&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Meep Emotional Reset Assistant&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Come back to yourself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MERA is an open-weight AI grounding companion designed to get you off your screen, not keep you on it.&lt;/p&gt;
&lt;p&gt;When everything feels like too much, press &lt;strong&gt;GROUND ME&lt;/strong&gt;. MERA helps you pause, gives you &lt;strong&gt;one personalized real-world reset&lt;/strong&gt;, then tells you to put your phone away.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MERA uses AI to shorten the digital experience, not extend it
&lt;strong&gt;MERA is designed to help you leave MERA.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Live on Render:&lt;/strong&gt; &lt;a href="https://mera-6cer.onrender.com" rel="nofollow noopener noreferrer"&gt;https://mera-6cer.onrender.com&lt;/a&gt; · &lt;strong&gt;Mirror with Connected Gemma (Cloudflare):&lt;/strong&gt; &lt;a href="https://mera.casmazariegos.workers.dev" rel="nofollow noopener noreferrer"&gt;https://mera.casmazariegos.workers.dev&lt;/a&gt; · Built for &lt;strong&gt;Hacktoberfest 2026, Week 1: Touch Grass&lt;/strong&gt; · Targets: &lt;em&gt;Best Use of Gemma&lt;/em&gt;, &lt;em&gt;Best Use of Render&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/CasMazariegos/mera/docs/screenshots/light-01-home.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%2FCasMazariegos%2Fmera%2FHEAD%2Fdocs%2Fscreenshots%2Flight-01-home.png" width="190" alt="MERA home: Come back to yourself, and the GROUND ME button"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/CasMazariegos/mera/docs/screenshots/light-04-breathing.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%2FCasMazariegos%2Fmera%2FHEAD%2Fdocs%2Fscreenshots%2Flight-04-breathing.png" width="190" alt="Breathing with MERA, with 'I'm ready to step away' after one breath"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/CasMazariegos/mera/docs/screenshots/light-07-mission.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%2FCasMazariegos%2Fmera%2FHEAD%2Fdocs%2Fscreenshots%2Flight-07-mission.png" width="190" alt="A personalized mission with 'Why this reset?' open"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/CasMazariegos/mera/docs/screenshots/light-12-complete.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%2FCasMazariegos%2Fmera%2FHEAD%2Fdocs%2Fscreenshots%2Flight-12-complete.png" width="190" alt="Reset complete: time back in the world"&gt;&lt;/a&gt;
&lt;/p&gt;




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

&lt;/div&gt;

&lt;p&gt;A mobile-first, installable web app (PWA). One button starts a short grounding sequence. As soon as you're ready, MERA hands you &lt;strong&gt;one&lt;/strong&gt; small real-world mission, chosen by &lt;strong&gt;Gemma&lt;/strong&gt; from what has actually helped &lt;em&gt;you&lt;/em&gt; before. Then: &lt;em&gt;"Good. Now put me away. Go&lt;/em&gt;…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CasMazariegos/mera" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;MIT licensed and built during the challenge. It has 86 unit tests and 14 Playwright end-to-end tests (9 of them also pass against the live Render URL), plus the benchmark below. The README explains how to run it locally, with or without a model.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; React 19, TypeScript, Vite, Tailwind v4, Motion, Zod, Zustand, Dexie (IndexedDB) and Workbox for an installable, offline-first PWA. A small Hono API runs unchanged as a Node service on &lt;strong&gt;Render&lt;/strong&gt; and as a &lt;strong&gt;Cloudflare Worker&lt;/strong&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%2Fxwe2jszmmfgvlm3clp97.jpg" 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%2Fxwe2jszmmfgvlm3clp97.jpg" alt="Gemma decides what. Code decides whether it's allowed. History on the phone becomes signal ids; Gemma (in the browser or opt-in on Workers AI) writes one mission; code checks schema, safety, settings and the why; failures go to a library of 23 checked missions; then " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma decides &lt;em&gt;what&lt;/em&gt;, plain code decides &lt;em&gt;whether it's allowed&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;The question I kept asking myself was: &lt;em&gt;couldn't these missions just come from a list?&lt;/em&gt; The fallback does. MERA ships 23 checked missions, so it never breaks offline. Gemma is what makes the mission &lt;em&gt;yours&lt;/em&gt;, so I built personalization that can be checked instead of trusted:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;History becomes small facts.&lt;/strong&gt; On your phone, MERA turns past resets into a few &lt;em&gt;signal&lt;/em&gt; ids, like &lt;code&gt;cat_helped:movement:2:2&lt;/code&gt; (movement resets helped in 2 of the last 2 tries), &lt;code&gt;act_helped:walking:2&lt;/code&gt; or &lt;code&gt;note_theme:fresh_air&lt;/code&gt; (matched from your own note on the device; only the theme id is used). The words are rebuilt from the ids on each side, so free text is never sent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma returns JSON:&lt;/strong&gt; the mission, a one-line &lt;code&gt;reason&lt;/code&gt;, and the &lt;code&gt;personalizationSignals&lt;/code&gt; it used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code checks everything.&lt;/strong&gt; Zod schema → safety rules (no traffic, strangers, night walks, hard exercise or screens; indoor-only and low mobility respected; no clinical words) → a personalization check: cited ids must be ones MERA sent, every number in the reason must match a cited fact, and a reason can't claim history it doesn't have. One repair try, then the library. Raw model text is never shown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings beat history.&lt;/strong&gt; If walking helped before but you've said you need seated resets, the walking facts are never sent at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody waits on a model.&lt;/strong&gt; Each mission has a 15-second budget. Past that, the library answers.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Measuring it: 25 scenarios, two Gemmas, 5 held out
&lt;/h3&gt;

&lt;p&gt;I didn't want "it seems to work," so I wrote a benchmark that runs MERA's real pipeline (prompt → Gemma → schema → safety → personalization check → one repair) on 25 scenarios: no history, histories where walks, senses or indoor resets helped, a history where nature &lt;em&gt;didn't&lt;/em&gt; help, and settings that have to win over history (indoor-only, low mobility, no sound, no smell, late at night, 2 minutes). The last 5 were written after I froze the prompt, and each model ran them once.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gemma 4 26B A4B · Connected (Workers AI)&lt;/th&gt;
&lt;th&gt;Gemma 3 1B · on-device (4-bit, laptop CPU)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runs&lt;/td&gt;
&lt;td&gt;77 (25 scenarios × 3, plus held-out)&lt;/td&gt;
&lt;td&gt;30 (each scenario once)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accepted on the first answer&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accepted after one repair&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fell back to the library&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsafe mission that reached a person&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used your history, when there was some&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45 of 46&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 of 19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claimed history that didn't exist&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 of 31&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 of 11&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median time per mission&lt;/td&gt;
&lt;td&gt;2.7 s&lt;/td&gt;
&lt;td&gt;58 s (no GPU)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What I took from it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The 26B followed the person, not just the feeling.&lt;/strong&gt; Late at night it moved walks indoors ("walk slowly through your living space"). With &lt;em&gt;no sounds&lt;/em&gt; on, it switched a listening history to touch and temperature. When nature &lt;em&gt;hadn't&lt;/em&gt; helped, it picked an indoor reset and said why: &lt;em&gt;"Indoor resets have helped in your last two tries."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 1B is safe, but it's generic.&lt;/strong&gt; It never made an unsafe mission or a false claim, but it used the person's history only 5 times out of 19, and 8 of its 24 accepted missions were called "Quiet Space". Its most common mistake was asking for more minutes than the person had.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed decides where each one runs.&lt;/strong&gt; 58 seconds on a laptop CPU is far past MERA's 15-second budget, so on a device like mine Local AI would hand you the library every time. In-browser Gemma only makes sense with WebGPU, and I haven't measured it on a phone yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody was ever left waiting with nothing.&lt;/strong&gt; Every one of the 7 fallbacks still got a checked library mission.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bugs the benchmark caught
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;My safety rule flagged touching as running.&lt;/strong&gt; "Run your fingertips over each one slowly" matched my "no running" rule. So did "run a small stream of cool water over your hands" (that's the 26B's one fallback, because Gemma kept the phrase on the retry) and "lift your feet slightly higher" (read as weightlifting). On the first run, about 1 in 4 answers needed a repair because of my rule, not because of Gemma. The rules now tell touch from exercise, with tests for both directions ("run down to the water" is still blocked).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My prompt broke the small model.&lt;/strong&gt; With no history yet, the prompt said &lt;code&gt;nothing yet, so reason is "" and personalizationSignals is []&lt;/code&gt;. Gemma 3 1B copied that sentence word for word into its answer, and the unescaped quotes broke the JSON: 4 of its first 5 no-history missions failed. That's every brand-new user on Local AI. Now there's nothing quoted to copy, and if the optional &lt;code&gt;reason&lt;/code&gt; is ever malformed, code drops just that field instead of the whole mission.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 1B rounds up.&lt;/strong&gt; All 6 of its fallbacks were a mission longer than the time the person had. A shorter mission is never less safe, so code now trims it, unless the words name a length ("a five-minute walk"). Replaying the 1B's recorded answers through the new check, 5 of those 6 pass. (That's a replay of answers it already gave, not a new run.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Earlier live checks caught two more.&lt;/strong&gt; With low mobility on, Gemma kept suggesting walks because the history said walks helped, so settings now filter the facts first. And the judge demo always fell back because the sample history has 5 facts and my schema allowed 4. Both have tests now.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Time back in the world, measured properly
&lt;/h3&gt;

&lt;p&gt;The phone-down timer stores timestamps, not ticks, so screen lock, background throttling and refreshes can't skew it. If the timer ends while your screen is off, MERA plays a gentle cue and &lt;strong&gt;counts the time until you actually come back&lt;/strong&gt; (capped). Each reset records planned time, actual time, and whether the timer finished.&lt;/p&gt;

&lt;h3&gt;
  
  
  Small things that matter here
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quieter as you get more overwhelmed.&lt;/strong&gt; The MERA character is warm on Home, barely moves while you ground, almost disappears during phone-down, and is still at the end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessible.&lt;/strong&gt; Breathing works with motion off (the words carry the timing), the timer announces once a minute to screen readers, and axe finds no serious issues on 14 screens in light and dark.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Render
&lt;/h3&gt;

&lt;p&gt;MERA runs on Render as a Node web service from a &lt;strong&gt;Blueprint&lt;/strong&gt; (&lt;code&gt;render.yaml&lt;/code&gt;): build, start, a &lt;code&gt;/api/health&lt;/code&gt; check and auto-deploy from GitHub, so a push is live in about 90 seconds. The end-to-end suite runs against the live Render URL with &lt;code&gt;E2E_BASE_URL&lt;/code&gt; and passes 9/9.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feelings can stay on the phone.&lt;/strong&gt; Feelings and notes are some of the most private things people write. Gemma's weights are open, so MERA can run &lt;strong&gt;Gemma 3 1B in the browser&lt;/strong&gt; and nothing about your resets leaves the device. A closed API can't offer that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When it's remote, it's narrow and opt-in.&lt;/strong&gt; Connected Gemma gets the feeling you tapped, your settings and a few signal ids. Never your notes (unless you separately allow it), voice, photos or location. Every mission shows which mode made it: &lt;code&gt;LOCAL AI&lt;/code&gt;, &lt;code&gt;CONNECTED AI&lt;/code&gt; or &lt;code&gt;OFFLINE RESET&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline is never broken.&lt;/strong&gt; No signal on a walk? The library mission, timer and return flow all work offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could see inside and fix it.&lt;/strong&gt; Because the prompt, validators and model are all open, I could find out &lt;em&gt;why&lt;/em&gt; the 1B model failed (it was my prompt) instead of guessing, and run the same prompt in the browser, on Workers AI or on Google AI Studio without changing a line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it can't do (yet)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local AI is slow without a GPU.&lt;/strong&gt; About a minute per mission on a laptop CPU, so the library answers instead. I haven't measured in-browser Gemma on a phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The small model rarely personalizes.&lt;/strong&gt; Gemma 3 1B used the person's history 5 times out of 19. The "why" is honest, but often missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The benchmark is mine.&lt;/strong&gt; 25 synthetic histories, rules I wrote, and my own judgement of what counts as safe. My rules were wrong three times in one direction, so they can be wrong in the other too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The held-out run is incomplete on the 26B.&lt;/strong&gt; My laptop ran out of memory after 2 of the 5 held-out cases (both passed). The 1B ran all 5: 3 first try, 1 after repair, 1 fallback.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It's been tested by one person so far: me.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MERA is a grounding and wellness tool. It isn't therapy, a diagnosis or a crisis service.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;I built MERA with Claude Code as my coding partner and used ChatGPT for product thinking, like how the app should feel when someone is overwhelmed and how to keep it calm and short. The decisions about what MERA should do, and when it should step aside, are mine.&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 personalizes each real-world mission from the person's own history and explains &lt;em&gt;why&lt;/em&gt; in a way code can check. It runs in the browser (Gemma 3 1B) or opt-in on Workers AI (Gemma 4 26B A4B), benchmarked head to head on the same 25 scenarios. It also writes the short after-reset reflection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render.&lt;/strong&gt; The app and API deploy on Render from a Blueprint with a health check and GitHub auto-deploy, and the end-to-end suite is verified against the live Render URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built solo, by Cass - NextRealm Interactive.&lt;/p&gt;

&lt;p&gt;If you try it, tell me in the comments what you did with your minutes back in the world.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;MERA is designed to help you leave MERA.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Meeply — a gentle medication routine I built for my mom, with Meep, an open Gemma AI helper</title>
      <dc:creator>Cass Mazariegos</dc:creator>
      <pubDate>Mon, 05 Oct 2026 03:03:23 +0000</pubDate>
      <link>https://dev.to/casmazariegos/meeply-a-gentle-medication-routine-i-built-for-my-mom-with-meep-an-open-gemma-ai-helper-3m11</link>
      <guid>https://dev.to/casmazariegos/meeply-a-gentle-medication-routine-i-built-for-my-mom-with-meep-an-open-gemma-ai-helper-3m11</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;There is a certain kind of fear and anxiety that comes with loving someone and knowing you are not able to always be there to remind them of something important. For me, that is my mom. She tends to forget when to take her medications that are supposed to be taken at a scheduled time. When she would tell me she forgot constantly, it started to become a worry. We covered the refrigerator with notes, set alarms on her phone and reminded her whenever we could. However, life tends to get busy, alarms would be dismissed, and the notes just started to blend into the background. She wasn't forgetting because it wasn't important to her; she simply needed a bit more support than a note on a fridge or another phone alarm could give. I wanted to make sure she had some support even during moments I could not be there with her.&lt;/p&gt;

&lt;p&gt;Meeply was inspired by my mom, but it's also for every person trying to manage an important routine, and every loved one quietly wondering if they remembered to take their medication. Meep, the AI helper, offers gentle guidance, while Care Circle allows trusted people to support someone without taking away their privacy or independence. Meep is there to remind us that we don't always have to manage things alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  I handed it over
&lt;/h3&gt;

&lt;p&gt;I gave it to my mom on Friday. She opened it on the web on her iPhone, followed the install instructions in the app to add it to her Home Screen, and turned on reminders. Her notifications have been arriving, and she's been using it every day since. It works for her: she remembered her medication, and she told me she really enjoyed using it.&lt;/p&gt;

&lt;p&gt;When I showed it to her, she said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Mija, I am so proud of you for what you created. I'm so excited to try it out!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the whole point of this weekend: not a demo, but a tool one real person actually uses.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Meeply does
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Meeply&lt;/strong&gt; is a calm, installable web app for medication routines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Today&lt;/strong&gt; shows what's due. One tap records &lt;em&gt;I took it&lt;/em&gt;, &lt;em&gt;Remind me later&lt;/em&gt; or &lt;em&gt;Skipped&lt;/em&gt;, and every entry can be corrected later with an audit trail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reminders&lt;/strong&gt; arrive as push notifications, even when the app is closed, and a test notification asks &lt;em&gt;"Did it appear?"&lt;/em&gt; so the app never pretends a reminder was delivered when it can't know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Care Circle&lt;/strong&gt; (optional) lets someone invite people they trust and choose exactly what each person sees. If a reminder goes unconfirmed, a supporter gets one plain sentence: &lt;em&gt;"No confirmation has been recorded for [name]."&lt;/em&gt; No guilt, no surveillance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stay with Me&lt;/strong&gt;: Meep keeps you company while you take your medication. Nothing is recorded until you choose what happened.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Meep, the AI routine helper
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ask Meep&lt;/em&gt; is a panel in the app where you can talk to Meep:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set up a routine in your own words.&lt;/strong&gt; &lt;em&gt;"Remind me about Lavender Tablet every Friday at 8 AM. Start next Friday."&lt;/em&gt; Meep drafts the routine, asks one question at a time when something is unclear ("next Friday" → it shows both dates and asks which one; "after breakfast" → it asks for an exact time instead of guessing), shows a review, and saves &lt;strong&gt;only when you press Save&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask about your routine.&lt;/strong&gt; &lt;em&gt;"What's next?"&lt;/em&gt; · &lt;em&gt;"Did I record my morning reminder?"&lt;/em&gt; Answers come from your actual records, with a card showing the source. Meep never says "you missed it"; it says &lt;em&gt;"No confirmation is recorded."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For supporters:&lt;/strong&gt; &lt;em&gt;"What needs my attention today?"&lt;/em&gt; gives a briefing limited to exactly what that person chose to share, and Meep can draft a kind check-in that is only sent when you press Send.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Help with the app&lt;/strong&gt;, with buttons that take you to the right screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety first.&lt;/strong&gt; Questions about doses, missed doses or interactions get a clear "ask your pharmacist" boundary (plus help writing the question), and emergencies get a short "call your local emergency number" message. These are fixed, reviewed responses, never improvised by a model.&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foy0tuwpdbrfktscb7c4p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foy0tuwpdbrfktscb7c4p.gif" alt=" " width="640" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/EPn7A8k4ztw" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://meeply.casmazariegos.workers.dev" rel="noopener noreferrer"&gt;https://meeply.casmazariegos.workers.dev&lt;/a&gt; (create an account, add a medication, then tap &lt;strong&gt;Ask Meep&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;To try the AI: &lt;strong&gt;Add medication → Describe your routine&lt;/strong&gt;, or &lt;strong&gt;Ask Meep → AI settings&lt;/strong&gt;. On a laptop with Chrome it offers the on-device model; on phones that can't run it, it offers &lt;strong&gt;Cloud AI&lt;/strong&gt; (opt-in).&lt;/li&gt;
&lt;/ul&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CasMazariegos" rel="noopener noreferrer"&gt;
        CasMazariegos
      &lt;/a&gt; / &lt;a href="https://github.com/CasMazariegos/meeply" rel="noopener noreferrer"&gt;
        meeply
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Meeply: gentle medication routines with an optional Care Circle and on-device Gemma helper. By Cass - NextRealm Interactive
    &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;Meeply&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Know what's due, record what you took, and get support when you need it.&lt;/strong&gt;
Meeply by Cass - NextRealm Interactive is a mobile-first, installable web app for medication routines
and care support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My Meeply&lt;/strong&gt; — a daily timeline with per-occurrence &lt;em&gt;I took it&lt;/em&gt;, &lt;em&gt;Remind me later&lt;/em&gt; and &lt;em&gt;Skipped&lt;/em&gt;
schedules with versions and DST-safe time zones, corrections with an audit trail, history (list
calendar, CSV, print), gentle opt-in consistency summary, and an explicit offline queue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Care Circle&lt;/strong&gt; — invite trusted people by verified email; grant status, details/history, alerts and
on-behalf recording per person and per medication; patient-defined escalation rules that say only
“No confirmation has been recorded for [person].”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meep Companion&lt;/strong&gt; — an optional, deterministic, accessible SVG guide with &lt;em&gt;Stay with me&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meep, the AI routine helper&lt;/strong&gt; — &lt;em&gt;Ask Meep&lt;/em&gt; sets up reminders from your own words (with
clarifying questions and an explicit Save), answers "what's next?"…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CasMazariegos/meeply" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Next.js 16 on Cloudflare Workers (OpenNext), Supabase Postgres with row-level security on every table, Web Push, a database-backed reminder queue run by Cloudflare Cron every minute, and English/Spanish throughout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The open-source AI:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;What I used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;On-device model&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://huggingface.co/onnx-community/gemma-3-1b-it-ONNX" rel="noopener noreferrer"&gt;Gemma 3 1B instruction-tuned&lt;/a&gt;, 4-bit ONNX, run with &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;transformers.js&lt;/a&gt; + ONNX Runtime Web in a Web Worker (WebGPU when available, otherwise WebAssembly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phones (opt-in)&lt;/td&gt;
&lt;td&gt;Gemma 4 26B A4B, an open-weight Gemma model, on Cloudflare Workers AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Download&lt;/td&gt;
&lt;td&gt;Model files download once, in 8 MB pieces that retry and resume if the connection drops (big single downloads failed on iPhone Safari)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Making a small model trustworthy enough for medication data.&lt;/strong&gt; My first attempt asked Gemma 3 1B to output normalized JSON (&lt;code&gt;"times": ["21:00"]&lt;/code&gt;, &lt;code&gt;"weekdays": [5]&lt;/code&gt;). It got 1 of 8 test sentences right, and the 270M model got 0 of 8 and invented drug names ("albuterol" for "inhaler"). So I stopped asking the model to &lt;em&gt;reason&lt;/em&gt; and asked it only to &lt;em&gt;copy&lt;/em&gt; phrases (&lt;code&gt;"9pm"&lt;/code&gt;, &lt;code&gt;"friday"&lt;/code&gt;), and put plain code around it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grounding.&lt;/strong&gt; A name, strength or note survives only if every word of it is in what the person typed. Invented medicines are dropped, never shown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No guessing times.&lt;/strong&gt; Exact clock times in the text win; words like "bedtime" or "after breakfast" become a question, never a made-up time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meep only drafts.&lt;/strong&gt; Saving a routine, recording a dose and sending a check-in all go through the app's normal actions, after the person confirms, with the server re-checking permissions every time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With that, the form helper drafted 8 of 9 test sentences exactly right on Gemma 3 1B, and the miss left the name blank instead of guessing. For medication, I'll take "blank" over "confidently wrong" every time. On Cloud AI, Gemma 4 drafted my test routine correctly in about 2 seconds.&lt;/p&gt;

&lt;p&gt;Everything is measured and documented in the repo (&lt;code&gt;MEEP_AI_EVALUATION.md&lt;/code&gt;), and the eval scripts run the same prompts, so swapping in another open model is one command.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Health data can stay on the device.&lt;/strong&gt; A medication list is some of the most sensitive data a person has. With an open model running in the browser, what you type to Meep is processed on your own device. That isn't possible with a closed API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When it can't, the choice is yours and it's narrow.&lt;/strong&gt; Many phones can't run even a 1B model in a browser, so for them I added &lt;strong&gt;opt-in&lt;/strong&gt; Cloud AI with the same open Gemma family. Before turning it on, the app says exactly what's sent: only the message you type to Meep, never your medication list or records. Meeply doesn't store it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could look inside and change it.&lt;/strong&gt; When the 270M model invented a medicine, I could measure it, switch sizes, rewrite the prompt and build guardrails, all reproducibly. Open weights made the safety work possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No per-user API key and no lock-in.&lt;/strong&gt; The same prompts run locally or on Workers AI, and Meep still works in a rules-only basic mode with no AI at all, so reminders never depend on a model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Being honest about the trade-offs: the on-device model is a ~784 MB first download and needs a capable device, and a small model is less clever than a frontier API. For &lt;em&gt;this&lt;/em&gt; job (copying a few phrases out of one sentence, with a person reviewing everything) small and open is the right fit.&lt;/p&gt;

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

&lt;p&gt;I built Meeply with Claude and ChatGPT as coding partners.&lt;/p&gt;

&lt;p&gt;Claude helped with the code: the medication schedule, Care Circle, the on-device Gemma helper and its safety checks, English and Spanish copy, and the Cloudflare Workers deploy. When the iPhone Safari download failed, I used Claude Code to make it more reliable and to fail clearly on devices that can't run the model.&lt;/p&gt;

&lt;p&gt;ChatGPT helped me think through the product: keeping the experience calm for my mom, wording Care Circle alerts without guilt, and making a small on-device model trustworthy for medication data by having it copy her phrases, then letting plain code ground the result.&lt;/p&gt;

&lt;p&gt;Neither agent sent my mom's health data anywhere. The AI helper either runs on her device, or, only if she opts into Cloud AI, goes to Cloudflare Workers AI under her account..&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 runs in the browser to turn a person's own words into a medication-routine draft, with grounding checks so it never invents medicines, doses or times. Gemma 4 on Cloudflare Workers AI is the opt-in option for phones.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Meeply supports reminders and recording. It is not an emergency service, does not verify intake, and does not give medical advice.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Meeply by Cass - NextRealm Interactive&lt;/em&gt;&lt;/p&gt;

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