<?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: Karishma Das</title>
    <description>The latest articles on DEV Community by Karishma Das (@karishma24).</description>
    <link>https://dev.to/karishma24</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%2F4152597%2F9f4bd016-7c67-490f-a296-c41e22e1a7ef.png</url>
      <title>DEV Community: Karishma Das</title>
      <link>https://dev.to/karishma24</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/karishma24"/>
    <language>en</language>
    <item>
      <title>Hacktober-Fest-In-Peace: A Graveyard for My Dead Bookmarks, Written by a Local AI</title>
      <dc:creator>Karishma Das</dc:creator>
      <pubDate>Sat, 31 Oct 2026 02:14:12 +0000</pubDate>
      <link>https://dev.to/karishma24/hacktober-fest-in-peace-a-graveyard-for-my-dead-bookmarks-written-by-a-local-ai-4bmh</link>
      <guid>https://dev.to/karishma24/hacktober-fest-in-peace-a-graveyard-for-my-dead-bookmarks-written-by-a-local-ai-4bmh</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;I ran a list of 26 old links through a script, and it flagged 15 of them as dead. Then a small AI model on my own laptop wrote a tombstone for each one.&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%2Fs5qynljj0ylwvssb18me.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%2Fs5qynljj0ylwvssb18me.png" alt=" " width="730" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hacktober-Fest-In-Peace&lt;/strong&gt; is a Dead Link Cemetery. You give it your bookmarks (or any list of URLs), and it does four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checks which links are dead.&lt;/li&gt;
&lt;li&gt;Looks each one up in the Wayback Machine to find when it was first and last saved.&lt;/li&gt;
&lt;li&gt;Reads what the old page said, and a local Gemma model writes a two-line epitaph from only those facts.&lt;/li&gt;
&lt;li&gt;Builds a dark, spooky &lt;code&gt;tombstones.html&lt;/code&gt; where every dead link has a gravestone: name, years, cause of death, and a "visit the ghost" link to the archived copy.&lt;/li&gt;
&lt;/ol&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%2Fimrz3cjefnvi1gka0pt2.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%2Fimrz3cjefnvi1gka0pt2.png" alt=" " width="800" height="877"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the theme, I treated websites as things that live and die. Halloween has the graveyard, and Día de los Muertos has the remembering. A bookmark is a small promise that you'll come back to a page someday, and for most pages, nobody ever does. My tool goes back and says goodbye.&lt;/p&gt;

&lt;p&gt;The idea came from a simple fact: every old bookmarks folder is a graveyard nobody has visited.&lt;/p&gt;

&lt;p&gt;I ran it on a demo list of 26 old links (famous dead services plus 6 fake addresses I planted on purpose). It flagged 15 as dead and counted 11 as alive. All 6 planted fakes were caught.&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/Karishma-Das" rel="noopener noreferrer"&gt;
        Karishma-Das
      &lt;/a&gt; / &lt;a href="https://github.com/Karishma-Das/hacktober-fest-in-peace" rel="noopener noreferrer"&gt;
        hacktober-fest-in-peace
      &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;Hacktober-Fest-In-Peace&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Finds your dead bookmarks, digs up their old copies from the Wayback Machine,
