<?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: Jainil Chavda</title>
    <description>The latest articles on DEV Community by Jainil Chavda (@jainil26).</description>
    <link>https://dev.to/jainil26</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%2F4153906%2F78cbc52e-659a-44ca-91ec-e580a183f0e1.jpg</url>
      <title>DEV Community: Jainil Chavda</title>
      <link>https://dev.to/jainil26</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jainil26"/>
    <language>en</language>
    <item>
      <title>Sloth Sorter: an offline, low-RAM file tidier with undo</title>
      <dc:creator>Jainil Chavda</dc:creator>
      <pubDate>Sun, 25 Oct 2026 06:00:00 +0000</pubDate>
      <link>https://dev.to/jainil26/sloth-sorter-an-offline-low-ram-file-tidier-with-undo-2nj0</link>
      <guid>https://dev.to/jainil26/sloth-sorter-an-offline-low-ram-file-tidier-with-undo-2nj0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Sloth Sorter&lt;/strong&gt; is a command-line tool that tidies a messy Downloads folder so you don't have to. It sorts files into folders, optionally reads their contents to guess a better category, and can rename them. Everything runs offline on a low-end laptop.&lt;/p&gt;

&lt;p&gt;It is built to be safe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dry-run by default.&lt;/strong&gt; It shows a preview and moves nothing until you pass &lt;code&gt;--apply&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It never deletes.&lt;/strong&gt; It only moves and renames.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo with SHA-256 checks.&lt;/strong&gt; Every move is logged in SQLite and can be reverted, and files that changed since the move are skipped.&lt;/li&gt;
&lt;/ul&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/Jainil26" rel="noopener noreferrer"&gt;
        Jainil26
      &lt;/a&gt; / &lt;a href="https://github.com/Jainil26/sloth-sorter" rel="noopener noreferrer"&gt;
        sloth-sorter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Offline, low-resource AI file organizer. Sorts, renames and archives your messy Downloads folder with dry-run and undo. Open-source, no LLM or GPU needed.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🦥 sloth-sorter&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An offline, low-resource file organizer CLI in Python 3.14. Sorts, cleans, and categorizes messy folders (like &lt;code&gt;Downloads&lt;/code&gt; or &lt;code&gt;Desktop&lt;/code&gt;) with collision safety, dry-run by default, intelligent embedding-based document classification, smart keyword renaming, and cryptographically verified undos.&lt;/p&gt;
