<?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: Aarya Shirsath</title>
    <description>The latest articles on DEV Community by Aarya Shirsath (@aarya0706).</description>
    <link>https://dev.to/aarya0706</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%2F4157698%2Fd04068af-c058-46e0-9c03-a9ce8c8fbcad.jpg</url>
      <title>DEV Community: Aarya Shirsath</title>
      <link>https://dev.to/aarya0706</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aarya0706"/>
    <language>en</language>
    <item>
      <title>sloth-standup: a standup writer that reads my git log so I don't have to</title>
      <dc:creator>Aarya Shirsath</dc:creator>
      <pubDate>Thu, 22 Oct 2026 13:45:21 +0000</pubDate>
      <link>https://dev.to/aarya0706/sloth-standup-a-standup-writer-that-reads-my-git-log-so-i-dont-have-to-11oe</link>
      <guid>https://dev.to/aarya0706/sloth-standup-a-standup-writer-that-reads-my-git-log-so-i-dont-have-to-11oe</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;sloth-standup&lt;/strong&gt; reads the git history of my active repos and writes my standup for me: what I did yesterday, and what I'm continuing today. One command, under 30 seconds, and the result is saved as a markdown file.&lt;/p&gt;

&lt;p&gt;I contribute to several open-source repos at once, and every morning I'd stare at &lt;code&gt;git log&lt;/code&gt; trying to remember what I'd actually done. Now I don't have to. It's for anyone who juggles multiple projects or has to post a daily update and would rather not write it.&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rcvd13o7omtalf20ku6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rcvd13o7omtalf20ku6.gif" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Real output from my own repos, generated by a 3B model running on my laptop CPU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS&amp;gt; python -m sloth_standup --since "30 days ago"
Yesterday:
- SecureFlow: Fixed insufficient VRAM handling; Added LLM explanation caching
- iloveAgents: Updated agent categories; Added documentation
- hiero-bot-py: Fixed DCO logic sharing; Added empty-check label verification; Updated test-file regex anchoring

Today:
- SecureFlow: continue fix/local-model-graceful-degradation
- iloveAgents: continue docs/update-category-list
- hiero-bot-py: continue fix/pr-quality-gates

(saved to standups\2026-10-22.md)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/Aarya0706" rel="noopener noreferrer"&gt;
        Aarya0706
      &lt;/a&gt; / &lt;a href="https://github.com/Aarya0706/sloth-standup" rel="noopener noreferrer"&gt;
        sloth-standup
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Writes your daily standup from your git commits. Runs on a local open-weight model (Qwen2.5), no API key, nothing leaves your machine.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;sloth-standup&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A lazy, fully local git standup bot. It reads your commits, uncommitted work
and open PRs, then an open-weight model running inside Python writes a
two-line standup. No Ollama, no server, no API key, no data leaving your laptop.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Aarya0706/sloth-standup/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2FAarya0706%2Fsloth-standup%2FHEAD%2Fdemo.gif" alt="sloth-standup demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install -r requirements.txt
copy config.example.json config.json      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; then edit your repo paths&lt;/span&gt;
python -m sloth_standup --dry-run         &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; check what the model will see&lt;/span&gt;
python -m sloth_standup                   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; first run downloads ~1 GB, once&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;If &lt;code&gt;pip install llama-cpp-python&lt;/code&gt; tries to compile and fails on Windows, use the
prebuilt CPU wheels:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Already have a GGUF file? Set &lt;code&gt;"model_path": "C:/models/your-model.gguf"&lt;/code&gt; in
&lt;code&gt;config.json&lt;/code&gt; instead of &lt;code&gt;model_repo&lt;/code&gt;/&lt;code&gt;model_file&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Make it lazy (Windows)&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-batchfile notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;schtasks&lt;/span&gt; /Create /SC DAILY /TN &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;SlothStandup&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; /TR &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;\&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-smi"&gt;%cd%&lt;/span&gt;\run_standup.bat\&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; /ST 08:30&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Your standup lands in &lt;code&gt;standups/YYYY-MM-DD.md&lt;/code&gt; every morning.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Options&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;python -m sloth_standup --since "2 days ago" --repo&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/Aarya0706/sloth-standup" 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;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Qwen2.5-Instruct in GGUF (q4_k_m), run locally on CPU. I tested the 1.5B and 3B versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git layer:&lt;/strong&gt; &lt;code&gt;gitdata.py&lt;/code&gt; pulls commits and diff stats from each repo listed in &lt;code&gt;config.json&lt;/code&gt;, filtered to my author name and capped at 2,500 characters per repo so the prompt stays small.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM layer:&lt;/strong&gt; &lt;code&gt;llm.py&lt;/code&gt; summarizes each repo's work at temperature 0.2 with a tight token limit, in a fixed "short items separated by semicolons" format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI:&lt;/strong&gt; &lt;code&gt;cli.py&lt;/code&gt; assembles the Yesterday/Today output and saves it to &lt;code&gt;standups/&lt;/code&gt;. The "Today" section comes from each repo's current branch name, so it costs zero tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; one JSON file holds the repos, the author, and the model. Swapping models is a two-line edit. A &lt;code&gt;run_standup.bat&lt;/code&gt; lets me double-click it each morning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.5B vs 3B, on my real repos
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Qwen2.5-1.5B&lt;/th&gt;
&lt;th&gt;Qwen2.5-3B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Download&lt;/td&gt;
&lt;td&gt;~1 GB&lt;/td&gt;
&lt;td&gt;~2.1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run time (3 repos, CPU)&lt;/td&gt;
&lt;td&gt;18.6 s&lt;/td&gt;
&lt;td&gt;28.1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SecureFlow&lt;/td&gt;
&lt;td&gt;Fixed VRAM issue; Added Redis cache for LLM explanations&lt;/td&gt;
&lt;td&gt;Fixed insufficient VRAM handling; Added LLM explanation caching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iloveAgents&lt;/td&gt;
&lt;td&gt;Updated agent category list; Fixed typo in documentation; &lt;strong&gt;Added new feature for user authentication&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Updated agent categories; Added documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hiero-bot-py&lt;/td&gt;
&lt;td&gt;Fixed PR health and quality gates; Improved DCO logic and cache commits; Fixed empty-check label audit, verified DCO trailers, anchored the &lt;em&gt;(cut off)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Fixed DCO logic sharing; Added empty-check label verification; Updated test-file regex anchoring&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 1.5B is about 10 seconds faster, but it invented two items for iloveAgents ("fixed a typo", "added user authentication") when my only commit there was a docs update to the category list. One of its hiero-bot-py items also ran out of tokens mid-sentence. The 3B was vaguer in places ("Added documentation") but didn't make anything up and stayed in the format. For something I'd paste into a standup without rereading closely, the 3B is the one I keep.&lt;/p&gt;

