<?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: Harshit Anand</title>
    <description>The latest articles on DEV Community by Harshit Anand (@sagebeast).</description>
    <link>https://dev.to/sagebeast</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%2F4154452%2Fcebbc685-46d3-4d17-861e-7207736dc470.png</url>
      <title>DEV Community: Harshit Anand</title>
      <link>https://dev.to/sagebeast</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sagebeast"/>
    <language>en</language>
    <item>
      <title>Trailtale: A Pocket-Sized Audio Story That Gets You Off Your Screen and Back on the Trail</title>
      <dc:creator>Harshit Anand</dc:creator>
      <pubDate>Sun, 11 Oct 2026 20:17:41 +0000</pubDate>
      <link>https://dev.to/sagebeast/trailtale-a-pocket-sized-audio-story-that-gets-you-off-your-screen-and-back-on-the-trail-5e93</link>
      <guid>https://dev.to/sagebeast/trailtale-a-pocket-sized-audio-story-that-gets-you-off-your-screen-and-back-on-the-trail-5e93</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;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%2Fc4rgvfoh3bb3h4249g4v.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%2Fc4rgvfoh3bb3h4249g4v.png" alt=" " width="232" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trailtale is a local, offline walking app that turns a walk into an immersive audio story. While you move, the app plays a short story segment; when you stop, the audio pauses automatically. It also surfaces weekly nature quests and lets you confirm interesting finds with a photo, all without pulling you back to a screen.&lt;/p&gt;

&lt;p&gt;It’s built for people who want to spend more time outside without getting stuck in their phone. The idea is simple: make the walk the main experience, not a distraction from it.&lt;/p&gt;

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

&lt;p&gt;Repository: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HarshitAnand1" rel="noopener noreferrer"&gt;
        HarshitAnand1
      &lt;/a&gt; / &lt;a href="https://github.com/HarshitAnand1/trailtale-touch-grass" rel="noopener noreferrer"&gt;
        trailtale-touch-grass
      &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;Trailtale&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An audio story that plays only while you walk, plus weekly nature quests. Every model runs locally — no cloud, no account, works offline.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Install Python dependencies&lt;/h3&gt;
&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; server
pip install -r requirements.txt&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Start the server&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; From the project root&lt;/span&gt;
uvicorn server.main:app --host 0.0.0.0 --port 8000 --reload&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;3. Open the app&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Visit &lt;a href="http://localhost:8000" rel="nofollow noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt; on your phone (or laptop browser).&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;4. (Optional) Set up llama.cpp for story generation&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Download a Gemma model and start the llama.cpp server&lt;/span&gt;
./llama-server -m gemma-2b.gguf --port 8080&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Without llama.cpp, the story engine returns fallback text so you can still test the full walk flow.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;5. (Optional) Install Piper for TTS&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; See https://github.com/rhasspy/piper for installation&lt;/span&gt;
piper --model en_US-lessac-medium --output_file test.wav &lt;span class="pl-k"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Hello from the trail&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Without Piper, the TTS engine generates silent placeholder audio.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&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;Phone (PWA)              Host (FastAPI)
┌──────────────┐        ┌──────────────────┐
│ Walk Gate    │──────▶ │ Orchestrator&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/HarshitAnand1/trailtale-touch-grass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Project source: this includes the PWA client, FastAPI backend, quest data, and local AI pipeline.&lt;/p&gt;

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

&lt;p&gt;I built Trailtale as a combination of a mobile-first PWA and a local AI backend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: a lightweight browser app in the &lt;code&gt;client/&lt;/code&gt; folder using HTML, CSS, and JavaScript&lt;/li&gt;
&lt;li&gt;Sensors: phone motion and GPS data are used to detect whether the user is walking or stopped&lt;/li&gt;
&lt;li&gt;Backend: FastAPI in the &lt;code&gt;server/&lt;/code&gt; folder orchestrates the walk flow, story queue, quests, and logs&lt;/li&gt;
&lt;li&gt;Story generation: a local model runs through &lt;code&gt;llama.cpp&lt;/code&gt; using Gemma&lt;/li&gt;
&lt;li&gt;Voice: Piper generates spoken audio from the generated story text&lt;/li&gt;
&lt;li&gt;Quest system: weekly nature quests are stored as local JSON packs and tracked in SQLite&lt;/li&gt;
&lt;li&gt;Optional vision check: a local multimodal model can verify that a photo matches a quest item&lt;/li&gt;
&lt;li&gt;Offline-first design: the app is intended to work with no cloud service, no account, and no internet dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This stack makes the app feel like a real walk companion rather than a web app that happens to use AI.&lt;/p&gt;

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

&lt;p&gt;Open innovation mattered here because the whole product depends on privacy, local control, and flexibility.&lt;/p&gt;

&lt;p&gt;A closed API would have forced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cloud-based story generation for every segment&lt;/li&gt;
&lt;li&gt;network calls for TTS and photo verification&lt;/li&gt;
&lt;li&gt;higher cost per walk&lt;/li&gt;
&lt;li&gt;user data leaving the device&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With open-source tools and open-weight models, Trailtale can run locally on a phone, laptop, or a backpack setup. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no cloud dependency&lt;/li&gt;
&lt;li&gt;no account required&lt;/li&gt;
&lt;li&gt;no pay-per-token barrier&lt;/li&gt;
&lt;li&gt;the prompt, model, and voice can all be tuned or swapped easily&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an app designed to get people to step away from screens, local open tech is not just a technical choice—it’s the product requirement.&lt;/p&gt;

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