&lt;p&gt;Designed specifically for low-end laptops with limited CPU, memory, and disk space:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Heavy ML Bloat&lt;/strong&gt;: No PyTorch, no sentence-transformers, no LLMs. Uses Model2Vec static embeddings (&lt;code&gt;minishlab/potion-base-8M&lt;/code&gt;, ~30MB).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiny Install Footprint&lt;/strong&gt;: Total virtual environment disk space is only ~303MB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Loaded&lt;/strong&gt;: Runs without &lt;code&gt;--smart&lt;/code&gt; never import or load Model2Vec.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never Deletes User Files&lt;/strong&gt;: Moves and renames only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dry-Run by Default&lt;/strong&gt;: Nothing moves without explicit &lt;code&gt;--apply&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe Undo with SHA-256&lt;/strong&gt;: SQLite-backed batch log tracks moves and renames, verifies hashes before reverting, and prevents overwriting conflicts.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏗️ How It Works: 3 Tiers&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Sloth Sorter uses a fast, hierarchical, multi-tiered approach:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;                      [ Incoming File ]&lt;/code&gt;&lt;/pre&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/Jainil26/sloth-sorter" 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;My laptop can't run even a small LLM, so I used a &lt;strong&gt;three-tier pipeline&lt;/strong&gt; that only reaches for AI when needed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rules:&lt;/strong&gt; extension and filename patterns, free and instant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source embeddings (&lt;code&gt;--smart&lt;/code&gt;):&lt;/strong&gt; &lt;a href="https://github.com/MinishLab/model2vec" rel="noopener noreferrer"&gt;Model2Vec&lt;/a&gt; &lt;code&gt;potion-base-8M&lt;/code&gt; (about 30 MB, CPU-only, no PyTorch) embeds the first ~2000 characters of a file. NumPy cosine similarity against category prototypes picks the category.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword renaming (&lt;code&gt;--rename&lt;/code&gt;):&lt;/strong&gt; a small built-in TF-IDF extractor builds names like &lt;code&gt;2026-03_electricity_invoice.pdf&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stack: Python 3.14, Model2Vec, NumPy, PyMuPDF, python-docx, Rich, SQLite, pytest (44 tests passing). I built it over three days with Antigravity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benchmark on 30 synthetic documents:&lt;/strong&gt; about 18 files/s, 191 MB peak RAM, 5 s model load (it includes the first-time download), 100% accuracy.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; it reads your personal documents (ID cards, certificates, fee receipts) and none of it leaves the machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs on weak hardware:&lt;/strong&gt; an open static-embedding model needs no GPU and no large download, which a closed API-based approach would not give me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero cost:&lt;/strong&gt; no API key or per-file billing, and it works offline after the first model download.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable:&lt;/strong&gt; categories and prototypes are plain config, so anyone can retrain them for their own files.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;On my real Downloads folder (503 files), a single dry-run produced a full plan and a CSV report in seconds. 431 files were sorted by rules alone, and the embedding tier handled the other 72.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The 100% score is on &lt;strong&gt;synthetic&lt;/strong&gt; files written to match the prototypes. On my real, messy Downloads, the embedding tier was much weaker. For example, lecture PDFs landed in "Resumes", and a software license landed in "Invoices". I only reviewed these by filename, so treat this as a rough observation, not a measured accuracy.&lt;/li&gt;
&lt;li&gt;Keyword renaming on real files was often unhelpful, so &lt;code&gt;--rename&lt;/code&gt; is experimental.&lt;/li&gt;
&lt;li&gt;The venv is about 303 MB, mostly PyMuPDF (172 MB). Swapping it for &lt;code&gt;pypdf&lt;/code&gt; would shrink it.&lt;/li&gt;
&lt;li&gt;Planned next: a stricter confidence threshold, keyword gates for risky categories, and a &lt;code&gt;watchdog&lt;/code&gt; auto-sort mode.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Tablespeak: a menu translator that spells every dish the way the restaurant does</title>
      <dc:creator>Jainil Chavda</dc:creator>
      <pubDate>Sat, 17 Oct 2026 10:31:06 +0000</pubDate>
      <link>https://dev.to/jainil26/tablespeak-a-menu-translator-that-spells-every-dish-the-way-the-restaurant-does-1c9m</link>
      <guid>https://dev.to/jainil26/tablespeak-a-menu-translator-that-spells-every-dish-the-way-the-restaurant-does-1c9m</guid>
      <description>&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%2Fq8seuzc3ikq2eljlw9ak.jpg" 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%2Fq8seuzc3ikq2eljlw9ak.jpg" alt=" " width="799" height="376"&gt;&lt;/a&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Tablespeak&lt;/strong&gt; is a menu translator for restaurants. You paste a menu in Gujarati, Hindi, English or a mix, pick one of 10 languages, and get a printable menu card.&lt;/p&gt;

&lt;p&gt;The part someone would pay for is the &lt;strong&gt;glossary&lt;/strong&gt;. A generic translator guesses dish names. It turns &lt;em&gt;ઊંધિયું&lt;/em&gt; into "mixed vegetable curry" and spells &lt;em&gt;khaman&lt;/em&gt; three different ways on one menu. With Tablespeak, the owner writes one line per dish:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ઊંધિયું / undhiyu | Undhiyu | Surat's winter specialty: mixed vegetables slow-cooked with green masala&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Every matching dish then keeps that exact spelling and description, in every language. Dishes from the glossary get a small turmeric dot on the card, so the owner can see what came from their own dictionary.&lt;/p&gt;

&lt;p&gt;The target customer is a small restaurant that wants a menu for tourists, or for staff and customers who read a different Indian language, without paying a translator for every edit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://tablespeak.vercel.app" rel="noopener noreferrer"&gt;https://tablespeak.vercel.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/Jainil26/tablespeak" rel="noopener noreferrer"&gt;https://github.com/Jainil26/tablespeak&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The browser sends the menu and glossary to a small Node server. The server builds a prompt, calls an open-weight model through an OpenAI-compatible API, and returns a menu card. The API key stays on the server, so visitors never see it.&lt;/p&gt;

&lt;p&gt;The whole project has &lt;strong&gt;zero dependencies&lt;/strong&gt;: plain HTML, CSS and JavaScript, plus about 100 lines of Node. I built it in two days using Google Antigravity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open models mattered here
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I don't own a powerful laptop, so I couldn't run a model locally.&lt;/strong&gt; Open weights still helped, because they are served by many providers through the same API. I used Qwen 2.5 72B, Llama 3.3 70B and Gemma 3 27B through OpenRouter, and switching between them is a dropdown in the app and one line in the code.&lt;/p&gt;

