<?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: Aditya Modani</title>
    <description>The latest articles on DEV Community by Aditya Modani (@modapk06).</description>
    <link>https://dev.to/modapk06</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%2F4155526%2Fdad7004c-aa4f-4cb5-b895-313feefdf5ed.jpg</url>
      <title>DEV Community: Aditya Modani</title>
      <link>https://dev.to/modapk06</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/modapk06"/>
    <language>en</language>
    <item>
      <title>I Told My Laptop “attendance” and It Answered Out Loud: A Local, Voice-Powered Portal Agent</title>
      <dc:creator>Aditya Modani</dc:creator>
      <pubDate>Sat, 24 Oct 2026 16:23:05 +0000</pubDate>
      <link>https://dev.to/modapk06/i-told-my-laptop-attendance-and-it-answered-out-loud-a-local-voice-powered-portal-agent-11i5</link>
      <guid>https://dev.to/modapk06/i-told-my-laptop-attendance-and-it-answered-out-loud-a-local-voice-powered-portal-agent-11i5</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;Attendance Monitor&lt;/strong&gt; is a voice-enabled command-line agent that does the boring portal chores for me. You give it a task name, and it opens the website, logs in, finds the right page, reads it, and tells you the answer out loud like a person would.&lt;/p&gt;

&lt;p&gt;The first task is attendance. I type one word:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;attendance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and it replies:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey, good news! Your overall attendance is eighty six percent. You're above seventy five percent in every course."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Attendance is only the first use, though. The agent has two parts: a &lt;strong&gt;fixed browser routine&lt;/strong&gt; (login, navigate, screenshot) and a &lt;strong&gt;reading step&lt;/strong&gt; (a local vision model plus a spoken-style reply). Both are driven by a config file with the URL, the click path and the question to ask. Pointing it at a different task means changing the config and the question, not rewriting the agent. Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fee or exam-form deadlines&lt;/li&gt;
&lt;li&gt;Timetable or room changes&lt;/li&gt;
&lt;li&gt;Assignment and results pages&lt;/li&gt;
&lt;li&gt;Any dashboard you check every day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who it saves effort for:&lt;/strong&gt; anyone who repeats the same login, scroll, click, read routine on a portal, and anyone who'd rather hear the answer than open the page.&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%2Fqbxv0tbykh0klfmz84hm.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%2Fqbxv0tbykh0klfmz84hm.png" alt=" " width="800" height="260"&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/Aditya4453" rel="noopener noreferrer"&gt;
        Aditya4453
      &lt;/a&gt; / &lt;a href="https://github.com/Aditya4453/attendance_monitor" rel="noopener noreferrer"&gt;
        attendance_monitor
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;attendance-agent 📊&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;An automated Python CLI agent that logs into your TCS iON portal, navigates to the &lt;strong&gt;Period wise attendance&lt;/strong&gt; page, captures a full-page screenshot, and uses a local Ollama vision model (such as &lt;code&gt;qwen2.5vl&lt;/code&gt; or &lt;code&gt;llava&lt;/code&gt;) to extract and summarize your attendance statistics with a clean terminal UI powered by Rich.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📁 Project Structure&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;attendance-agent/
├── .env                 # Your portal credentials (NEVER commit this)
├── .env.example         # Template with variable names
├── .gitignore           # Ignores credentials, screenshots, logs, and session files
├── config.yaml          # Portal URL, CSS selectors, model name, screenshot settings
├── pyproject.toml       # Defines the `attendance` global console command
├── agent/
│   ├── __init__.py
│   ├── cli.py           # Typer CLI application &amp;amp; Rich output formatter
│   ├── browser.py       # Playwright browser automation (session persistence, lazy scroll, screenshot)
│   ├── vision.py        # Pillow image shrinking &amp;amp; Ollama vision model API integration
│   └── models.py        # Pydantic AttendanceSummary&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/Aditya4453/attendance_monitor" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;attendance_monitor/
├── agent/
│   ├── cli.py        # the `attendance` command
│   ├── browser.py    # login, navigation, screenshot
│   ├── vision.py     # image prep + local model call
│   ├── speech.py     # turns results into a casual message
│   ├── voice.py      # ElevenLabs text-to-speech
│   └── models.py     # Pydantic result schema
├── config.yaml       # URL, click path, selectors, model name
└── .env              # credentials and API keys (never committed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser automation&lt;/td&gt;
&lt;td&gt;Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reading the screenshot&lt;/td&gt;
&lt;td&gt;Open-weight vision model running locally through Ollama ([Moondream])&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image prep&lt;/td&gt;
&lt;td&gt;Pillow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice&lt;/td&gt;
&lt;td&gt;ElevenLabs text-to-speech&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Typer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output validation&lt;/td&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logging&lt;/td&gt;
&lt;td&gt;loguru&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;attendance&lt;/code&gt; starts the run.&lt;/li&gt;
&lt;li&gt;Playwright logs in with credentials from a separate &lt;code&gt;.env&lt;/code&gt; file and reuses the saved session next time.&lt;/li&gt;
&lt;li&gt;It follows the click path from &lt;code&gt;config.yaml&lt;/code&gt;, scrolls to load the page, and takes a screenshot.&lt;/li&gt;
&lt;li&gt;Pillow shrinks the image for faster inference.&lt;/li&gt;
&lt;li&gt;The local vision model reads it and returns structured JSON.&lt;/li&gt;
&lt;li&gt;Pydantic validates the JSON, and a formatter turns it into a short, friendly message.&lt;/li&gt;
&lt;li&gt;ElevenLabs speaks the message. &lt;code&gt;--mute&lt;/code&gt; skips this step.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright can't mix CSS and &lt;code&gt;text=&lt;/code&gt; selectors in one comma list, so combining locators with &lt;code&gt;.or_()&lt;/code&gt; is the fix.&lt;/li&gt;
&lt;li&gt;College portals often use iframes, so content has to be found inside the frame.&lt;/li&gt;
&lt;li&gt;Scraped summary cards can look like course rows, so I validate the data before speaking it.&lt;/li&gt;
&lt;li&gt;Text meant for speech has to be written differently, with percentages as words and no symbols or tables.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A student portal holds personal data: logins, grades, attendance. Because the vision model is open-weight and runs &lt;strong&gt;locally&lt;/strong&gt;, the screenshot of my logged-in portal never leaves my laptop. A closed vision API would have meant uploading that screenshot to someone else's server on every run, with per-image costs and rate limits.&lt;/p&gt;

