<?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: Viktor</title>
    <description>The latest articles on DEV Community by Viktor (@shadow16ua).</description>
    <link>https://dev.to/shadow16ua</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%2F4155614%2F5fd14b76-d881-4419-976e-ec2cb40b8722.jpg</url>
      <title>DEV Community: Viktor</title>
      <link>https://dev.to/shadow16ua</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shadow16ua"/>
    <language>en</language>
    <item>
      <title>Sloth AI Folder Tidier: Let Open-Source AI Clean Your Downloads Folder So You Don't Have To</title>
      <dc:creator>Viktor</dc:creator>
      <pubDate>Sat, 24 Oct 2026 10:02:48 +0000</pubDate>
      <link>https://dev.to/shadow16ua/sloth-ai-folder-tidier-let-open-source-ai-clean-your-downloads-folder-so-you-dont-have-to-g6m</link>
      <guid>https://dev.to/shadow16ua/sloth-ai-folder-tidier-let-open-source-ai-clean-your-downloads-folder-so-you-dont-have-to-g6m</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;p&gt;What I Built&lt;br&gt;
Let’s be honest about the Downloads folder. For most developers and students, it is a digital graveyard. Mine had accumulated exactly 962 files—a chaotic mix of university PDFs, C# snippets, .jar game mods, audio tracks, and 40 different setup_v2_final(1).exe installers.&lt;/p&gt;

&lt;p&gt;Why don't I clean it? Because of the Hoarder’s Paradox:&lt;/p&gt;

&lt;p&gt;I am way too lazy to sort nearly a thousand files manually.&lt;br&gt;
I am too paranoid to bulk-delete anything because "what if I need that random file from 4 months ago?!"&lt;/p&gt;

&lt;p&gt;To channel my inner sloth for International Sloth Day, I built Sloth AI Folder Tidier—an automated file organizer designed specifically for lazy digital hoarders.&lt;/p&gt;

&lt;p&gt;Instead of blindly sorting by file extension, it scans file age, size, and peeks at the first 150 characters of text/code files. Using open-weight models, it understands context and neatly organizes chaos into logical folders (University_&amp;amp;&lt;em&gt;Docs, Code&lt;/em&gt;&amp;amp;&lt;em&gt;Dev, Gaming&lt;/em&gt;&amp;amp;&lt;em&gt;Mods, Media&lt;/em&gt;&amp;amp;_Music, etc.) with three golden safety rules:&lt;/p&gt;

&lt;p&gt;Zero-Deletion Policy: The script literally does not contain a delete function. Nothing is ever lost.&lt;/p&gt;

&lt;p&gt;The Sloth Vault (Sloth_Vault_Old): If an installer or archive hasn't been touched in over 30 days, the AI quarantines it. Out of sight, out of mind, but still there if you panic.&lt;/p&gt;

&lt;p&gt;1-Click Undo (--undo) &amp;amp; Dry-Run (--dry-run): Every move is logged locally. One command reverts your entire folder back to its original messy state in 1 second.&lt;/p&gt;

&lt;p&gt;Demo&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%2F4guuie435ug52u5wdy8o.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%2F4guuie435ug52u5wdy8o.jpg" alt="Program startup" width="775" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Shadow16Ua" rel="noopener noreferrer"&gt;
        Shadow16Ua
      &lt;/a&gt; / &lt;a href="https://github.com/Shadow16Ua/Sloth-Folder-Tidier" rel="noopener noreferrer"&gt;
        Sloth-Folder-Tidier
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;How I Built It&lt;br&gt;
The project is a Python CLI built around fast, open-weight models (qwen/qwen3.8-27b and openai/gpt-oss-20b) running via the Groq API.&lt;/p&gt;

&lt;p&gt;Metadata &amp;amp; Micro-Context Extraction: Rather than uploading whole files, the script uses pathlib and os.stat to extract lightweight metadata (filename, extension, age in days, size) and reads a tiny 150-character preview for plain-text/code files.&lt;/p&gt;

&lt;p&gt;Structured JSON Batching: To process hundreds of files efficiently without hitting rate limits, the script chunks the files into batches of 15. These are passed to the model with response_format={"type": "json_object"}, forcing the open-weight model to act as a deterministic routing engine rather than a chatty assistant.&lt;/p&gt;