and lets a local Gemma model write an epitaph for each one.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Reads a bookmarks export or a list of URLs.&lt;/li&gt;
&lt;li&gt;Checks which links are dead.&lt;/li&gt;
&lt;li&gt;Looks up each dead link in the Wayback Machine.&lt;/li&gt;
&lt;li&gt;A local model (Gemma via Ollama) writes a two-line epitaph.&lt;/li&gt;
&lt;li&gt;Builds &lt;code&gt;tombstones.html&lt;/code&gt;, a gallery of tombstones.&lt;/li&gt;
&lt;/ol&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/222429264/690799657-5d4f6c97-7803-4640-9137-4905e973feca.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTM0NTEyMzIsIm5iZiI6MTc5MzQ1MDkzMiwicGF0aCI6Ii8yMjI0MjkyNjQvNjkwNzk5NjU3LTVkNGY2Yzk3LTc4MDMtNDY0MC05MTM3LTQ5MDVlOTczZmVjYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYxMDMxJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MTAzMVQxMjQ4NTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYjk1MDNhNTJmZjkwMTA2NzcyZGEzNjdiZGIzMDZhNDA0ZDhkY2JmMjljMDY5ZWE1NDJiNDNmMDhjNWU0Y2ZmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.lA_hglUkRBuiEMlf4yV3Pm8ijaRfYJpy6-gdUUqRAKs"&gt;&lt;img width="833" height="913" alt="screenshot" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F222429264%2F690799657-5d4f6c97-7803-4640-9137-4905e973feca.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTM0NTEyMzIsIm5iZiI6MTc5MzQ1MDkzMiwicGF0aCI6Ii8yMjI0MjkyNjQvNjkwNzk5NjU3LTVkNGY2Yzk3LTc4MDMtNDY0MC05MTM3LTQ5MDVlOTczZmVjYS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYxMDMxJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MTAzMVQxMjQ4NTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYjk1MDNhNTJmZjkwMTA2NzcyZGEzNjdiZGIzMDZhNDA0ZDhkY2JmMjljMDY5ZWE1NDJiNDNmMDhjNWU0Y2ZmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.lA_hglUkRBuiEMlf4yV3Pm8ijaRfYJpy6-gdUUqRAKs" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install Python and Ollama, then run: ollama pull gemma3:4b&lt;/li&gt;
&lt;li&gt;pip install requests&lt;/li&gt;
&lt;li&gt;python cemetery.py demo_urls.txt --model gemma3:4b&lt;/li&gt;
&lt;li&gt;Open tombstones.html&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Privacy, honestly&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The AI runs on your own machine. Link checking still contacts each site,
and Wayback lookups send those URLs to archive.org.&lt;/p&gt;
&lt;p&gt;Built for Hacktoberfest Week 5: Ghost in the Machine.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Karishma-Das/hacktober-fest-in-peace" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;One Python file, &lt;code&gt;cemetery.py&lt;/code&gt;, plus a README and the demo list. The only dependency is &lt;code&gt;requests&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Open pieces:&lt;/strong&gt; Gemma (an open-weight model) running locally through Ollama, and the Wayback Machine's public archive. No paid API and no AI account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bookmark export in, link check on every URL, dead ones go to the Wayback Machine for their first and last saved dates and the old page text.&lt;/li&gt;
&lt;li&gt;Gemma gets only those facts and a strict prompt: use only what's below, never invent a name or a year, write two short lines. The cause of death comes from the program, not the model, so the model can't make up how a site died.&lt;/li&gt;
&lt;li&gt;Results are saved in a small cache file, so if a run crashes halfway, rerunning picks up where it stopped.&lt;/li&gt;
&lt;li&gt;The gallery is plain HTML and CSS with no framework, so it opens anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What went wrong:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The dead-or-alive check is not perfect.&lt;/strong&gt; Deciding that a website is dead is harder than it sounds. Some live sites answer slowly or refuse scripts, and some dead brands redirect somewhere else and look alive. The script treats a clear "this page is gone" or "this domain doesn't exist" as the strongest evidence of death.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The AI reads my browsing past on my own machine.&lt;/strong&gt; A bookmarks file shows what you worried about at 2 AM. The text of old pages and the epitaph writing never go to an AI company. &lt;strong&gt;To be honest about the limits:&lt;/strong&gt; checking links still contacts each website, and the Wayback lookups send those URLs to archive.org. The local part is the AI, not the whole pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run,&lt;/strong&gt; however many links I have. A paid API would make me think twice about running 1,000 dead links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can swap the model or change the voice&lt;/strong&gt; (funny, tender, dramatic) by editing one line, without asking a company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works without an AI account,&lt;/strong&gt; and it can't disappear because a service shut down. That fits a project about things that disappeared when companies shut down.&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; Gemma runs locally through Ollama and writes every epitaph, grounded only in facts the program supplies.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
    </item>
    <item>
      <title>Sloth Desk: Paste a Message You’re Avoiding, Get a Checklist (Local Gemma, No Cloud)</title>
      <dc:creator>Karishma Das</dc:creator>
      <pubDate>Sun, 25 Oct 2026 07:22:47 +0000</pubDate>
      <link>https://dev.to/karishma24/sloth-desk-paste-a-message-youre-avoiding-get-a-checklist-local-gemma-no-cloud-jd9</link>
      <guid>https://dev.to/karishma24/sloth-desk-paste-a-message-youre-avoiding-get-a-checklist-local-gemma-no-cloud-jd9</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;&lt;strong&gt;Sloth Desk&lt;/strong&gt; is a one-page tool for the messages you keep putting off. Paste an email, a college notice, a landlord's text or a bill, and it gives you a short checklist: what it is, what you have to do, and every date, time, amount, file requirement and place, in order.&lt;/p&gt;

