<?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: Aishik Yadav</title>
    <description>The latest articles on DEV Community by Aishik Yadav (@aishik_xd).</description>
    <link>https://dev.to/aishik_xd</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%2F4167973%2F338a9936-3c53-416a-9a89-e9f0db694022.png</url>
      <title>DEV Community: Aishik Yadav</title>
      <link>https://dev.to/aishik_xd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aishik_xd"/>
    <language>en</language>
    <item>
      <title>ContextForge: Resurrecting Codebase Blueprints to Slash LLM Token Waste by 90%</title>
      <dc:creator>Aishik Yadav</dc:creator>
      <pubDate>Tue, 27 Oct 2026 06:41:01 +0000</pubDate>
      <link>https://dev.to/aishik_xd/contextforge-resurrecting-codebase-blueprints-to-slash-llm-token-waste-by-90-4981</link>
      <guid>https://dev.to/aishik_xd/contextforge-resurrecting-codebase-blueprints-to-slash-llm-token-waste-by-90-4981</guid>
      <description>&lt;p&gt;&lt;strong&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge: Week 4 — Ghost in the Machine&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  👻 The "Ghost in the Machine": When Codebases Haunt the Context Window
&lt;/h2&gt;

&lt;p&gt;Every modern developer working with AI has faced this dilemma:&lt;/p&gt;

&lt;p&gt;You want an LLM (Claude 3.5, GPT-4o, Gemini, or a local open-weight model) to fix a bug, review system architecture, or implement a new feature across your codebase.&lt;/p&gt;

&lt;p&gt;You have two choices, and both are broken:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dump the entire codebase into the prompt:&lt;/strong&gt; You burn through 60,000 to 150,000 tokens in one shot. The model drowns in low-level loop bodies, internal array manipulations, and boilerplate. You hit context limits, pay high token bills, and face the "lost in the middle" problem where models miss critical details hidden in massive dumps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manually cherry-pick a few snippets:&lt;/strong&gt; The model loses the big picture. It hallucinates missing types, invents imaginary function signatures, and violates conventions established elsewhere in your project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In honor of &lt;strong&gt;Hacktoberfest Week 4: "Ghost in the Machine"&lt;/strong&gt;, I wanted to summon the true &lt;em&gt;spirit&lt;/em&gt; of a codebase without all the heavy, noisy &lt;em&gt;flesh&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;ContextForge ⚡&lt;/strong&gt; — an open-source CLI and interactive local web dashboard that strips away implementation clutter, extracts &lt;strong&gt;structural AST signatures and type blueprints&lt;/strong&gt; across multiple languages, budgets tokens against your target model, and formats token-efficient prompt packs that &lt;strong&gt;slash token consumption by 70% to 90%&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/contextforge" rel="noopener noreferrer"&gt;sleepyaishik69/contextforge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ What ContextForge Does
&lt;/h2&gt;

&lt;p&gt;ContextForge bridges the gap between raw codebases and LLM context windows through three core engines:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Multi-Language AST Signature Extractor
&lt;/h3&gt;

&lt;p&gt;Instead of feeding an AI 500 lines of implementation logic for a service file, ContextForge parses the code and extracts its structural skeleton:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript / JavaScript:&lt;/strong&gt; Exported interfaces, type aliases, classes, method signatures, parameter types, return types, enums, and JSDoc comments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python:&lt;/strong&gt; Classes, methods, functions, type hints, and docstrings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go:&lt;/strong&gt; Structs, interfaces, function signatures, and method receivers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rust:&lt;/strong&gt; Structs, enums, traits, &lt;code&gt;impl&lt;/code&gt; blocks, and &lt;code&gt;pub fn&lt;/code&gt; signatures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Java / C#:&lt;/strong&gt; Classes, interfaces, and public/protected method signatures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives the AI a complete, 100% accurate mental model of your system's contracts and interfaces without reading thousands of lines of internal loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Intelligent Dynamic Token Budgeting
&lt;/h3&gt;

&lt;p&gt;Different models have different context windows and cost profiles. ContextForge includes built-in presets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude 3.5 Sonnet&lt;/strong&gt; (200k context / 64k recommended budget)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-4o&lt;/strong&gt; (128k context / 32k recommended budget)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 1.5 Pro / Flash&lt;/strong&gt; (1M context / 128k recommended budget)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Llama 3 / Gemma 2 Local&lt;/strong&gt; (8k context / 4k budget)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek Coder&lt;/strong&gt; (64k context / 24k budget)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your codebase exceeds your chosen budget, ContextForge &lt;strong&gt;dynamically downsamples non-critical files to AST blueprints&lt;/strong&gt; while keeping your core entrypoints in full code.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Task-Driven Prompt Templates
&lt;/h3&gt;

