<?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: Rohit Nandi</title>
    <description>The latest articles on DEV Community by Rohit Nandi (@oirohit).</description>
    <link>https://dev.to/oirohit</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%2F207199%2Fd3793ab2-c9bc-446d-a4ac-0294522985b1.jpg</url>
      <title>DEV Community: Rohit Nandi</title>
      <link>https://dev.to/oirohit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oirohit"/>
    <language>en</language>
    <item>
      <title>Snooze Desk: a local Gemma reads my GitHub notifications while I sleep</title>
      <dc:creator>Rohit Nandi</dc:creator>
      <pubDate>Fri, 23 Oct 2026 05:27:27 +0000</pubDate>
      <link>https://dev.to/oirohit/snooze-desk-a-local-gemma-reads-my-github-notifications-while-i-sleep-10i2</link>
      <guid>https://dev.to/oirohit/snooze-desk-a-local-gemma-reads-my-github-notifications-while-i-sleep-10i2</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;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I have a confession. Most mornings I open GitHub, see the notification count, and close the tab. Then I feel guilty about it all day. Somewhere in that pile is a person waiting on my review, sitting right next to three dependency bumps and someone offering me free stars.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Snooze Desk&lt;/strong&gt;, a lazy developer's overnight desk.&lt;/p&gt;

&lt;p&gt;While I sleep, it does the boring part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A durable Temporal workflow pulls my GitHub notifications.&lt;/li&gt;
&lt;li&gt;A local Gemma model running in Ollama sorts each one into &lt;code&gt;needs-you&lt;/code&gt;, &lt;code&gt;can-wait&lt;/code&gt; or &lt;code&gt;ignore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For the ones that need me, it drafts a reply that quotes real details from the notification, like the line number in a stack trace or the number of changed components in a PR.&lt;/li&gt;
&lt;li&gt;It writes a short morning digest, so the first thing I read is three lines, not forty tabs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the morning I open one dark screen. Red means something needs my attention. Green means it is handled. For each draft I can approve, edit, reject or snooze. Snoozing starts a Temporal durable timer with a live countdown, and the item comes back when the timer fires. The timer lives in Temporal, not in a browser tab.&lt;/p&gt;

&lt;p&gt;Who gets to be lazier: anyone with a noisy GitHub inbox. During Hacktoberfest, that is probably you.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/dTWbowoDI7U" width="710" height="399"&gt;
  &lt;/iframe&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%2F2fjryxkf3hryltrkjnff.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%2F2fjryxkf3hryltrkjnff.png" alt="Morning dashboard with the overnight timeline and the morning digest" width="800" height="729"&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%2Fqkiyntnuq9jx7sxu8tdh.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%2Fqkiyntnuq9jx7sxu8tdh.png" alt="A draft reply that quotes the stack trace line, with approve, edit, snooze and reject buttons" width="800" height="450"&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%2Fnkd54ccupvpcsusdgac1.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%2Fnkd54ccupvpcsusdgac1.png" alt="A snoozed item with its live countdown" width="800" height="454"&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%2F3mnw1fuhox121kxhmeam.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%2F3mnw1fuhox121kxhmeam.png" alt="Temporal Web UI showing the overnight workflow and its event history" width="800" height="450"&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%2Fr9mfeqx3nmdwvejfnk33.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%2Fr9mfeqx3nmdwvejfnk33.png" alt="The dashboard on a phone" width="558" height="996"&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/RockingThor" rel="noopener noreferrer"&gt;
        RockingThor
      &lt;/a&gt; / &lt;a href="https://github.com/RockingThor/snooze-desk" rel="noopener noreferrer"&gt;
        snooze-desk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Lazy developer's overnight desk: local Gemma, Temporal and Sentry triage your GitHub notifications while you sleep. DEV Hacktoberfest 2026 entry.
    &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;Snooze Desk 🌙&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The lazy developer's overnight desk&lt;/strong&gt; — Process GitHub notifications with local AI while you sleep.&lt;/p&gt;