&lt;h3&gt;
  
  
  Things I learned
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Filter by author.&lt;/strong&gt; My first version summarized everyone's commits in the repo, so my standup claimed other contributors' work as mine. My identity was also split across two emails (one a GitHub noreply address), so matching on my name worked where matching on email didn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small models need a rigid format.&lt;/strong&gt; Early output was full of colons and stray punctuation until I forced short semicolon-separated items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the output against your real data.&lt;/strong&gt; Both models looked fine at a glance, and the difference only showed up when I compared them to my actual commit log.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;My commit history is my private working record: unreleased branches, half-finished fixes, repo names. With a closed API, every standup would send that to a server I don't control, and I'd be paying per call for a task I do daily. With an open-weight model, the whole pipeline runs on my laptop. No account, no API key, no cost, and it works with no wifi after the first model download.&lt;/p&gt;

&lt;p&gt;Open weights also let me swap models by changing one line and compare 1.5B and 3B on my own repos rather than trusting a leaderboard. That comparison is how I caught the 1.5B's invented feature. A small quantized model turned out to be good enough for this job, and I could only learn that because I could run both.&lt;/p&gt;

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

&lt;p&gt;Instead of digging through &lt;code&gt;git log&lt;/code&gt; across three repos every morning, I run one command and wait about half a minute. It costs nothing per run, and I used it for my own updates this week.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>"BillGuard AI: An Open-Model Invoice Auditor for Freelancers"</title>
      <dc:creator>Aarya Shirsath</dc:creator>
      <pubDate>Thu, 15 Oct 2026 14:31:41 +0000</pubDate>
      <link>https://dev.to/aarya0706/billguard-ai-an-open-model-invoice-auditor-for-freelancers-4ii7</link>
      <guid>https://dev.to/aarya0706/billguard-ai-an-open-model-invoice-auditor-for-freelancers-4ii7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Meet &lt;strong&gt;BillGuard AI&lt;/strong&gt;, an &lt;strong&gt;invoice auditor designed for freelancers and small businesses&lt;/strong&gt; that want to spend less time checking bills manually.&lt;/p&gt;

&lt;p&gt;Invoices arrive as &lt;strong&gt;PDFs, screenshots, and photos&lt;/strong&gt;. Important fields can be difficult to read, GSTINs can be mistyped, and subtotals, taxes, and totals don't always add up.&lt;/p&gt;