&lt;p&gt;Context packs aren't just raw code—they are structured prompts with specialized system directives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 &lt;strong&gt;Bug Investigation &amp;amp; Root Cause:&lt;/strong&gt; Directs the model to check race conditions, null safety, and boundary states.&lt;/li&gt;
&lt;li&gt;✨ &lt;strong&gt;Feature Implementation Blueprint:&lt;/strong&gt; Instructs the model to outline touched files and follow existing patterns.&lt;/li&gt;
&lt;li&gt;🏗️ &lt;strong&gt;Architecture &amp;amp; Data Flow Review:&lt;/strong&gt; Maps domain entities, lifecycles, and scaling bottlenecks.&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Security &amp;amp; Vulnerability Audit:&lt;/strong&gt; Audits auth boundaries, input validation, and secret exposure.&lt;/li&gt;
&lt;li&gt;🧪 &lt;strong&gt;Test Suite Generation:&lt;/strong&gt; Drafts unit and integration tests covering happy paths and edge cases.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 The Math: 91.6% Token Reduction in Practice
&lt;/h2&gt;

&lt;p&gt;Here is a real test running ContextForge against itself:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Raw Full Codebase&lt;/th&gt;
&lt;th&gt;ContextForge Signatures Mode&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Files Scanned&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18 files&lt;/td&gt;
&lt;td&gt;18 files&lt;/td&gt;
&lt;td&gt;Complete Coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AST Signatures Extracted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;73 signatures&lt;/td&gt;
&lt;td&gt;Full Architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estimated Tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;64,700 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5,400 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;91.6% reduction&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fit in Local 8k Context?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No (Blows limit 8x)&lt;/td&gt;
&lt;td&gt;✅ Yes (Only 67% of 8k)&lt;/td&gt;
&lt;td&gt;Instant local inference&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By stripping inner loops and keeping types, interfaces, and function signatures, an entire multi-module codebase comfortably fits inside a local &lt;strong&gt;Gemma 2 (8k)&lt;/strong&gt; or &lt;strong&gt;Llama 3&lt;/strong&gt; context window!&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture &amp;amp; How It Works
&lt;/h2&gt;

&lt;p&gt;Here is the pipeline that runs when you invoke ContextForge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Codebase Directory ]
          │
          ▼
┌────────────────────────┐
│  scanner/scanner.ts    │ ◄── Respects .gitignore, ignores binary &amp;amp; lockfiles, builds tree
└─────────┬──────────────┘
          │
          ▼
┌────────────────────────┐
│  parser/signature.ts   │ ◄── AST/Regex signature extraction (TS, Python, Go, Rust, Java)
└─────────┬──────────────┘
          │
          ▼
┌────────────────────────┐
│  packer/packer.ts      │ ◄── Allocates token budget, downsamples to signatures, applies template
└─────────┬──────────────┘
          │
     ┌────┴───────────────────────────┐
     ▼                                ▼
┌────────────────────────┐   ┌────────────────────────┐
│  cli.ts                │   │  server/server.ts      │
│  - Terminal summary    │   │  - Glassmorphic UI     │
│  - OS Clipboard (-c)   │   │  - Live token gauges   │
│  - Export Markdown (-o)│   │  - Signature drawer    │
│  - Stream via Ollama   │   │  - Local AI playground │
└────────────────────────┘   └────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎨 Two Ways to Use It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. High-Speed Terminal CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scan current repository and view metrics&lt;/span&gt;
contextforge &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Generate a bug-hunt pack with a 32k token budget and copy directly to clipboard&lt;/span&gt;
contextforge &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; bug &lt;span class="nt"&gt;-b&lt;/span&gt; 32000 &lt;span class="nt"&gt;-c&lt;/span&gt;