&lt;p&gt;A real example: a 10-line placement-cell notice becomes five lines. Upload the resume as a PDF under 2 MB by 29 Oct, 5 pm. Attend the Infosys talk on 2 Nov, 10:30 am, in the main auditorium, with your college ID. The eligibility list goes up on 31 Oct. Nobody has to read the whole thing twice.&lt;/p&gt;

&lt;p&gt;It saves the "I'll read this later" effort, and the cost of missing a deadline buried in paragraph four. Anyone who gets long, wordy notices (students, tenants, freelancers, parents) gets to be a little lazier.&lt;/p&gt;

&lt;p&gt;It runs entirely on your own computer. Nothing is uploaded anywhere.&lt;/p&gt;

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

&lt;p&gt;Sloth Desk needs a local Ollama server, so there is no hosted link. Here it is running on two messages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A college placement notice&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%2F757skj4zujoxd7uhxu66.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%2F757skj4zujoxd7uhxu66.png" alt="Sloth Desk decoding a placement notice" width="763" height="913"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A landlord's message (rent change, renewal deadline, water cut)&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%2Feot1msbfbixrj43wmf9o.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%2Feot1msbfbixrj43wmf9o.png" alt="Sloth Desk decoding a rental message" width="748" height="879"&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/Karishma-Das" rel="noopener noreferrer"&gt;
        Karishma-Das
      &lt;/a&gt; / &lt;a href="https://github.com/Karishma-Das/sloth-desk" rel="noopener noreferrer"&gt;
        sloth-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;Sloth Desk&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Paste a message you don't want to deal with (an email, a college notice, a landlord's text, a bill) and get a short checklist of what you need to know and do, with every date, time, amount, file requirement and place.&lt;/p&gt;
&lt;p&gt;Runs fully on your own computer with a local open-weight model (Gemma 3 4B via Ollama). Nothing is uploaded anywhere.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How to run&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; and pull the model
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;ollama pull gemma3:4b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Download &lt;code&gt;index.html&lt;/code&gt; from this repo.&lt;/li&gt;
&lt;li&gt;In the folder with &lt;code&gt;index.html&lt;/code&gt;, serve it (do not double-click it, browsers block it from reaching Ollama):
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;python -m http.server 8000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;http://localhost:8000/index.html&lt;/code&gt;, paste a message, click &lt;strong&gt;Decode it&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the page says it can't reach Ollama, either use step 3 as written, or set &lt;code&gt;OLLAMA_ORIGINS=*&lt;/code&gt; and restart Ollama.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Calls Ollama's &lt;code&gt;/api/chat&lt;/code&gt; with strict JSON output and temperature 0.&lt;/li&gt;
&lt;li&gt;A worked example in the…&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/Karishma-Das/sloth-desk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It is a single &lt;code&gt;index.html&lt;/code&gt; file with no build step, no backend and no API keys.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma 3 4B (open weights), run locally through &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; one HTML file that calls Ollama's &lt;code&gt;/api/chat&lt;/code&gt; on &lt;code&gt;localhost&lt;/code&gt;, asks for strict JSON, and renders the checklist. You can also drag a &lt;code&gt;.txt&lt;/code&gt; file onto the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Making a small model reliable:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Temperature 0, so the same message gives the same answer.&lt;/li&gt;
&lt;li&gt;A worked example inside the prompt, so the model copies the format and style.&lt;/li&gt;
&lt;li&gt;Prompt rules that force every date, time, amount, size and place into the same sentence.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;self-check in code&lt;/strong&gt;: after the model answers, the page scans the original message for dates, times, amounts, sizes and file formats and checks each one made it into the output. If something was dropped, it retries once, naming exactly what was missed. If it is still missing, the page shows a red "Check the original for: …" line instead of giving you silent half-information.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest limits:&lt;/strong&gt; in my testing, Sloth Desk caught roughly 95% of the details in messages. The rest are occasional misses or odd wording, mostly places, items to bring, and contacts, which the code check can't verify. It sometimes adds a filler line (for example a "Contact" line when the message has none). A larger model would likely do better, and the model dropdown lets you try one. Always check the original for anything that matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot:&lt;/strong&gt; [add one or two sentences on how you used Copilot while building.]&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The messages people avoid are the private ones: bills, school notices, landlord chats, legal letters. With a closed API, every one of them would leave your computer and need an API key and a bill. Because Gemma is open-weight and Ollama runs it locally, Sloth Desk works offline, costs nothing per message, and keeps the text on the machine it came from.&lt;/p&gt;

