<?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: Suprabhat Das</title>
    <description>The latest articles on DEV Community by Suprabhat Das (@suprabhatdas).</description>
    <link>https://dev.to/suprabhatdas</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%2F206216%2F27d59980-1369-44de-8a8c-153f1face78a.jpg</url>
      <title>DEV Community: Suprabhat Das</title>
      <link>https://dev.to/suprabhatdas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suprabhatdas"/>
    <language>en</language>
    <item>
      <title>Tab Hibernator Sloth 🦥: Slow, Steady, and Saves 900MB in One Click</title>
      <dc:creator>Suprabhat Das</dc:creator>
      <pubDate>Wed, 21 Oct 2026 09:13:34 +0000</pubDate>
      <link>https://dev.to/suprabhatdas/tab-hibernator-sloth-slow-steady-and-saves-900mb-in-one-click-303m</link>
      <guid>https://dev.to/suprabhatdas/tab-hibernator-sloth-slow-steady-and-saves-900mb-in-one-click-303m</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;Tab Hibernator Sloth 🦥 - Save RAM Without Closing Tabs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chrome eats RAM when you keep 30+ tabs open. Closing them loses context, shopping carts, and research.&lt;/p&gt;

&lt;p&gt;Sloth doesn't close your tabs — it &lt;strong&gt;hibernates&lt;/strong&gt; them. Tabs stay in your tab bar, turn faded, show as sleeping, use 0 RAM, and wake instantly when you click. One click to hibernate 25 tabs = ~1125MB saved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built for everyone with 20+ tabs open. So, everyone:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For developers:&lt;/strong&gt; GitHub issues, Stack Overflow, localhost, docs - keep them all. Hibernate when you switch branches. 15 tabs = ~675MB back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For researchers &amp;amp; students:&lt;/strong&gt; 20 papers, Notion, Drive, Medium articles. Don't close, hibernate. Export as Markdown for weekly review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For shoppers &amp;amp; planners:&lt;/strong&gt; Amazon, Flipkart, Myntra carts you'll "buy later". Hibernate instead of buying now. Sloth rewards laziness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For everyone with Gmail:&lt;/strong&gt; That Gmail with 11,313 unread? Hibernate it. It still shows unread count, but uses 0 RAM until you need it.&lt;/p&gt;

&lt;p&gt;Free • Open source • No sign-up • 727KB • 100% Local • No tracking • Works offline&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live Site:&lt;/strong&gt; &lt;a href="https://tab-hibernator-sloth.netlify.app/" rel="noopener noreferrer"&gt;https://tab-hibernator-sloth.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2c7um3g5x03l3p24bviu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2c7um3g5x03l3p24bviu.gif" alt="Tab Hibernator Sloth Demo" width="760" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Watch 20 tabs hibernate → save 900MB. Tabs stay in bar, RAM freed. Click any sleeping tab to wake it instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install in 15 seconds:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download .zip from the live site&lt;/li&gt;
&lt;li&gt;Go to chrome://extensions → Enable Developer mode&lt;/li&gt;
&lt;li&gt;Click Load unpacked → Select the unzipped folder&lt;/li&gt;
&lt;li&gt;Pin the sloth 🦥 icon&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Works on Chrome, Brave, Edge, Arc.&lt;/p&gt;

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

&lt;p&gt;No GitHub repo — the entire extension is 8 files, 727KB, downloadable directly from the live site and fully auditable in 5 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core logic (popup.js):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// List all tabs across all windows&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tabs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;

&lt;span class="c1"&gt;// Hibernate = use Chrome's native discard API&lt;/span&gt;
&lt;span class="c1"&gt;// Same thing Chrome uses internally for Memory Saver&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;discard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tabId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1 line = ~45MB saved&lt;/span&gt;

&lt;span class="c1"&gt;// Tabs stay in bar, faded, sleeping. Click to wake.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Extension structure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;manifest.json      // Manifest V3 - minimal permissions
popup.html         // 400px popup UI
popup.css          // No framework, pure CSS
popup.js           // ~4KB - all logic
icons/
  icon16.png
  icon48.png
  icon128.png
  icon512.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Landing page:&lt;/strong&gt; Pure static HTML/CSS, hosted on Netlify. No build step, no React, no API.&lt;/p&gt;

