<?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: Himanshu Nikam</title>
    <description>The latest articles on DEV Community by Himanshu Nikam (@himanshu_1817).</description>
    <link>https://dev.to/himanshu_1817</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%2F4150292%2F06a1a1f2-d906-4b04-a13b-2cdc397788ea.jpeg</url>
      <title>DEV Community: Himanshu Nikam</title>
      <link>https://dev.to/himanshu_1817</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/himanshu_1817"/>
    <language>en</language>
    <item>
      <title>SleepIn: Because I Refuse to Scroll 500 Unread Group Chat Messages Every Morning</title>
      <dc:creator>Himanshu Nikam</dc:creator>
      <pubDate>Fri, 23 Oct 2026 18:43:23 +0000</pubDate>
      <link>https://dev.to/himanshu_1817/sleepin-because-i-refuse-to-scroll-500-unread-group-chat-messages-every-morning-25gn</link>
      <guid>https://dev.to/himanshu_1817/sleepin-because-i-refuse-to-scroll-500-unread-group-chat-messages-every-morning-25gn</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I often wake up to hundreds of unread messages across family, friends, and apartment group chats.&lt;/p&gt;

&lt;p&gt;Most are greetings, stickers, forwards, cricket debates, and parking arguments. Somewhere in that noise, however, Mom may have asked me to call or tonight’s plan may have moved to Saturday.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;SleepIn&lt;/strong&gt; so I can find those two important messages without reading the other 500.&lt;/p&gt;

&lt;p&gt;Drop in WhatsApp or Telegram chat exports, enter your name, and SleepIn produces a private morning digest such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rahul’s birthday moved to Saturday, Mom wants you to call, nothing else matters.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The result is divided into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What matters:&lt;/strong&gt; Direct requests, changed plans, deadlines, money, health, and family updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What can wait:&lt;/strong&gt; Everything that does not require my attention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every result includes the relevant group name. Senders retain the name—or unsaved phone number—found in the original export.&lt;/p&gt;

&lt;p&gt;It is essentially a permission slip to mute every group chat and sleep peacefully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Favgzavdgdni75d18v4tb.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%2Favgzavdgdni75d18v4tb.png" alt="SleepIn morning digest" width="799" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/neoquantx" rel="noopener noreferrer"&gt;
        neoquantx
      &lt;/a&gt; / &lt;a href="https://github.com/neoquantx/SleepIn" rel="noopener noreferrer"&gt;
        SleepIn
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Sleep in. A local AI reads last night's WhatsApp and Telegram group chats and gives you the two lines that matter. Runs fully offline with Ollama.
    &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;SleepIn&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;I'm in a family group, a friends group and a society group, and every morning there are a few hundred unread messages waiting. Usually only two of them matter. So I made SleepIn: you give it last night's WhatsApp or Telegram export, a small open-weight model running on your own laptop reads everything, and you get something like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rahul's birthday moved to Saturday, mom wants you to call, nothing else matters.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/neoquantx/SleepIn/docs/digest.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fneoquantx%2FSleepIn%2FHEAD%2Fdocs%2Fdigest.png" alt="SleepIn digest for the sample chats"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Everything runs on your machine. The chat file is parsed in the browser and the summary comes from Ollama on localhost. No cloud API, no login, no analytics (Next.js telemetry is switched off in the npm scripts too). That was the whole point. I'm not uploading my mom's messages anywhere.&lt;/p&gt;
&lt;p&gt;Made for Week 3 of the Hacktoberfest Open-Source AI Challenge, "Slow and Steady" (International Sloth Day). The model does the catching up overnight, you stay in bed.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Running&lt;/h2&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/neoquantx/SleepIn" 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;SleepIn uses &lt;strong&gt;Next.js 16&lt;/strong&gt;, &lt;strong&gt;TypeScript&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, &lt;strong&gt;shadcn/ui&lt;/strong&gt;, and &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The processing flow is intentionally simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user exports a WhatsApp &lt;code&gt;.txt&lt;/code&gt; file or Telegram &lt;code&gt;result.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;SleepIn parses the export and filters the selected time window.&lt;/li&gt;
&lt;li&gt;A local open-weight model reads each group separately.&lt;/li&gt;
&lt;li&gt;The app combines only the important results into one short digest.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;WhatsApp exports differ between Android and iPhone, so I created a parser that handles both formats, multiline messages, 12/24-hour timestamps, media placeholders, deleted messages, and system notices. The Telegram parser supports individual chats and full-account JSON exports.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why one chat at a time?
&lt;/h3&gt;