&lt;p&gt;Open models also let me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swap models&lt;/strong&gt; freely and pick the smallest one that reads the page well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run offline&lt;/strong&gt;, since the reading step needs no internet beyond the portal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adapt the tool&lt;/strong&gt; to any task, because I control the whole pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only cloud piece is the optional ElevenLabs voice, which receives just the short text reply and never the screenshot.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before:&lt;/strong&gt; about [X] minutes per check, [Y] times a week, from login to scrolling to squinting at a table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After:&lt;/strong&gt; one command and about [Z] seconds, with the answer read aloud while I do something else.&lt;/li&gt;
&lt;li&gt;That's about [total] minutes saved a month, and I no longer forget to check.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt;: the agent's replies are written for speech and read out through ElevenLabs text-to-speech.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight models&lt;/strong&gt;: the screenshot is read by an open-weight vision model running locally through Ollama.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overall&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>ExpenseAI — Privacy-First Local AI Expense Tracker</title>
      <dc:creator>Aditya Modani</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:14:24 +0000</pubDate>
      <link>https://dev.to/modapk06/expenseai-privacy-first-local-ai-expense-tracker-5e07</link>
      <guid>https://dev.to/modapk06/expenseai-privacy-first-local-ai-expense-tracker-5e07</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Story: It Started With a ₹450 Coffee&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When I saw the Hacktoberfest #BuildForAFriend challenge, I knew exactly what I was going to build. Because the idea was already sitting there, born from a simple ₹450 coffee.&lt;/p&gt;