&lt;p&gt;State Reversibility: Every shutil.move operation is recorded in a sloth_history.json state file, allowing deterministic rollback.&lt;/p&gt;

&lt;p&gt;Why Does Open Innovation Matter?&lt;br&gt;
When building a tool that inspects your personal filesystem, open-source AI isn't just a nice-to-have — it’s mandatory:&lt;/p&gt;

&lt;p&gt;Privacy of Personal Files: Nobody wants to send a list of their private university documents, local source code, and personal filenames to a closed, proprietary corporate cloud that trains on user prompts. Because this architecture uses standard open-weight models, you can run it via fast zero-retention APIs (like Groq) or eventually swap the base URL to run it 100% offline via Ollama.&lt;/p&gt;

&lt;p&gt;Set It and Forget It (Zero Cost): A folder tidier is a background utility you run weekly. Using highly capable, smaller open models means inference is practically free, allowing a true "set it once and be lazy forever" workflow.&lt;/p&gt;

&lt;p&gt;Model Swappability: Closed APIs lock you in. While building this, several models were decommissioned on my inference provider. Because I was using open models, I simply swapped my array from gemma2-9b-it to qwen3.8-27b and gpt-oss-20b in exactly five seconds without rewriting a single line of parsing logic.&lt;/p&gt;

&lt;p&gt;The Lazy Payoff&lt;br&gt;
I am my own first user. My Downloads folder had 962 files spanning over a year of university assignments and freelance coding projects. Sorting that manually would have taken at least an hour of tedious dragging and dropping.&lt;/p&gt;

&lt;p&gt;With this script, I typed one command, leaned back, and watched the AI process 65 batches in a few seconds. My folder is completely clean, my old installers are quarantined in the vault, and I didn't have to lift a finger or make a single decision. Pure sloth perfection!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>AI QA-Assistant for Freelance Audio Transcribers (Hacktoberfest Week 2)</title>
      <dc:creator>Viktor</dc:creator>
      <pubDate>Sun, 18 Oct 2026 11:23:18 +0000</pubDate>
      <link>https://dev.to/shadow16ua/ai-qa-assistant-for-freelance-audio-transcribers-hacktoberfest-week-2-521p</link>
      <guid>https://dev.to/shadow16ua/ai-qa-assistant-for-freelance-audio-transcribers-hacktoberfest-week-2-521p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I built Transcriber-QA-Toolkit, an automated QA pipeline designed for freelance audio transcribers and data annotators.&lt;/p&gt;

&lt;p&gt;Transcribing the audio is only 20% of the job. The other 80% is formatting the text according to strict guidelines: checking specific tags like , converting numbers (Inverse Text Normalization), fixing mathematical symbols, and recovering accidentally missed words from the audio.&lt;/p&gt;

&lt;p&gt;This single-script toolkit solves that problem by automating the Quality Assurance and gap-filling process. It analyzes the timestamps of JSON transcriptions, slices the original audio to recover missing words using Whisper, and strictly formats the entire text batch using an open-weight model.&lt;/p&gt;

&lt;p&gt;Who would pay for it: Freelance transcribers are paid per audio minute. By cutting QA time by 90%, this tool effectively doubles their hourly rate. Transcription agencies would also pay a subscription for a local, automated QA tool that ensures their workers' output is 100% compliant with client guidelines before submission.&lt;/p&gt;

&lt;p&gt;Demo&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%2Fkp09xvayckrocpz9nro1.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%2Fkp09xvayckrocpz9nro1.PNG" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Code&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Shadow16Ua" rel="noopener noreferrer"&gt;
        Shadow16Ua
      &lt;/a&gt; / &lt;a href="https://github.com/Shadow16Ua/Transcriber-QA-Toolkit" rel="noopener noreferrer"&gt;
        Transcriber-QA-Toolkit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;How I Built It&lt;br&gt;