&lt;p&gt;BillGuard AI extracts invoice details and checks them using deterministic Python rules.&lt;/p&gt;

&lt;p&gt;It extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vendor name, invoice number, and date&lt;/li&gt;
&lt;li&gt;GSTIN and expense category&lt;/li&gt;
&lt;li&gt;Subtotal, tax, and final total&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It then &lt;strong&gt;flags missing fields, invalid GSTIN formats, and arithmetic mismatches&lt;/strong&gt;. Users can review the results in a dashboard and export them to CSV.&lt;/p&gt;

&lt;p&gt;The goal is simple: make invoice review less tedious without pretending that AI extraction is automatically correct.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live application:&lt;/strong&gt; &lt;a href="https://billguard-ai-ke9v.onrender.com/" rel="noopener noreferrer"&gt;https://billguard-ai-ke9v.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/Aarya0706/billguard-ai" rel="noopener noreferrer"&gt;https://github.com/Aarya0706/billguard-ai&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%2Fnav9tt3004z0yrjli4wo.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%2Fnav9tt3004z0yrjli4wo.png" alt="BillGuard AI invoice review dashboard displaying extracted invoice details and validation results" width="799" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application is deployed on Render. The hosted demo uses a configured Gemini endpoint, so availability depends on the provider's API quota.&lt;/p&gt;

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

&lt;p&gt;The application uses &lt;strong&gt;Python, FastAPI, PyMuPDF, Pillow, and a lightweight HTML/CSS/JavaScript&lt;/strong&gt; dashboard.&lt;/p&gt;

&lt;p&gt;The extraction pipeline works in two stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A vision model reads invoice images or PDF pages and returns structured fields.&lt;/li&gt;
&lt;li&gt;Python normalizes the extracted values and applies deterministic validation rules.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I separated extraction from validation deliberately. A language model can misread a digit or confuse a subtotal with a final payable amount, so arithmetic checks should not depend on the model's own judgment.&lt;/p&gt;

&lt;p&gt;The app supports different OpenAI-compatible vision endpoints. It is designed to run with the &lt;strong&gt;open-weight Qwen2.5-VL model&lt;/strong&gt; through &lt;strong&gt;Ollama&lt;/strong&gt; for local inference, or with a hosted provider when easier access is needed. The public deployment currently uses &lt;strong&gt;Gemini&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I also added &lt;strong&gt;automated tests&lt;/strong&gt; for image processing, multi-page PDFs, malformed model responses, validation, rate limits, fallback models, and API errors. My latest local test run &lt;strong&gt;passed all 29 tests.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Invoices can contain client names, addresses, tax identifiers, and financial details. Where that information is processed matters.&lt;/p&gt;

&lt;p&gt;An open-weight model gives users a choice that a hosted-only application cannot offer: &lt;strong&gt;run inference on their own computer&lt;/strong&gt; instead of sending every invoice to an external AI service.&lt;/p&gt;

&lt;p&gt;With a local model configured through Ollama, invoice images can stay on the user's machine, and inference does not incur a per-request API charge after the model has been downloaded. The trade-off is that local models need storage and computing resources.&lt;/p&gt;

&lt;p&gt;The hosted option makes the app easier to access, but invoice images are sent to the configured provider and usage limits can apply.&lt;/p&gt;

&lt;p&gt;I also wanted to avoid locking the project to one model provider. A model can be replaced without redesigning the invoice validation pipeline.&lt;/p&gt;

&lt;p&gt;For a small business, that flexibility matters: it offers a path toward privacy, predictable costs, and control over how the tool works.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Could Someone Pay For?
&lt;/h2&gt;

&lt;p&gt;The initial audience is freelancers, independent consultants, and small businesses that receive invoices regularly.&lt;/p&gt;

&lt;p&gt;A potential paid version could offer larger batches, searchable invoice history, vendor-wise expense summaries, and accounting-friendly exports.&lt;/p&gt;