&lt;p&gt;A friend of mine had been trying to track his expenses for weeks. He genuinely wanted to build the habit, but one evening, after we grabbed coffee, I watched him pull out his phone to record the expense. He opened his budgeting app, and then came the rigid dropdowns: Category. Amount. Description. Date. Save.&lt;/p&gt;

&lt;p&gt;He stared at the screen, sighed, and closed the app. "I'll add it later."&lt;/p&gt;

&lt;p&gt;I knew what “later” meant. It meant the ₹450 would disappear into a mental pile of unrecorded expenses. The software was asking him to think like a database when he was simply trying to remember what he had spent.&lt;/p&gt;

&lt;p&gt;So I asked him: &lt;strong&gt;“Why can't you just tell the app what you spent?”&lt;/strong&gt;&lt;br&gt;
He laughed, and then said something that stuck with me: “Because apps don't understand the way I talk.”&lt;/p&gt;

&lt;p&gt;He was right. If he told me, "&lt;strong&gt;four fifty coffee pe spent kiya,"&lt;/strong&gt; I would immediately understand: ₹450. Coffee. Expense. But traditional software sees that sentence as a problem that needs to be squeezed into predefined fields—often failing on regional currency speech and turning "four fifty" into $4.50 instead of ₹450.&lt;/p&gt;

