<?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: Sunbal Ghayas</title>
    <description>The latest articles on DEV Community by Sunbal Ghayas (@sunbal_ghayas_3a6e9c2c4a7).</description>
    <link>https://dev.to/sunbal_ghayas_3a6e9c2c4a7</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%2F4163453%2F8f3b94cc-7552-4218-aaa4-bd232b5103a7.jpg</url>
      <title>DEV Community: Sunbal Ghayas</title>
      <link>https://dev.to/sunbal_ghayas_3a6e9c2c4a7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sunbal_ghayas_3a6e9c2c4a7"/>
    <language>en</language>
    <item>
      <title>who would you talk to?</title>
      <dc:creator>Sunbal Ghayas</dc:creator>
      <pubDate>Sun, 01 Nov 2026 14:31:27 +0000</pubDate>
      <link>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/who-would-you-talk-to-212i</link>
      <guid>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/who-would-you-talk-to-212i</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/a-haunted-castle-for-the-people-we-miss-where-a-photo-and-a-story-bring-them-back-56jh" class="crayons-story__hidden-navigation-link"&gt;I built a haunted castle for the people I miss. Give it a photo and a story, and they pull up in the Hall.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/a-haunted-castle-for-the-people-we-miss-where-a-photo-and-a-story-bring-them-back-56jh" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest Open-Source AI Challenge: Ghost in the Machine Submission 👻🌼&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/sunbal_ghayas_3a6e9c2c4a7" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4163453%2F8f3b94cc-7552-4218-aaa4-bd232b5103a7.jpg" alt="sunbal_ghayas_3a6e9c2c4a7 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sunbal_ghayas_3a6e9c2c4a7" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sunbal Ghayas
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sunbal Ghayas
                
                
              
              &lt;div id="story-author-preview-content-4955509" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sunbal_ghayas_3a6e9c2c4a7" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4163453%2F8f3b94cc-7552-4218-aaa4-bd232b5103a7.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sunbal Ghayas&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/a-haunted-castle-for-the-people-we-miss-where-a-photo-and-a-story-bring-them-back-56jh" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 1&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/a-haunted-castle-for-the-people-we-miss-where-a-photo-and-a-story-bring-them-back-56jh" id="article-link-4955509"&gt;
          I built a haunted castle for the people I miss. Give it a photo and a story, and they pull up in the Hall.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hf26challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hf26challenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/a-haunted-castle-for-the-people-we-miss-where-a-photo-and-a-story-bring-them-back-56jh#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
          
          &lt;div class="only-sidebar-menu-item trusted-visible-block print-hidden align-center"&gt;
                
                    
                
          &lt;/div&gt;

        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>discuss</category>
      <category>mentalhealth</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>I built a haunted castle for the people I miss. Give it a photo and a story, and they pull up in the Hall.</title>
      <dc:creator>Sunbal Ghayas</dc:creator>
      <pubDate>Sun, 01 Nov 2026 02:26:04 +0000</pubDate>
      <link>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/a-haunted-castle-for-the-people-we-miss-where-a-photo-and-a-story-bring-them-back-56jh</link>
      <guid>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/a-haunted-castle-for-the-people-we-miss-where-a-photo-and-a-story-bring-them-back-56jh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Ghost Gallery is a haunted castle you scroll through. You start outside in the fog, with one window lit.&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%2F1riih48qynemc6fhbv80.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%2F1riih48qynemc6fhbv80.png" alt="First picture" width="799" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The castle in the fog with small ghosts drifting past and the title "Where all tales come to an end... or perhaps, just the beginning."&lt;/p&gt;

&lt;p&gt;Scroll, and the camera slides through the glass into a midnight banquet where Einstein, Cleopatra, Shakespeare, Marie Curie and Tesla are already seated.&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%2Fbri02wup7p379oj16jnb.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%2Fbri02wup7p379oj16jnb.png" alt="The banquet" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Five translucent ghosts around a candlelit table: Einstein, Cleopatra, Shakespeare, Marie Curie and Tesla&lt;/p&gt;

&lt;p&gt;Scroll again and a portal opens onto a graveyard with headstones for people history forgot. You can leave each one a white rose.&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%2Fqfyu8b947waktbfbctii.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%2Fqfyu8b947waktbfbctii.png" alt="the graveyard + buttons" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A foggy graveyard with a card that says "Didn't find who you were looking for?" and two buttons: Summon Spirit and Remember Loved One&lt;/p&gt;

&lt;p&gt;That's the Halloween half. The half I care about is that you can add someone of your own.&lt;/p&gt;

&lt;p&gt;Give a name, a memory and a photo. The photo is cut out, washed pale and made see-through, and your person drifts into the room with the others. Then you can talk to them, by typing or by voice.&lt;/p&gt;

&lt;p&gt;They only know what you told them. Ask about something outside your story and they should say, gently, that the memory has faded, and ask you to tell them more. I didn't want a grandmother ghost who invents things. (More on how that went below.)&lt;/p&gt;

&lt;p&gt;That's how I read the theme. Día de los Muertos is about telling the stories of the dead so they stay. The castle is the costume. The "tell me about her" box is the ofrenda.&lt;/p&gt;