&lt;p&gt;Open weights also let me change the model, rewrite the prompt freely and add my own verification layer. The dropdown picks up whatever models are installed, so anyone can run it with a model that fits their laptop.&lt;/p&gt;

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

&lt;p&gt;[Only keep this if true. Example: "I used it on a real placement notice and a rental message this week. Reading each took ~50seconds; the checklist took about 30–60 seconds on a 4B model on my laptop and gave me the deadlines up front."]&lt;/p&gt;

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

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

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>FreelanceFlow: The AI Book-keeper</title>
      <dc:creator>Karishma Das</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:11:42 +0000</pubDate>
      <link>https://dev.to/karishma24/freelanceflow-the-ai-book-keeper-3h71</link>
      <guid>https://dev.to/karishma24/freelanceflow-the-ai-book-keeper-3h71</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;FreelanceFlow&lt;/strong&gt; is an AI bookkeeper for freelancers that runs entirely on their own computer.&lt;/p&gt;

&lt;p&gt;Freelancers, creators and tiny agencies handle their own money but have no finance team. Receipts are photos, invoices are PDFs, and everything piles up. Many pay an accountant mainly to organize paperwork. A cloud AI tool could do it, but uploading client invoices and bank data to a server you don't control is exactly what a careful freelancer avoids.&lt;/p&gt;

&lt;p&gt;With FreelanceFlow, a freelancer drops in receipt images or PDFs. A local open-weight model reads them. My own validation rules flag anything doubtful. The freelancer fixes the table, downloads a clean CSV for their accountant, and sees a monthly forecast and unusual-spending alerts.&lt;/p&gt;

&lt;p&gt;Who would pay: solo freelancers (designers, developers, writers, tutors) who want privacy and a low price. The target is a small monthly fee of about $5 to $10, far less than an accountant's hourly rate.&lt;/p&gt;

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

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

&lt;p&gt;Project page: &lt;a href="https://karishma-das.github.io/freelanceflow/" rel="noopener noreferrer"&gt;https://karishma-das.github.io/freelanceflow/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app itself runs on the user's laptop (that is the privacy point), so the demo is a video plus a static project page.&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/Karishma-Das" rel="noopener noreferrer"&gt;
        Karishma-Das
      &lt;/a&gt; / &lt;a href="https://github.com/Karishma-Das/freelanceflow" rel="noopener noreferrer"&gt;
        freelanceflow
      &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;FreelanceFlow&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A privacy-first AI bookkeeper for freelancers. A local open-source vision model (Gemma 3 4B via Ollama) reads receipts, my own validation rules flag bad records, and the app exports a clean CSV, shows a forecast and flags unusual spending. Documents are read on your own computer.&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;Upload receipt images (PNG/JPG) or PDFs.&lt;/li&gt;