&lt;p&gt;My first version sent every group to the model at once. A small 3B model sometimes mixed up conversations, treated jokes as important, or attached a message to the wrong group.&lt;/p&gt;

&lt;p&gt;The improved version processes one group at a time and requests structured JSON containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A short headline&lt;/li&gt;
&lt;li&gt;An importance score&lt;/li&gt;
&lt;li&gt;Items that matter&lt;/li&gt;
&lt;li&gt;Items that can wait&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is slower, but significantly more reliable—which fits the &lt;strong&gt;Slow and Steady&lt;/strong&gt; theme perfectly.&lt;/p&gt;

&lt;p&gt;I also added guardrails around the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Names and places absent from the source chat are rejected.&lt;/li&gt;
&lt;li&gt;A group needs evidence such as a direct mention, request, or changed plan before reaching the main digest.&lt;/li&gt;
&lt;li&gt;Later messages override earlier plans.&lt;/li&gt;
&lt;li&gt;If Ollama is unavailable, demo mode still lets people try the complete experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SleepIn defaults to &lt;code&gt;llama3.2&lt;/code&gt;, while also supporting locally installed models such as Qwen, Gemma, Mistral, and Phi.&lt;/p&gt;

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

&lt;p&gt;Private group conversations can contain phone numbers, home addresses, health updates, financial details, and family information. Uploading all of that to a closed cloud API did not feel responsible.&lt;/p&gt;

&lt;p&gt;With Ollama and open-weight models, SleepIn can run on the user’s own computer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat files are parsed locally.&lt;/li&gt;
&lt;li&gt;Inference runs through Ollama on &lt;code&gt;localhost&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;No messages are sent to a cloud AI provider.&lt;/li&gt;
&lt;li&gt;There are no API keys, subscriptions, accounts, or per-token charges.&lt;/li&gt;
&lt;li&gt;Users can change the model instead of being locked to one provider.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cloud model might respond faster, but this project does not need instant output. Taking around a minute to privately process hundreds of overnight messages is a trade-off I am happy to make.&lt;/p&gt;

&lt;p&gt;In SleepIn, being slow is not a limitation. It is part of the privacy model.&lt;/p&gt;

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

&lt;p&gt;I created three reproducible sample conversations representing a realistic morning inbox:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A friends group where Rahul’s birthday moves to Saturday&lt;/li&gt;
&lt;li&gt;A family group where Mom asks for a call&lt;/li&gt;
&lt;li&gt;A residents group full of parking arguments and a temporarily lost cat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, they contain roughly &lt;strong&gt;520 messages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Reading them manually could take 10–15 minutes—and I might still miss the final venue change. SleepIn processes them while I make coffee and returns the two lines that deserve my attention.&lt;/p&gt;

&lt;p&gt;That is the payoff: less scrolling, fewer missed plans, and a few extra minutes in bed.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overall Challenge:&lt;/strong&gt; SleepIn is entered for the overall prize of &lt;strong&gt;$250 USD, DEV++ membership, and the exclusive winner badge&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partner Categories:&lt;/strong&gt; Github Colipot .&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Simmer: Snap Your Fridge, Get 3 Recipes</title>
      <dc:creator>Himanshu Nikam</dc:creator>
      <pubDate>Sun, 18 Oct 2026 16:18:43 +0000</pubDate>
      <link>https://dev.to/himanshu_1817/simmer-snap-your-fridge-get-3-recipes-11ph</link>
      <guid>https://dev.to/himanshu_1817/simmer-snap-your-fridge-get-3-recipes-11ph</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;My flatmate asks the same question almost every day: what should we eat? Before breakfast, before dinner, and on holidays every few hours. The fridge usually has enough in it. The hard part is deciding.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Simmer&lt;/strong&gt;. You snap a photo of your fridge or type what you have, pick the meal (breakfast, lunch, a snack, or dinner), and Simmer gives you exactly three recipes you can make right now. Each one has short steps and a "need to buy" list, and the three are ranked by how little extra shopping they need. One tap copies that list.&lt;/p&gt;