&lt;p&gt;That mattered twice while building:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Free models disappear.&lt;/strong&gt; Two of my three free model ids started returning 404 partway through, with an error saying the free version was gone. With a closed API that would have meant rewriting the integration. With open models I changed two ids in a config file and kept going.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models are not equally good in every language.&lt;/strong&gt; My first Punjabi test came back with English descriptions and English added in brackets next to the Gurmukhi headings. Because I could compare models and control the prompt, I fixed it in two steps: a script-aware prompt that tells the model which writing system to use, and a check on the server that detects when most descriptions are not in the right script and asks the model once more. After that, Punjabi came out correctly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Other benefits of the open approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in.&lt;/strong&gt; Any OpenAI-compatible endpoint works, so I can change the provider with one environment variable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private when it needs to be.&lt;/strong&gt; The same code can point at a local Ollama server on a stronger machine, and a restaurant's menu data would never leave the building.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheap.&lt;/strong&gt; A menu is a few thousand tokens, so a translation costs a fraction of a cent. [[ADD your real cost if you checked it on OpenRouter ]]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customizable.&lt;/strong&gt; The glossary and prompt are plain text, and open weights can be fine-tuned later for one cuisine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned from comparing models
&lt;/h2&gt;

&lt;p&gt;[[ADD 2-3 honest lines from your own test: which model was best at Gujarati/Punjabi, which kept glossary names most exactly, which invented ingredients, and any speed difference. Even "Qwen was the best default" is fine. ]]&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Output is AI-generated, so the card tells readers to &lt;strong&gt;check ingredients and allergens before printing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open models are stronger in Hindi, Gujarati, Marathi and Bengali than in smaller-resource languages like Malayalam, Kannada and Telugu.&lt;/li&gt;
&lt;li&gt;It translates menu text, not photos. Uploading a photo of a menu is the next feature I'd add.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contribute
&lt;/h2&gt;

&lt;p&gt;The repo is open for Hacktoberfest. Good first issues: glossary starter packs for other cuisines, more languages, CSV import and export for the glossary, and tests for the translation logic. Pull requests are welcome.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>opensource</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jainil Chavda</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:50:34 +0000</pubDate>
      <link>https://dev.to/jainil26/-11ij</link>
      <guid>https://dev.to/jainil26/-11ij</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/jainil26/i-built-studybuddy-ai-for-a-friend-who-was-tired-of-turning-notes-into-study-material-fdh" class="crayons-story__hidden-navigation-link"&gt;I Built StudyBuddy AI for a Friend Who Was Tired of Turning Notes Into Study Material 📚🤖&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/jainil26/i-built-studybuddy-ai-for-a-friend-who-was-tired-of-turning-notes-into-study-material-fdh" 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="/jainil26" 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%2F4153906%2F78cbc52e-659a-44ca-91ec-e580a183f0e1.jpg" alt="jainil26 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jainil26" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jainil Chavda
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jainil Chavda
                
                
              
              &lt;div id="story-author-preview-content-4792408" 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="/jainil26" 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%2F4153906%2F78cbc52e-659a-44ca-91ec-e580a183f0e1.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jainil Chavda&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/jainil26/i-built-studybuddy-ai-for-a-friend-who-was-tired-of-turning-notes-into-study-material-fdh" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 3&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/jainil26/i-built-studybuddy-ai-for-a-friend-who-was-tired-of-turning-notes-into-study-material-fdh" id="article-link-4792408"&gt;
          I Built StudyBuddy AI for a Friend Who Was Tired of Turning Notes Into Study Material 📚🤖
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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;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/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/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&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/jainil26/i-built-studybuddy-ai-for-a-friend-who-was-tired-of-turning-notes-into-study-material-fdh" 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/jainil26/i-built-studybuddy-ai-for-a-friend-who-was-tired-of-turning-notes-into-study-material-fdh#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;
            5 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>ai</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built StudyBuddy AI for a Friend Who Was Tired of Turning Notes Into Study Material 📚🤖</title>
      <dc:creator>Jainil Chavda</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:47:30 +0000</pubDate>
      <link>https://dev.to/jainil26/i-built-studybuddy-ai-for-a-friend-who-was-tired-of-turning-notes-into-study-material-fdh</link>
      <guid>https://dev.to/jainil26/i-built-studybuddy-ai-for-a-friend-who-was-tired-of-turning-notes-into-study-material-fdh</guid>
      <description>&lt;h3&gt;
  
  
  I Built StudyBuddy AI for a Friend Who Was Tired of Turning Notes Into Study Material 📚🤖