&lt;li&gt;Gemma extracts amount, date, store name and category.&lt;/li&gt;
&lt;li&gt;Validation rules flag records for human review.&lt;/li&gt;
&lt;li&gt;Edit the table, then download a CSV.&lt;/li&gt;
&lt;li&gt;Forecast next month's income and expenses.&lt;/li&gt;
&lt;li&gt;Alerts for unusual spending.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Results (measured)&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Test set: 7 real receipts of mixed quality (kept private, not in this repo).&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Correct&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Amount&lt;/td&gt;
&lt;td&gt;6/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;4/4 (receipts where the answer key has a date)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Store name&lt;/td&gt;
&lt;td&gt;3/3 (receipts where the answer key has a store name)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Average time per receipt: 179.5 seconds on a laptop CPU (no API cost)&lt;/li&gt;
&lt;li&gt;Flagged for review: 6 of 7&lt;/li&gt;
&lt;li&gt;6…&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/Karishma-Das/freelanceflow" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;Open pieces:&lt;/strong&gt; Gemma 3 (4B, open-weight) running locally through Ollama, with Python, Pydantic, PyMuPDF, pandas, Streamlit and pytest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipeline:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload&lt;/strong&gt; PNG, JPG or PDF. PDF pages are converted to images with PyMuPDF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read.&lt;/strong&gt; Gemma returns structured fields (amount, category, store, date), forced into a Pydantic schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check.&lt;/strong&gt; Rules I wrote myself flag missing dates and store names, zero or negative amounts, future or very old dates, unknown categories, and tax larger than the total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export.&lt;/strong&gt; The user edits the table in Streamlit and downloads a CSV.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan.&lt;/strong&gt; A forecast tab and an alert for any expense more than 3x its category median.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Measured results&lt;/strong&gt; on 7 real receipts of mixed quality (clear, wrinkled, faded, blurry, and a photo of a hand holding a pile of receipts). The receipts are private and not in the repo.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Correct&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Amount&lt;/td&gt;
&lt;td&gt;6/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Date&lt;/td&gt;
&lt;td&gt;4/4 (receipts where the answer key has a date)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Store name&lt;/td&gt;
&lt;td&gt;3/3 (receipts where the answer key has a store name)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flagged for review&lt;/td&gt;
&lt;td&gt;6 of 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time per receipt&lt;/td&gt;
&lt;td&gt;about 180 seconds on a laptop CPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The most useful lesson.&lt;/strong&gt; My first version asked the model for the date directly and got 0 out of 4, because the small model kept answering "null". So I split the job: the model reads the text on the receipt, and plain Python code finds and converts the date. Dates went to 4 out of 4. With a small local model, let the model read and let normal code parse and check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One amount was read as -354.83 instead of 54.83. My "amount must be positive" rule flagged it.&lt;/li&gt;
&lt;li&gt;An unreadable receipt still got an amount and a made-up store name. Validation flagged it only for a missing date, so it does not catch a confidently wrong store name yet.&lt;/li&gt;
&lt;li&gt;Store names were missed on three receipts.&lt;/li&gt;
&lt;li&gt;My first answer key was wrong: I had typed a store's slogan as its name. The model was right, so I fixed the key.&lt;/li&gt;
&lt;li&gt;It is slow, about 3 minutes per receipt on a CPU. The app can load saved results for demos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Forecast, honestly.&lt;/strong&gt; The forecast tab uses a 3-month average as its baseline, with TabPFN wired in as the model to try first. I did not get TabPFN's local license login working in time, so every forecast in my demo used the average fallback, tested on a synthetic 18-month history, not real data. The code reports which method actually ran.&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; Gemma reads each document on the user's machine, so receipts never reach a server. For a bookkeeping tool, that is the main selling point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; There is no per-document API fee, so a cheap subscription can still work as a side hustle. Cost per document in my tests was zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in.&lt;/strong&gt; The model name is a single line in the code. If a better open model appears, I swap it, and I am not tied to someone else's pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline.&lt;/strong&gt; The sensitive step, extraction, needs no internet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not benchmark against a closed API, so I won't claim it is more accurate. My claim is narrower: for this job, privacy and cost matter as much as accuracy, and open models let me keep both.&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 runs locally through Ollama and does all the document reading.
&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%2F1fflulkec1rv43jozapu.png" alt=" " width="800" height="624"&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Porchlight: a local AI outdoor coach that fits your body and your day</title>
      <dc:creator>Karishma Das</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:25:38 +0000</pubDate>
      <link>https://dev.to/karishma24/porchlight-a-local-ai-outdoor-coach-that-fits-your-body-and-your-day-559c</link>
      <guid>https://dev.to/karishma24/porchlight-a-local-ai-outdoor-coach-that-fits-your-body-and-your-day-559c</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Porchlight is a small outdoor coach that runs on your own computer. You answer a few questions once: how far you can comfortably go from home, whether stairs are a problem, whether heat bothers you, and what you have at home (a window, balcony, doorstep or yard). After that, each time you run it you say how many minutes you have and how your energy is, and it gives you one small mission. For example: stand on the balcony, close your eyes and listen for three sounds.&lt;/p&gt;