&lt;p&gt;These are ideas to validate with users, not features or customer demand I am claiming to have proven yet.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Render&lt;/strong&gt; — the application is deployed on Render, which hosts the public web app and its FastAPI backend.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Temple Heritage: an open-source AI yatra planner I took to Mahakaleshwar, Ujjain</title>
      <dc:creator>Aarya Shirsath</dc:creator>
      <pubDate>Tue, 06 Oct 2026 08:19:29 +0000</pubDate>
      <link>https://dev.to/aarya0706/temple-heritage-an-open-source-ai-yatra-planner-i-took-to-mahakaleshwar-ujjain-3ghl</link>
      <guid>https://dev.to/aarya0706/temple-heritage-an-open-source-ai-yatra-planner-i-took-to-mahakaleshwar-ujjain-3ghl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Planning a pilgrimage usually means ten browser tabs, a group chat, and a map you can't read at the gate. I built Temple Heritage so the planning takes five minutes and the rest of the day is spent at the temple, not on your phone.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Temple Heritage&lt;/strong&gt; is a pilgrimage-planning app for people who want to actually go, not just scroll. You pick your preferences, and an AI planner builds a day-wise yatra (pilgrimage trip) with the stops ordered by an optimized route, so you spend less time traveling and more time there.&lt;/p&gt;

&lt;p&gt;The screen is only the planning step. The output is a day-wise itinerary, a route map with a Google Maps handoff for navigation, festival countdowns, and nearby temples, all meant to be used on the road. Each temple has a voice-enabled Q&amp;amp;A assistant (English and Hindi), and a pilgrimage passport tracks the temples you've visited, which pushes you to go to the next one.&lt;/p&gt;

&lt;p&gt;The planner runs on an open-weight model, &lt;strong&gt;OpenAI's gpt-oss-120b&lt;/strong&gt;, so the AI core of the app is open and swappable.&lt;/p&gt;

&lt;p&gt;It's for families, devotees, and heritage travelers who find trip planning a chore.&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%2Fosc5wqsl9nzzazx5kclm.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%2Fosc5wqsl9nzzazx5kclm.png" alt="Temple Heritage homepage: " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live:&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://templeheritage.me/" rel="noopener noreferrer"&gt;https://templeheritage.me/&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://github.com/Aarya0706/temple-heritage" rel="noopener noreferrer"&gt;https://github.com/Aarya0706/temple-heritage&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I Took It Outside
&lt;/h2&gt;

&lt;p&gt;I tested it on a real trip to &lt;strong&gt;Mahakaleshwar Temple in Ujjain&lt;/strong&gt;, one of the 12 Jyotirlingas. I entered Ujjain, 2 days, and a temple-focused trip.&lt;/p&gt;

&lt;p&gt;Instead of treating Mahakaleshwar as one more stop on a tourist checklist, the planner built the itinerary around the rhythm of a pilgrimage, including the early-morning Bhasma Aarti and the nearby temples.&lt;/p&gt;

&lt;p&gt;The interesting part was the constraint. Bhasma Aarti starts at 4:00 AM, so dropping it randomly into a day plan would make everything after it unrealistic. The plan it gave me actually worked as a day: an early start, then a slower pace after.&lt;/p&gt;

&lt;p&gt;That turned into a useful lesson for me. A planner shouldn't just generate places, it needs to generate a day that makes sense. Right now my validation catches invented temples, duplicates, and missing days, but it doesn't check timings. A time-aware layer for rituals like this is the next thing I want to build.&lt;/p&gt;

&lt;p&gt;That's the problem Temple Heritage is trying to solve: turning a list of temples into a practical yatra.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend/backend:&lt;/strong&gt; Next.js + TypeScript + Supabase (auth, DB, migrations)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI planner:&lt;/strong&gt; OpenAI's gpt-oss-120b (open-weight) served through Groq, with schema validation to catch invented or duplicate temples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temple Q&amp;amp;A:&lt;/strong&gt; RAG chatbot with a custom TF-IDF retriever I wrote myself, so there are no embedding API calls and no vendor lock-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing:&lt;/strong&gt; nearest-neighbour + 2-opt route optimization (my own implementation, 23 tests) and Leaflet maps on OpenStreetMap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommendations:&lt;/strong&gt; content-based, collaborative, and popularity signals combined&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality:&lt;/strong&gt; Vitest suite (140+ tests), ESLint, and CI on GitHub Actions that also deploys DB migrations&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swappable models:&lt;/strong&gt; the model is open-weight, though I currently run it on Groq's hosted service. It's a single constant in the code, so I can switch models or self-host later without rewriting the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free to run:&lt;/strong&gt; OpenStreetMap/Leaflet for maps and a self-written TF-IDF retriever for RAG keep the core features free per user. A pilgrimage app shouldn't need a subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparent:&lt;/strong&gt; the routing, retrieval, and recommendation logic is all readable code, not a black box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What a closed API wouldn't give me:&lt;/strong&gt; full control over retrieval and routing, and no per-call costs for maps or embeddings.&lt;/li&gt;
&lt;/ul&gt;

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