&lt;/h3&gt;

&lt;p&gt;This is my submission for the &lt;strong&gt;Hacktoberfest 2026 Weekend Challenge: Build for a Friend&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build something with open-source AI at its core.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of building another generic AI chatbot, I wanted to build something practical for a student.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;StudyBuddy AI&lt;/strong&gt; — an AI-powered study assistant that turns raw study notes into a structured study pack with summaries, key takeaways, practice questions, answers, and explanations.&lt;/p&gt;




&lt;h2&gt;
  
  
  👋 The Problem
&lt;/h2&gt;

&lt;p&gt;A friend of mine often has the same problem before exams:&lt;/p&gt;

&lt;p&gt;They already have the notes.&lt;/p&gt;

&lt;p&gt;But then comes the difficult part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What should I actually remember?&lt;/li&gt;
&lt;li&gt;What are the important points?&lt;/li&gt;
&lt;li&gt;What questions could be asked?&lt;/li&gt;
&lt;li&gt;Can I test myself?&lt;/li&gt;
&lt;li&gt;Do I really understand the topic?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turning a large set of notes into useful revision material can take a lot of time.&lt;/p&gt;

&lt;p&gt;I wanted to build something that could take those notes and immediately turn them into something that is actually useful for studying.&lt;/p&gt;

&lt;p&gt;That's how &lt;strong&gt;StudyBuddy AI&lt;/strong&gt; started.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎓 What Is StudyBuddy AI?
&lt;/h3&gt;

&lt;p&gt;StudyBuddy AI takes a student's study notes and transforms them into a structured &lt;strong&gt;Study Pack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The student provides their notes, and the application generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📝 Summary&lt;/li&gt;
&lt;li&gt;🔑 Key Takeaways&lt;/li&gt;
&lt;li&gt;❓ Practice Questions&lt;/li&gt;
&lt;li&gt;✅ Answers&lt;/li&gt;
&lt;li&gt;💡 Explanations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Paste your notes → Generate a study pack → Revise → Test yourself&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://dev.tourl"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows the complete flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter study notes&lt;/li&gt;
&lt;li&gt;Select an available AI model&lt;/li&gt;
&lt;li&gt;Generate the study pack&lt;/li&gt;
&lt;li&gt;Read the summary and key takeaways&lt;/li&gt;
&lt;li&gt;Practice with generated questions&lt;/li&gt;
&lt;li&gt;Reveal answers and explanations&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🚀 Try the Project
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/Jainil26/hacktoberfest-weekend-2026" rel="noopener noreferrer"&gt;https://github.com/Jainil26/hacktoberfest-weekend-2026&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 How It Works
&lt;/h3&gt;

&lt;p&gt;The architecture is intentionally simple.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
Student
   ↓
React Frontend
   ↓
Express.js Backend
   ↓
Hugging Face Router
   ↓
Open-Weight AI Model
   ↓
Structured Study Pack
   ↓
React Interface


1. Student Input

The student pastes their study notes into the application.

2. Backend Processing

The React frontend sends the notes to the Express.js backend.

3. AI Processing

The backend creates a structured prompt based on the student's notes.

The prompt is then sent to the Hugging Face Router.

4. Model Generation

An available open-weight AI model processes the notes and generates:

Summary
Key takeaways
Practice questions
Answers
Explanations
5. Study Pack

The generated content is returned to the React application and displayed in an organized interface.

🤖 Model Selection

The default model used by StudyBuddy AI is:

Qwen/Qwen2.5-72B-Instruct

But I didn't want to hard-code the application around a single model.

StudyBuddy AI also includes a dynamic model selector.

It discovers compatible models currently available through Hugging Face's inference providers and allows the application to work with available models.

This is useful because model availability through hosted inference can change.

Instead of presenting users with models that may not currently work with the configured inference service, the application can discover compatible options dynamically.

💡 Why Open-Weight AI?

Open-weight AI was an important part of this project.

StudyBuddy AI uses open-weight models through Hugging Face inference providers.

This approach provides several interesting possibilities:

🔄 Flexibility

The application isn't conceptually locked to one model.

Compatible models can be swapped depending on availability and requirements.

💻 Deployment Options

When hardware allows, compatible open-weight models can potentially be deployed locally instead of relying entirely on hosted inference.

🛠️ Developer Control