The project is built around a single, powerful Python script (groq_batch_fixer.py) running on Groq's high-speed inference API for extreme speed, paired with FFmpeg for audio processing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Whisper Audio Gap Recovery
Human transcribers often miss words. The script analyzes the start and end timestamps in the JSON file. If it finds a silence gap greater than 0.5 seconds, it extracts that specific audio chunk via FFmpeg and runs it through whisper-large-v3 to catch any missed speech.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;gap_duration = start - last_end&lt;br&gt;
if gap_duration &amp;gt; 0.5:&lt;br&gt;
    gap_text = transcribe_with_whisper(AUDIO_PATH, last_end, start)&lt;br&gt;
    if gap_text and re.search(r'[а-яА-Яa-zA-Z]', gap_text):&lt;br&gt;
        print(f"➕ [Found missing speech]: {gap_text}")&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Strict Batch Normalization
Using a strict system prompt and zero-shot/few-shot examples, the script batches the transcription segments and sends them to LLaMA (e.g., llama3-70b-8192 or llama3-8b-8192). The model acts purely as a formatting algorithm, applying Inverse Text Normalization (ITN), fixing punctuation, and managing strict spacing rules around tags, while preserving the original spoken words.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why Does Open Innovation Matter?&lt;br&gt;
For the transcription side hustle, open-source AI is a strict requirement, not just a preference:&lt;/p&gt;

&lt;p&gt;Strict NDA &amp;amp; Privacy: Freelancers work with highly confidential audio (medical, legal, unreleased products). You cannot send this data to closed APIs that might train on user data. Open-weight models like LLaMA and Whisper guarantee that client data never leaks, especially if the user eventually decides to run the inference entirely locally via Ollama.&lt;/p&gt;

&lt;p&gt;Cost Efficiency: Running open models on fast inference providers like Groq costs a fraction of a cent per task, making the freelance business model actually viable.&lt;/p&gt;

&lt;p&gt;Niche Fine-Tuning: Generic closed models are terrible at following highly specific formatting tags (like keeping  without surrounding spaces). Open-weight models follow strict rules predictably for structural tasks without trying to be "chatty assistants".&lt;/p&gt;

&lt;p&gt;My First User&lt;br&gt;
I am my own first user! I work as a freelance audio transcriber and data annotation contractor. Before building this, I spent hours manually checking JSON files against strict guidelines. Now, I just run the script, review the automated fixes, and submit my tasks. It saves me hours of manual QA every single day, directly increasing my actual hourly earnings.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>whisper</category>
    </item>
    <item>
      <title>TouchGrass AI: Local Gemma 2B Micro-Adventure Generator</title>
      <dc:creator>Viktor</dc:creator>
      <pubDate>Sat, 10 Oct 2026 08:02:15 +0000</pubDate>
      <link>https://dev.to/shadow16ua/touchgrass-ai-local-gemma-2b-micro-adventure-generator-4kbp</link>
      <guid>https://dev.to/shadow16ua/touchgrass-ai-local-gemma-2b-micro-adventure-generator-4kbp</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;&lt;strong&gt;TouchGrass AI&lt;/strong&gt; is a lightweight, offline-first web application that generates hyper-local, 3-step micro-adventures. The goal is simple: make the screen the shortest part of the experience. &lt;/p&gt;

&lt;p&gt;You select your current environment (e.g., a local park, city center, or quiet neighborhood) and the time you have available. The app instantly generates a unique real-world observation quest. Instead of scrolling, you get specific physical tasks-like finding a distinct architectural feature, observing specific colors in nature, or completing a walking challenge. You lock your device, put it in your pocket, and actually interact with the physical world around you. &lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faho9zgsvg0gyz8ldr6nt.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%2Faho9zgsvg0gyz8ldr6nt.PNG" alt=" " width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Shadow16Ua" rel="noopener noreferrer"&gt;
        Shadow16Ua
      &lt;/a&gt; / &lt;a href="https://github.com/Shadow16Ua/TouchGrass-AI" rel="noopener noreferrer"&gt;
        TouchGrass-AI
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Engine:&lt;/strong&gt; Google's open-weight &lt;code&gt;gemma2:2b&lt;/code&gt; running locally via &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; &lt;strong&gt;.NET 10 Minimal API&lt;/strong&gt; (C#) to handle the prompt pipeline and schema enforcement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla HTML, CSS, and JavaScript with a responsive, nature-accented dark UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core challenge was taming a lightweight 2B model to generate realistic, physical tasks instead of fictional role-playing narratives (initially, it tried to send me on a detective quest to investigate a fictional neighbor). By enforcing a rigid JSON schema in the C# backend and explicitly restricting the prompt from inventing fictional characters, the API reliably outputs highly contextual, real-world tasks formatted as clean JSON arrays.&lt;/p&gt;

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

