<?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: Saurabh Chauhan</title>
    <description>The latest articles on DEV Community by Saurabh Chauhan (@saurabheffect).</description>
    <link>https://dev.to/saurabheffect</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%2F4157408%2Fc1c7d0f1-4174-4c07-9b85-010fafc8bacf.png</url>
      <title>DEV Community: Saurabh Chauhan</title>
      <link>https://dev.to/saurabheffect</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saurabheffect"/>
    <language>en</language>
    <item>
      <title>The Won't-Do List: a local model that tells you what you can safely ignore</title>
      <dc:creator>Saurabh Chauhan</dc:creator>
      <pubDate>Mon, 26 Oct 2026 04:17:04 +0000</pubDate>
      <link>https://dev.to/saurabheffect/the-wont-do-list-a-local-model-that-tells-you-what-you-can-safely-ignore-59if</link>
      <guid>https://dev.to/saurabheffect/the-wont-do-list-a-local-model-that-tells-you-what-you-can-safely-ignore-59if</guid>
      <description>&lt;p&gt;&lt;em&gt;This is my submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge: Week 3&lt;/a&gt;, "Slow and Steady".&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every to-do list has the same flaw: it only grows. Adding a task is free. Removing one needs a decision, and deciding is the part nobody does on purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Won't-Do List&lt;/strong&gt; is an anti-to-do list. You paste everything you meant to get to (bullets, numbers, checkboxes, whatever your notes app spits out) and a small open-weight model, running on your own computer, sorts every task into one of four piles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Do now&lt;/strong&gt;: ignoring it costs you soon, or it takes under ten minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do later&lt;/strong&gt;: it matters, but nothing breaks this week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let it expire&lt;/strong&gt;: nothing bad happens if it never gets done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not my problem&lt;/strong&gt;: it belongs to someone else, or you are waiting on them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every card says why, and, the part I care about most, says in one honest sentence &lt;strong&gt;what actually happens if you ignore it&lt;/strong&gt;. The tasks you put down come back a week later for a single question: &lt;em&gt;did letting go cost you anything?&lt;/em&gt; Your answers become examples the model sees next time.&lt;/p&gt;

&lt;p&gt;The effort it saves is the effort you never spend. At the top of every sorted list the app tells you how many minutes you were just handed back.&lt;/p&gt;

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

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

&lt;p&gt;Try it yourself. There is nothing to &lt;code&gt;pip install&lt;/code&gt;; it is plain Python and plain JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b      &lt;span class="c"&gt;# or any instruct model of about 3B parameters or more&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; wontdo          &lt;span class="c"&gt;# then open http://127.0.0.1:8742&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No model running? The app still opens and sorts with a few keyword rules. They are not AI, and every list they make says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lazy payoff
&lt;/h2&gt;