&lt;p&gt;That's when I decided to build ExpenseAI: an expense tracker that adapts to the person, instead of forcing the person to adapt to the software.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;What I Built&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;ExpenseAI is a 100% private, database-free, local-first financial intelligence tracker. You type or speak naturally &lt;strong&gt;(e.g., "four fifty CCD coffee pe spent kiya" or "got 25000 salary")&lt;/strong&gt;, and an open-source LLM running locally via Ollama parses the input into structured data—keeping every rupee of your financial history strictly on your own device&lt;/p&gt;
&lt;h3&gt;
  
  
  Core Highlights:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local AI Natural Language Parsing:&lt;/strong&gt; Processes conversational queries using a local &lt;code&gt;llama3.2&lt;/code&gt; model managed by Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INR Spoken Currency Engine:&lt;/strong&gt; Specifically trained via system prompts to interpret Indian spoken number formats correctly (e.g., &lt;code&gt;"four fifty"&lt;/code&gt; $\rightarrow$ &lt;code&gt;450&lt;/code&gt;, &lt;code&gt;"fifteen hundred"&lt;/code&gt; $\rightarrow$ &lt;code&gt;1500&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict JSON Schema Sampler:&lt;/strong&gt; Enforces strict structural output directly at the model sampler level to eliminate schema drift and prevent parsing errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilient Offline Fallback:&lt;/strong&gt; Includes a heuristic keyword parser that seamlessly takes over if Ollama is unreachable or times out during cold starts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database-Free Local Storage:&lt;/strong&gt; Operates completely offline without external databases, storing state in browser &lt;code&gt;localStorage&lt;/code&gt; and Express memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Client-Side Excel/CSV Import:&lt;/strong&gt; Drag and drop bank statements (.xlsx, .csv) to parse transactions client-side using SheetJS without sending a single byte to a server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Analytics &amp;amp; One-Click Exports:&lt;/strong&gt; Real-time category breakdown via Chart.js with high-res PNG/JPG chart image downloads and Excel-compatible CSV exports.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Aditya4453/DEVchallenge" rel="noopener noreferrer"&gt;Aditya4453/DEVchallenge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo Link:&lt;/strong&gt; &lt;em&gt;&lt;a href="https://de-vchallenge.vercel.app/" rel="noopener noreferrer"&gt;https://de-vchallenge.vercel.app/&lt;/a&gt;&lt;/em&gt; (Only for frontend)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visuals:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F78k2vcgn3bcyw3uhdu4l.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%2F78k2vcgn3bcyw3uhdu4l.png" alt=" " width="800" height="823"&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/Aditya4453" rel="noopener noreferrer"&gt;
        Aditya4453
      &lt;/a&gt; / &lt;a href="https://github.com/Aditya4453/DEVchallenge" rel="noopener noreferrer"&gt;
        DEVchallenge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ExpenseAI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;ExpenseAI is a React and Express personal-finance dashboard. Enter an expense
or income item in natural language, review monthly analytics, filter and sort
transactions, and export the current view.&lt;/p&gt;
&lt;p&gt;Transactions are stored locally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The backend keeps an in-memory array while it is running.&lt;/li&gt;
&lt;li&gt;The frontend mirrors transactions in browser &lt;code&gt;localStorage&lt;/code&gt;, so browser
reloads do not lose them.&lt;/li&gt;
&lt;li&gt;Backend memory is cleared when the backend process restarts.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it includes&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;English and Hinglish natural-language transaction input&lt;/li&gt;
&lt;li&gt;Local Ollama parsing with strict JSON output&lt;/li&gt;
&lt;li&gt;Keyword-based parser fallback when Ollama is unavailable&lt;/li&gt;
&lt;li&gt;INR phrase handling such as &lt;code&gt;four fifty&lt;/code&gt; -&amp;gt; &lt;code&gt;450&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Monthly summary cards and Chart.js category breakdown&lt;/li&gt;
&lt;li&gt;Category filters and newest/oldest/amount sorting&lt;/li&gt;
&lt;li&gt;Excel-compatible CSV transaction export&lt;/li&gt;
&lt;li&gt;Full PNG/JPG chart export with legend and totals&lt;/li&gt;
&lt;li&gt;Responsive React UI with Framer Motion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The current React interface does not use voice/STT/TTS. Legacy ElevenLabs
backend code remains available but is not part of the…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Aditya4453/DEVchallenge" 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;ExpenseAI is built on a decoupled full-stack architecture designed for privacy, speed, and offline resilience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; A responsive, interactive React UI scaffolded with Vite. It uses &lt;code&gt;framer-motion&lt;/code&gt; for fluid micro-animations, &lt;code&gt;Chart.js&lt;/code&gt; for dynamic visual analytics, and &lt;code&gt;SheetJS&lt;/code&gt; for handling local CSV/Excel imports. Data is persisted securely in the browser's &lt;code&gt;localStorage&lt;/code&gt; to ensure persistence across reloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; A lightweight Node.js/Express server that acts as the middleware. It handles cross-origin requests, validates the incoming natural language prompts, and orchestrates the AI parsing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration:&lt;/strong&gt; The backend sends a meticulously crafted system prompt and strict JSON schema to a local instance of Ollama running &lt;code&gt;llama3.2&lt;/code&gt;. If the model is not running, the Express API instantly routes the request to a regex-based heuristic fallback parser to ensure the dashboard remains fully functional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; No MongoDB, Postgres, or cloud database is required. The backend uses a volatile in-memory array for session continuity, heavily complementing the frontend's local storage solution.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Personal financial logs represent highly sensitive data. Sending every daily meal, utility bill, or salary deposit to closed, proprietary cloud APIs creates unnecessary privacy risks, rate-limit constraints, and subscription costs.&lt;/p&gt;

&lt;p&gt;Open innovation and open-weight models made &lt;strong&gt;ExpenseAI&lt;/strong&gt; possible by enabling:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Absolute On-Device Privacy:&lt;/strong&gt; Financial data never leaves the user's browser or local machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero API Cost &amp;amp; Unlimited Usage:&lt;/strong&gt; Free, unlimited local inference without API keys, monthly bills, or rate limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True Offline Independence:&lt;/strong&gt; Fully functional without an active internet connection—allowing users to track expenses anywhere, anytime.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;We utilized AI agent workflows throughout the build to refactor the project's default models to &lt;code&gt;llama3.2&lt;/code&gt;, handle git history and commits properly, test local model edge cases, and add debugging utilities directly into the codebase. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Aditya4453/DEVchallenge" rel="noopener noreferrer"&gt;Aditya4453/DEVchallenge&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Team Members
&lt;/h2&gt;

&lt;p&gt;Credit to my teammate who contributed to this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Samridhi&lt;/strong&gt; (&lt;a href="https://dev.to/justsamridhi"&gt;@justsamridhi&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Main Challenge:&lt;/strong&gt; Build for a Friend&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best Use of Local Inference / Ollama&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

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