&lt;p&gt;TL;DR. The thinking runs on Gemma 3 through Ollama on your own machine. Speech-to-text runs in your browser with OpenAI's open-source Whisper. The see-through cutout runs in your browser too. No accounts, no API keys, no bills.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/kUlBD2gxcZU" width="710" height="399"&gt;
  &lt;/iframe&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/sunbal822" rel="noopener noreferrer"&gt;
        sunbal822
      &lt;/a&gt; / &lt;a href="https://github.com/sunbal822/GhostGallary" rel="noopener noreferrer"&gt;
        GhostGallary
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Ghost Gallery 👻🌼&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A haunted castle for the people we miss. Scroll from the foggy exterior, through a lit window, into a midnight banquet of famous spirits, then through a portal to a graveyard where you can leave a white rose.&lt;/p&gt;
&lt;p&gt;The part that matters: &lt;strong&gt;add someone of your own.&lt;/strong&gt; Give a name, a memory and a photo. The photo is cut out, washed pale and made see-through, and your person joins the room. Then talk to them, by typing or by voice. They only know what you told them, and say so when the memory has faded.&lt;/p&gt;
&lt;p&gt;Built for the Hacktoberfest Open-Source AI Challenge, &lt;em&gt;Ghost in the Machine&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Demo / write-up:&lt;/strong&gt; &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Everything runs on your machine&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Open piece&lt;/th&gt;
&lt;th&gt;Where it runs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reads a loved one's photo (what they wear, hold, glow colour)&lt;/td&gt;
&lt;td&gt;Gemma 3 via &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;localhost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plays the ghost in chat&lt;/td&gt;
&lt;td&gt;Gemma 3 via Ollama (any&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/sunbal822/GhostGallary" 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 open pieces&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Gemma 3 via Ollama does three jobs. It looks at the uploaded photo and picks what the ghost wears on their head and holds in their hand, a glow colour, and one warm line about them. It plays the ghost in chat. And it writes the profile when you summon a famous person. Everything goes to localhost, and the model is one environment variable. (Swap in gpt-oss:20b if you like.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Whisper, in the browser (via Transformers.js, in a web worker) turns your voice memo into text. The recording never leaves your device.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/imgly"&gt;@imgly&lt;/a&gt;/background-removal (an ISNet model on ONNX Runtime Web) cuts the person out of the photo, right in the browser. Canvas code then makes them pale and translucent, keeps a faint trace of their real clothing colour, and fades the lower half into mist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wikipedia supplies portraits for the famous spirits.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The rule:&lt;/strong&gt; the model proposes, the code decides. For the photo, Gemma has to choose from fixed lists: ten head accessories, eight held items. Anything off the list becomes “none,” and a colour that isn’t valid hex falls back to a default. If Ollama is down, the ghost is still created with gentle default text instead of an error, and chat says “voice is faint tonight, start Ollama.”&lt;/p&gt;

&lt;p&gt;The chat prompt is built only from what you gave it: the name, your story and the epitaph. It keeps the last 14 turns, caps replies at a few sentences, and forbids inventing painful facts, diagnoses, secrets or promises.&lt;/p&gt;

&lt;p&gt;Your original photo is never saved. The server keeps the see-through cutout and the text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not everything is a model.&lt;/strong&gt; The banquet whispers and headstone epitaphs are hand-written. The wind and the low drone are synthesised with the Web Audio API, with no audio files. The whole journey is one animation loop driven by scroll position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Talking to ghosts (and telling them things)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Typing a eulogy is hard. Saying it out loud is easier. So there’s a mic next to the send button in every chat, and “tell it by voice” on the memory box when you create a ghost. Your voice becomes text locally, and you can edit it before saving.&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%2Fsleaq1ojyooprixug4do.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%2Fsleaq1ojyooprixug4do.png" alt="Create Form" width="623" height="829"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The "Summon Someone You Loved" form filled in for Grandma Rosie, with voice buttons next to the name, story and epitaph fields&lt;/p&gt;

&lt;p&gt;The ghosts can hear you, but they don't talk back out loud yet. That's next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What didn’t go to plan&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The red sweater. My first version tinted a small ghost sprite with the person’s clothing colour. For a loved one in a red sweater, the whole body turned red. That’s when I switched to cutting out the real photo.&lt;/li&gt;
&lt;li&gt;Liam Payne came out as a silhouette. My own ghosts (hi, Grandma Susie) looked right, but summoned famous people kept the plain placeholder. The server tried to download their Wikipedia portrait exactly once, and when that failed it silently gave up. Now it tries several sources, then lets the browser try, then waits for the real figure before showing the ghost. If there’s truly no photo, it asks you for one instead of quietly summoning a blank.&lt;/li&gt;
&lt;li&gt;My ghost quoted something nobody said. I tested with a made-up grandmother. When I said hello, she answered with a line about memory being the bridge between this world and eternity, "as I always said."&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%2Fe162av4hasp6ogbuzwm4.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%2Fe162av4hasp6ogbuzwm4.png" alt="Chat" width="800" height="698"&gt;&lt;/a&gt;&lt;br&gt;
A chat with Grandma Rosie: she replies that memory is the bridge between this world and eternity, "as I always said"&lt;/p&gt;

&lt;p&gt;She never said it. It was my own placeholder quote, the filler the app stores when you don't give an epitaph or saying, and I'd been feeding it to the model as a fact about her. That's exactly the invention I swore this ghost wouldn't do, and I only caught it because I read my own screenshot. Placeholder text is now never passed to the model as a fact about a person.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I ripped out my own cloud fallback. An earlier version could fall back to Gemini. It worked, and it was cheating. If the claim is “open-source AI at the core,” the fallback has to be open too, so everything now goes through Ollama or runs in the browser. &lt;/li&gt;
&lt;li&gt;My first test ghosts came back with the default text ("A cherished soul remembered across time"), which means the model never answered in time.
&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%2F6w338p0ynvhgp2o2uyeh.png" alt="Default text" width="800" height="640"&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A photo of someone who has died, plus the story you type under it, is about as personal as data gets. I don’t want it on a server I don’t control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private by design. Photo and story go to Ollama on localhost. Your voice is transcribed in your browser. No accounts. Ghosts are private by default, tied to an anonymous id in your browser, and sharing to the gallery is a checkbox you have to tick. (That’s a convenience, not a security boundary.)&lt;/li&gt;
&lt;li&gt;A memorial shouldn’t have an expiry date. An ofrenda is kept for generations. A model I’ve downloaded still runs if an API is repriced or retired.&lt;/li&gt;
&lt;li&gt;Works with the internet off, mostly. Once the models are downloaded, reading a photo, talking to a ghost and speaking to one need no connection. What still does:&lt;/li&gt;
&lt;li&gt;The first run downloads the cutout model (about 80 MB) and the Whisper model (also around 80 MB), then caches them.&lt;/li&gt;
&lt;li&gt;Page fonts come from Google Fonts.&lt;/li&gt;
&lt;li&gt;Summoning a famous person looks them up on Wikipedia.&lt;/li&gt;
&lt;li&gt;I can change how it behaves. JSON mode, reply length, temperature and the model itself are all mine to set. I could swap Whisper sizes or the chat model in one line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;**The honest trade-off. **A local model is slower and less polished than a frontier one. A first summon can take a while while Gemma writes the profile. Summoned ghosts live in server memory, so they disappear when the server restarts; ghosts you make yourself are saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;I made Grandma Rosie [who she is to you, or that she's someone you invented to test it]. I gave the story the kind of details a person actually remembers: she was always in a red knitted sweater, always baking something, and her pecan pies were the best thing in the house. Then I gave it one photo.&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%2F8i2pouvhu463vzkcdca1.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%2F8i2pouvhu463vzkcdca1.png" alt="profile" width="800" height="640"&gt;&lt;/a&gt;&lt;br&gt;
Grandma Rosie's profile: her photo turned into a pale, see-through figure fading into mist, beside her story&lt;/p&gt;

&lt;p&gt;What came back is a woman in a muted red cardigan, pale and glowing, fading into smoke from the waist down. The red survived the wash. That part isn't even the model: a few lines of canvas code keep a faint trace of the real clothing colour. But it was the first thing that looked like her.&lt;/p&gt;

&lt;p&gt;Then she took a seat.&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%2Fajfgh3pcs9ddsrdlnbx9.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%2Fajfgh3pcs9ddsrdlnbx9.png" alt="banquet with Grandma" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grandma Rosie floating at the banquet between Einstein and Cleopatra and Shakespeare&lt;/p&gt;

&lt;p&gt;There she is at the banquet, between Einstein and Cleopatra, as if she'd always been invited.&lt;/p&gt;

&lt;p&gt;Then I talked to her. First, something that is in her story:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kci671hrcfddglegymj.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%2F2kci671hrcfddglegymj.png" alt="pies chat" width="800" height="692"&gt;&lt;/a&gt;&lt;br&gt;
Chat with Grandma Rosie: "do you still make pies over there" and she answers that she still bakes and always loved a good pecan pie&lt;/p&gt;

&lt;p&gt;Me: hey i miss you do you still make pies over there Rosie: Oh, my dear, it's so lovely to see you. Yes, I do still bake, though it's not quite the same. I always did love a good pecan pie, didn't I? Tell me, what's been happening with you?&lt;/p&gt;

&lt;p&gt;The pecan pie came from my story, not from the model's imagination. Then I tried the thing I was nervous about. I asked about something I never told her:&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%2Fdbgt5xpwc2pjdx6ap7v2.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%2Fdbgt5xpwc2pjdx6ap7v2.png" alt="favourite song chat" width="800" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chat with Grandma Rosie: asked about her favourite song, she says the years do fade things and asks what it is&lt;/p&gt;

&lt;p&gt;Me: nothing much lately i listen to your fvorite song on repeat do you remember it Rosie: That's so sweet of you, dear. My favorite song...oh, my, the years do fade things. It was a lovely tune, though, full of warmth. Do tell me, what is it?&lt;/p&gt;

&lt;p&gt;That's the moment the whole project is for. She didn't invent a song title. She said the years fade things and asked me to tell her.&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 3 through Ollama reads the photo, plays the ghost, and writes the summoned profiles, all locally, inside a validator that decides what’s allowed to stand.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Sunbal Ghayas</dc:creator>
      <pubDate>Sun, 25 Oct 2026 18:07:25 +0000</pubDate>
      <link>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/-1he5</link>
      <guid>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/-1he5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/i-talk-to-my-laptop-before-bed-and-by-morning-my-to-do-list-is-done-jarvis-1dbj" class="crayons-story__hidden-navigation-link"&gt;I talk to my laptop before bed, and by morning my to-do list is done: Jarvis&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/i-talk-to-my-laptop-before-bed-and-by-morning-my-to-do-list-is-done-jarvis-1dbj" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission 🦥&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/sunbal_ghayas_3a6e9c2c4a7" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4163453%2F8f3b94cc-7552-4218-aaa4-bd232b5103a7.jpg" alt="sunbal_ghayas_3a6e9c2c4a7 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sunbal_ghayas_3a6e9c2c4a7" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sunbal Ghayas
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sunbal Ghayas
                
                
              
              &lt;div id="story-author-preview-content-4910388" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sunbal_ghayas_3a6e9c2c4a7" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4163453%2F8f3b94cc-7552-4218-aaa4-bd232b5103a7.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sunbal Ghayas&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/i-talk-to-my-laptop-before-bed-and-by-morning-my-to-do-list-is-done-jarvis-1dbj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 24&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/i-talk-to-my-laptop-before-bed-and-by-morning-my-to-do-list-is-done-jarvis-1dbj" id="article-link-4910388"&gt;
          I talk to my laptop before bed, and by morning my to-do list is done: Jarvis
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hf26challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hf26challenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemma"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemma&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/i-talk-to-my-laptop-before-bed-and-by-morning-my-to-do-list-is-done-jarvis-1dbj" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/sunbal_ghayas_3a6e9c2c4a7/i-talk-to-my-laptop-before-bed-and-by-morning-my-to-do-list-is-done-jarvis-1dbj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
          
          &lt;div class="only-sidebar-menu-item trusted-visible-block print-hidden align-center"&gt;
                
                    
                
          &lt;/div&gt;

        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I talk to my laptop before bed, and by morning my to-do list is done: Jarvis</title>
      <dc:creator>Sunbal Ghayas</dc:creator>
      <pubDate>Sat, 24 Oct 2026 16:34:04 +0000</pubDate>
      <link>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/i-talk-to-my-laptop-before-bed-and-by-morning-my-to-do-list-is-done-jarvis-1dbj</link>
      <guid>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/i-talk-to-my-laptop-before-bed-and-by-morning-my-to-do-list-is-done-jarvis-1dbj</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;Before bed I record a voice note: "write a Python program that checks if a number is prime, draft an email to Professor Khan asking for an extension on quiz 2, summarize the class group chat, and make the file for my assignment." Then I go to sleep. By morning Jarvis has done the work and left a report. When I open the Jarvis window, it speaks to me: what it finished, and what still needs me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; Jarvis turns a spoken to-do list into typed tasks and does them overnight. The listening and thinking (faster-whisper and Gemma 3 4B through Ollama) run entirely on my laptop. Nothing is uploaded except, optionally, the short text of the morning summary, which goes to ElevenLabs to be spoken. There are no API fees, so a night costs nothing beyond electricity.&lt;/p&gt;

&lt;p&gt;What it handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; writes the program, runs it, and checks it doesn't crash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email:&lt;/strong&gt; drafts only. Jarvis never sends anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Messages:&lt;/strong&gt; a short WhatsApp or SMS text, not an email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reminders and calls:&lt;/strong&gt; with real time awareness, and a pop-up when they are due.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chat summaries, files, and everything else.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The lazy part:&lt;/strong&gt; I never open a menu or pick a model. I say what I need in my own words, and Jarvis chooses the task types, the order and the model.&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%2Fo3k8hjtqyehe2w7dwvah.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%2Fo3k8hjtqyehe2w7dwvah.png" alt="The Jarvis window" width="800" height="805"&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/p-ZppdSgwmk" 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%2F89h96ikc9b01cnfpuxiz.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%2F89h96ikc9b01cnfpuxiz.png" alt="Command prompt" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the screenshot above, one voice note became four tasks (code, email, chat summary, file) and a morning report in &lt;strong&gt;2 minutes 18 seconds&lt;/strong&gt;. The ping to 8.8.8.8 at the top of the window times out, so the network was down for that run. The spoken summary needs internet, so I tested it separately.&lt;/p&gt;

&lt;p&gt;A second run with a different voice note, start to finish:&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%2Fnnlsqvrw1hvgim45w79x.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%2Fnnlsqvrw1hvgim45w79x.png" alt="The final full run" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second full run: 4 tasks in 2m 44s, the code passed its own tests on the first attempt&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%2Fuz03bnpj16hm6wvhut6q.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%2Fuz03bnpj16hm6wvhut6q.png" alt="The morning report open" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The morning report: what was done, what needs my approval, what needs my help&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%2Fiunb9rp6e3cqumxu5ljt.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%2Fiunb9rp6e3cqumxu5ljt.png" alt="Reminder" width="800" height="793"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A reminder Jarvis set from a voice note, firing on time&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/sunbal822" rel="noopener noreferrer"&gt;
        sunbal822
      &lt;/a&gt; / &lt;a href="https://github.com/sunbal822/Jarvis" rel="noopener noreferrer"&gt;
        Jarvis
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Jarvis: an overnight voice-to-tasks assistant that runs on your own laptop&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Record a voice note before bed. Jarvis turns it into typed tasks, does them while you sleep, and gives you a morning report (and a spoken summary).&lt;/p&gt;

&lt;p&gt;Transcription (faster-whisper) and the thinking (Gemma 3 4B through Ollama) run locally. Nothing is uploaded. The spoken summary uses ElevenLabs and is optional.&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;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Task type&lt;/th&gt;

&lt;th&gt;What Jarvis does&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;code&lt;/td&gt;

&lt;td&gt;Writes the program, runs it, and checks it doesn't crash&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;email&lt;/td&gt;

&lt;td&gt;Drafts only. It never sends anything&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;message&lt;/td&gt;

&lt;td&gt;Writes a short WhatsApp/SMS-style text&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;reminder&lt;/td&gt;

&lt;td&gt;Parses the time with plain code and pops up when it is due&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;chat_summary&lt;/td&gt;

&lt;td&gt;Summarizes a chat you exported into &lt;code&gt;~/jarvis_output/inputs/&lt;/code&gt;&lt;br&gt;
&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;file&lt;/td&gt;

&lt;td&gt;Creates a document or file&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;other&lt;/td&gt;

&lt;td&gt;Questions, explanations, plans&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, then: &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip install faster-whisper ollama pydantic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;For the Jarvis window (&lt;code&gt;jarvis_ui.py&lt;/code&gt;): [CHECK the imports at…&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/sunbal822/Jarvis" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
Try it: python run_overnight.py my_voice.ogg. For a real night, run_nightly.bat is started by Windows Task Scheduler, and the README has the setup steps.

&lt;p&gt;The nightly task in Windows Task Scheduler&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The stack: faster-whisper (small.en) for transcription, Gemma 3 4B through Ollama for task extraction and drafting, Pydantic for strict JSON, ElevenLabs for the spoken morning summary, and plain Python for everything that must never be wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rule behind the whole project:&lt;/strong&gt; the model judges, code guarantees. A 4B model is small enough for my laptop, but it makes confident mistakes. So the model decides what the tasks are, and ordinary code decides what is allowed to stand:&lt;/p&gt;

&lt;p&gt;Reminder times are parsed by plain code, never by the model, so "tomorrow at 3pm" always means exactly that. I wrote 18 tests for the parser, including traps like "he sat down on Friday" (not Saturday) and "around 5 minutes" (not a clock time). All 18 pass.&lt;br&gt;
A validator deletes any reminder time with a day or number the speaker never said, and marks the task "needs clarification" instead of guessing.&lt;/p&gt;

&lt;p&gt;A "summary" only counts as a chat summary if the transcript mentions a chat. A summary of a topic or of emails is a normal task.&lt;/p&gt;

&lt;p&gt;Code written by the model is scanned before it runs. If it uses risky calls (starting programs, the network), Jarvis refuses to run it and tells me.&lt;br&gt;
If step 1 crashes while the OS shuts down a native audio library, the pipeline checks that tasks.json was written and carries on.&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%2Fms75dsav555a0vohfbes.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%2Fms75dsav555a0vohfbes.png" alt="jarvis 18/18 ping" width="800" height="367"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Why such a small model.&lt;/strong&gt; I started with Gemma 12B. My laptop restarted three times mid-run. I switched to the 4B model and a bigger Whisper (small.en, because the small Vosk model heard "let this be" as "August"), then spent the effort on guardrails instead of parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I measured it.&lt;/strong&gt; I recorded real voice notes, transcribed them, and hand-labelled them with the right answers. The final set has 28 spoken to-do lists (21 real voice notes, 7 synthetic).&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%2Fo9t0zs9mt319ghwp86pc.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%2Fo9t0zs9mt319ghwp86pc.png" alt="Table 1" width="780" height="358"&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%2Funog8a0h7wnvd9puy5xb.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%2Funog8a0h7wnvd9puy5xb.png" alt="run 3" width="798" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run 3 looks like a step backwards, and it was. The new rules fixed the wrong answers, but 4 of 28 cases crashed with timeouts, so valid JSON fell to 86%. Fixing that took two more rounds.&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%2Fcj7xatqozwaekxr18d46.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%2Fcj7xatqozwaekxr18d46.png" alt="very first eval (18 cases: 89% exact, 100% reminder time" width="799" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first eval, 18 cases&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%2F3kk9bpdrrv4akkeuaige.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%2F3kk9bpdrrv4akkeuaige.png" alt="The BEFORE results table " width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before: the 28-case baseline results&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%2F5ri5apnzm4yojgamhpay.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%2F5ri5apnzm4yojgamhpay.png" alt="the final run: 100% valid, 100% exact, 100% reminder time, 89% clarification" width="799" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After: the final results, 100% exact task list and 100% reminder time&lt;/p&gt;

&lt;p&gt;A caveat I want to be upfront about: I tuned the rules on these same 28 cases, so the 100% means "I fixed everything I found," not "it will never miss." The clarification flag also dipped slightly (91% to 89%). The harder set exposed what the first 18 hid: reminder times the model made up.&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%2Frmql28pe6lutf3igx5g0.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%2Frmql28pe6lutf3igx5g0.png" alt="final" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was failing, and what I changed. Every row below is a real case from the eval:&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%2Ffzi83sbsgaah471lhj3e.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%2Ffzi83sbsgaah471lhj3e.png" alt="Table 2" width="768" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What the eval taught me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The model invented times&lt;/strong&gt;. "Set a reminder to call my mom" came back as "in 20 minutes". "Remind me on Saturday" came back as "Saturday at 00:00:00". The validator now blanks both and asks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At temperature 0, one transcript can loop forever&lt;/strong&gt;. A transcript with a typo ("Sit a reminder...") made the model count "147, 148, 149..." until it timed out, and temperature 0 means it loops the same way every retry. Now each retry changes the sampling settings, the answer length is capped, and the last attempt adds a repeat penalty and a "keep every field short" hint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bug I shipped.&lt;/strong&gt; My own validator deleted the correct time in "7:00 PM", because it read the "00" as a number the speaker never said. The eval caught it. I would not have found it by looking at a few examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When it said no&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On one run the code task came back &lt;strong&gt;BLOCKED.&lt;/strong&gt; The model wrote a login app that started another program (subprocess), and Jarvis wrote the file, refused to run it, and listed it under "needs your approval." The next run passed on the first attempt, after I told the prompt to build apps as plain functions with in-memory data. Same voice note, same model: the first run was blocked, the second tested clean. That is why the guard exists.&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%2F6nskk7hceh9tq65n1eg0.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%2F6nskk7hceh9tq65n1eg0.png" alt="The BLOCKED lines" width="800" height="494"&gt;&lt;/a&gt;&lt;br&gt;
Jarvis blocking a script that wanted to start another program&lt;/p&gt;

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

&lt;p&gt;Because the whole product is "I tell it everything." My voice, my emails, my assignments, my chats. I will not send that to a closed API every night.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy by design&lt;/strong&gt;. The voice, the transcript, the tasks and the drafts stay on my laptop. The only thing that leaves is the short spoken summary, and it is optional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero marginal cost.&lt;/strong&gt; A nightly assistant on a paid API has a bill that grows every night. Whisper and Gemma cost nothing to run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control over the failure modes.&lt;/strong&gt; With open weights I could cap output length, change sampling on every retry, and build the validator around the exact mistakes this model makes. I couldn't have done the repeat-loop fix through a closed API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody can take it away.&lt;/strong&gt; If a model is deprecated or repriced, my assistant still runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest trade-off: a frontier model would write nicer drafts and need fewer guards. A 4B model needs the guards, and takes about 30 seconds per extraction on my CPU. That is why it fits "Slow and Steady": it works while I sleep, so speed doesn't matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff: What it would have cost me by hand
&lt;/h2&gt;

&lt;p&gt;Four jobs that I estimate would take about 75 minutes by hand. I spent 31 seconds talking, plus about 5 minutes the next morning reading results and filling in two names.&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%2F5movi47vqjn52awelxwz.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%2F5movi47vqjn52awelxwz.png" alt="Lazy payoff chart" width="800" height="415"&gt;&lt;/a&gt;&lt;br&gt;
75 minutes by hand versus 31 seconds of talking and a 1 min 56 s run&lt;/p&gt;

&lt;p&gt;Here is the night, straight from the log. I recorded one 31-second voice note, and Windows Task Scheduler started Jarvis at 11:59 PM. I didn't touch anything.&lt;/p&gt;

&lt;p&gt;23:59:50  Jarvis starts on its own&lt;br&gt;
00:00:34  voice note understood: 4 tasks (44 s)&lt;br&gt;
00:01:06  Python program written, run, and tested   ✔&lt;br&gt;
00:01:13  email drafted, nothing sent               ✔&lt;br&gt;
00:01:13  reminder saved                            ✔&lt;br&gt;
00:01:45  summary written, morning report ready     ✔&lt;br&gt;
Total: 1 minute 56 seconds.&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%2Fonsjqtxv19yj8tzhdakq.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%2Fonsjqtxv19yj8tzhdakq.png" alt="The log of last night's run" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The log of last night's run, start to finish&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%2F3eit134eeeq610d9s9fb.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%2F3eit134eeeq610d9s9fb.png" alt="What Jarvis did, and how long each task took" width="761" height="415"&gt;&lt;/a&gt;&lt;br&gt;
What it would have cost me by hand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Python program, with testing and trial: about 30 minutes&lt;/li&gt;
&lt;li&gt;The email draft: about 10 minutes&lt;/li&gt;
&lt;li&gt;The reminder (on my phone): about 5 minutes&lt;/li&gt;
&lt;li&gt;A short summary in good shape: about 30 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is about 75 minutes. My part was 31 seconds of talking, plus about 5 minutes in the morning to read the results and fill in two names.&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%2Fjunq3ece2mi64x2t3qua.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%2Fjunq3ece2mi64x2t3qua.png" alt=" The morning report, showing 'What I did', 'Needs your approval' and 'Needs your help'" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The morning report: four tasks done, two names left for me to fill in&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%2F6xw4wnmr06aamk7z1fxx.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%2F6xw4wnmr06aamk7z1fxx.png" alt="The prime-number program" width="632" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The program Jarvis wrote, passing its own tests&lt;/p&gt;

&lt;p&gt;And at 8:00 the next morning, the reminder fired on time, and the Jarvis window spoke 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%2F1bg420b4ufvkkzanfgis.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%2F1bg420b4ufvkkzanfgis.png" alt="8 am reminder" width="620" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The 8:00 AM reminder firing, with the voice waveform playing&lt;/p&gt;

&lt;p&gt;It isn't magic. I still read the code before I use it, fill in two names, and fact-check the summary. But the blank-page work, the part I put off, was done before I woke up.&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 4B does the task extraction and drafting, run locally with Ollama, with a code validator around it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; Jarvis speaks the morning summary, what was done and what needs me. Transcription runs locally with Whisper.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>That’s Not the Green I Meant”: A Colour Preview and Quote Tool for Crochet Sellers</title>
      <dc:creator>Sunbal Ghayas</dc:creator>
      <pubDate>Sat, 17 Oct 2026 15:06:29 +0000</pubDate>
      <link>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/thats-not-the-green-i-meant-a-colour-preview-and-quote-tool-for-crochet-sellers-47k8</link>
      <guid>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/thats-not-the-green-i-meant-a-colour-preview-and-quote-tool-for-crochet-sellers-47k8</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;br&gt;
Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I started my crochet business only recently. Within a few weeks of meeting other crochet artists, I noticed we were all losing sleep over the same three problems.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;“Same thing, but in different colours.” A customer sends a reference photo and wants it in other colours. Often they aren’t sure which shade they mean. “Green” could be light green, sage or even olive. We agree in words, and the finished piece arrives weeks later. Sometimes it isn’t what they pictured. Nobody did anything wrong; we just never looked at the same picture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pricing something that doesn’t exist yet. To price a piece I need to know how many grams of yarn it will use and how many hours it will take. I only know that after it’s made, but the customer wants a number today. So we guess, and most of us guess low.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keeping track. Which orders have I agreed to? Which one is due in two days? If I accept one more, does another go late? Spread across chat threads, that is a lot to hold in your head.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I built KARSAZ Stitch Desk, a small web app that handles all three. The seller goes through five steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload the customer’s reference photo and paste their message.&lt;/li&gt;
&lt;li&gt;Say whether they want a colour change.&lt;/li&gt;
&lt;li&gt;Pick the parts of the photo to recolour (petals, leaves, body, trim) and choose the colours, so the customer sees their order before any yarn is cut.&lt;/li&gt;
&lt;li&gt;Enter the size or age, quantity, deadline and any extra changes.&lt;/li&gt;
&lt;li&gt;Get a price, a ready date, a before-and-after picture, a reply message to send, and a quote card the customer can keep.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every quote can be logged as an order. The Orders tab shows what is agreed, what is overdue and what is at risk of being late, and each seller sets their own yarn cost, hourly rate and markup in the Prices tab.&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%2F0czg5wai5ozd1b6aamso.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%2F0czg5wai5ozd1b6aamso.png" alt="KARSAZ Stich Desk" width="749" height="326"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Watch the video:&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt; &lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://karsaz.tech/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fgradio-app%2Fgradio%2Fmain%2Fjs%2F_website%2Fsrc%2Flib%2Fassets%2Fimg%2Fheader-image.jpg" height="414" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://karsaz.tech/" rel="noopener noreferrer" class="c-link"&gt;
            
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          karsaz.tech
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Upload a photo of a crochet item on the &lt;strong&gt;New order&lt;/strong&gt; tab. To see the &lt;strong&gt;Orders&lt;/strong&gt; and &lt;strong&gt;Prices&lt;/strong&gt; tabs, create a test account on the &lt;strong&gt;Account&lt;/strong&gt; tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An honest note:&lt;/strong&gt; the live site runs on a small server, and Gemma photo reading and Smart selection need more memory than it has. I run those on my own computer in the video. On the live site you choose the item by hand and colour parts with automatic colouring or hand-drawn shapes.&lt;/p&gt;

&lt;h2&gt;
  
  
  One order, start to finish
&lt;/h2&gt;

&lt;p&gt;Here’s a real order going through the app. A customer sends a photo of a star baby cocoon and asks for it for a 1-year-old by 18 October. These screenshots were taken on my own computer, where Gemma and Smart selection run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Photo in
&lt;/h3&gt;

&lt;p&gt;A custom order starts the way it does in real life: a reference photo and a message. The seller uploads the photo and pastes in whatever the customer wrote, such as “Want this for a 1 year old in mint green”. The message is optional, because many customers just send a picture.&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%2Flci3835rasmiadcue2qv.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%2Flci3835rasmiadcue2qv.png" alt="Upload the customer’s photo, paste their message, and press Continue." width="800" height="989"&gt;&lt;/a&gt;&lt;br&gt;
On my own computer, Gemma reads the photo and the message to work out which item it is and what the customer asked for. It only identifies. It never produces a price or a date.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Do they want a colour change?
&lt;/h3&gt;

&lt;p&gt;This step is a single question: does the customer want the item in different colours, or exactly as in the photo? If not, the app skips the colour work and goes straight to the details. If yes, it opens the colour screen. It is quick on purpose, because many orders are “exactly this one, please”.&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%2Fgp0r3bx87xyrdahht8d2.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%2Fgp0r3bx87xyrdahht8d2.png" alt="The colour question." width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Choose the colours
&lt;/h3&gt;

&lt;p&gt;This is the step that solves “that’s not the green I meant”. The customer sees their order in the new colours before any yarn is cut. The seller can colour everything at once or one part at a time.&lt;/p&gt;

&lt;h4&gt;
  
  
  Option A:
&lt;/h4&gt;

&lt;p&gt;One tap with a palette. The app suggests palettes made for this kind of item. For a baby cocoon: soft pastel, sunny morning, lavender dream and more. One tap colours every part.&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%2F4zy61z042py0xwijftrq.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%2F4zy61z042py0xwijftrq.png" alt="Palettes made for the kind of item." width="800" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Option B:
&lt;/h4&gt;

&lt;p&gt;Part by part. Clicking a part of the photo, here the hood, selects it. The highlighted area is what will change. Then the seller taps a colour.&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%2Fzwtrg2mrynuf767tfhws.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%2Fzwtrg2mrynuf767tfhws.png" alt="Click a part, then pick a colour." width="799" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If “green” isn’t specific enough, “Any other colour” opens a picker with an exact hex code.&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%2Fwqpcj0rjdl9lk2dexr7s.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%2Fwqpcj0rjdl9lk2dexr7s.png" alt="Pick the exact shade instead of arguing about words" width="800" height="738"&gt;&lt;/a&gt;&lt;br&gt;
The new colour keeps the photo’s own light and shadow, so it still looks like crocheted yarn rather than a flat paint fill.&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%2Fut9i8ifp0oa8120kkzk9.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%2Fut9i8ifp0oa8120kkzk9.png" alt="One part done" width="800" height="638"&gt;&lt;/a&gt;&lt;br&gt;
The customer can see this before any yarn is cut. I picked deliberately loud colours to show that each part is handled separately.&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%2Fjuoeljwv4fy9c610p6id.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%2Fjuoeljwv4fy9c610p6id.png" alt="Five parts coloured" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the selection isn’t perfect. The “Fine-tune” panel lets the seller add area, remove area or draw a shape by hand. The quick-fix buttons (“Colour spilling outside”, “Old colour left at the edge”) adjust the last part. Fixing a rough edge takes a click, not a restart.&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%2Fl6scyzbbhm9ogrq5lpnt.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%2Fl6scyzbbhm9ogrq5lpnt.png" alt="The Fine-tune panel" width="531" height="667"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Size, deadline and details
&lt;/h3&gt;

&lt;p&gt;Now the practical details. The seller confirms the item, then enters the size or age, the quantity, the customer’s deadline and any extra changes, such as “add ears”. Extra changes add a small amount to the hours, and the app uses all of this to calculate the quote. This is the only typing the seller has to do.&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%2Fuib2bvq04e17blqya74l.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%2Fuib2bvq04e17blqya74l.png" alt="Size or age, quantity, deadline and extra changes." width="800" height="1030"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Price, ready date and reply
&lt;/h3&gt;

&lt;p&gt;One button, “Create quote and reply”, and everything comes together on one screen: before and after side by side, the price, the grams and hours, and an estimate of yarn per colour.&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%2Fwq0eakwmgz7dhutmckzn.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%2Fwq0eakwmgz7dhutmckzn.png" alt="The result screen" width="800" height="1024"&gt;&lt;/a&gt;&lt;br&gt;
The part I’m proudest of is the deadline check. The customer wanted this by 18 October. The app tells the seller that the earliest realistic date is 26 October, and explains why: about 7 days of crocheting at 3 hours a day, with only 1 day left. It then drafts a reply with the size in cm, the price and an honest date. The seller can copy it and edit 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%2F22aple3ffhyuon95ze0k.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%2F22aple3ffhyuon95ze0k.png" alt="The deadline warning and the reply draft" width="800" height="474"&gt;&lt;/a&gt;&lt;br&gt;
From here the seller presses “Log this order” or “Make quote card”. The quote card turns the quote into a single image with the shop logo, the customer’s name, before and after side by side, the price and the ready date. It’s easy to send in a chat, and it replaces a long message of numbers.&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%2Fk6jzu2qhnmnuq2tklgz1.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%2Fk6jzu2qhnmnuq2tklgz1.png" alt="The quote card the customer can keep" width="729" height="1013"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  After the five steps: keeping track
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Orders:&lt;/strong&gt; Logged quotes go into the Orders tab. The seller moves each one from Quoted to Pending to In progress to Done, and only Pending and In progress count toward the workload check.&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%2Fi0wekm9lwdfnz1180u51.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%2Fi0wekm9lwdfnz1180u51.png" alt="The Orders tab" width="800" height="743"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prices:&lt;/strong&gt; Every quote comes from numbers the seller sets: yarn cost, hourly rate, markup, rounding and hours per day. Change them once and every future quote follows. My numbers are defaults. Each seller uses their own.&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%2F8z5gc83pixoj957r5fgu.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%2F8z5gc83pixoj957r5fgu.png" alt="The Prices tab" width="800" height="975"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Account:&lt;/strong&gt; Guests can make quotes and previews. An account keeps orders and prices in a private space.&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%2Fc5acs9u0mttp0lfsz8t4.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%2Fc5acs9u0mttp0lfsz8t4.png" alt="Sign in to save your orders and prices." width="800" height="822"&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/sunbal822" rel="noopener noreferrer"&gt;
        sunbal822
      &lt;/a&gt; / &lt;a href="https://github.com/sunbal822/KARSAZ_Stitch_Desk" rel="noopener noreferrer"&gt;
        KARSAZ_Stitch_Desk
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;KARSAZ Stitch Desk&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An order assistant for a crochet business. Upload a customer's reference photo and message, pick the colours on the photo, and get a price, a ready date, a before/after preview, a reply draft and a quote card you can send.&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Photo and message&lt;/strong&gt; – upload the customer's photo and paste what they wrote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colour change?&lt;/strong&gt; – say whether the customer wants different colours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick the colours&lt;/strong&gt; – click each part of the photo and choose its colour (palettes, swatches or a colour picker).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size, deadline, details&lt;/strong&gt; – age or size, quantity, due date, extra changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quote&lt;/strong&gt; – price, ready date, before/after picture, a reply you can copy, and a downloadable quote card.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Other tabs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orders&lt;/strong&gt; – search and filter your orders, change status (Quoted, Pending, In progress, Done, Cancelled), see counts and the month's booked value. Overdue and at-risk orders are flagged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prices&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/sunbal822/KARSAZ_Stitch_Desk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
A quick map of the project:

&lt;ul&gt;
&lt;li&gt;app.py is the web app, with the five steps and the Orders, Prices and Account tabs.&lt;/li&gt;
&lt;li&gt;quote.py holds the pricing and ready-date formulas.&lt;/li&gt;
&lt;li&gt;pipeline.py turns a request into a quote and a reply message.&lt;/li&gt;
&lt;li&gt;extract.py reads the photo and message with Gemma.&lt;/li&gt;
&lt;li&gt;recolor_v5.py does the part-by-part recolouring.&lt;/li&gt;
&lt;li&gt;orders.py and accounts.py handle the order log, deadline checks and sign-in.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Open models do the seeing and the reading. The hardest part of a custom order is turning a reference photo and a vague message into something clear. Three open models do that work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemma 3 (4B), running locally through Ollama, looks at the photo and reads the customer’s message to work out which item it is and what they asked for.&lt;/li&gt;
&lt;li&gt;ISNet cuts the item out of its background, so the app can find its parts.&lt;/li&gt;
&lt;li&gt;Segment Anything lets the seller click a part of the photo and get its exact outline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I gave the models the jobs they are good at, seeing and reading. Prices, weights and dates come from plain Python, so a small model on a laptop is enough, and its mistakes can never reach a customer’s quote.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Open piece&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reading the photo and the customer’s message&lt;/td&gt;
&lt;td&gt;Gemma 3 (4B) through Ollama, running locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cutting the item out of its background&lt;/td&gt;
&lt;td&gt;ISNet (&lt;code&gt;isnet-general-use&lt;/code&gt;) through rembg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Click-to-select on a part of the photo&lt;/td&gt;
&lt;td&gt;Segment Anything through rembg (optional, local)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recolouring&lt;/td&gt;
&lt;td&gt;OpenCV, NumPy and Pillow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The app&lt;/td&gt;
&lt;td&gt;Gradio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The order log&lt;/td&gt;
&lt;td&gt;An ordinary Excel file written with openpyxl&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Render, with a persistent disk&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three design decisions are worth explaining.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Colours come only from the customer’s words. The model’s guess at colours is thrown away. A small parser reads the message (“red flower and green leaves”) and ties each colour to the part it names. If the customer wrote no colours, there are none. Nothing is guessed, so the preview can’t drift from what the customer asked for.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A quote is a formula, not a guess. Each catalogue item has yarn grams, hours and a number of colours. The quote scales them by size, adds a small increase for every extra change the customer asks for, and then applies the seller’s own rates. Here is the default tulip:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Working&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yarn&lt;/td&gt;
&lt;td&gt;80 g × Rs 225 per 100 g&lt;/td&gt;
&lt;td&gt;Rs 180&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Labour&lt;/td&gt;
&lt;td&gt;5 hours × Rs 50&lt;/td&gt;
&lt;td&gt;Rs 250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra colour&lt;/td&gt;
&lt;td&gt;1 extra × Rs 20&lt;/td&gt;
&lt;td&gt;Rs 20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Rs 450&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Rs 450 × 1.4 markup, rounded to the nearest Rs 50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Rs 650&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ready date&lt;/td&gt;
&lt;td&gt;5 hours ÷ 3 hours a day, rounded up, plus 2 spare days&lt;/td&gt;
&lt;td&gt;about 4 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For wearables, the age in months scales the yarn and hours along a size chart, and the reply shows the matching height and chest in centimetres.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The deadline check counts work you have already agreed. The ready date isn’t today plus hours. It starts after your agreed orders. When a new order would push another one past its date, the app says so in plain words, and the Orders tab flags overdue and at-risk jobs. It works through jobs earliest deadline first, which is how a human would plan the week.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recolouring that still looks like yarn. A flat colour fill looks like paint. The “natural lighting finish” keeps the photo’s own light and shadow on the new colour, so the preview looks like real yarn. Parts can be found three ways: automatically by grouping the item’s pixels by colour, by clicking with Smart selection, or by drawing the corners of a shape by hand. A hand-drawn edge follows the drawn line exactly.&lt;/p&gt;

&lt;h3&gt;
  
  
  What went wrong.
&lt;/h3&gt;

&lt;p&gt;The first version only worked on my laptop, with one set of orders. Making it multi-user meant giving each account its own folder for orders and prices, with passwords hashed using PBKDF2.&lt;br&gt;
My first deploy ran out of memory on the smallest paid server. The cause wasn’t the model I expected: even with Smart selection off, cutting the item out of its background loads a second model. I turned Smart selection off by default on the website and gave the server more memory.&lt;/p&gt;

&lt;p&gt;What’s next: a password reset, remembering the sign-in after a page refresh, and a repeat-order shortcut for returning customers.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; A customer’s reference photo and message are personal. Run locally, they never leave the seller’s computer. (The hosted demo does upload photos to its server; the local version is the private one.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; Margins on handmade work are thin. There are no per-photo fees for background removal or for reading a message. A small model on a laptop costs electricity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable:&lt;/strong&gt; The model is one line, MODEL = "gemma3:4b" in extract.py. A seller with a stronger machine can try a bigger one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixable:&lt;/strong&gt; When the app picks a wrong part of a photo, I can read the code and fix it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;I wanted someone who actually sells crochet to try it. A friend of mine runs her own crochet business and asked to stay anonymous. She became the first person outside my laptop to use Karsaz Stitch Desk.&lt;/p&gt;

&lt;p&gt;She had a real customer who wanted a white tulip in a different colour. Normally that means guessing, crocheting, or hours of scrolling on Pinterest, and hoping the customer likes it. Instead she uploaded the photo and tried pink, light blue and purple. Eventually she landed on lilac with green leaves.&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%2Fn841vlbgtn11gzz3ybff.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%2Fn841vlbgtn11gzz3ybff.png" alt="The quote card from that order: lilac and sage, Rs 650, ready by about 24 October" width="800" height="1111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then she wanted to see how far it could actually go. So she uploaded a child frok to see how it goes. This is the result.&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%2Fj9ilhaa9ufw3cwp4etun.jpeg" 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%2Fj9ilhaa9ufw3cwp4etun.jpeg" alt="child frok" width="785" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then to take it up a notch she uploaded a bunny and recoloured the ears, arms and legs separately. &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%2Fp7l48d5xu03acz2bw7pm.jpeg" 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%2Fp7l48d5xu03acz2bw7pm.jpeg" alt="Stress test: every part recoloured on its own." width="799" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I asked what she'd pay. Nothing yet, because this was a trial. But she said she'd consider a monthly subscription if it costs less than Adobe-type tools, mainly to keep her crochet work in one place.&lt;/p&gt;

&lt;p&gt;She also found a weakness. With very blurry or very dark photos, the Segment Anything selection picks objects poorly. It finds roughly the right thing, but not cleanly. The next step is a warning when a photo is too blurry or dark.&lt;/p&gt;

&lt;p&gt;It's one seller and one trial, so I'm not calling it proof. But for a tool I built for my own business, it was a good first real test.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 3 (4B) runs through Ollama on the seller’s own computer, reading the customer’s reference photo and message locally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of Render:&lt;/strong&gt; Render hosts the live app at karsaz.tech and deploys it automatically from GitHub. A persistent disk keeps each seller’s accounts, orders and prices safe, and Render runs the ISNet background-cutting step. Gemma and Smart selection run on my own computer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of a .tech Domain:&lt;/strong&gt; Karsaz_Stitch_Desk is live at &lt;a href="https://karsaz.tech" rel="noopener noreferrer"&gt;https://karsaz.tech&lt;/a&gt;, so anyone can open it and try it without installing anything. The .tech domain gives the project a short, memorable address that fits what it is: a tool built for sellers, with the app served from Render under that name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; The narration for the demo video was generated with ElevenLabs. I wrote the script myself and used an ElevenLabs voice to deliver it, which let me produce a clear, consistent walkthrough of the full flow, from the customer’s photo and message to the seller’s order.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next time a customer says “that’s not the green I meant,” I want it to be before the first stitch, not after the last.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>PIP: a desktop penguin that loves you but hates it when you stay on the desktop for too long</title>
      <dc:creator>Sunbal Ghayas</dc:creator>
      <pubDate>Sun, 11 Oct 2026 10:46:00 +0000</pubDate>
      <link>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/pip-a-desktop-penguin-that-loves-you-but-hates-it-when-you-stay-on-the-desktop-for-too-long-2j</link>
      <guid>https://dev.to/sunbal_ghayas_3a6e9c2c4a7/pip-a-desktop-penguin-that-loves-you-but-hates-it-when-you-stay-on-the-desktop-for-too-long-2j</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%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqkowwbec3rqd1baj7fp.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%2Fnqkowwbec3rqd1baj7fp.PNG" alt="PIP: part pet, part screen monitor whose life mission is to get you to be more active" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Pip is a small, chronically online penguin who lives on your Windows desktop. His life mission is to get you off the screen.&lt;/p&gt;

&lt;p&gt;He tracks how long you've really been at the computer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;30 minutes:&lt;/strong&gt; he raises a hand and nudges you to go outside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;60 minutes:&lt;/strong&gt; he turns red and starts steaming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5 minutes after that:&lt;/strong&gt; he &lt;strong&gt;locks your screen&lt;/strong&gt; until you pick a quest and prove you did it.&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%2Fy8f325j114di96twkyiq.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%2Fy8f325j114di96twkyiq.PNG" alt="Changes of Pip's mood according to how much time you spend" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quests&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outdoors: bring Pip a leaf, a flower, a pebble or some actual grass, take a brisk lap around the block, or sit in the sun (or look at the sky if it's night).&lt;/li&gt;
&lt;li&gt;Indoors: dance, cook, stretch, tidy a corner, or call someone you like.&lt;/li&gt;
&lt;li&gt;Pip is weather-aware. If it's raining, too hot or freezing, he swaps the outdoor quest for an indoor one and tells you why.&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%2F3yjn8tfmhqrryql82ff4.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%2F3yjn8tfmhqrryql82ff4.png" alt="Pip lock if you dont listen" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proof, so you can't just click "done"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Item quests:&lt;/strong&gt; you hold the object up to the camera and a local vision model checks it. Screens and printed pictures are rejected, and &lt;strong&gt;old photos can't be reused&lt;/strong&gt;.&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%2F28qj68g7mlexjzhm1tcd.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%2F28qj68g7mlexjzhm1tcd.png" alt="show pip the wrong thing and it wont accept it" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Activity quests:&lt;/strong&gt; you have to actually be away from the screen. Then Pip asks one specific question about what you did, and a judge model checks your answer against the question, the real weather and the time of day. Saying "it was sunny" at 9pm gets you a stern look.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The rest of Pip&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;He grows bigger with every finished quest and unlocks accessories (scarf, party hat, cape, crown).&lt;/li&gt;
&lt;li&gt;You can customize Pip in many colours, so you feel more connected to him.&lt;/li&gt;
&lt;li&gt;Eye-rest (20-20-20), blink and posture reminders from the webcam.&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%2Fbbcs65wxk7nf2uz3u3y9.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%2Fbbcs65wxk7nf2uz3u3y9.png" alt="Pip telling you to blink" width="799" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A to-do list he checks in on, a journal he writes in his own voice after each quest, and a stats dashboard with streaks.&lt;/li&gt;
&lt;li&gt;Voice chat, with offline listening.&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;h2&gt;
  
  
  Field Test
&lt;/h2&gt;

&lt;p&gt;I took Pip outside and tried to fool him. It's harder than it sounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The leaf quest&lt;/strong&gt;&lt;br&gt;
Pip told me to go for a walk and bring him a leaf.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before I left, I tried showing him a leaf-pattern picture. He said no, that's not a real leaf.&lt;/li&gt;
&lt;li&gt;I went out, did the walk and came back with a piece of bark. Rejected.&lt;/li&gt;
&lt;li&gt;Then I showed him an actual leaf, and only then did he unlock the screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The old-photo test&lt;/strong&gt;&lt;br&gt;
I also tried showing him an old picture instead of going out. He rejected it, because he remembers the pictures he's already accepted and won't take the same one twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trying to trick the vision model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pebble quest:&lt;/strong&gt; I showed him a seashell that looked a lot like a pebble. I expected it to slip through, but he rejected it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grass quest:&lt;/strong&gt; I held up a bunch of leaves piled together. He still rejected it. He worked out that they were leaves, not grass.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What surprised me:&lt;/strong&gt; I thought a 4B model running locally would be easy to fool, especially with look-alikes. It wasn't. It told the difference between a leaf and bark, a pebble and a shell, and grass and a pile of leaves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; the only way to get my screen back was to get up, go outside and bring back the right thing.&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/sunbal822" rel="noopener noreferrer"&gt;
        sunbal822
      &lt;/a&gt; / &lt;a href="https://github.com/sunbal822/PIP-the-desktop-penguin-that-makes-you-touch-grass" rel="noopener noreferrer"&gt;
        PIP-the-desktop-penguin-that-makes-you-touch-grass
      &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 class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Pip: the desktop penguin that makes you touch grass&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Pip is a small, chronically online penguin who lives on your Windows desktop. His one mission is to get you off the screen.&lt;/p&gt;
&lt;p&gt;He tracks how long you've really been at your computer. At 30 minutes he raises a hand and nudges you. At 60 minutes he turns red and starts steaming. Five minutes later he &lt;strong&gt;locks your screen&lt;/strong&gt; until you pick a quest and prove you did it.&lt;/p&gt;
&lt;p&gt;Everything runs locally: the language model, the vision model, speech recognition and the camera checks.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quests:&lt;/strong&gt; outdoor (bring Pip a leaf, flower, pebble or grass, walk around the block, sit in the sun) and indoor (dance, cook, stretch, tidy, call someone).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weather-aware:&lt;/strong&gt; if it's raining, snowing, too hot or freezing, Pip swaps outdoor quests for indoor ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof of quest:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Item quests: hold the object up to the camera and a…&lt;/li&gt;
&lt;/ul&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/sunbal822/PIP-the-desktop-penguin-that-makes-you-touch-grass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Setup instructions are in the README. You need Windows, Python, and &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; with &lt;code&gt;gemma3:4b&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Everything runs on my own Windows PC in a single Python file, with no paid API.&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 it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 3 (4B)&lt;/strong&gt; via &lt;strong&gt;Ollama&lt;/strong&gt;, open-weight&lt;/td&gt;
&lt;td&gt;Pip's personality and replies, the answer judge, and his diary entries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 3 vision&lt;/strong&gt; (same model)&lt;/td&gt;
&lt;td&gt;Looks at the photo you hold up and labels it (leaf, flower, pebble, grass, cup...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vosk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Offline speech-to-text, so I can just talk to Pip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenCV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks whether a face is in view (the "are you really away" test), blink rate and posture, all in memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pyttsx3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Offline voice (with an optional neural voice if &lt;code&gt;edge-tts&lt;/code&gt; is installed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open-Meteo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free weather, no API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tkinter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Draws the see-through penguin and the whole UI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The main lesson from using a small local model: &lt;strong&gt;code decides, the model talks.&lt;/strong&gt; A 4B model is a great character but a bad referee. So the timers, the screen lock, sound effects and the weather sanity check are plain code. Gemma only writes Pip's lines and judges answers inside strict JSON prompts. Verification is layered too: the photo label, then a duplicate-photo check, then screen and printed-picture rejection. If the judge ever crashes, it doesn't punish the user.&lt;/p&gt;

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

&lt;p&gt;Pip watches me through a webcam, listens through a mic, knows my to-do list and writes a diary about my day. I would never want to stream that to a server I don't control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; the language model, vision model, speech recognition and face/blink/posture analysis all run on my machine. The background camera monitor never saves frames. The only photos kept are the ones I deliberately capture as quest proof, and they stay in a local folder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free to run:&lt;/strong&gt; a pet that talks to me all day and looks at my photos would add up to a real bill on a closed API. Locally it costs electricity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can tune it:&lt;/strong&gt; because I own the model, I can re-roll when it repeats its own examples, force JSON judging, and swap in a bigger Gemma with one line if the photo check gets sloppy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline after setup:&lt;/strong&gt; chat, photo checking and voice input need no internet once everything is installed (Vosk downloads its small speech model once, the first time). Only the weather and the optional neural voice need internet.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Pip's brain runs on Gemma 3 (4B) locally through Ollama. Gemma writes Pip's personality and replies, judges whether your answer to his question really holds up, writes his diary entries, and (using its vision ability) checks the photo you hold up to the camera. If the photo check is sloppy, I can swap in a bigger Gemma by changing one line.&lt;/p&gt;

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