&lt;p&gt;I ran it on my own list of 9 tasks with gemma3:4b on Windows 11:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tasks pasted&lt;/td&gt;
&lt;td&gt;[9]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put down (let it expire, not my problem)&lt;/td&gt;
&lt;td&gt;[3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minutes handed back&lt;/td&gt;
&lt;td&gt;[about 1 h 40 min]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time for the model to sort the list&lt;/td&gt;
&lt;td&gt;[300 seconds]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verdicts I disagreed with&lt;/td&gt;
&lt;td&gt;[1 of 9]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The minutes are the model's own rough estimates, rounded to five, ten, fifteen minutes and so on. They are a nudge, not a stopwatch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters here
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A task list is the most candid document you own.&lt;/strong&gt; It holds the rent you are late on, the appointment you keep postponing, the name of the person you are avoiding. Sent to a hosted model, that list becomes a request body on a server I do not control. Run through an open-weight model on my own machine, it stays inside one process on one computer. The app listens on &lt;code&gt;127.0.0.1&lt;/code&gt; only, it loads its own fonts, and a browser test records every request the page makes while you sort a list and fails if any of them leaves the machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works on a plane.&lt;/strong&gt; No account, no key, no quota, no connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model is a setting, not a dependency.&lt;/strong&gt; The app talks to Ollama, llama.cpp's &lt;code&gt;llama-server&lt;/code&gt;, LM Studio or any OpenAI-compatible server. Swap one model for another and nothing else changes; the &lt;em&gt;Test connection&lt;/em&gt; button tells you in about ten seconds whether the new one behaves. Because those protocols are open and simple, I could also test the whole pipeline against scripted stand-in servers that misbehave on purpose: invalid JSON, slow replies, dropped connections, a reasoning model that thinks out loud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing is metered.&lt;/strong&gt; Sorting a list twice with two different models, to see who you trust, costs a little electricity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teaching it stays private.&lt;/strong&gt; The check-in answers and the tasks you move by hand become up to six short examples in the next prompt. That trick works with any model. What open weights change is that those examples are the most personal data you have, and they never leave your disk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where a closed model would have been better.&lt;/strong&gt; A large hosted model would almost certainly judge ambiguous tasks better than a 4B model on a laptop. A small model will sometimes tell you to ignore your tax return. So I did not try to make the model perfect. I built around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The model proposes, plain rules veto.&lt;/strong&gt; Seven regex tripwires (money, official paperwork, health, safety, booked commitments, people who matter, someone you answer to) plus your own never-skip words watch every task. If the model says "let it expire" and a tripwire fires, the task moves to Do later and the card says why. A second rule says the model cannot rate something medium or high risk and also skip it. Only &lt;em&gt;you&lt;/em&gt; can overrule the net, with the &lt;em&gt;Move to…&lt;/em&gt; menu. The rules lean towards false alarms on purpose: a false alarm costs one extra item on your list, and a missed one costs a late fee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dates are worked out by code.&lt;/strong&gt; "by Friday" becomes &lt;code&gt;[due in 6 days]&lt;/code&gt; before the model sees it, because small models are poor at calendar arithmetic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consequence before verdict.&lt;/strong&gt; The output schema asks for &lt;code&gt;if_ignored&lt;/code&gt; and &lt;code&gt;risk&lt;/code&gt; &lt;em&gt;before&lt;/em&gt; &lt;code&gt;bucket&lt;/code&gt;, so the model has to write what happens if you ignore the task before it chooses a pile. I picked that order so the verdict has to agree with the sentence the model has just written. I did not run a controlled comparison, so treat it as a design choice, not a result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small models are messy, so the client is forgiving.&lt;/strong&gt; It pulls usable JSON out of code fences, &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; blocks, trailing commas and truncated replies, and understands loose spellings such as "skip" or "defer". It retries without JSON-schema mode when a server rejects it. If the model dies halfway through a long list, the remaining tasks are finished with the keyword rules and labelled as such, instead of throwing the whole list away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your energy sets the size of Do now.&lt;/strong&gt; A slider fills Do now up to that many minutes and slides the overflow to Do later, instantly and without asking the model again. Anything important that is due within two days stays put.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The boring parts are the point.&lt;/strong&gt; The server is Python's standard library and the front end is one HTML file, one stylesheet and one script, so there is nothing to install and nothing to break. Fonts ship with the app (Atkinson Hyperlegible, under the SIL Open Font Licence) and the colour pairs were run through a contrast checker. [N] tests cover the parser, the dates, the safety net, both model clients, the pipeline, HTTP security and the command line, and [N] more drive a real browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Teach the date finder and the safety net languages other than English. Today a model may cope with other languages, but the tripwires will not.&lt;/li&gt;
&lt;li&gt;Measure how often each verdict is overruled, per model, so choosing a model stops being guesswork.&lt;/li&gt;
&lt;li&gt;A weekly sweep: re-sort what is still sitting in Do later.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://github.com/SaurabhEffect/HacktoberFest-2026/tree/main/wont-do-list" rel="noopener noreferrer"&gt;github.com/SaurabhEffect/HacktoberFest-2026/tree/main/wont-do-list&lt;/a&gt;&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;: the demo above runs Gemma (gemma3:4b) locally through Ollama.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>devchallenge</category>
      <category>python</category>
    </item>
    <item>
      <title>Hinglish reel captions, made offline on your own laptop</title>
      <dc:creator>Saurabh Chauhan</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:57:28 +0000</pubDate>
      <link>https://dev.to/saurabheffect/hinglish-reel-captions-made-offline-on-your-own-laptop-1gl1</link>
      <guid>https://dev.to/saurabheffect/hinglish-reel-captions-made-offline-on-your-own-laptop-1gl1</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 Week 2 "Side Hustle" challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Scroll through Indian Instagram and you will keep running into captions like this one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;aaj hum baat karenge ki kaise aap apne reels mein captions laga sakte ho&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hindi and English in one sentence, typed in English letters. It is how a lot of people talk and post, and Roman script is what many viewers find easiest to read on a phone.&lt;/p&gt;

&lt;p&gt;Someone has to caption those reels, and for plenty of creators that someone gets paid: a freelance editor, a two-person agency, a cousin who "does the editing". Their problem is not that speech recognition can't hear Hindi, because open models like Whisper hear it well. The problem is what comes out. Hindi arrives in Devanagari, English words arrive in whichever script the model fancied, and nothing turns that into the spelling people actually type (&lt;em&gt;kya&lt;/em&gt;, &lt;em&gt;nahi&lt;/em&gt;, &lt;em&gt;bahut&lt;/em&gt;) with a timestamp on every word. Cloud caption tools tend to bill by the minute or by the month, and they want the client's unreleased footage on their servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hinglish Reel Captioner&lt;/strong&gt; is a small local web app for that job. You drop in a video or a voice note. It listens with open-weight Whisper, converts each Hindi word to Roman Hinglish while leaving English words English, and plays big word-by-word captions over a live preview. You fix any word in an editor that keeps the timing intact, pick a look (or save the creator's brand colours), and either burn the captions into the MP4 or export SRT, VTT, ASS or a plain transcript.&lt;/p&gt;

&lt;p&gt;The person who would pay is the person who captions other people's reels. Their price per reel is set by their clients, and their cost per reel is their time. The point of the tool is to turn the slowest part of that job, typing Hinglish against a waveform, into skimming and fixing, without adding a per-minute line to their costs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Roman Hinglish, word by word.&lt;/strong&gt; &lt;code&gt;क्या&lt;/code&gt; becomes &lt;em&gt;kya&lt;/em&gt;, &lt;code&gt;वीडियो&lt;/code&gt; stays &lt;em&gt;video&lt;/em&gt;, &lt;code&gt;एपीआई&lt;/code&gt; becomes &lt;em&gt;API&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An editor that keeps the timing.&lt;/strong&gt; Respell a word and nothing moves. Add or delete words and the neighbours keep their timing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four looks, your brand colours.&lt;/strong&gt; Pumpkin, Pop, Classic and Box, with one-click "my brand look".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burned in, or as files.&lt;/strong&gt; An MP4 with the captions drawn in, or &lt;code&gt;.srt&lt;/code&gt;, &lt;code&gt;.vtt&lt;/code&gt;, &lt;code&gt;.ass&lt;/code&gt; and a plain transcript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice notes too.&lt;/strong&gt; Audio-only files get a branded background and become a captioned video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My words.&lt;/strong&gt; One line fixes a spelling for every future video: &lt;code&gt;doston=dosto&lt;/code&gt;, or &lt;code&gt;insta gram=Instagram&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/3NLlcVbnK2E" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
There is nothing to sign up for and nothing to deploy, because the point is that it runs on your own machine. Demo mode plays a scripted Hinglish transcript over any video you drop in, so you can try the whole studio without downloading a model. You need Python 3.10 or newer and FFmpeg:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;% https://github.com/SaurabhEffect/HacktoberFest-2026/tree/main/hinglish-reel-captioner %&lt;span class="o"&gt;}&lt;/span&gt;
./run.sh &lt;span class="nt"&gt;--demo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows PowerShell, from the cloned project folder, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\run.bat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--demo&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It opens &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;. Drop a video and you land in the studio. The preview plays with the same fonts, line breaks and colours as the final render. The panel on the right has &lt;strong&gt;Captions&lt;/strong&gt; (edit, split, join, click a time to jump), &lt;strong&gt;Style&lt;/strong&gt; (four looks and every control behind them) and &lt;strong&gt;Export&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Options panel holds the language, the speech model and the &lt;em&gt;My words&lt;/em&gt; rules:&lt;/p&gt;

&lt;p&gt;It is a small FastAPI app (&lt;code&gt;reelcaptioner/&lt;/code&gt;) and a front end of plain HTML, CSS and JavaScript modules: no build step, no CDN, fonts bundled. There are 395 tests. The README covers the settings, the HTTP API (so a batch of reels can be captioned from a shell script) and troubleshooting.&lt;/p&gt;

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

&lt;p&gt;I directed an AI coding agent (Claude) to build this. I chose the idea and the shape of the product, and the agent wrote and tested the code, so everything below is about the product and about what the tests in the repo actually check.&lt;/p&gt;

&lt;h3&gt;
  
  
  The open pieces
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Whisper&lt;/strong&gt; (OpenAI, MIT licence), run through &lt;strong&gt;faster-whisper&lt;/strong&gt; and CTranslate2, does the listening: word timestamps, voice-activity detection, your own names as hotwords, and a Hinglish prompt. Any CTranslate2 Whisper model works, so you can pick a size from &lt;code&gt;tiny&lt;/code&gt; to &lt;code&gt;large-v3&lt;/code&gt;, or point the &lt;em&gt;Custom model&lt;/em&gt; box at a Hindi fine-tune.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FFmpeg and libass&lt;/strong&gt; probe the file, pull out 16 kHz audio, make a small preview copy and burn the captions in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; and plain HTML, CSS and JavaScript make the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; is optional. It runs a local model, Gemma by preference, to tidy spellings card by card.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Three problems that took more thought than the model
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Whisper writes Hindi in Devanagari, so the app converts.&lt;/strong&gt; Rather than coax Roman text out of the model, it lets Whisper write what it writes and converts each word afterwards, in a fixed order: your own rules first, then English loanwords (kept as English), then a lexicon of common Hindi words with their usual spellings, then rule-based transliteration for everything else. The rules are where the craft is. Devanagari writes an inherent &lt;em&gt;a&lt;/em&gt; after every consonant and then does not pronounce some of them: &lt;code&gt;समझ&lt;/code&gt; is &lt;em&gt;samajh&lt;/em&gt;, not &lt;em&gt;samajha&lt;/em&gt;, and &lt;code&gt;बनता&lt;/code&gt; is &lt;em&gt;banta&lt;/em&gt;, not &lt;em&gt;banata&lt;/em&gt;. Deleting those schwas correctly does a lot of work for words that are in no lexicon. The whole thing is deterministic, so a wrong spelling is fixed once and stays fixed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The preview has to match the render.&lt;/strong&gt; The studio draws captions in the browser, but the export burns them in with libass. If the two disagree, the editor approves one thing and ships another, and by default they do disagree. Browsers place text using a font's ascent and descent (for Poppins, 1.05 and 0.35 em), while libass uses the Windows metrics (1.135 and 0.627 em) and scales font size by their sum. So the exporter converts every size (×1.762) and places each baseline explicitly, the server measures the line breaks once with the real font and hands the same ones to both renderers, and the outline is drawn in the browser as rings of hard text-shadows, because &lt;code&gt;-webkit-text-stroke&lt;/code&gt; draws mitred spikes that libass does not.&lt;/p&gt;

&lt;p&gt;To check it, a script captions the same flat-colour clip for nine looks and positions, once in the live preview in headless Chromium and once burned in by FFmpeg, and compares where the caption lands. The worst difference was 0.19% of the frame, about one pixel on a 640 px tall video. The tests derive each constant from the font file, so changing the font cannot quietly pull the two apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. An editor that never loses the timing.&lt;/strong&gt; Fixing a spelling moves nothing: when the word count is unchanged, every timing is kept. When you add or delete words, the words before and after the edit keep their timing and the new ones share the gap. The optional LLM pass follows the same discipline. It may only respell: each card has to come back with the same number of words and mostly the same letters, or the original card is kept, and it is only ever shown the text, so it cannot move a timestamp.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it was tested without a model
&lt;/h3&gt;

&lt;p&gt;The build environment could not download a Whisper model, so the tests exercise the real transcription code against a stand-in model that returns faster-whisper's real output shapes. Every FFmpeg render is run for real and measured pixel by pixel, the command-line tests boot an actual server, and the Ollama pass is tested against a fake one. There are 395 tests, passing on Python 3.10, 3.11, 3.12 and 3.13, each in a freshly built environment.&lt;/p&gt;

&lt;p&gt;What that cannot prove is accuracy on real Hinglish audio, which depends on your recording and your model. That is why the editor is a first-class feature, and measuring word error rates on real reels is the first thing I would do next.&lt;/p&gt;

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

&lt;p&gt;Four things in this project only work because the model is open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It costs nothing per reel.&lt;/strong&gt; A captioning side hustle runs on thin margins and many small jobs. When the model runs on the captioner's own laptop, the hundredth reel costs the same as the first: a few minutes of CPU. There is no meter to watch and no plan to outgrow, so what they charge a client stays their own decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The footage stays put.&lt;/strong&gt; Reels for a brand deal or a launch are often unreleased, and sometimes under NDA, by the time they reach the editor. With local inference the audio is extracted and transcribed on the machine that already holds the file. The server listens on &lt;code&gt;127.0.0.1&lt;/code&gt; by default, there are no analytics and no CDN, and a test fails if the front end ever references an outside address. The only network traffic is the one-time model download.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The spelling is mine to change.&lt;/strong&gt; Hinglish has no standard spelling (&lt;em&gt;hai&lt;/em&gt;, &lt;em&gt;hain&lt;/em&gt;, &lt;em&gt;h&lt;/em&gt;), so the spelling layer is where the value is. Hosted captioning APIs typically hand back finished text in their own conventions. With open weights I get word timestamps and hotwords instead, and everything after the model is code I control: the romanizer, the &lt;em&gt;My words&lt;/em&gt; rules and the editor. When someone says "my audience writes &lt;em&gt;dosto&lt;/em&gt;, not &lt;em&gt;doston&lt;/em&gt;", that is one line in a text box and it holds for every video after. When a better Hindi model appears, it is a drop-down choice or a folder path, not a migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody can change the terms.&lt;/strong&gt; The weights are a file on disk. They cannot be repriced, deprecated or rate-limited out from under a business that depends on them.&lt;/p&gt;

&lt;p&gt;Where would a closed API have been better? Probably out-of-the-box accuracy on noisy audio, since a large hosted model will beat &lt;code&gt;small&lt;/code&gt; on a laptop CPU, and setup is friction because you need Python and FFmpeg. I would rather say that plainly than pretend open wins every column. It wins the ones this customer cares about: cost per reel, where the footage lives, and who controls the spelling.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>devchallenge</category>
      <category>opensource</category>
    </item>
    <item>
      <title>This Week Outside: a field guide you print, built from open data and a local LLM 🌿</title>
      <dc:creator>Saurabh Chauhan</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:54:44 +0000</pubDate>
      <link>https://dev.to/saurabheffect/this-week-outside-a-field-guide-you-print-built-from-open-data-and-a-local-llm-1bin</link>
      <guid>https://dev.to/saurabheffect/this-week-outside-a-field-guide-you-print-built-from-open-data-and-a-local-llm-1bin</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;blockquote&gt;
&lt;p&gt;Most "get outside" apps ask you to stare at your phone while you're outside.&lt;br&gt;
This one does its thinking at your desk, then hands you a sheet of paper and gets out of the way.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;&lt;strong&gt;This Week Outside&lt;/strong&gt; is a hyperlocal field guide you &lt;strong&gt;print and take with you&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You type your town. It asks &lt;a href="https://www.inaturalist.org" rel="noopener noreferrer"&gt;iNaturalist&lt;/a&gt; what people within a few kilometres have actually spotted in the last two weeks, checks the 7-day forecast, and works out which species have &lt;strong&gt;just showed up&lt;/strong&gt;: logged recently, but not in the two months before. A small open-weight model running on your own machine then writes the friendly parts (an intro, a weekly mission, and a short &lt;em&gt;what to look or listen for&lt;/em&gt; tip per species). You hit print, leave the phone at home, and tick things off with a pen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's for&lt;/strong&gt; anyone who would walk more if the walk came with a tiny quest, and who would rather not have an app open on the trail to get it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The screen is the shortest part
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;01 · Pick your patch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Type a town or share your location. Coordinates are rounded to about 1 km before they leave your computer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;02 · Read the neighbourhood&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recent sightings plus the forecast, with a ★ on the best day and the golden-hour time. A local model writes the tips.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;03 · Print it. Go.&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A clean, ink-friendly sheet with a tick box beside every species and a ruled space for field notes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;A minute at the screen. The rest is the point.&lt;/em&gt;&lt;/p&gt;




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

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

&lt;p&gt;&lt;strong&gt;The home page&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;![The This Week Outside home page: a forest-green hero reading "Something wild is near you", a big search bar, and die-cut leaf, bird, mushroom, sun and acorn stickers]&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%2Fcncpk19w9qq7kqqkqz2m.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%2Fcncpk19w9qq7kqqkqz2m.png" alt=" " width="800" height="475"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The UI borrows its look from hacktoberfest.com: forest green, cream paper, sticker art, an italic accent inside a bold headline.&lt;/em&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/SaurabhEffect" rel="noopener noreferrer"&gt;
        SaurabhEffect
      &lt;/a&gt; / &lt;a href="https://github.com/SaurabhEffect/HacktoberFest-2026" rel="noopener noreferrer"&gt;
        HacktoberFest-2026
      &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;Hacktoberfest 2026&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This repository collects projects for Hacktoberfest 2026. Each project lives in
its own top-level folder.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Projects&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/SaurabhEffect/HacktoberFest-2026/./NoFumble/README.md" rel="noopener noreferrer"&gt;NoFumble&lt;/a&gt; - local-first cash-flow forecasting and
expense checks.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SaurabhEffect/HacktoberFest-2026/./this-week-outside/README.md" rel="noopener noreferrer"&gt;This Week Outside&lt;/a&gt; - a hyperlocal field guide
for things to look for outdoors this week.&lt;/li&gt;
&lt;/ul&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/SaurabhEffect/HacktoberFest-2026" 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;The project lives in &lt;a href="https://github.com/SaurabhEffect/HacktoberFest-2026/tree/main/this-week-outside" rel="noopener noreferrer"&gt;&lt;code&gt;this-week-outside/&lt;/code&gt;&lt;/a&gt;. It has a Dockerfile and compose file, and a CI workflow that runs the test suite on Python 3.10, 3.11 and 3.12.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; browser ──► Flask (app.py) ──► fieldguide/guide.py
                                   ├─ inat.py     iNaturalist species_counts  (recent window + 60-day baseline)
                                   ├─ weather.py  Open-Meteo 7-day forecast   (+ best-day score, golden hour)
                                   ├─ geocode.py  Open-Meteo geocoding        (place name → lat/lng)
                                   └─ llm.py      local model via Ollama or any OpenAI-compatible server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python + Flask + &lt;code&gt;requests&lt;/code&gt;, vanilla JavaScript with no build step, and no API keys anywhere.&lt;/p&gt;




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

&lt;p&gt;Because of four things I couldn't have promised with a hosted model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What I wanted&lt;/th&gt;
&lt;th&gt;What open made possible&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Private&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The AI text is written on your machine. What leaves it is the place name you search for and a coordinate rounded to ~1 km, sent to the public iNaturalist and Open-Meteo APIs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free to run, forever&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open data and an open-weight model mean no API key, no bill, and no tier to outgrow. Anyone can run a card for their own town.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Swappable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Try another model, or another server (Ollama, llama.cpp, LM Studio, vLLM), by changing one variable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Useful where signal isn't&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Once the card is printed, the trail needs no connection at all.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;And where open is harder.&lt;/strong&gt; A 3B-parameter model is not as reliable as a frontier model, and it will sometimes get a species tip wrong. That's exactly why the architecture is "data decides, the model decorates", with a validator and a safe fallback around it. Working with a small open model pushed me toward a &lt;em&gt;more&lt;/em&gt; careful design than I'd have bothered with otherwise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Honest limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sightings reflect where people use iNaturalist: dense in cities and popular parks, sparse elsewhere. Widen the radius if a card looks thin.&lt;/li&gt;
&lt;li&gt;"Just showed up" means &lt;em&gt;newly logged&lt;/em&gt;, which can also mean &lt;em&gt;newly noticed&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Everything the model says is a hint, not an identification.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Credits &amp;amp; attribution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sightings and species photos: &lt;a href="https://www.inaturalist.org" rel="noopener noreferrer"&gt;iNaturalist&lt;/a&gt; observers (each photo keeps its own licence).&lt;/li&gt;
&lt;li&gt;Forecast and place search: &lt;a href="https://open-meteo.com" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Look inspired by &lt;a href="https://hacktoberfest.com" rel="noopener noreferrer"&gt;hacktoberfest.com&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;If you try it, tell me what you found near you.&lt;/em&gt; 🌿&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>devchallenge</category>
      <category>opensource</category>
    </item>
    <item>
      <title>hello guys I just joined dev</title>
      <dc:creator>Saurabh Chauhan</dc:creator>
      <pubDate>Fri, 02 Oct 2026 12:32:30 +0000</pubDate>
      <link>https://dev.to/saurabheffect/hello-guys-i-just-joined-dev-mij</link>
      <guid>https://dev.to/saurabheffect/hello-guys-i-just-joined-dev-mij</guid>
      <description></description>
    </item>
  </channel>
</rss>