&lt;p&gt;I built it because the usual "go outside" ideas assume you can hike, jog or get to a trail. Porchlight is for people who can't do that: older adults, people with limited mobility or low vision, people who struggle in the heat, or anyone who just has five minutes and a doorstep.&lt;/p&gt;

&lt;p&gt;The mission shows up in the terminal and as a page with large text that you can read or print, so the screen part stays short. Then you put the laptop down and go.&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%2Ft8jgi3ezcbdv7veb8ena.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%2Ft8jgi3ezcbdv7veb8ena.png" alt=" " width="800" height="899"&gt;&lt;/a&gt;&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%2Fx5qnm4tgv5krzj2ppxns.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%2Fx5qnm4tgv5krzj2ppxns.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&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%2Fx3eg97n7karmgfnmnlwu.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%2Fx3eg97n7karmgfnmnlwu.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&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%2Fzotuk47uf76ny42n3t5f.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%2Fzotuk47uf76ny42n3t5f.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&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%2Fzi09iqrjswown5eku3vw.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%2Fzi09iqrjswown5eku3vw.png" alt=" " width="799" height="467"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Porchlight demo site.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Video:&lt;/strong&gt; the real app running on my laptop, followed by the demo site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=047kle42H9M" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=047kle42H9M&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo site:&lt;/strong&gt; &lt;a href="https://karishma-das.github.io/porchlight/" rel="noopener noreferrer"&gt;https://karishma-das.github.io/porchlight/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The site is only a demo. The real app runs locally with a local model. The "Try the guard" part of the site uses hand-written sample suggestions, not a live AI.&lt;/p&gt;

&lt;p&gt;Here is a real run of the app on my laptop (I shortened the file path on the "Large-print card" line):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python porchlight.py

=== Porchlight (local model: gemma3:4b) ===
How many minutes do you have? [10]: 15
Is your energy low today? (y/n) [n]: n
Is it hot outside right now? (y/n) [n]: n

Thinking, locally...

Doorstep Reflection  [doorstep, ~15 min]
  1. Stand on your doorstep, feeling the ground beneath your feet.
  2. Close your eyes and listen to the sounds around you – birds, traffic, the wind.
  3. Take a few deep breaths, noticing the rhythm of your own body and the quiet of the moment.

Large-print card: porchlight_card.html

Go outside. Press Enter when you're back...
One line: how did it go?: I had 15 minutes free and felt normal, so Porchlight suggested "Doorstep Reflection." I went outside and stood near my house for 15 minutes. I heard birds singing, leaves moving in the wind, and cars passing by. At first, it felt a little strange to stand quietly, but soon I felt peaceful and enjoyed the sounds around me.
Saved your note.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Karishma-Das" rel="noopener noreferrer"&gt;
        Karishma-Das
      &lt;/a&gt; / &lt;a href="https://github.com/Karishma-Das/porchlight" rel="noopener noreferrer"&gt;
        porchlight
      &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;Porchlight: touch grass at your own pace&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Most "go outside" apps assume you can hike, jog or walk a mile. Porchlight is for everyone else: older adults, people with limited mobility or low vision, people recovering from illness, or anyone with five minutes and a doorstep.&lt;/p&gt;

&lt;p&gt;It runs an &lt;strong&gt;open-weight model (Gemma via Ollama) entirely on your own computer&lt;/strong&gt;. No cloud API, no API keys, no accounts, no &lt;code&gt;pip install&lt;/code&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;


&lt;ol&gt;

&lt;li&gt;Answer a few questions once (how far you can go, stairs, heat, vision, what you have at home). They are saved only in a local file.&lt;/li&gt;

&lt;li&gt;Each day, say how much time and energy you have.&lt;/li&gt;

&lt;li&gt;The local model suggests a tiny outdoor mission (a balcony, a doorstep, a window, or a short walk).&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;The model suggests, the code decides.&lt;/strong&gt; Every suggestion is checked against your hard limits (distance, stairs, heat, time, no strenuous words)…&lt;/li&gt;

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


