<?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>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>