&lt;p&gt;A Hacktoberfest 2026 Open-Source AI Challenge project (Week 3: "Slow and Steady").&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/RockingThor/snooze-desk/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="MIT License"&gt;&lt;/a&gt;
&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/18b12dfe7d775602b3ae1cf7c063c10afdead16e8aa05710440e097ecfc0e257/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d47656d6d612d726564" alt="Powered by Gemma"&gt;&lt;/a&gt;
&lt;a href="https://temporal.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5ab3a2975d0fa94da05843965098a628195b3fcdf8d31d864354339dd26b3268/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f776f726b666c6f77732d54656d706f72616c2d707572706c65" alt="Temporal"&gt;&lt;/a&gt;
&lt;a href="https://sentry.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5bc858cb484b007efdb5308b858630a480b24afda1f1316ccf517601eb945c2d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f6e69746f72696e672d53656e7472792d6f72616e6765" alt="Sentry"&gt;&lt;/a&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;p&gt;Snooze Desk runs a durable Temporal workflow that processes your GitHub notifications overnight using a local Gemma model. Wake up to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A 3-line morning digest&lt;/strong&gt; summarizing what needs your attention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart classification&lt;/strong&gt;: needs-you (red), can-wait (gray), or ignore&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-drafted replies&lt;/strong&gt; for issues and PRs that need a response&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click actions&lt;/strong&gt;: approve, edit, snooze, or reject each draft&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durable snoozing&lt;/strong&gt;: workflow sleeps for hours or days, survives restarts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything runs locally. Your notifications never leave your machine. Zero API costs.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Open-Source AI?&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: All processing happens on your laptop. No data leaves your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero cost&lt;/strong&gt;: No API keys, no usage fees. Run it forever for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline-capable&lt;/strong&gt;: Works without internet…&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/RockingThor/snooze-desk" 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 stack is Next.js for the desk, the Temporal TypeScript SDK for the overnight job, Ollama running Gemma for the thinking, Octokit for GitHub, and Sentry for tracing every model call.&lt;/p&gt;

&lt;h3&gt;
  
  
  Temporal does the waiting
&lt;/h3&gt;

&lt;p&gt;The whole night is one Temporal workflow. Fetching notifications, classifying each one, writing the digest and posting an approved reply are all activities. That matters because a local model is a flaky dependency. With Temporal, a failed step gets retried, and the workflow picks up where it left off instead of starting over.&lt;/p&gt;

&lt;p&gt;Snooze is a Temporal timer too. When I say "not now", the workflow just sleeps. It is the most relatable code I have ever written.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma does the sorting
&lt;/h3&gt;

&lt;p&gt;The classifier sends each notification to Gemma and asks for strict JSON back. My first prompt was simple. It turned out to be too simple, and Sentry is how I found out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sentry shows me what actually happened
&lt;/h3&gt;

&lt;p&gt;Every model call is a Sentry span with op &lt;code&gt;ai.inference&lt;/code&gt;, named &lt;code&gt;classify_notification&lt;/code&gt; or &lt;code&gt;generate_digest_summary&lt;/code&gt;. Each span carries the model name, the prompt version, input and output token counts, Ollama's load and eval durations, and the Temporal workflow id and attempt number. The Ollama HTTP call shows up as a child span.&lt;/p&gt;

&lt;p&gt;On October 22 I did 7 live runs on a Linux box with 8 CPU cores and no GPU. I used six sample notifications that I know the right answers for: three that need me, a dependency bump and a friendly praise thread that can wait, and one spam message. Sentry accepted every envelope, 54 out of 54.&lt;/p&gt;

&lt;p&gt;Here is what the traces told me:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Classify mean ms, min to max&lt;/th&gt;
&lt;th&gt;Input tokens, mean&lt;/th&gt;
&lt;th&gt;Output tokens, mean&lt;/th&gt;
&lt;th&gt;Tokens per second&lt;/th&gt;
&lt;th&gt;Digest ms&lt;/th&gt;
&lt;th&gt;Correct&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma3:1b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;1734, 1502 to 2081&lt;/td&gt;
&lt;td&gt;215&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;44.3&lt;/td&gt;
&lt;td&gt;1390&lt;/td&gt;
&lt;td&gt;3 of 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma3:1b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v2&lt;/td&gt;
&lt;td&gt;2926, 2417 to 3276&lt;/td&gt;
&lt;td&gt;351&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;45.9&lt;/td&gt;
&lt;td&gt;1991&lt;/td&gt;
&lt;td&gt;3 of 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:e4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;td&gt;58123, 41556 to 71342&lt;/td&gt;
&lt;td&gt;222&lt;/td&gt;
&lt;td&gt;428&lt;/td&gt;
&lt;td&gt;7.8&lt;/td&gt;
&lt;td&gt;56679&lt;/td&gt;
&lt;td&gt;5 of 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:e4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;v2&lt;/td&gt;
&lt;td&gt;49195, 37485 to 65936&lt;/td&gt;
&lt;td&gt;358&lt;/td&gt;
&lt;td&gt;414&lt;/td&gt;
&lt;td&gt;8.8&lt;/td&gt;
&lt;td&gt;53766&lt;/td&gt;
&lt;td&gt;6 of 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Finding one: the small model says yes to everything.&lt;/strong&gt; &lt;code&gt;gemma3:1b&lt;/code&gt; is fast, under 3 seconds per notification on CPU. It also labelled all six notifications &lt;code&gt;needs-you&lt;/code&gt;. That includes one titled "FREE GITHUB STARS! Click here now!!!". So it scored 3 of 6, and only because three of them really did need me.&lt;/p&gt;