&lt;p&gt;Who would pay for this? Students and young professionals living away from home, people sharing a flat, anyone who opens the fridge, stares at it, and orders food anyway. It's a small problem that comes back every day, so the price is small too: three meals are free, then ₹99 for the whole year. No account, and no monthly plan to remember to cancel.&lt;/p&gt;

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

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

&lt;p&gt;In the video: a fridge photo turns into a list of ingredients, I pick dinner, and three recipes come back. After the third free meal, the yearly offer shows a UPI QR. The buyer pastes their UTR and email, I check the payment in my UPI app and switch it to Paid on the admin page, and a PDF receipt lands in their inbox.&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/neoquantx" rel="noopener noreferrer"&gt;
        neoquantx
      &lt;/a&gt; / &lt;a href="https://github.com/neoquantx/simmer" rel="noopener noreferrer"&gt;
        simmer
      &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;Simmer&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Snap your fridge. Get three doable recipes for the next meal.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Simmer reads a photo of your fridge, or the ingredients you type, and suggests exactly three recipes for breakfast, lunch, a snack, or dinner. Each recipe lists the steps and a short "need to buy" list, ranked by how little extra shopping it asks for.&lt;/p&gt;
&lt;p&gt;The model runs locally through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; (Gemma 3 4B). A fridge photo is not sent to a paid vision API, and that is why the yearly price can be small.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Try 3 meals free. Then ₹99 for the year.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12" rel="nofollow"&gt;DEV Hacktoberfest Open-Source AI Challenge, Week 2: Side Hustle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/neoquantx/simmer/docs/screenshots/01-landing.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fneoquantx%2Fsimmer%2FHEAD%2Fdocs%2Fscreenshots%2F01-landing.png" alt="Simmer landing page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#screenshots" rel="noopener noreferrer"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#tech-stack" rel="noopener noreferrer"&gt;Tech stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#requirements" rel="noopener noreferrer"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#configuration" rel="noopener noreferrer"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#using-simmer" rel="noopener noreferrer"&gt;Using Simmer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#free-meals-and-payments" rel="noopener noreferrer"&gt;Free meals and payments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#install-on-a-phone" rel="noopener noreferrer"&gt;Install on a phone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#api-reference" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#project-structure" rel="noopener noreferrer"&gt;Project structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#going-live" rel="noopener noreferrer"&gt;Going live&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#known-limits" rel="noopener noreferrer"&gt;Known limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#privacy" rel="noopener noreferrer"&gt;Privacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#challenge-timeline" rel="noopener noreferrer"&gt;Challenge timeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoquantx/simmer#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;Four meals.&lt;/strong&gt; Breakfast, lunch, snacks…&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/neoquantx/simmer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The whole app runs on one open-weight model: &lt;strong&gt;Gemma 3 4B&lt;/strong&gt;, served locally through &lt;strong&gt;Ollama&lt;/strong&gt;. The same model reads the fridge photo and writes the recipes, so there's no separate vision service.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, Vite and Tailwind, installable on a phone as a PWA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; FastAPI. It builds the prompt from your ingredients, the meal, your dislikes, and limits like "15 minutes" or "veg only", then asks Gemma for strict JSON with exactly three recipes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; MongoDB Atlas stores each kitchen's session, pantry, saved recipes, suggestion history and payment claims. There's no login; a private cookie remembers your kitchen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; a UPI QR for ₹99, a form for the UTR and email, a password-protected admin page with a Paid switch, and a PDF receipt sent by email.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The photo step taught me the most. My first version simply asked Gemma to list the ingredients in the photo. I tested it with a screenshot of a chat window, and it confidently returned tomato, cheese, onion, garlic, bread and potato. Asking "is this food?" didn't help either, because the question itself pushed it towards food. What worked was asking it first to describe, in one plain sentence, what is actually in the picture. If that sentence doesn't sound like a fridge, a counter or a plate, Simmer stops and asks for a real photo. Only then does it ask for ingredients, and you still confirm the list before cooking.&lt;/p&gt;