&lt;p&gt;Building this with an open-source model was mandatory for the core concept to work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;100% Offline Capability:&lt;/strong&gt; You can generate a trail quest in the middle of a deep forest where there is zero cellular signal. Because it runs locally on a laptop, it doesn't need an internet connection to function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total Privacy:&lt;/strong&gt; Your location context, available free time, and walking habits are never sent to a corporate cloud server or API provider. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency &amp;amp; Control:&lt;/strong&gt; Working directly with local inference allowed me to rapidly iterate on prompt constraints and see exactly how &lt;code&gt;gemma2:2b&lt;/code&gt; processes spatial context, allowing me to adjust my C# backend to perfectly parse and sanitize its raw output.&lt;/li&gt;
&lt;/ol&gt;

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

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

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>StudyBuddy AI: Taming Gemma 2B to Build a Local Quiz Generator for a Friend</title>
      <dc:creator>Viktor</dc:creator>
      <pubDate>Sun, 04 Oct 2026 14:39:41 +0000</pubDate>
      <link>https://dev.to/shadow16ua/studybuddy-ai-taming-gemma-2b-to-build-a-local-quiz-generator-for-a-friend-4mpo</link>
      <guid>https://dev.to/shadow16ua/studybuddy-ai-taming-gemma-2b-to-build-a-local-quiz-generator-for-a-friend-4mpo</guid>
      <description>&lt;h2&gt;
  
  
  Who I Built It For
&lt;/h2&gt;

&lt;p&gt;My friend is currently preparing for university exams and technical interviews (focusing on databases and C#). Reading dry documentation gets boring quickly, so I wanted to build an interactive, multiple-choice quiz partner that tests their knowledge on any given topic. Since it's for a student, it had to be completely free and accessible without internet restrictions.&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;StudyBuddy AI&lt;/strong&gt; — a lightweight, completely local web application that generates 3-question multiple-choice quizzes on any subject. &lt;/p&gt;

&lt;p&gt;GitHub Repository: &lt;a href="https://github.com/Shadow16Ua/StudyBuddy-AI" rel="noopener noreferrer"&gt;https://github.com/Shadow16Ua/StudyBuddy-AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Tech Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;AI Model:&lt;/strong&gt; Google's &lt;code&gt;gemma2:2b&lt;/code&gt; running locally via Ollama.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Backend:&lt;/strong&gt; .NET 10 Minimal API (C#) to handle prompting and JSON parsing.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Frontend:&lt;/strong&gt; Pure HTML, CSS, and Vanilla JavaScript (with a sleek dark mode).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📸 Demo
&lt;/h3&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%2F35sytt21dmaq4d3o89iw.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%2F35sytt21dmaq4d3o89iw.PNG" alt=" " width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters Here
&lt;/h2&gt;

&lt;p&gt;Choosing an open-weight model like Gemma 2B over a closed API (like OpenAI) was crucial for this project for three main reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Zero Cost &amp;amp; Privacy:&lt;/strong&gt; My friend can generate hundreds of quizzes without worrying about API limits, subscription fees, or sending their study data to a third-party server.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;100% Offline Capability:&lt;/strong&gt; It runs perfectly on a standard laptop CPU, meaning they can study during commutes or internet outages.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Engineering Challenge (Taming the 2B Model):&lt;/strong&gt; This was the most interesting part. I quickly realized that small 2B models struggle to output complex JSON arrays (like 3 questions at once). It would constantly hallucinate structures or merge answers. Because I had full control over the local inference, I was able to completely redesign the backend pipeline. Instead of asking for 3 questions in one prompt, my C# backend asynchronously asks Gemma for &lt;em&gt;one&lt;/em&gt; question, exactly 3 times in a loop, and then manually constructs a bulletproof JSON array. This guarantees perfect UI rendering every single time. I also shifted the "shuffle options" logic to the frontend to prevent the AI from confusing correct/incorrect indexes. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open source allowed me to iterate rapidly, observe the raw output locally, and engineer a robust wrapper around a lightweight model to make it perform like a much heavier one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Note: I'm submitting this project for the Best Use of Gemma category as well!&lt;/em&gt;&lt;/p&gt;

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