Developers have more control over the model and deployment environment.

🧪 Experimentation

Open-weight models make it easier to experiment with different models and AI application architectures.

💰 Cost Flexibility

Developers can choose between hosted inference and self-hosted deployment depending on their requirements.

For StudyBuddy AI, this means the AI layer can evolve independently from the rest of the application.

🛠️ Tech Stack
Frontend
React 18
Vite
Vanilla CSS3
Lucide Icons
Canvas Confetti
Backend
Node.js
Express.js
CORS
Dotenv
AI
Hugging Face Router
Hugging Face Inference Providers
Qwen/Qwen2.5-72B-Instruct
📂 Project Structure
hacktoberfest-weekend-2026/
│
├── client/
│   ├── public/
│   │   └── logo.jpg
│   │
│   └── src/
│       ├── components/
│       │   ├── AboutModal.jsx
│       │   ├── FlashcardQuiz.jsx
│       │   ├── ModelSelector.jsx
│       │   ├── NoteInput.jsx
│       │   └── StudyPackView.jsx
│       │
│       ├── App.jsx
│       ├── App.css
│       └── main.jsx
│
├── server/
│   ├── aiService.js
│   ├── index.js
│   └── sampleNotes.js
│
├── .env.example
├── .gitignore
├── package.json
├── package-lock.json
├── README.md
└── ...
🧪 Example

Imagine a student has these notes:

TCP is a connection-oriented transport layer protocol.
It provides reliable and ordered delivery of data.
TCP uses acknowledgements, sequence numbers and retransmission
to ensure reliable communication between devices.

Instead of manually converting those notes into revision material, StudyBuddy AI can generate a structured study pack.

📌 Summary

A concise explanation of TCP and its purpose.

🔑 Key Takeaways
TCP operates at the transport layer.
TCP provides reliable data delivery.
TCP maintains ordered communication.
TCP uses acknowledgements and sequence numbers.
Lost data can be retransmitted.
❓ Practice Questions

The application generates questions based on the submitted study material.

✅ Answers &amp;amp; Explanations

Students can reveal the answers and explanations to check their understanding.

The idea is not simply to give the student an AI-generated summary.

It is to create a small revision + self-testing workflow from the material they already have.

🔐 Security

The Hugging Face API token is stored using environment variables.

Sensitive information should never be committed to the repository.

.env
API keys
Access tokens
Passwords
Private credentials

The .gitignore file is configured to exclude environment files and dependency directories.

🔮 What's Next?

There are several features I would like to add in future versions:

📄 PDF and document upload
🧠 Multiple study modes
🗂️ Dedicated flashcard generation
🎚️ Difficulty selection
📖 Detailed topic explanations
💻 Local model support
🤖 More Hugging Face models
📊 Study history
📈 Progress tracking
🔁 Spaced-repetition support

The current version intentionally keeps the core workflow simple.

❤️ Why I Built It

One thing I like about building AI applications is that the best ideas don't always need to be huge.

Sometimes the problem is simple:

"I have my notes. I just need a better way to study them."

StudyBuddy AI is my attempt to solve exactly that.

It combines a normal full-stack web application with open-weight AI to create something that can actually be used during everyday studying.

🧑‍💻 What I Learned

Building StudyBuddy AI gave me hands-on experience with:

Integrating AI models into a full-stack application
Working with Hugging Face inference
Building structured prompts
Dynamically discovering available AI models
Connecting React with an Express backend
Handling environment variables securely
Designing an AI-powered user workflow
Thinking about model flexibility instead of hard-coding a single model
🎯 Hacktoberfest 2026

This project was built for the Hacktoberfest 2026 Weekend Challenge: Build for a Friend.

The challenge focuses on building something with open-source AI at its core that solves a real problem for a friend or someone you care about.

For me, that problem was studying.

Instead of building a complicated AI system just for the sake of using AI, I wanted to build a small application where the AI component directly contributes to solving the problem.


🙌 Feedback Welcome

I'd love to hear what you think about StudyBuddy AI.

If you are a student, what feature would make a tool like this more useful for your study workflow?

And if you're a developer, I'd especially love feedback on the architecture, AI integration, and model-selection approach.

Built with ❤️ and open-weight AI for Hacktoberfest 2026.

![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/z1abbsvg5iv2q89pphpb.jpg)
![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/a5t6snmnsjg9l0m754mi.jpg)
![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/9ixr3kc516b4sd3m4sgl.jpg)
![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/8668w5r31jccoddi57mv.jpg)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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