&lt;p&gt;Speed was the other lesson. On my 8 GB MacBook Air, one suggestion takes about a minute (around 10 tokens a second) and a photo takes 10 to 30 seconds. I raised the timeout and told Ollama to keep the model loaded between requests, so the next person doesn't have to wait for it to load again.&lt;/p&gt;

&lt;p&gt;The prompt is written for an Indian home kitchen: rice, dal, eggs, onion, roti, leftovers. It's told not to suggest things like tahini or truffle oil unless you already have them, and never to talk about calories.&lt;/p&gt;

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

&lt;p&gt;It's the reason the price can be ₹99.&lt;/p&gt;

&lt;p&gt;A paid vision API charges for every image. A Simmer user might send a fridge photo every day, sometimes three times a day. Paying per call would either eat the whole ₹99 or force a monthly plan, which nobody wants for a "what's for dinner" app. With Gemma running on my own machine, a photo costs electricity, not an API bill.&lt;/p&gt;

&lt;p&gt;It also keeps the fridge private. A photo of your fridge says a lot about how you live. With a local model, that photo goes only to the computer running Simmer, and Simmer doesn't store it.&lt;/p&gt;

&lt;p&gt;And I'm not locked in. The model is one line in a config file. If a better small open model comes out next month, I can swap it in without rewriting the app or agreeing to someone's new pricing.&lt;/p&gt;

&lt;p&gt;To be fair to closed models: a large hosted vision model would read a messy fridge more accurately, and it would answer faster. A 4B model sometimes misses a jar or names something wrong. I designed around that instead of hiding it: the scene check, the "check these before adding" step, and recipes that lean on staples you almost certainly have.&lt;/p&gt;

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

&lt;p&gt;My first user was my flatmate, the same person who gave me the idea. He's the one asking "what should we eat?" every day, and on holidays it's breakfast, lunch, snacks and dinner. He used Simmer on his own to answer that question.&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, running locally through Ollama, is the core of Simmer. It reads the fridge photo and writes all three recipes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of MongoDB Atlas:&lt;/strong&gt; Atlas is the data layer behind the app: kitchen sessions, the free-meal count, pantries, the recipe box, suggestion history and UPI payment claims.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Your Next AI Chat Is Earned Outside</title>
      <dc:creator>Himanshu Nikam</dc:creator>
      <pubDate>Sun, 11 Oct 2026 21:30:46 +0000</pubDate>
      <link>https://dev.to/himanshu_1817/your-next-ai-chat-is-earned-outside-3nhb</link>
      <guid>https://dev.to/himanshu_1817/your-next-ai-chat-is-earned-outside-3nhb</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;I didn't want to build another app that simply tells people to go outside. I wanted to try something different: make the AI itself the reward.&lt;/p&gt;

&lt;p&gt;Touch Grass is an Android app where you earn tokens by walking and completing outdoor missions. Those tokens unlock a small AI companion that runs locally on your phone. When your balance reaches zero, you need to get back outside and complete more activities to earn tokens.&lt;/p&gt;

&lt;p&gt;Each day, the app gives you different ways to get outside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GO:&lt;/strong&gt; Visit a nearby green space and check in to earn 500 tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LOOK:&lt;/strong&gt; Find something outdoors, such as a yellow flower or an interesting shadow, and photograph it to earn 300 tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LEARN:&lt;/strong&gt; Explore a nearby landmark or tree, check in, take a photo, and read what the map says about it to earn 700 tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Walking also earns 100 tokens for every 250 metres, up to 5 km per day. The app tracks progress through its history screen, daily streaks, and badges.&lt;/p&gt;