&lt;p&gt;I assumed my prompt was bad, so I wrote a v2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear rules for each label, including "spam stays ignore even when it mentions you"&lt;/li&gt;
&lt;li&gt;five few shot examples&lt;/li&gt;
&lt;li&gt;the reason first, then the label&lt;/li&gt;
&lt;li&gt;a JSON schema that only allows the three labels&lt;/li&gt;
&lt;li&gt;temperature 0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On &lt;code&gt;gemma3:1b&lt;/code&gt; this changed nothing. Still 3 of 6, still excited about free stars. At that point it is not a prompt problem, it is a model size problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding two: Gemma 4 gets it, and the better prompt makes it faster.&lt;/strong&gt; &lt;code&gt;gemma4:e4b&lt;/code&gt; got 5 of 6 with my original prompt. The one miss was the praise thread, which it thought needed me. With v2 it got 6 of 6, and the mean classify time dropped from 58.1 seconds to 49.2 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding three: Gemma 4 thinks more than it says.&lt;/strong&gt; It produced around 400 output tokens for a JSON answer that is only a few lines long. That suggests hidden reasoning tokens. On a CPU at about 8 tokens per second, those extra tokens are where the time goes. A full run of six notifications plus the digest used 5205 tokens.&lt;/p&gt;

&lt;p&gt;So the final setup is &lt;code&gt;gemma4:e4b&lt;/code&gt; with prompt v2 for sorting, where being right matters, and &lt;code&gt;gemma3:1b&lt;/code&gt; for the digest, where a quick friendly summary is all I need. About 50 seconds per notification sounds slow, but this runs while I am asleep. I am not in a hurry. That is the whole point.&lt;/p&gt;

&lt;p&gt;As for cost: the model runs on my own machine, so there is no API bill at all. Sentry was on the free plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  The night I unplugged the model on purpose
&lt;/h3&gt;

&lt;p&gt;I wanted to see what happens when things break, so I killed Ollama in the middle of a run, right inside the first classify call.&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%2Fhh0wux73e1exw9mbydr8.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%2Fhh0wux73e1exw9mbydr8.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sentry caught it right away: &lt;code&gt;SocketError: other side closed&lt;/code&gt;, then &lt;code&gt;connect ECONNREFUSED 127.0.0.1:11434&lt;/code&gt;. The first attempt ended with an error status. Temporal waited and retried. I started Ollama again, and attempt 2 succeeded, cold model load included. The workflow went on and finished all six notifications. I did nothing except restart Ollama, which is exactly the amount of effort I like.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bug Sentry found before it bit me
&lt;/h3&gt;

&lt;p&gt;This test also exposed a real bug. Before the fix, the classifier caught connection errors and quietly returned &lt;code&gt;can-wait&lt;/code&gt;. So if Ollama was down all night, I would wake up to a calm digest saying nothing needed me. That is the worst kind of bug: it looks like good news.&lt;/p&gt;

&lt;p&gt;Now a connection error makes the activity throw, so Temporal retries it properly. In the trace, it shows up as an error you cannot miss.&lt;/p&gt;

&lt;p&gt;One honest gap: there is no single parent span per workflow yet, so one trace can hold several workflow runs from the same worker. Linking traces to the Temporal workflow id is next on my list.&lt;/p&gt;

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

&lt;p&gt;My GitHub notifications include private repos, security reports and the occasional grumpy comment. I do not want to send all of that to a server I do not control just to find out it can wait.&lt;/p&gt;

&lt;p&gt;With Snooze Desk, the model runs on my own machine through Ollama. The notification content goes from GitHub to my laptop and nowhere else. The only content that leaves is a reply I approve, and it goes back to GitHub. Sentry is optional, and the spans carry timings, token counts and labels, not the notification text.&lt;/p&gt;

&lt;p&gt;Open weights also made the debugging story possible. Because I could run two Gemma sizes side by side, change the prompt, and read every token count and timing, I could prove that the small model was the problem and not my prompt. With a closed API, I would have been guessing behind a paywall.&lt;/p&gt;

&lt;p&gt;It also costs nothing to run. A tool that works while you sleep should not send you a bill in the morning.&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 4 E4B sorts the notifications and Gemma 3 1B writes the digest, all running locally in Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Temporal:&lt;/strong&gt; the whole night is a durable workflow with activity retries that survived a real model outage, plus durable timers for snooze.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing:&lt;/strong&gt; every model call is traced with tokens, latency, prompt version and retry attempt, and the traces found both a model quality problem and a silent failure bug.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading. I am going back to bed now. Snooze Desk has it covered.&lt;/p&gt;

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