&lt;p&gt;To run it you need Python 3 and &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. No pip installs and no API keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama pull gemma3:4b
python porchlight.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main files are &lt;code&gt;porchlight.py&lt;/code&gt; (the app and the guard), &lt;code&gt;card.py&lt;/code&gt; (the page), &lt;code&gt;test_guard.py&lt;/code&gt; (a test for the guard) and &lt;code&gt;index.html&lt;/code&gt; (the demo site).&lt;/p&gt;

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

&lt;p&gt;The model is Gemma (&lt;code&gt;gemma3:4b&lt;/code&gt;), running locally through Ollama. The app is plain Python using only the standard library, and it talks to Ollama's local HTTP API.&lt;/p&gt;

&lt;p&gt;The idea I built around is that the model suggests and the code decides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The model is asked to reply with a small JSON object: a title, a place, minutes, distance, whether it needs stairs, sun or shade, and exactly three steps.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;validate&lt;/code&gt; function checks that reply against the person's limits: the places they have, their minutes, their distance, stairs, direct sun on a hot day, and a short blocklist of words like run, climb, hike and barefoot.&lt;/li&gt;
&lt;li&gt;If a reply breaks a rule, it is rejected and the model is asked again, with the reason included. After three failed tries, the app uses a built-in safe mission instead.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;card.py&lt;/code&gt; writes the page as one offline HTML file. The default look is purple, and there is a high-contrast, large-text mode for low vision.&lt;/li&gt;
&lt;li&gt;The profile and the history are plain JSON files on your computer, and they are kept out of the repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How I tested it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In my real runs with my own profile (150 m, no stairs, 15 minutes), Gemma followed the rules every time, so the guard never had to reject anything. To check that the guard works anyway, &lt;code&gt;test_guard.py&lt;/code&gt; runs six hand-written suggestions through the same &lt;code&gt;validate&lt;/code&gt; function for three made-up test profiles. No model is used. The result was 6 accepted and 12 rejected, and the same suggestion can pass for one profile and fail for another. For example, a doorstep breathing mission is fine for someone who can walk 150 m, but it is rejected for someone who can't leave home. The guard on the demo site is a JavaScript copy of the same rules. The test profiles are not real users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taking it outside&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I did two missions outside. The first was "Doorstep Reflection" (the run above): I stood near my house for 15 minutes and heard birds, leaves and cars. It felt strange for the first few minutes, then it felt peaceful. The second was "Balcony Breathing": I spent about 15 minutes on my balcony, looked at the view and took slow, deep breaths. I felt relaxed afterwards. That is one person's two outings, not a test of any health benefit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What went wrong&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In my first run, the model told me to stand barefoot on the doorstep. That can be unsafe for some people (hot or rough ground), and the guard let it through because it wasn't a rule yet. I added "barefoot" to the blocklist.&lt;/li&gt;
&lt;li&gt;In the balcony run, step 2 told me to close my eyes and focus on the colours I could see, and step 3 just said to repeat for 15 minutes. The guard accepted it, because it checks safety limits and not whether the instructions make sense. I haven't built a second check for that.&lt;/li&gt;
&lt;li&gt;The model is slow on my laptop, especially on the first run.&lt;/li&gt;
&lt;li&gt;Porchlight doesn't assess anyone's health and isn't medical advice.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;What someone can physically manage is personal information. With an open-weight model running through Ollama, that profile and the history stay in two local files on the person's own computer. There is no account, no API key and no server holding it. A closed API would have meant sending someone's limits to a server they don't control.&lt;/p&gt;

&lt;p&gt;It also costs nothing to run. Because I ran the model myself and could read its raw reply, I was able to wrap it in a guard and send a rejected answer back with the reason. The model can be swapped with one setting (&lt;code&gt;PL_MODEL&lt;/code&gt;), though I only used &lt;code&gt;gemma3:4b&lt;/code&gt;. It will work without internet once the model is downloaded.&lt;/p&gt;

&lt;p&gt;The trade-off is that a small local model is slower and sometimes gives odd suggestions, which is why the guard exists.&lt;/p&gt;

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

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

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