&lt;p&gt;The idea is simple: give people a reason to use their phones for something useful, then encourage them to put the phone away and explore the world around them.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Video walkthrough:&lt;/strong&gt; The video will show the initial setup, airplane mode, the locked AI chat, outdoor missions, and the AI companion working after earning tokens.&lt;/p&gt;


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


&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://github.com/neoquantx/Touch_Grass/releases/latest/download/app-release.apk" rel="noopener noreferrer"&gt;Download the Android APK&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The app requires an Android ARM64 device. The first setup downloads the AI model, approximately 470 MB, and nearby map data, so Wi-Fi is recommended. This testing build is signed with a debug key.&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/neoquantx" rel="noopener noreferrer"&gt;
        neoquantx
      &lt;/a&gt; / &lt;a href="https://github.com/neoquantx/Touch_Grass" rel="noopener noreferrer"&gt;
        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;🌱 Touch Grass&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Stop doomscrolling. Touch actual grass. Earn free on-device AI tokens.&lt;/strong&gt;&lt;br&gt;
A 100% offline, privacy-first mobile exploration game that trades physical footsteps for local AI compute.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📸 Screenshots &amp;amp; Visual Tour&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Here is what &lt;strong&gt;Touch Grass&lt;/strong&gt; looks like in action:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;1. Setup &amp;amp; Model Download&lt;/th&gt;
&lt;th&gt;2. Daily Quests (&lt;code&gt;Today&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;3. Offline AI (&lt;code&gt;Companion&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;4. Field Journal&lt;/th&gt;
&lt;th&gt;5. Stats &amp;amp; Badges (&lt;code&gt;History&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/neoquantx/Touch_Grass/docs/screenshots/setup.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fneoquantx%2FTouch_Grass%2FHEAD%2Fdocs%2Fscreenshots%2Fsetup.png" width="185" alt="Setup Screen"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/neoquantx/Touch_Grass/docs/screenshots/today.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fneoquantx%2FTouch_Grass%2FHEAD%2Fdocs%2Fscreenshots%2Ftoday.png" width="185" alt="Today Screen"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/neoquantx/Touch_Grass/docs/screenshots/companion.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fneoquantx%2FTouch_Grass%2FHEAD%2Fdocs%2Fscreenshots%2Fcompanion.png" width="185" alt="Companion Screen"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/neoquantx/Touch_Grass/docs/screenshots/journal.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fneoquantx%2FTouch_Grass%2FHEAD%2Fdocs%2Fscreenshots%2Fjournal.png" width="185" alt="Journal Screen"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/neoquantx/Touch_Grass/docs/screenshots/history.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fneoquantx%2FTouch_Grass%2FHEAD%2Fdocs%2Fscreenshots%2Fhistory.png" width="185" alt="History Screen"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;One-time Wi-Fi model grab &amp;amp; OSM area cache&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;GO / LOOK / LEARN daily quest cards&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Private Qwen 0.5B LLM — 1 token per token&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Scrapbook with geotags &amp;amp; proof photos&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;14-day activity chart &amp;amp; 9 Grass Badges&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 Why This Exists&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;The Problem&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Laptop Trap:&lt;/strong&gt; Developers, engineers, and students are glued to screens 12+ hours a day. Zero sunlight, zero movement, pure burnout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The $20/month AI Tax:&lt;/strong&gt; ChatGPT Plus, Claude Pro, and cloud API tokens are expensive. If you…&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/neoquantx/Touch_Grass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The source code is available on GitHub under the MIT License. The README includes the setup and build instructions.&lt;/p&gt;

&lt;p&gt;The project also includes checks that can be run with Node.js. For example, &lt;code&gt;node scripts/check_missions.js&lt;/code&gt;. The full set of checks is listed in &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The model.&lt;/strong&gt; I built the app with React Native and Expo using JavaScript. The AI runs locally on the phone through &lt;code&gt;llama.rn&lt;/code&gt;, which connects React Native to &lt;code&gt;llama.cpp&lt;/code&gt;. The model is Qwen2.5-0.5B-Instruct, quantized as a Q4_K_M GGUF file of approximately 470 MB.&lt;/p&gt;

&lt;p&gt;I benchmarked different thread counts on a release build using a 64-token completion:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;Tokens/sec&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;21.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;30.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;37.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;22.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;26.8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four threads gave the best result in my test. Six threads were actually slower than three, which surprised me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The map.&lt;/strong&gt; During setup, the app retrieves nearby OpenStreetMap data through the Overpass API and caches the results for an area within 1 km. Missions are generated from the cached map data using ordinary code, rather than asking the AI to choose places.&lt;/p&gt;

&lt;p&gt;I initially experimented with AI-generated mission descriptions. The model sometimes invented details, such as calling an ordinary park a "tree sanctuary" or making up distances. I turned off that feature and switched to templates based on the available map data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the model is used.&lt;/strong&gt; The AI powers the Companion chat and helps summarise information for LEARN missions. For LEARN, the model receives the place's OpenStreetMap tags. A basic grounding check rejects certain unsupported numerical or historical claims and falls back to the raw tags when the check fails. It is not a guarantee that every answer is correct, and Companion chat is not checked by this validator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checks.&lt;/strong&gt; The app validates GPS accuracy and distance from a mission target, and rejects mock locations. Walk tracking filters inaccurate GPS fixes, tiny movements, and speeds above approximately 15 km/h to reduce GPS errors and obvious attempts to earn tokens from vehicle travel.&lt;/p&gt;

&lt;p&gt;When a photo includes an EXIF capture timestamp, the app checks that it is not older than ten minutes. The app does not identify the objects in photos. It can warn when a photo appears very dark based on its exposure metadata.&lt;/p&gt;

&lt;p&gt;I also learned that file size alone is not a reliable way to detect a covered camera lens. A nearly black photo can still be a full-size image, so I added a check based on EXIF information such as ISO and exposure time.&lt;/p&gt;

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

&lt;p&gt;Running an open-weight model directly on the phone made this idea possible without sending every chat message to a cloud AI service. The token system, mission rewards, and chat lock are implemented in the app itself.&lt;/p&gt;

&lt;p&gt;A few things mattered to me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No custom backend.&lt;/strong&gt; The model and map data are downloaded during setup. The initial map request sends the area's coordinates to an Overpass server, but the app does not need my own server to handle chat messages or walking progress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline use.&lt;/strong&gt; After the model and map data are cached, the core missions and AI chat are designed to work in airplane mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No AI API key or per-request cloud bill.&lt;/strong&gt; The tokens are game currency earned through outdoor activities. Local inference still uses the phone's battery and computing resources, but it does not require a paid AI API for each response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control over the model.&lt;/strong&gt; With the model running locally, I can experiment with compatible model files and inference settings instead of relying entirely on a hosted AI provider.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off is response quality. A small 0.5B model can give short answers and sometimes get things wrong. For an app intended to encourage time away from the screen, I wanted to explore whether a small local model could still make the experience useful.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot:&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Himanshu Nikam</dc:creator>
      <pubDate>Sun, 04 Oct 2026 11:16:17 +0000</pubDate>
      <link>https://dev.to/himanshu_1817/devchallengeweekendchallengehf26challenge-3c3n</link>
      <guid>https://dev.to/himanshu_1817/devchallengeweekendchallengehf26challenge-3c3n</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/himanshu_1817/i-built-a-brutal-resume-roaster-for-my-friend-who-keeps-getting-rejected-4b5h" class="crayons-story__hidden-navigation-link"&gt;I Built a Brutal Resume Roaster for My Friend Who Keeps Getting Rejected&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/himanshu_1817/i-built-a-brutal-resume-roaster-for-my-friend-who-keeps-getting-rejected-4b5h" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest Weekend Challenge: Build for a Friend 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="/himanshu_1817" 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%2F4150292%2F06a1a1f2-d906-4b04-a13b-2cdc397788ea.jpeg" alt="himanshu_1817 profile" class="crayons-avatar__image" width="736" height="736"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/himanshu_1817" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Himanshu Nikam
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Himanshu Nikam
                
                
              
              &lt;div id="story-author-preview-content-4795451" 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="/himanshu_1817" 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%2F4150292%2F06a1a1f2-d906-4b04-a13b-2cdc397788ea.jpeg" class="crayons-avatar__image" alt="" width="736" height="736"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Himanshu Nikam&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/himanshu_1817/i-built-a-brutal-resume-roaster-for-my-friend-who-keeps-getting-rejected-4b5h" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 4&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/himanshu_1817/i-built-a-brutal-resume-roaster-for-my-friend-who-keeps-getting-rejected-4b5h" id="article-link-4795451"&gt;
          I Built a Brutal Resume Roaster for My Friend Who Keeps Getting Rejected
        &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/weekendchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;weekendchallenge&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/himanshu_1817/i-built-a-brutal-resume-roaster-for-my-friend-who-keeps-getting-rejected-4b5h" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/himanshu_1817/i-built-a-brutal-resume-roaster-for-my-friend-who-keeps-getting-rejected-4b5h#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;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built a Brutal Resume Roaster for My Friend Who Keeps Getting Rejected</title>
      <dc:creator>Himanshu Nikam</dc:creator>
      <pubDate>Sun, 04 Oct 2026 11:10:42 +0000</pubDate>
      <link>https://dev.to/himanshu_1817/i-built-a-brutal-resume-roaster-for-my-friend-who-keeps-getting-rejected-4b5h</link>
      <guid>https://dev.to/himanshu_1817/i-built-a-brutal-resume-roaster-for-my-friend-who-keeps-getting-rejected-4b5h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My friend Arjun kept sending me his resume and asking for feedback. Every time I'd just say "looks good bro" because honestly, telling someone their resume is bad is awkward. But he kept getting rejected from internships and I could see why.&lt;/p&gt;

&lt;p&gt;So I built RoastMyResume - an AI tool that gives the kind of brutally honest, section-by-section feedback that friends are too uncomfortable to give. But it doesn't just roast you for fun. It actually helps you fix the problems: keyword gaps, weak bullet points, ATS issues, the works.&lt;/p&gt;

&lt;p&gt;The whole thing runs locally on your machine using Ollama. No API keys needed, no data sent anywhere. You upload your PDF resume, paste the job description you're targeting, and the AI tears it apart then helps you rebuild it.&lt;/p&gt;

&lt;p&gt;Here's what it does:&lt;/p&gt;

&lt;p&gt;The Roast — section-by-section honest feedback, not the polite kind&lt;br&gt;
4-Second Test  simulates what a recruiter actually sees in their first 4 seconds&lt;br&gt;
Rejection Risk Score — 0–100 score per resume section with charts&lt;br&gt;
JD Match Analysis — compares your resume against the actual job description&lt;br&gt;
Keyword Gap Finder — shows exactly which ATS keywords are missing&lt;br&gt;
AI Rewriter — rewrites any weak section to be stronger and JD-matched&lt;br&gt;
Interview Prep — predicts the hardest interview questions based on your resume gaps&lt;br&gt;
Voice Roast (optional) — reads the roast aloud using ElevenLabs TTS&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Watch it in action here:&lt;/p&gt;

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

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

&lt;p&gt;The full source code is on GitHub:&lt;/p&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/neoquantx" rel="noopener noreferrer"&gt;
        neoquantx
      &lt;/a&gt; / &lt;a href="https://github.com/neoquantx/RoastMyResume" rel="noopener noreferrer"&gt;
        RoastMyResume
      &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;🔥 RoastMyResume&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Brutally honest AI career coach for your friend who keeps getting rejected.&lt;/strong&gt;
Built for the "Build for a Friend" challenge — Open-Source AI at its core.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 The Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;My friend Arjun kept applying to internships and getting rejected. He'd send me his resume and I'd say "looks great!" — because I didn't want to hurt his feelings. He needed someone to tell him the truth.&lt;/p&gt;
&lt;p&gt;So I built an AI that would.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RoastMyResume&lt;/strong&gt; gives the brutal, honest feedback that friends are too polite to give — but in a constructive way that actually fixes the problem.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&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;Feature&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;The Roast&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Section-by-section brutal honest feedback in Gen Z voice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⏱️ &lt;strong&gt;4-Second Test&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Simulates exactly what a recruiter sees in 4 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📊 &lt;strong&gt;Rejection Risk Score&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;0-100 score per section with visual charts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎯 &lt;strong&gt;JD Match Analysis&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Compares resume against actual job description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔑 &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/neoquantx/RoastMyResume" 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;Everything runs locally using open-weight models through Ollama. No OpenAI, no paid API, nothing leaves your machine.&lt;/p&gt;

&lt;p&gt;The stack:&lt;/p&gt;

&lt;p&gt;Ollama as the local model runner&lt;br&gt;
Llama 3.2 (3B) as the default model — fast, runs on CPU, no GPU needed&lt;br&gt;
Mistral (7B) and Gemma 2 (9B) as optional alternatives you can switch between in the sidebar&lt;br&gt;
Streamlit for the web UI&lt;br&gt;
PyMuPDF for parsing uploaded PDF resumes&lt;br&gt;
ElevenLabs TTS (optional, needs API key) for the voice roast feature&lt;br&gt;
Python for everything tying it together&lt;/p&gt;

&lt;p&gt;The core flow: user uploads a PDF → PyMuPDF extracts the text → Ollama runs the chosen local model → the prompt asks it to analyze the resume section by section against the job description → Streamlit displays the results in tabs.&lt;/p&gt;

&lt;p&gt;The model switch in the sidebar is just swapping which Ollama model name gets sent in the API call. Simple but works really well , you can literally feel the difference in reasoning quality between the 3B and 7B model.&lt;/p&gt;

&lt;p&gt;To run it yourself:&lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;
git clone &lt;a href="https://github.com/neoquantx/RoastMyResume.git" rel="noopener noreferrer"&gt;https://github.com/neoquantx/RoastMyResume.git&lt;/a&gt;&lt;br&gt;
cd RoastMyResume&lt;br&gt;
python3 -m venv venv &amp;amp;&amp;amp; source venv/bin/activate&lt;br&gt;
pip install -r requirements.txt&lt;/p&gt;

&lt;h1&gt;
  
  
  if you want other models you can got through readme section:
&lt;/h1&gt;

&lt;p&gt;ollama pull llama3.2&lt;br&gt;
ollama serve&lt;/p&gt;

&lt;h1&gt;
  
  
  in a second terminal:
&lt;/h1&gt;

&lt;p&gt;streamlit run app.py&lt;/p&gt;

&lt;p&gt;Then open - &lt;a href="http://localhost:8501" rel="noopener noreferrer"&gt;http://localhost:8501&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The honest answer: a closed API would have made this impossible to share the way I wanted to.&lt;/p&gt;

&lt;p&gt;If I had used GPT-4 or Claude, Arjun would need to hand over his resume to a third-party server. That's a real concern  a resume has your phone number, address, work history, everything. With Ollama and open-weight models, the resume never leaves his laptop. Nothing is logged, nothing is stored, no company is reading it.&lt;/p&gt;

&lt;p&gt;Beyond privacy, open models let anyone actually run this. No credit card, no account, no API limits. Arjun just clones the repo and runs it. That's the point. If open-weight models didn't exist, this tool would either cost money to use or require people to trust a cloud service with their personal data. Neither of those felt right for something built for a friend.&lt;/p&gt;

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

&lt;p&gt;Based on what the project actually uses:&lt;/p&gt;

&lt;p&gt;Featured categories ($200 each):&lt;/p&gt;

&lt;p&gt;Best Use of Gemma — Gemma 2 (9B) is one of the three supported local models. Users can select it in the sidebar and run it fully locally via Ollama.&lt;/p&gt;

&lt;p&gt;Partner categories ($100 each):&lt;/p&gt;

&lt;p&gt;Best Use of ElevenLabs — the optional voice roast feature uses ElevenLabs TTS to read the roast feedback aloud. The .env setup for this is fully documented in the README.&lt;/p&gt;

&lt;p&gt;Best Use of GitHub Copilot — used GitHub Copilot throughout development for UI fixes in Streamlit and other parts of the codebase. It helped speed up the frontend work significantly.&lt;/p&gt;

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