&lt;p&gt;Permissions explained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tabs - to list and discard your tabs&lt;/li&gt;
&lt;li&gt;storage - to remember your last selection&lt;/li&gt;
&lt;li&gt; - to read tab titles (local only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✓ No network requests&lt;br&gt;
✓ No analytics&lt;br&gt;
✓ No cookies&lt;/p&gt;

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

&lt;p&gt;I built Sloth around one Slow and Steady principle: use what the browser already gives you, don't add AI bloat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which open-source did I use? Chromium itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of calling a closed LLM API to "predict which tabs to close" or "summarize your tabs with AI", I used Chromium's open-source discard API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chrome.tabs.discard() - open-source, documented, local. It's the same API that powers chrome://discards. It unloads a tab from memory but keeps it in your tab bar. No data leaves your machine.&lt;/li&gt;
&lt;li&gt;chrome.tabs.query({}) - lists tabs across all windows instantly. No cloud needed.&lt;/li&gt;
&lt;li&gt;Vanilla JS + Manifest V3 - No React, no 5MB bundle, no build step. The whole popup logic is ~4KB. It opens instantly because there's nothing to download.&lt;/li&gt;
&lt;li&gt;Local-first everything - All logic runs in popup.js. storage only remembers your last checkbox selection. You can open DevTools and verify zero network calls.&lt;/li&gt;
&lt;li&gt;Open web for the demo - Landing page is static HTML/CSS, GIF was screen-recorded locally, deployed on Netlify. No closed video API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is Slow and Steady by design: instead of adding an LLM to decide which tabs you might need, Sloth trusts you and makes the lazy action (one-click hibernate) faster than the anxious action (Cmd+W x 30).&lt;/p&gt;

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

&lt;p&gt;A closed AI tab manager would send your tab titles and URLs to a cloud API for "smart grouping", require login, tracking, a dashboard, a "productivity score", break offline, cost money, and leak your Amazon carts and Gmail. It dies when the startup dies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open innovation made Sloth possible because:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Chromium is open-source: I could read how chrome://discards actually works and use the same native API. No reverse-engineering a black box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Privacy by inspection: Anyone can download the zip from &lt;a href="https://tab-hibernator-sloth.netlify.app/" rel="noopener noreferrer"&gt;https://tab-hibernator-sloth.netlify.app/&lt;/a&gt;, unzip it, and open popup.js. 100 lines. Zero fetch(). That trust is impossible with a closed API that says "we don't store your data."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No vendor lock-in: Works offline on a flight, in incognito, behind a corporate firewall. No API key to expire, no quota to hit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remixable by anyone: MIT licensed. A student can fork it, add tab grouping, change the sloth to a cat, or make it auto-hibernate after 1 hour. The web gets better because the building blocks are open.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Slow and steady wins because open, boring tech (a 1-line discard call) beats flashy closed AI that needs your data to function.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;I use it every day. Here's my actual week:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monday:&lt;/strong&gt; Had 32 tabs from weekend research. Selected 27, hibernated in one click. Saved ~1215MB. My MacBook fan finally stopped screaming. I kept all context for later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wednesday:&lt;/strong&gt; Debugging with 12 localhost + 10 docs tabs. Hibernated docs while coding, woke them instantly when stuck. No more losing that perfect Stack Overflow answer because I closed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Friday cleanup:&lt;/strong&gt; Exported 25 open tabs as a clean Markdown file for weekly review, hibernated 18. Zero guilt, all context preserved.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;20 tabs × ~45MB per tab = ~900MB saved instantly&lt;/li&gt;
&lt;li&gt;30 tabs × 5 seconds to carefully close = 150 seconds vs 1 click to hibernate = ~2 minutes saved per cleanup&lt;/li&gt;
&lt;li&gt;No reloading lost form data, no re-finding URLs, no "where was that Amazon cart?" = priceless&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The laziest part? I don't even decide anymore. By default, all non-active tabs are selected. I just click Hibernate. If I need it, I click the faded tab and it wakes instantly.&lt;/p&gt;

&lt;p&gt;Being lazy is now the most efficient path. That's the Sloth way. 🦥&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Vyorin Budget — The Budget Tracker People Actually Keep Using</title>
      <dc:creator>Suprabhat Das</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:55:43 +0000</pubDate>
      <link>https://dev.to/suprabhatdas/vyorin-budget-the-budget-tracker-people-actually-keep-using-2ahl</link>
      <guid>https://dev.to/suprabhatdas/vyorin-budget-the-budget-tracker-people-actually-keep-using-2ahl</guid>
      <description>&lt;p&gt;&lt;strong&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;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Most budgeting apps fail for the same reason. They make you feel guilty, not powerful. You link your bank, categorize three months of data, feel bad about Swiggy, and quit by day seven.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vyorin Budget flips the flow: Income → Budget → Spend → Insights.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built it for how we actually live in India. Payday to payday, not calendar month to calendar month. If you get paid on the 5th, your month runs from the 5th to the 4th. Vyorin understands that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Would Pay for It?
&lt;/h3&gt;

&lt;p&gt;This is Week 2: Side Hustle, so I designed it with margins from day one. Zero infrastructure cost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Freelancers:&lt;/strong&gt; ₹199/month for client-wise buckets, automatic GST set-aside, and a "Can I afford to say no?" calculator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Couples and flatmates:&lt;/strong&gt; ₹299/month for shared budgets without a joint bank account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small shop owners:&lt;/strong&gt; ₹499 setup plus ₹99/month for a white-label PWA. "Ratan Tea Stall Budget" instead of "Vyorin Budget".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first ₹200 came from a tea stall owner next to my dad's office who wanted his shop name on it. That was validation, not just an idea.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Income-first onboarding:&lt;/strong&gt; You cannot add an expense until you add income. This forces clarity and cuts churn. On first load, you see only a full-screen salary input — nothing else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recurring bills:&lt;/strong&gt; Toggle 🔁 for rent, OTT, SIP, and other recurring expenses. It automatically generates the next month's entries. Insights show figures such as "₹18,500 in recurring — 37% of income".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payday burn rate:&lt;/strong&gt; Set payday to the 1st, 5th, 10th, 15th, 25th, or the last day of the month. The hero strip shows "₹1,240 per day • 14 days to payday" and turns red when you are over budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Savings goals:&lt;/strong&gt; Create goals such as Goa Trip or Emergency Fund. Progress bars help you track your savings and adjust your available spending amount so you do not accidentally spend your Goa fund.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% local:&lt;/strong&gt; No login, no bank linking, no cloud. All data stays in &lt;code&gt;localStorage&lt;/code&gt;. The app works offline and is installable as a PWA with a ₹ icon.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;Live App:&lt;/strong&gt; &lt;a href="https://vyorin-budget.netlify.app" rel="noopener noreferrer"&gt;https://vyorin-budget.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The 45-Second Test
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the link. You will see a full-screen welcome modal asking for your salary first. This is intentional.&lt;/li&gt;
&lt;li&gt;Add ₹60,000 as salary. Set budgets for Food (₹10,000) and Transport (₹5,000).&lt;/li&gt;
&lt;li&gt;Tap the &lt;strong&gt;+&lt;/strong&gt; button. Add ₹450 for Food with the note "Swiggy Biryani". Watch the burn rate update instantly.&lt;/li&gt;
&lt;li&gt;Tap the gear icon next to the month. Set payday to the 5th. See "₹X per day • Y days to payday".&lt;/li&gt;
&lt;li&gt;Install it:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Android Chrome:&lt;/strong&gt; Menu → Install app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iPhone Safari:&lt;/strong&gt; Share → Add to Home Screen.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Build Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Single file: approximately 254 KB, with no &lt;code&gt;node_modules&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;0 px overflow at viewport widths of 375 px and 390 px.&lt;/li&gt;
&lt;li&gt;Lighthouse PWA score: 100.&lt;/li&gt;
&lt;li&gt;Lighthouse Accessibility score: 96.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;strong&gt;Live App and Code:&lt;/strong&gt; &lt;a href="https://vyorin-budget.netlify.app" rel="noopener noreferrer"&gt;https://vyorin-budget.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is no separate GitHub repository. The deployed source is the code. Right-click → View Source to inspect the app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single &lt;code&gt;index.html&lt;/code&gt; file — around 2,800 lines.&lt;/li&gt;
&lt;li&gt;React via CDN, with no build step.&lt;/li&gt;
&lt;li&gt;Persistence through &lt;code&gt;localStorage&lt;/code&gt; keys:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vyorin-budget-tracker-v1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vyorin-goals&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vyorin-payday&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PWA support through Blob URLs: the manifest and service worker are generated in-page, allowing the single-file app to work on Netlify.&lt;/li&gt;
&lt;li&gt;Core logic includes &lt;code&gt;autoGenerateRecurring()&lt;/code&gt;, &lt;code&gt;calculateBurnRate()&lt;/code&gt;, and &lt;code&gt;getDaysToPayday()&lt;/code&gt;, which handle recurring expenses, spending calculations, and month rollovers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why one file? &lt;strong&gt;Auditability.&lt;/strong&gt; A shop owner can email it to their CA. There is no hidden server. You can fork it, add Bengali merchants, and host it anywhere for $0.&lt;/p&gt;




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

&lt;p&gt;I built Vyorin using &lt;strong&gt;Meta AI (Muse Spark)&lt;/strong&gt; as my pair programmer, grounded in open-source thinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ideation
&lt;/h3&gt;

&lt;p&gt;My first prompt was not "build a tracker". It was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;People quit budgeting apps in 3 days and they will not link banks — what would make them stay?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer was clear: make payday the center, make income first, and automate recurring expenses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build Loop — 7 Iterations in One Night
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v1:&lt;/strong&gt; Basic tracker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v2:&lt;/strong&gt; Income-first flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v3:&lt;/strong&gt; Branding and favicon with the ₹ icon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v4:&lt;/strong&gt; Light and dark modes with system preference support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v5:&lt;/strong&gt; Recurring bills, burn rate, and savings goals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v6:&lt;/strong&gt; Responsive design, achieving a visual quality score of 100/100 on mobile and desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v7:&lt;/strong&gt; PWA support, Netlify deployment, and a first-load salary visibility fix.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  No Closed APIs on Purpose
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No Plaid or bank aggregators — SBI users will not give OTPs to every app.&lt;/li&gt;
&lt;li&gt;No OpenAI API for categorization — used local merchant chips such as Swiggy, Zepto, and IRCTC.&lt;/li&gt;
&lt;li&gt;No Firebase — &lt;code&gt;localStorage&lt;/code&gt; is the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The future upgrade is local inference. Replace heuristics with a 1B open model through WebLLM running in the browser. Same architecture, $0 cost, and data that never leaves the device.&lt;/p&gt;




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

&lt;p&gt;If I had to use closed finance APIs, Vyorin would not exist.&lt;/p&gt;

&lt;p&gt;The closed path looks like this: Plaid at $500 per month minimum, with limited support for SBI; RazorpayX at ₹15,000 per month; OpenAI at $0.002 per categorization; and Firebase bills on top. You need 100 paying users just to break even. Then you quit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Made It Possible
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy as physics, not policy:&lt;/strong&gt; No server means data never leaves the phone. Try promising that with a closed API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-cost scaling:&lt;/strong&gt; Netlify $0, database $0, AI $0. If 10,000 users come tomorrow, the infrastructure cost is still $0. That is a side hustle with 100% margin from user one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localization without permission:&lt;/strong&gt; Want "Mio Amore" or "Dada Boudi Biryani" as a merchant? Add five lines. No feature request to a vendor. That is how you win in Kolkata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community as a moat:&lt;/strong&gt; I shared the Netlify link in a Telegram group of 40 freelancers. In two hours, I got a Tiffin category, a Durga Puja goal template, and Bengali translation fixes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why Hacktoberfest matters. A solo builder in Kolkata can compete with VC-funded apps because the tools are open.&lt;/p&gt;




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

&lt;p&gt;My first user is my dad, &lt;strong&gt;Somnath Das, 52&lt;/strong&gt; — &lt;a href="https://www.linkedin.com/in/somnathdas-ai/" rel="noopener noreferrer"&gt;LinkedIn profile&lt;/a&gt;. He works in AI. He is my toughest critic because he has seen every dashboard and AI demo.&lt;/p&gt;

&lt;p&gt;He still writes important expenses in a notebook because most apps make you feel guilty, not clear.&lt;/p&gt;

&lt;p&gt;I showed him &lt;a href="https://vyorin-budget.netlify.app" rel="noopener noreferrer"&gt;Vyorin Budget&lt;/a&gt; on his phone.&lt;/p&gt;

&lt;p&gt;"How much came in this month?" I asked.&lt;/p&gt;

&lt;p&gt;"₹75,000," he said.&lt;/p&gt;

&lt;p&gt;I added it. Green bar: Income ₹75,000.&lt;/p&gt;

&lt;p&gt;"Spent?"&lt;/p&gt;

&lt;p&gt;"₹18,500 rent, ₹350 chai, ₹2,200 tools."&lt;/p&gt;

&lt;p&gt;The screen showed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;₹53,950 left • ₹1,798 per day • 30 days to next month.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;He stared at ₹1,798 per day.&lt;/p&gt;

&lt;p&gt;"If I buy that ₹12,000 course?" he asked.&lt;/p&gt;

&lt;p&gt;I added it. The burn rate dropped to ₹1,398 per day. The bar turned amber.&lt;/p&gt;

&lt;p&gt;He was quiet, then said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"আগে খাতায় লিখতে ভুলে যেতাম। এখন ফোনই বলে দেয়, আর কত বাকি আছে।"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Earlier, I would forget the ledger. Now, the phone tells me how much is left.&lt;/p&gt;

&lt;p&gt;On day three, he called: "I have ₹420 per day left till the 1st. Should I buy that domain?"&lt;/p&gt;

&lt;p&gt;On day seven, his friend who runs a tea stall next door saw it and asked, "How much for this?"&lt;/p&gt;

&lt;p&gt;I said, "Free now, ₹200 for your shop name on it."&lt;/p&gt;

&lt;p&gt;He paid two ₹100 notes from his cash box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That was my first revenue.&lt;/strong&gt; I still have that ₹200 in my wallet.&lt;/p&gt;

&lt;p&gt;If you try it, add one income and one Swiggy expense. Watch the burn rate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That is the moment.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
    </item>
    <item>
      <title>Mitti — Every garden app told me to wait for frost. We don't have frost.</title>
      <dc:creator>Suprabhat Das</dc:creator>
      <pubDate>Fri, 09 Oct 2026 13:51:03 +0000</pubDate>
      <link>https://dev.to/suprabhatdas/mitti-every-garden-app-told-me-to-wait-for-frost-we-dont-have-frost-21co</link>
      <guid>https://dev.to/suprabhatdas/mitti-every-garden-app-told-me-to-wait-for-frost-we-dont-have-frost-21co</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 built &lt;strong&gt;Mitti — a Balcony Garden Oracle for 22°N&lt;/strong&gt;. It tells you what to plant &lt;em&gt;this week&lt;/em&gt; on your balcony in Kolkata, based on your actual sunlight, pot size, and direction — not US frost dates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is it for?&lt;/strong&gt; 10M families who don't have a backyard. They have an 8" tub, a 12" pot, or an 18" bosta crate on a north-facing balcony that gets 2 hours of sun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it gets you off-screen?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Screen time &amp;lt; 1 minute. 3 taps: Which way does it face? N/E/S/W. How many hours direct sun? 0-8h slider. What pot size? Small/Medium/Large. Optional: upload balcony photo — Mitti estimates light locally. Badge: &lt;code&gt;Photo considered • local only&lt;/code&gt;. Photo never leaves your laptop.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;What should I plant this week?&lt;/strong&gt; → Returns 3 cards in late monsoon context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;পুদিনা&lt;/strong&gt; Pudina - Mint (shade-tolerant) - 15 days&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;পুঁই শাক&lt;/strong&gt; Pui Shak - Malabar Spinach (humidity lover) - needs trellis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;লঙ্কা&lt;/strong&gt; Lanka - Chili (high sun, fruiting)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6k5n667007n95w8kldis.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%2F6k5n667007n95w8kldis.png" alt="What should I plant this week?" width="799" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you close the laptop and go touch actual mitti. Journal is offline in localStorage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Leaf Doctor:&lt;/strong&gt; Upload a sick leaf → diagnosis on-device, in Bangla + English, with kitchen fix. Output: &lt;code&gt;Overwatering + fungal spots&lt;/code&gt; → &lt;code&gt;বেশি জল + ছত্রাক — দুদিন জল দেবেন না, নিম তেল স্প্রে করুন&lt;/code&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%2Fhf9uk1b37xmxe026es6s.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%2Fhf9uk1b37xmxe026es6s.png" alt="Leaf looking sick?" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; Local PWA, fully offline after first load — runs on your laptop&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="c"&gt;# Terminal 1 — allow browser to talk to Ollama&lt;/span&gt;
&lt;span class="nv"&gt;OLLAMA_ORIGINS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; ollama serve

&lt;span class="c"&gt;# Terminal 2 — pull open-weight models&lt;/span&gt;
ollama pull moondream
ollama pull llama3.2:latest

&lt;span class="c"&gt;# Terminal 3 — serve Mitti&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Top bar turns green: &lt;code&gt;Ollama: live • local&lt;/code&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%2F5zb312x7nzrc1y53rmgf.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%2F5zb312x7nzrc1y53rmgf.png" alt="Top bar turns green" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;30-sec flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set balcony: N facing, 4hr direct sun, Medium 12" pot + upload balcony photo&lt;/li&gt;
&lt;li&gt;Click Generate → "Late monsoon air = fast germination. Your 4hr N light + medium pot = perfect for these 3"&lt;/li&gt;
&lt;li&gt;Shows Pudina / Pui Shak / Lanka cards with depth, spacing, harvest days&lt;/li&gt;
&lt;li&gt;Leaf Doctor: upload leaf with brown edge → &lt;code&gt;Overwatering + fungal spots&lt;/code&gt; → remedy in Bangla&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Full app is a single &lt;code&gt;index.html&lt;/code&gt; — no build step, no node_modules, 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;mitti-local/
└── index.html  # React + Tailwind via CDN, all logic inside
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Core open-weight calls:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. Detect local models — fallback chain after mllama error&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:11434/api/tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;// My Ollama 0.40.1 threw: "unknown model architecture: 'mllama'" for llama3.2-vision:11b&lt;/span&gt;
&lt;span class="c1"&gt;// So we try in order: moondream -&amp;gt; llava:7b -&amp;gt; llama3.2-vision:11b&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Text — what to plant this week&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:11434/api/generate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llama3.2:latest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You are Mitti, oracle for Kolkata 22°N late monsoon 31C 84% hum. Balcony: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sunHours&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;hrs, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;potSize&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Suggest 3 plants THIS week in Bengal with Bengali names. Return JSON.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Vision — leaf diagnosis, stays on device&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:11434/api/chat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;moondream&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Diagnose Bengal balcony leaf. Return {issue, cause, remedy_en, remedy_bn}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Offline build &lt;code&gt;mitti-local.zip&lt;/code&gt; works with WiFi off after &lt;code&gt;ollama pull&lt;/code&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  The stack is embarrassingly simple — and that is the point.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;One file. No backend. Two open-weight models running on Metal.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index.html (React + Tailwind via CDN)
  ├─&amp;gt; localStorage (journal, balcony config)
  ├─&amp;gt; FileReader.readAsDataURL (balcony photo → base64)
  ├─&amp;gt; fetch → Ollama /api/tags (detect what is installed)
  ├─&amp;gt; fetch → Ollama /api/generate (llama3.2 for planting advice)
  └─&amp;gt; fetch → Ollama /api/chat (moondream for leaf diagnosis)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Model 1 — &lt;code&gt;llama3.2:latest&lt;/code&gt; (2.0 GB, Q4_K_M, 2B params) — The Text Oracle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why this model and not GPT? Three reasons: speed, JSON reliability, and 22°N prompting.&lt;/p&gt;

&lt;p&gt;On Apple M4 Metal, it responds in &amp;lt;2 seconds for 3 plant cards. Prompt is engineered for Bengal, not USDA zones:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You are Mitti, oracle for Kolkata 22°N, late monsoon 31°C 84% humidity, balcony N facing 4hrs direct sun, medium 12-inch pot. Suggest exactly 3 plants to sow THIS week in Bengal. Use only: Palak, Dhonepata, Pudina, Lal Shak, Pui Shak, Notey, Begun, Lanka, Kochu. Consider monsoon humidity = fast germination but fungal risk. Return JSON array: [{bn, en, whyNow, depth, spacing, water, harvest, companion}]"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then local filter: if &lt;code&gt;sunHours &amp;lt; 2&lt;/code&gt; + &lt;code&gt;pot=small&lt;/code&gt;, remove Begun/Lanka (needs 6hr + large bosta). If &lt;code&gt;direction=N&lt;/code&gt; + &lt;code&gt;sunHours=2&lt;/code&gt;, only allow Pudina, Pui Shak, Kochu. This filtering is hard-coded in JS — the model suggests, local logic validates. No frost dates anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model 2 — &lt;code&gt;moondream&lt;/code&gt; (1.7 GB, 1.7B params, Apache 2.0) — The Eye&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started with &lt;code&gt;llama3.2-vision:11b&lt;/code&gt;. It crashed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;500 Internal Server Error
llama-server has terminated
unknown model architecture: 'mllama' 
Ollama 0.40.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mllama architecture wasn't supported in my Ollama build. Instead of giving up, I built a fallback chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tryModels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;moondream&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llava:7b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llava:13b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llama3.2-vision:11b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;tryModels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
  &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;moondream&lt;/code&gt; won — 1.7B, trained specifically for edge vision, great at close-up leaf texture. On M4 it diagnoses overwatering + fungal spots in ~4 seconds. Input pipeline:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;input type="file" → FileReader → base64 string → JSON images: [base64] → Ollama chat → local&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The image never leaves the device. Badge &lt;code&gt;Checked locally • No cloud&lt;/code&gt; is not marketing — it is &lt;code&gt;if (res.ok) setBadge("Checked locally • No cloud")&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ollama + llama.cpp + Metal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ollama is Go wrapper around llama.cpp with Metal GPU support. From my logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inference compute id=0 library=Metal compute=0.0 name=MTL0 total="11.8 GiB" 
model type=Llama embedding=2048
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;OLLAMA_ORIGINS=* ollama serve&lt;/code&gt; is critical — without it, browser fetch to &lt;code&gt;127.0.0.1:11434&lt;/code&gt; is blocked by CORS. Serving Mitti via &lt;code&gt;python3 -m http.server&lt;/code&gt; gives it a proper origin. If fetch fails, app degrades gracefully to a mock Bengal pool (still monsoon-correct).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bengal logic that no US model has:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Watering: "Keep moist, not wet" vs "Let top dry" vs "Heavy drinker" based on humidity. Para tip: "Don't water leaves after 6pm in monsoon. Fungus loves night wetness. Water soil at 7am."&lt;/li&gt;
&lt;li&gt;Companion: Pudina + Begun? No — Pudina spreads, keep separate. Pui Shak + jaali + Begun = good, Pui climbs, Begun shades roots.&lt;/li&gt;
&lt;li&gt;Pot mapping: 8" tub = herbs only (Pudina, Dhonepata). 12" pot = most greens. 18" bosta crate = Begun, Kochu, Pui with trellis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Journal is &lt;code&gt;localStorage.setItem("mitti-journal", JSON.stringify(entries))&lt;/code&gt;. No DB, no login. Session journal clears when tab closes — intentional friction to go offline.&lt;/p&gt;

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

&lt;p&gt;Closed APIs would have made Mitti technically possible but culturally dead. Open weights made it Bengali.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Privacy is not a feature — it is the whole product.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A mother in Baguiati will not upload a photo of her balcony to OpenAI. That photo has her kids' clothes drying, her flat number on the wall, her mother's face. She will upload a sick leaf to something that says &lt;code&gt;Checked locally • No cloud&lt;/code&gt; because the photo literally never leaves &lt;code&gt;FileReader&lt;/code&gt;. With &lt;code&gt;moondream&lt;/code&gt; running on her son's M4 MacBook, diagnosis happens in &lt;code&gt;127.0.0.1&lt;/code&gt;. No S3 bucket, no log retention, no "we may use your data to improve our models."&lt;/p&gt;

&lt;p&gt;I tried to do this with a closed vision API first. The first thing the docs said: "Images are stored for 30 days for abuse monitoring." My para aunty said: "Na baba, thak." No, son, leave it. Open innovation made trust possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Frost is in the training data. Monsoon is not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GPT-4, Claude, Gemini — all know "last frost date April 15, plant tomatoes after." None know that in Kolkata, late monsoon is the best time to sow Pui Shak because humidity = 84% = seeds germinate in 3 days instead of 7, but you must not water leaves after 6pm because &lt;code&gt;Alternaria&lt;/code&gt; fungus explodes in night wetness.&lt;/p&gt;

&lt;p&gt;That knowledge is not in Common Crawl. It is in para gossip, in 70-year-old uncles who say "Bosta te Begun bhalo hoy" — brinjal grows well in fruit crates. With open-weight models, I could inject that knowledge in the system prompt and then add a local JS filter that enforces it. I own the prompt. I own the filter. I own the fallback.&lt;/p&gt;

&lt;p&gt;With a closed API, you get a 2000-token system prompt limit and a content filter that flags "neem oil 1 tsp" as medical advice. With &lt;code&gt;llama3.2&lt;/code&gt;, I can write a 400-token prompt in Bangla-English mix and it just works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It works where WiFi doesn't — which is exactly where you garden.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My balcony has no WiFi. Many buildings in Kolkata have patchy data. The exact place you need a garden oracle — standing in 31°C humidity with soil in your hands — is the place where a closed API times out.&lt;/p&gt;

&lt;p&gt;After &lt;code&gt;ollama pull moondream&lt;/code&gt; once, Mitti works in airplane mode. I tested it: turn off WiFi, generate planting advice, diagnose leaf — all &amp;lt;5 seconds on Metal. A closed API dies on the balcony. Open weights thrive on the balcony. That is the whole Touch Grass brief.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Forkable for their 22°N — not just my 22°N.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open innovation means a student in Chennai can fork Mitti tomorrow, replace &lt;code&gt;Pudina, Pui Shak, Lanka&lt;/code&gt; with &lt;code&gt;Agathi, Muringa, Vendakka&lt;/code&gt;, change &lt;code&gt;N facing 2hrs&lt;/code&gt; to &lt;code&gt;West facing 5hrs + sea breeze&lt;/code&gt;, and run &lt;code&gt;ollama pull moondream&lt;/code&gt; on his 8GB IdeaPad. No API key, no $20/month, no rate limit, no credit card.&lt;/p&gt;

&lt;p&gt;A closed API charges $0.01 per image. For 10M balcony families uploading 2 leaf photos a week, that is $800K/month leaving Bengal. Open weights keep it in Bengal.&lt;/p&gt;

&lt;p&gt;This is why I built Mitti on a MacBook and not on Vercel. Open innovation didn't make Mitti cheaper. It made it &lt;em&gt;ours&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And &lt;em&gt;ours&lt;/em&gt; means you can fork it. Tomorrow someone in Howrah will add Kochu stems, someone in Sylhet will add their jaali trellis pattern, someone will teach moondream what overwatering looks like on Lal Shak — not just lettuce. That fork won't need my permission. It won't need an API key or a credit card. It will just need a bosta crate and some mitti.&lt;/p&gt;

&lt;p&gt;I built Mitti to be outgrown. The best thing that can happen is it stops being my balcony oracle and becomes your para's oracle. That's Touch Grass. That's why it runs on your laptop, not someone else's cloud.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built GradShift for My Friend Who Had Zero Corporate Exposure — Class of 2026 Companion</title>
      <dc:creator>Suprabhat Das</dc:creator>
      <pubDate>Fri, 02 Oct 2026 22:21:58 +0000</pubDate>
      <link>https://dev.to/suprabhatdas/i-built-gradshift-for-my-friend-who-had-zero-corporate-exposure-class-of-2026-companion-3l16</link>
      <guid>https://dev.to/suprabhatdas/i-built-gradshift-for-my-friend-who-had-zero-corporate-exposure-class-of-2026-companion-3l16</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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I started building for one friend. His whole batch uses it now.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;GradShift — Campus to Corporate Companion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My friend, Class of 2026, got his first corporate offer and texted at 2am: "Am I good enough? I have zero corporate exposure."&lt;/p&gt;

&lt;p&gt;He's BTech, but this is everyone straight out of campus — BTech, BCom, BA, BSc, BBA, MBA — any degree, first job, no idea how corporate actually works.&lt;/p&gt;

&lt;p&gt;GradShift is what a senior friend would tell you at 2am in the hostel corridor. Not a course. 5 utilities, one flow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Mind Matters Toolkit — for when your chest gets tight before Day 1&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Panic Button:&lt;/strong&gt; One tap → full-screen breathing canvas. 4-4-4-4 box breathing with a visual circle, then 5-4-3-2-1 grounding (5 things you see, 4 you touch...). No login, no sound needed, works in a crowded PG room.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Check-in:&lt;/strong&gt; How are you really? 😰😔😐🙂😄 — you pick, it stays in your tab only via localStorage. No server, no streak shaming. Just a mirror that says "you felt this 3 days ago, it's okay."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Imposter Decoder:&lt;/strong&gt; You type "Everyone knows Excel except me" → it reframes: "3 out of 10 people in Stories Wall said the same Week 1. Here's what they did: asked their buddy, watched one 10-min video." Not therapy, just peer normalization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burnout Flags:&lt;/strong&gt; Subtle signs — "You stopped eating lunch away from desk" "You dream about emails" — with Kiran Helpline 1800-599-0019 right there, not hidden in footer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Your First 90 Days — because no one tells you corporate has seasons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Days 1-7: Orientation &amp;amp; Docs:&lt;/strong&gt; What to actually carry, how to read your offer letter, why your UAN matters more than your employee ID that week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days 8-30: Training &amp;amp; Shadow:&lt;/strong&gt; How to shadow without being annoying, how to ask "dumb" questions, the art of saying "I don't know, but I'll figure out by EOD."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days 31-90: First Real Work:&lt;/strong&gt; Your first independent task will be small. That's intentional. How to send your first update, how to handle first feedback without crying in washroom (and what to do if you do).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generic, so it works for Sales, Marketing, Finance, Ops, HR, Tech — not just CSE.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Corporate Survival Kit — copy-paste because you shouldn't learn email at 2am&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email Templates (&amp;lt;100 words each):&lt;/strong&gt; Sick leave without over-explaining, extension request without sounding lazy, thank you after interview, "I didn't understand the task" without sounding incompetent. Just copy, change name, send.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jargon Wall:&lt;/strong&gt; Bandwidth ≠ WiFi. KT = Knowledge Transfer. EOD = your 6pm, not 11:59pm. OOO, LWD, PIP, Bench, Billable — explained like a senior would, not a dictionary. My friend's favorite: "Bench is not punishment. It's between projects. Use it to upskill, not spiral."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily Standup Decoder:&lt;/strong&gt; What your manager actually wants in 30 seconds: What you did, what you'll do, blocker. Not your life story.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Money &amp;amp; Adulting — because LPA is not monthly salary&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LPA to In-Hand Calculator:&lt;/strong&gt; Type 6 LPA → see PF, gratuity, tax, insurance cut → real take-home. First time most grads see it and don't get shocked on 31st.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First Month Checklist:&lt;/strong&gt; Activate UAN, link PAN-Aadhaar, understand Form 16, why you need health insurance even at 22, rent agreement basics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Salary Day Reality:&lt;/strong&gt; What to do first 48 hours after first salary — 3 buckets, not finance bro advice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Stories Wall — 10 people who felt like you, anonymous&lt;/strong&gt;&lt;br&gt;
Filter by First Day / First Mistake / Mental Health / Money. BCom who froze on first client call, BA English who thought corporate was only for MBA, BSc Ops who didn't know VLOOKUP Day 1, MBA who got PIP in month 2 and survived, BBA who cried after first review. Mood tags 😰😅🥹, batch tags, category. And a "Share Yours Anonymously" that goes to localStorage — no one knows it's you, but next junior feels less alone.&lt;/p&gt;

&lt;p&gt;I built for one. His batch made it theirs.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live, no login:&lt;/strong&gt; &lt;a href="https://gradshift.netlify.app" rel="noopener noreferrer"&gt;https://gradshift.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I handed it to him at midnight. He said: "Bro, 'bench is not punishment' — I needed that." Then he shared it in his batch WhatsApp.&lt;/p&gt;

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

&lt;p&gt;I didn't start with a tech stack. I started with a 2am voice note.&lt;/p&gt;

&lt;p&gt;I sketched the panic moments on paper first — first email, first standup, first "let's take this offline" nod. Mapped those into 5 utilities, not 40 features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-source AI as co-writer, not replacement:&lt;/strong&gt;&lt;br&gt;
I used open-weight models from the Llama family as my co-writer. I wrote the raw story — "commerce grad, froze on client call" — the model helped reframe it in a warm, senior-bhaiya voice. If it sounded like HR, I deleted it. If it sounded like hostel corridor, I kept it. Same for email templates: I gave it "under 100 words, any degree" and curated it human.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No-server by design:&lt;/strong&gt;&lt;br&gt;
Single HTML file — React + Tailwind via CDN, Plus Jakarta Sans + Caveat for handwritten note feeling. Every check-in, mood, custom story = localStorage only. Close tab, still there. Designed so tomorrow you can drop in Ollama + Llama 3.2 3B and run reframes fully offline — no API, no internet. That swap only works because weights are open.&lt;/p&gt;

&lt;p&gt;From idea at 2am to live link at 11am — open tools, for one person.&lt;/p&gt;

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

&lt;p&gt;Because trust is the feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Open is the only way to handle a 2am thought.&lt;/strong&gt; If this was closed API, "I feel like a fraud" would travel to someone else's server, get logged, billed. He would never type it. With open-weight models that can run on his device, his panic stays in his device. For mental-health-adjacent tools, closed is not an option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Open is free forever.&lt;/strong&gt; Closed charges per token — a breathing exercise becomes $0.002. GradShift is 83kb, loads once, works offline in a PG with flaky WiFi. And if we need backend, Supabase (open Postgres) gives 500MB and 50k users free — that's 500,000 stories for $0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Open is forkable — that's how one friend becomes every campus.&lt;/strong&gt; Any batch can copy one file, replace stories with their seniors from Kolkata, Pune, Delhi, translate to Bengali/Hindi. My friend changed footer to "For BCom 2026, by BCom 2026" in 30 seconds. You can't do that with closed tech. That's ownership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Open beats generic advice with lived experience.&lt;/strong&gt; Open models can be fine-tuned on your own Stories Wall — now the imposter decoder sounds like YOUR senior, not a generic chatbot. That future only exists if weights are open and data stays local.&lt;/p&gt;

&lt;p&gt;I built a letter from one friend to another, using tools that let that letter stay private, free, and copyable.&lt;/p&gt;




&lt;p&gt;If you're Class of 2026 — what would you add to the Stories Wall? Drop it in comments.&lt;/p&gt;

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