&lt;p&gt;Gemma&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>You Said You'd: A 100% Local AI Commitment Tracker for Forgetful Friends</title>
      <dc:creator>Harshit Anand</dc:creator>
      <pubDate>Sun, 04 Oct 2026 23:44:19 +0000</pubDate>
      <link>https://dev.to/sagebeast/you-said-youd-a-100-local-ai-commitment-tracker-for-forgetful-friends-3h3a</link>
      <guid>https://dev.to/sagebeast/you-said-youd-a-100-local-ai-commitment-tracker-for-forgetful-friends-3h3a</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;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;*&lt;em&gt;"You Said You'd" *&lt;/em&gt; is a local, privacy-first AI commitment tracker. &lt;/p&gt;

&lt;p&gt;I built this for a friend who is incredibly busy and constantly making casual promises in WhatsApp and Telegram groups ("I'll send you that link tomorrow", "Let's grab lunch next week", "I owe you $20 for the tickets"). Unsurprisingly, these casual commitments get lost in the noise of group chats, leading to forgotten plans and missed IOUs.&lt;/p&gt;

&lt;p&gt;To solve this, I built a brutalist, retro-themed web application where they can drop in a raw chat export (.txt or .json). The application parses the chat and uses local AI to extract every single promise, request, and IOU made by them or to them, categorizing them into a neat, searchable ledger.&lt;/p&gt;

&lt;p&gt;When I handed the app over to him and had him upload his group chat from last month, his exact reaction was: &lt;em&gt;"Wait, I completely forgot I told Shivam I'd look at his resume. This is terrifyingly useful."&lt;/em&gt;&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://drive.google.com/file/d/1mMjRwcm2dRD55WSBUvtPWYHmFAyOTCQw/view?usp=sharing" rel="noopener noreferrer" class="c-link"&gt;
            hacktoberfest_challenge_1.mp4 - Google Drive
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fssl.gstatic.com%2Fdocs%2Fdoclist%2Fimages%2Fdrive_favicon_2026_32dp.png" width="32" height="32"&gt;
          drive.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&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/HarshitAnand1" rel="noopener noreferrer"&gt;
        HarshitAnand1
      &lt;/a&gt; / &lt;a href="https://github.com/HarshitAnand1/local-commitment-tracker" rel="noopener noreferrer"&gt;
        local-commitment-tracker
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      local, privacy-first AI commitment tracker
    &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;You Said You'd&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;An AI that remembers what you promised, what others promised you, and shows the exact message where it was said.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hacktoberfest Weekend Challenge 2026&lt;/strong&gt; · &lt;em&gt;Build for a Friend + Open-Source AI&lt;/em&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;People constantly make small commitments in chats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"I'll send it tonight."&lt;/li&gt;
&lt;li&gt;"I'll bring the HDMI adapter."&lt;/li&gt;
&lt;li&gt;"I'll talk to the professor tomorrow."&lt;/li&gt;
&lt;li&gt;"Don't worry, I'll handle the registration."&lt;/li&gt;
&lt;li&gt;"I'll send you the deck after dinner."&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These commitments disappear into thousands of messages. &lt;strong&gt;You Said You'd&lt;/strong&gt; imports a user's own chat export and turns those vague conversational promises into a searchable, evidence-backed commitment ledger.&lt;/p&gt;
&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; another generic chatbot. Its job is specifically:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Remember what I said I'd do. Remember what other people said they'd do. Help me resume unfinished commitments.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Target User&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;A real person who frequently forgets small promises, has many active projects, works in groups/clubs, loses track of who owes…&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/HarshitAnand1/local-commitment-tracker" 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;The entire stack is designed to run entirely locally, turning your own machine into the AI server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Frontend:&lt;/strong&gt; Next.js (App Router) styled with vanilla CSS following a strict Hacktoberfest 26 retro-brutalist theme (no Tailwind).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Agent Framework:&lt;/strong&gt; I used &lt;strong&gt;Mastra (@mastra/core)&lt;/strong&gt; to orchestrate the AI logic. Mastra handles the multi-step workflow of parsing the chat and enforcing structured JSON outputs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Local Inference:&lt;/strong&gt; &lt;strong&gt;Ollama&lt;/strong&gt; running &lt;strong&gt;Gemma 3&lt;/strong&gt; natively on the machine. This acts as the brain for the Mastra Agents.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Memory &amp;amp; Retrieval (RAG):&lt;/strong&gt; Instead of dumping massive chat histories into the context window, I used &lt;strong&gt;PostgreSQL with pgvector&lt;/strong&gt;. Every commitment is embedded using the &lt;code&gt;nomic-embed-text&lt;/code&gt; model. When the user asks a question on the "Ask" page, we do a cosine similarity search to find the top 5 most relevant commitments and pass only those to the Mastra QA Agent.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This project is built around one core philosophy: &lt;strong&gt;My friend's conversations are not AI training data. They're their private life.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A person's chat history contains personal relationships, private plans, arguments, addresses, and sensitive financial context. It is incredibly dangerous to send 5 years of WhatsApp history to a closed-source cloud LLM API just to extract some reminders. &lt;/p&gt;

&lt;p&gt;Open innovation—specifically the availability of powerful open-weights models like Gemma 3, local inference runners like Ollama, and open-source frameworks like Mastra—made this project possible. I was able to build an advanced RAG pipeline that processes sensitive data entirely on the user's local hardware. You get the power of an AI assistant while keeping your data off a server you don't control. &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; (Ran Gemma 3 locally as the core reasoning engine for extracting commitments).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Mastra&lt;/strong&gt; (Orchestrated the extraction workflow and the QA agent using Mastra over open local models).&lt;/li&gt;
&lt;/ul&gt;

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