&lt;span class="c"&gt;# Export architectural blueprints to Markdown&lt;/span&gt;
contextforge &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; architecture &lt;span class="nt"&gt;-m&lt;/span&gt; signatures &lt;span class="nt"&gt;-o&lt;/span&gt; architecture-pack.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Glassmorphic Web Dashboard (&lt;code&gt;--ui&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;contextforge --ui&lt;/code&gt; to launch an interactive local workspace in your browser (&lt;code&gt;http://localhost:4567&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual File Tree:&lt;/strong&gt; Toggle individual files between &lt;code&gt;Full&lt;/code&gt;, &lt;code&gt;Blueprint / Signatures&lt;/code&gt;, or &lt;code&gt;Exclude&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AST Signature Inspector:&lt;/strong&gt; Click the &lt;code&gt;⚡&lt;/code&gt; badge on any file to open a drawer and inspect parsed methods and types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Context Gauges:&lt;/strong&gt; Live progress bar showing budget utilization against Claude, GPT-4o, and Gemma.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Ollama Studio:&lt;/strong&gt; Send prompt packs directly to locally running open-weight models with real-time streaming output and tokens/sec metrics.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔒 Why Open-Source AI Matters Here
&lt;/h2&gt;

&lt;p&gt;When building developer tools that inspect codebases, privacy is non-negotiable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero Intellectual Property Leakage:&lt;/strong&gt; Feeding company codebases or private repos into third-party cloud APIs poses proprietary risks. With ContextForge and local Ollama inference, &lt;strong&gt;not a single line of code ever leaves your laptop&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Free Scalability:&lt;/strong&gt; You can generate dozens of context packs and run local queries all day without worrying about API rate limits or surprise bills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Reliability:&lt;/strong&gt; Whether you are on an airplane, train, or disconnected from the internet, your local synthesizer and model keep working seamlessly.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Quickstart: Try It Yourself
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt;: v18.0.0 or higher (v20+ recommended)&lt;/li&gt;
&lt;li&gt;(Optional) &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; for local AI generation:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  ollama pull gemma2:2b
  ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Clone &amp;amp; Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/sleepyaishik69/contextforge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;contextforge
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Run It
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Launch the Web Dashboard&lt;/span&gt;
npm run ui

&lt;span class="c"&gt;# Or generate a prompt pack from terminal:&lt;/span&gt;
node dist/cli.js &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; bug &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🏆 Prize Category
&lt;/h2&gt;

&lt;p&gt;This project is entered into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma ($200 featured category):&lt;/strong&gt; ContextForge is specifically designed to make complex codebases fit within compact open-weight models like Google's &lt;code&gt;gemma2:2b&lt;/code&gt;. By condensing bloated code into high-density AST blueprints, Gemma can understand and reason about entire repositories that would otherwise exceed its context window!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Related Community Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/_richa_/ollama-how-to-easily-run-local-llms-on-your-computer-4g9o"&gt;Ollama: How to Easily Run LLMs Locally on Your Computer&lt;/a&gt; by Richa — a great guide to getting started with local models.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/gpuneet/building-reliable-llm-applications-in-python-hd1"&gt;Building Reliable LLM Applications in Python&lt;/a&gt; by Puneet — exploring context curation and structured model outputs.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>dumper: A Local AI File Organizer That Rewards Your Laziness</title>
      <dc:creator>Aishik Yadav</dc:creator>
      <pubDate>Wed, 21 Oct 2026 17:15:22 +0000</pubDate>
      <link>https://dev.to/aishik_xd/dumper-a-local-ai-file-organizer-that-rewards-your-laziness-2kb2</link>
      <guid>https://dev.to/aishik_xd/dumper-a-local-ai-file-organizer-that-rewards-your-laziness-2kb2</guid>
      <description>&lt;p&gt;&lt;strong&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;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Lazy Inspiration: The "Downloads" Graveyard
&lt;/h2&gt;

&lt;p&gt;We all have that one folder. The &lt;code&gt;Downloads&lt;/code&gt; folder, the desktop cluttered with &lt;code&gt;Screenshot 2026-10-21.png&lt;/code&gt;, &lt;code&gt;assignment_final_v2_really_final.pdf&lt;/code&gt;, &lt;code&gt;receipt_182749.pdf&lt;/code&gt;, or &lt;code&gt;notes_october.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Every few weeks, we promise ourselves: &lt;em&gt;"Today I'm going to sort this out."&lt;/em&gt;&lt;br&gt;
Then we look at 300 unnamed files, realize sorting them by hand will take an hour, and close the folder.&lt;/p&gt;

&lt;p&gt;In honor of &lt;strong&gt;International Sloth Day&lt;/strong&gt; and this week’s &lt;strong&gt;"Slow and Steady"&lt;/strong&gt; Hacktoberfest theme, I decided to channel my inner sloth: &lt;strong&gt;build something that does the tedious work so I don't have to.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;dumper&lt;/strong&gt; — a background daemon and CLI that watches a drop folder, reads your files locally with an open-source LLM, deduces what each file actually is, renames it into human-readable kebab-case, and files it into tidy category folders.&lt;/p&gt;

&lt;p&gt;Zero manual tagging. Zero manual renaming. Just drop and forget.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/dumper" rel="noopener noreferrer"&gt;sleepyaishik69/dumper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;&lt;strong&gt;dumper&lt;/strong&gt; is an autonomous, local-first file organizer built with &lt;strong&gt;TypeScript&lt;/strong&gt;, &lt;strong&gt;Node.js&lt;/strong&gt;, and &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of writing brittle regex rules or mapping extensions to hardcoded folders (which groups an invoice and an ebook into the same folder just because both are &lt;code&gt;.pdf&lt;/code&gt;), &lt;code&gt;dumper&lt;/code&gt; actually inspects what is inside the file:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Text &amp;amp; Code (&lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.ts&lt;/code&gt;, &lt;code&gt;.py&lt;/code&gt;, &lt;code&gt;.json&lt;/code&gt;, etc.):&lt;/strong&gt; Streams the first 2,500 characters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF Documents (&lt;code&gt;.pdf&lt;/code&gt;):&lt;/strong&gt; Extracts textual content from pages via &lt;code&gt;pdf-parse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images &amp;amp; Media (&lt;code&gt;.png&lt;/code&gt;, &lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.mp4&lt;/code&gt;):&lt;/strong&gt; Extracts metadata, dimensions, and filename semantics.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, it queries a locally hosted open-source model (such as &lt;code&gt;gemma2:2b&lt;/code&gt; or &lt;code&gt;llama3.2&lt;/code&gt;) running on your own machine. The model classifies the content into custom categories (like &lt;code&gt;finance/invoices&lt;/code&gt;, &lt;code&gt;college/assignments&lt;/code&gt;, &lt;code&gt;development/scripts&lt;/code&gt;, &lt;code&gt;notes&lt;/code&gt;) and invents a clean, descriptive slug.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example in Action:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Original Dropped File&lt;/th&gt;
&lt;th&gt;Local AI Understanding&lt;/th&gt;
&lt;th&gt;Renamed &amp;amp; Moved Destination&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Scan_0042.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"Utility electricity bill for Sept 2026"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Organized/Finance/bills/september-2026-electric-bill.pdf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Screenshot 2026-10-21.png&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"Figma mockup of login screen"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Organized/Design/mockups/dark-mode-login-mockup.png&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hw3_final.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"Graph BFS traversal algorithm assignment"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Organized/College/algorithms/graph-bfs-traversal-hw3.py&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;receipt_78291.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;"Cloud server invoice from AWS"&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Organized/Finance/invoices/aws-cloud-invoice-oct26.pdf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Architecture &amp;amp; How It Works
&lt;/h2&gt;

&lt;p&gt;Here is the pipeline that runs every time a file is dropped into your dump folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ File Dropped into ~/Dump ]
             │
             ▼
    ┌─────────────────┐
    │   watcher.ts    │  ◄── Chokidar detects write &amp;amp; waits for completion (1.5s debounce)
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │  extractor.ts   │  ◄── Reads head content, parses PDF text, or inspects media
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │   analyzer.ts   │  ◄── Injects user categories into prompt -&amp;gt; calls Ollama JSON API
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │  organizer.ts   │  ◄── Resolves cross-disk moves, slugifies names &amp;amp; handles duplicates
    └────────┬────────┘
             │
             ▼
    ┌─────────────────┐
    │ ui.ts / logger  │  ◄── Renders visual terminal card &amp;amp; records history to ~/.dumper/history.json
    └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The AI Prompting Mechanism
&lt;/h3&gt;

&lt;p&gt;In &lt;a href="https://github.com/sleepyaishik69/dumper/blob/main/src/analyzer.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/analyzer.ts&lt;/code&gt;&lt;/a&gt;, &lt;code&gt;dumper&lt;/code&gt; sends a structured request to Ollama with &lt;code&gt;format: "json"&lt;/code&gt;. It passes the user's configured category definitions directly in the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"finance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subcategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invoices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"newFilename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aws-cloud-hosting-invoice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Document contains itemized cloud infrastructure charges from Amazon Web Services."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the model is uncertain or the file type is unsupported, &lt;code&gt;dumper&lt;/code&gt; gracefully isolates it in an &lt;code&gt;uncategorized/&lt;/code&gt; bucket without interrupting the file watch loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open-Source AI Matters Here
&lt;/h2&gt;

&lt;p&gt;File organization is inherently personal and sensitive. Your dump folder contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bank statements and tax forms&lt;/li&gt;
&lt;li&gt;Medical records and prescriptions&lt;/li&gt;
&lt;li&gt;Proprietary source code and API keys&lt;/li&gt;
&lt;li&gt;Personal photos and journal notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sending every dropped file to a closed cloud API like OpenAI or Claude creates three huge problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy &amp;amp; Security:&lt;/strong&gt; Cloud providers log API calls and prompts. Feeding them personal invoices or private code is an unnecessary security risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; Running a cloud LLM on every single file you download or screenshot quickly turns into a recurring bill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability &amp;amp; Offline Capability:&lt;/strong&gt; If you're on a plane or have no internet connection, your file organizer shouldn't stop working.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With open models through Ollama (like Google's &lt;strong&gt;Gemma 2&lt;/strong&gt; or Meta's &lt;strong&gt;Llama 3.2&lt;/strong&gt;), &lt;strong&gt;100% of the inference happens locally in RAM and GPU.&lt;/strong&gt; Not a single byte of your files ever leaves your computer.&lt;/p&gt;




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

&lt;p&gt;How much effort does &lt;code&gt;dumper&lt;/code&gt; actually save?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manual sorting:&lt;/strong&gt; Finding a downloaded file, opening it to remember what it was, creating a subfolder, renaming it, and moving it takes ~20 to 45 seconds per file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With &lt;code&gt;dumper&lt;/code&gt;:&lt;/strong&gt; 0 seconds. You download or save files to your &lt;code&gt;~/Dump&lt;/code&gt; directory as usual, and &lt;code&gt;dumper&lt;/code&gt; silently organizes them in the background while you grab a coffee or relax.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over a semester or a few months of development work, that translates to hours of tedious folder maintenance eliminated entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quickstart: Try It Yourself
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prerequisites
&lt;/h3&gt;

&lt;p&gt;Ensure &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; is installed and running with your choice of model:&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;# Recommended lightweight model (ideal for Best Use of Gemma):&lt;/span&gt;
ollama pull gemma2:2b

&lt;span class="c"&gt;# Or Llama 3.2:&lt;/span&gt;
ollama pull llama3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Install &amp;amp; Run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/sleepyaishik69/dumper.git
&lt;span class="nb"&gt;cd &lt;/span&gt;dumper
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build

&lt;span class="c"&gt;# Run interactive setup wizard&lt;/span&gt;
node dist/index.js init

&lt;span class="c"&gt;# Start in dry-run mode to see what it would do without moving files:&lt;/span&gt;
node dist/index.js start &lt;span class="nt"&gt;--dry-run&lt;/span&gt;

&lt;span class="c"&gt;# Or run the live daemon:&lt;/span&gt;
node dist/index.js start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Check Stats &amp;amp; History
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View recent file moves&lt;/span&gt;
node dist/index.js &lt;span class="nb"&gt;history&lt;/span&gt;

&lt;span class="c"&gt;# View classification analytics&lt;/span&gt;
node dist/index.js stats
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;This project is entered into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma ($200 featured category):&lt;/strong&gt; &lt;code&gt;dumper&lt;/code&gt; is built from the ground up to pair with &lt;code&gt;gemma2:2b&lt;/code&gt;, giving ultra-fast (~300ms) local JSON classification on modest laptop hardware without heating up your machine.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Related Community Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/_richa_/ollama-how-to-easily-run-local-llms-on-your-computer-4g9o"&gt;Ollama: How to Easily Run LLMs Locally on Your Computer&lt;/a&gt; by Richa — a great primer on setting up local inference.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/pavelespitia/function-calling-with-ollama-make-your-local-llm-run-real-tools-bep"&gt;Function Calling with Ollama: Make Your Local LLM Run Real Tools&lt;/a&gt; by Pavel Espitia — exploring structured tool use with local models.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>StockSense AI: Building a Retail Analytics Assistant That Shows Its Work</title>
      <dc:creator>Aishik Yadav</dc:creator>
      <pubDate>Fri, 16 Oct 2026 12:03:19 +0000</pubDate>
      <link>https://dev.to/aishik_xd/stocksense-ai-building-a-retail-analytics-assistant-that-shows-its-work-1deh</link>
      <guid>https://dev.to/aishik_xd/stocksense-ai-building-a-retail-analytics-assistant-that-shows-its-work-1deh</guid>
      <description>&lt;p&gt;At closing time, a shopkeeper looks at a spreadsheet with hundreds of rows. Sales are recorded. Stock is somewhere between “probably fine” and “we should have ordered this yesterday.” A dashboard can show a total, but it may not explain why a product ranked first, whether a profit number is trustworthy, or what information is missing.&lt;/p&gt;

&lt;p&gt;That scenario led me to a question: &lt;strong&gt;Could a small retailer get useful answers from sales and stock data without handing the arithmetic to a chatbot?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;StockSense AI&lt;/strong&gt; as an open-source retail analytics MVP to explore that question. It combines a conventional analytics backend with an optional local language model. The calculations produce the evidence; the model helps explain it. If the model is unavailable, the core dashboard still works.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense" rel="noopener noreferrer"&gt;sleepyaishik69/Stock-Sense&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup and product notes:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database schema snapshot:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/backend/schema.sql" rel="noopener noreferrer"&gt;backend/schema.sql&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alembic migrations:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/tree/main/backend/migrations" rel="noopener noreferrer"&gt;backend/migrations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend analytics:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/backend/app/analytics.py" rel="noopener noreferrer"&gt;analytics.py&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI context builder:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/backend/app/ai_context.py" rel="noopener noreferrer"&gt;ai_context.py&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API and AI routes:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/backend/app/main.py" rel="noopener noreferrer"&gt;main.py&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/frontend/app/page.tsx" rel="noopener noreferrer"&gt;frontend/app/page.tsx&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synthetic import file for trying the workflow:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/test_sales_data.csv" rel="noopener noreferrer"&gt;test_sales_data.csv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container setup:&lt;/strong&gt; &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/docker-compose.yml" rel="noopener noreferrer"&gt;docker-compose.yml&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The question that pushed the AI work forward
&lt;/h2&gt;

&lt;p&gt;These are earlier versions of the Ask StockSense screen. In the first, I asked which product sold the most; the answer said it could not tell, even though the evidence panel showed sales totals. In the second, I asked how to sell more and got broad marketing advice without product-level evidence. Seeing those responses made the gap clear: showing metrics beside an answer is not the same as using those metrics to answer the question.&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%2Fqsix22kmeop5a43pso3y.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%2Fqsix22kmeop5a43pso3y.png" alt="Earlier StockSense Ask screen: the most-sold-product question and the metrics shown as evidence" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Earlier iteration: the answer did not identify a best-selling product, despite sales evidence being visible.&lt;/em&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%2F7f7rcuhat83g0xptbgvp.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%2F7f7rcuhat83g0xptbgvp.png" alt="Earlier StockSense Ask screen: generic advice in response to a sales-growth question" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Earlier iteration: generic advice did not connect the recommendation to products or measured results.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The design rule: calculate first, explain second
&lt;/h2&gt;

&lt;p&gt;A natural-language answer can sound polished and still be wrong. StockSense keeps business arithmetic in deterministic Python code. The backend calculates totals, comparisons, product rankings, and inventory signals from the selected workspace, store, and date range. Certain questions, including “Which product sold the most units?” and “What were net sales?”, are answered directly from those facts.&lt;/p&gt;

&lt;p&gt;For broader questions, StockSense builds a structured, bounded analysis context from the selected period and an equal-length previous period. It includes sales and profit trends, product and category rankings, changes in units, inventory signals, basket patterns, and known data gaps. If Ollama and the configured Gemma model are available, the model uses that context to write an explanation. The model does not get a SQL tool and cannot change inventory or place an order.&lt;/p&gt;

&lt;p&gt;The interface labels whether an answer came from &lt;strong&gt;core analytics&lt;/strong&gt;, &lt;strong&gt;Gemma&lt;/strong&gt;, or the &lt;strong&gt;core analytics fallback&lt;/strong&gt;. It also shows the date range and supporting metric, product, and inventory evidence. When the selected period has no relevant data, the app says so instead of inventing a bestseller.&lt;/p&gt;

&lt;p&gt;That separation matters: a model can help interpret a result, but it should not quietly become the source of the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in the app today?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. A workspace starts empty
&lt;/h3&gt;

&lt;p&gt;A new registration creates a workspace and its first store, but no seeded products or sales. Products, stores, sales, and imports carry workspace scope, and the API applies the authenticated workspace to its queries. Users can register or sign in with an email and password; the API uses a signed HttpOnly session cookie.&lt;/p&gt;

&lt;p&gt;This keeps a demo dataset from masquerading as a user’s real business data. The included CSV is an explicit, synthetic test fixture that a developer can import when they want to explore the product.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Import existing sales instead of retyping them
&lt;/h3&gt;

&lt;p&gt;The import workflow accepts CSV and Excel files. The preview detects common column aliases, displays a sample, and suggests how source columns map to StockSense fields. Users confirm the import before records are written.&lt;/p&gt;

&lt;p&gt;Date, quantity, and unit price are required. Transaction ID, SKU, product name, category, discount, tax, unit cost, and a return indicator are optional. The backend validates dates and numbers, rejects non-positive quantities and duplicate rows, and can import valid rows while recording rejected rows and reasons in an import history. When a SKU is new, the import can create its product record.&lt;/p&gt;

&lt;p&gt;That makes data quality visible. A partially successful import is not silently treated as a perfect one: users can inspect rejected rows and should resolve them before trusting the totals.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Metrics have explicit definitions
&lt;/h3&gt;

&lt;p&gt;The analytics code uses Python &lt;code&gt;Decimal&lt;/code&gt; values and rounds money to cents with half-up rounding. The headline definitions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Net sales = gross sales − discounts − refunds.&lt;/strong&gt; Tax is stored, but excluded from net sales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gross profit = net sales − cost of goods sold.&lt;/strong&gt; It is returned only when every relevant sale line has a unit cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gross margin = gross profit ÷ net sales.&lt;/strong&gt; It is unavailable when costs are incomplete or net sales are zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transactions&lt;/strong&gt; count distinct transaction IDs, scoped to a store.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average transaction value = net sales ÷ transaction count.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inventory value&lt;/strong&gt; uses the current product cost and current on-hand count; it is a present-day estimate, not a historical valuation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These rules help prevent a dashboard from presenting “0” where the honest answer is “unknown.” Missing cost data is particularly important: a product’s current catalog cost cannot retroactively prove what a sale line cost at the time it was sold.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Sales and product analysis
&lt;/h3&gt;

&lt;p&gt;The overview includes a selected-period snapshot and an equal-length prior-period comparison. It tracks sales and profit trends at a weekly or monthly grain, ranks products by units, sales, and gross profit, compares product units with the previous period, and groups sales by category.&lt;/p&gt;

&lt;p&gt;The dashboard is split into practical views, including Overview, Sales Analytics, Products, Inventory, Finance, Marketing, Ask StockSense, Reports, Imports, and Settings. That lets an owner move from a metric to the records and operational detail behind it.&lt;/p&gt;

&lt;p&gt;Reports can be exported as CSV. The goal is not to bury a small business in charts; it is to let someone answer routine questions, see assumptions, and get back to operating the store.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Inventory as a sequence of movements
&lt;/h3&gt;

&lt;p&gt;StockSense has an append-only stock movement ledger for opening counts, physical counts, deliveries, damage, and corrections. Each entry records the product, store, workspace, movement type, quantity change, resulting quantity, optional note, actor, and time. Product stock edits also create a movement record. Sales imports do not silently overwrite today’s stock.&lt;/p&gt;

&lt;p&gt;This is a deliberate shift from treating stock as one mutable integer. The movement history gives the operator a trail to review when counts change. The ledger only records changes from the point a user starts entering them; it cannot reconstruct stock history that was never captured.&lt;/p&gt;

&lt;p&gt;The overview’s Daily Action Center flags unknown stock, low-stock or stockout risk, suggested reorders, and missing product costs. Reorder estimates use selected-period average daily units, lead time, and the configured reorder threshold. They are review prompts: they do not model seasonality, confirmed incoming orders, supplier pack sizes, or demand uncertainty, and they never create a purchase order.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Budget and basket signals
&lt;/h3&gt;

&lt;p&gt;The purchase budget planner allocates a stated budget across supported reorder suggestions using current recorded cost and stock. It only includes products with enough information to estimate the cost; it does not contact a supplier or place an order.&lt;/p&gt;

&lt;p&gt;The marketing view can surface products that appear together in transaction baskets. It uses support, confidence, and lift, and only works when usable transaction IDs are present. These are descriptive co-purchase patterns. They do not prove that one product causes another to sell or measure a promotion effect. Promotion lift, price elasticity, and customer segmentation are not established by this data model.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Optional local Gemma through Ollama
&lt;/h3&gt;

&lt;p&gt;The AI path is optional. StockSense can call a locally running Ollama service configured for &lt;code&gt;gemma2:2b&lt;/code&gt;. The dashboard exposes model status; model-backed insight generation has a timeout and bounded concurrency. If Ollama is offline, deterministic analytics, reports, imports, and the rest of the dashboard remain available. Natural-language chat falls back to a labeled summary of calculated facts.&lt;/p&gt;

&lt;p&gt;That is useful for local experimentation and keeps the model dependency separate from the data pipeline. It does not mean the complete application has been production-hardened: running a model locally still requires suitable hardware and an operator-managed service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack and architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Next.js 16, React 19, TypeScript, Tailwind CSS, and Recharts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; Python, FastAPI, SQLAlchemy, and Pydantic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence:&lt;/strong&gt; SQLite for local development; PostgreSQL in the Docker Compose path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema changes:&lt;/strong&gt; Alembic migrations. The initial schema and stock-movement migration live in the repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inference:&lt;/strong&gt; Optional Ollama HTTP calls to Gemma; no model is required for core metrics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The high-level request path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CSV / Excel import
        ↓
Preview → map columns → validate → confirm
        ↓
Workspace-scoped relational records
        ↓
Python Decimal analytics + inventory signals
        ├── Dashboard and CSV reports
        └── Bounded facts context → optional Ollama/Gemma explanation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For SQLite, the API creates an empty schema at startup. PostgreSQL deployments apply the Alembic migration chain. The checked-in &lt;code&gt;schema.sql&lt;/code&gt; is a generated SQLite snapshot; &lt;strong&gt;migrations are the source of truth for schema evolution&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it locally
&lt;/h2&gt;

&lt;p&gt;Clone the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/sleepyaishik69/Stock-Sense.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Stock-Sense
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the API in one terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;backend&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;venv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;venv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;venv&lt;/span&gt;&lt;span class="nx"&gt;\Scripts\Activate.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;requirements.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;alembic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;upgrade&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;uvicorn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;app.main:app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--reload&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;8000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start the Next.js app in another terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;frontend&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:3000&lt;/code&gt;, create a workspace, and import your own sales file or the &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/test_sales_data.csv" rel="noopener noreferrer"&gt;synthetic test CSV&lt;/a&gt;. API documentation is available locally at &lt;code&gt;http://localhost:8000/docs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To try the optional local model, install &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma2:2b
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API reads &lt;code&gt;OLLAMA_BASE_URL&lt;/code&gt;, &lt;code&gt;OLLAMA_MODEL&lt;/code&gt;, and &lt;code&gt;OLLAMA_TIMEOUT_SECONDS&lt;/code&gt; from configuration. For a PostgreSQL-backed local stack, copy &lt;code&gt;.env.example&lt;/code&gt; to &lt;code&gt;.env&lt;/code&gt;, replace the development secret, then use &lt;code&gt;docker compose up --build&lt;/code&gt;. The optional Ollama service is available through the &lt;code&gt;ai&lt;/code&gt; Compose profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits I want to keep visible
&lt;/h2&gt;

&lt;p&gt;StockSense is an MVP foundation, not a finished SaaS product. The repository’s &lt;a href="https://github.com/sleepyaishik69/Stock-Sense/blob/main/README.md#known-limitations" rel="noopener noreferrer"&gt;README lists the current limitations and roadmap&lt;/a&gt;. Among the important gaps: PostgreSQL row-level security, workspace roles, password reset, CSRF defenses, rate limiting, supplier records, confirmed purchase orders and partial receiving, historical cost snapshots, seasonality-aware demand, promotion analysis, and browser end-to-end tests are not implemented yet.&lt;/p&gt;

&lt;p&gt;The session cookie currently supports local HTTP development; a real deployment needs HTTPS and production cookie settings, secret management, careful database credentials, backups, monitoring, and security review. The Compose credentials are for development. Financial output is operational analysis, not accounting, tax, or professional financial advice.&lt;/p&gt;

&lt;p&gt;I think making these limits part of the product story is a strength. A retailer should be able to tell which numbers are observed, which are estimated, and which questions the current data cannot answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned building it
&lt;/h2&gt;

&lt;p&gt;The most useful engineering decision was to make the data path explicit before adding natural language. It forced me to define net sales, returns, missing costs, transaction identity, stock history, and the boundary between a measured fact and a plausible explanation.&lt;/p&gt;

&lt;p&gt;It also changed how I think about “AI analytics.” The impressive part is not just asking a model to summarize a table. It is preparing the right evidence, preserving metric semantics, showing provenance, and letting the system say “there isn’t enough data.” For inventory, it means recording movements instead of pretending a current count explains the past. For costs, it means making missingness visible instead of filling a gap with a guess.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>hf26challenge</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>ChromaWild: A Local Gemma-Powered Color Walk</title>
      <dc:creator>Aishik Yadav</dc:creator>
      <pubDate>Sun, 11 Oct 2026 10:45:30 +0000</pubDate>
      <link>https://dev.to/aishik_xd/chromawild-a-local-gemma-powered-color-walk-1nkf</link>
      <guid>https://dev.to/aishik_xd/chromawild-a-local-gemma-powered-color-walk-1nkf</guid>
      <description>&lt;p&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;/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%2Fzib4nzv5pyb9o97uod2e.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%2Fzib4nzv5pyb9o97uod2e.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;**&lt;br&gt;
ChromaWild is a color walk and field journal. It gives you a color to look for outdoors, then lets you compare what you found, save field notes, and sketch the observation.&lt;/p&gt;

&lt;p&gt;I wanted the prompts to work for the places people actually walk through. That can be a park, a sidewalk, a bus stop, a playground, a building, a piece of public art, a patch of sky, or a plant. It doesn't have to be a wilderness trail.&lt;/p&gt;

&lt;p&gt;The color and subject are generated together by Gemma through Ollama. The app asks the model for a fresh, coherent prompt instead of picking a color from a fixed bucket and attaching a preset nature subject.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;There isn't a hosted demo yet. The app runs locally; the repository README has the setup steps: &lt;a href="https://github.com/sleepyaishik69/ChromaWild" rel="noopener noreferrer"&gt;github.com/sleepyaishik69/ChromaWild&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To generate quests locally, install Ollama, run &lt;code&gt;ollama pull gemma2:2b&lt;/code&gt;, then start the app with &lt;code&gt;npm run dev&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The browser handles color matching and keeps field entries, photos, sketches, and progress in its local storage. For a new quest, the Next.js API route asks Ollama for a title, color, subject, and outdoor hint, then checks the returned fields and hex value before using them.&lt;/p&gt;

&lt;p&gt;The model prompt includes a broad subject list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;categories&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="s1"&gt;plants&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="s1"&gt;animals&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="s1"&gt;water&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="s1"&gt;sky&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="s1"&gt;architecture&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="s1"&gt;street&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="s1"&gt;transit&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="s1"&gt;public art&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="s1"&gt;playgrounds&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="s1"&gt;outdoor objects&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="s1"&gt;sports&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="s1"&gt;food&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="s1"&gt;other&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default model is configurable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OLLAMA_MODEL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemma2:2b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the request path:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  Browser[ChromaWild in browser] --&amp;gt;|request a quest| Next[Next.js API route]
  Next --&amp;gt;|prompt| Ollama[Local Ollama and Gemma]
  Ollama --&amp;gt;|structured color quest| Next
  Next --&amp;gt;|validated quest| Browser
  Browser --&amp;gt;|color comparison and journal| Browser&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The implementation is in &lt;a href="https://github.com/sleepyaishik69/ChromaWild/blob/main/src/app/api/gemma/route.ts" rel="noopener noreferrer"&gt;the Gemma API route&lt;/a&gt;. The repo also has setup instructions, contribution and security notes, and a GitHub Actions workflow for linting, type checking, and building.&lt;/p&gt;

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

&lt;p&gt;With Ollama, the default color-quest generation runs on the machine hosting the app. I can try a different Ollama model by changing configuration, without tying the core feature to a paid inference API. That makes local experimentation possible and keeps the default quest prompt on the local machine.&lt;/p&gt;

&lt;p&gt;There are tradeoffs: users need to install Ollama and download a model, and generation speed depends on their hardware. The hosted-app setup is different: Ollama must be reachable from the server, and this project still needs API protections before a public deployment. Optional Groq evaluation and ElevenLabs speech use external services if configured.&lt;/p&gt;

&lt;p&gt;The app's public GitHub repository is up, though I still need to choose a project license. I also want to take ChromaWild on an actual color walk and see which prompts are easy to find in an everyday neighborhood.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize category
&lt;/h2&gt;

&lt;p&gt;ChromaWild appears to fit the &lt;strong&gt;Best Use of Gemma&lt;/strong&gt; category because Gemma generates quests in the default setup. If the challenge has a separate category-entry step, I'll select it there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/pavelespitia/how-to-run-llms-locally-with-ollama-a-developers-guide-25nh"&gt;How to Run LLMs Locally with Ollama — A Developer's Guide&lt;/a&gt; covers the local model setup behind this approach.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/gpuneet/building-reliable-llm-applications-in-python-hd1"&gt;Building Reliable LLM Applications in Python&lt;/a&gt; discusses validating structured model output and handling failures—useful practices across languages.&lt;/li&gt;
&lt;/ul&gt;

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