<?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: Avrojit Dutta</title>
    <description>The latest articles on DEV Community by Avrojit Dutta (@avrojitduttaj).</description>
    <link>https://dev.to/avrojitduttaj</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%2F4151629%2F4eff2142-8d36-4a6c-b3ec-57d2f219bcdd.png</url>
      <title>DEV Community: Avrojit Dutta</title>
      <link>https://dev.to/avrojitduttaj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/avrojitduttaj"/>
    <language>en</language>
    <item>
      <title>ReplyLater: I Gave My Inbox the Night Shift to Reclaim My Me Time</title>
      <dc:creator>Avrojit Dutta</dc:creator>
      <pubDate>Sun, 25 Oct 2026 12:37:10 +0000</pubDate>
      <link>https://dev.to/avrojitduttaj/replylater-i-gave-my-inbox-the-night-shift-to-reclaim-my-me-time-33g1</link>
      <guid>https://dev.to/avrojitduttaj/replylater-i-gave-my-inbox-the-night-shift-to-reclaim-my-me-time-33g1</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;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%2F2zuniz4h5cpe648nh225.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%2F2zuniz4h5cpe648nh225.png" alt=" " width="799" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ReplyLater: The Overnight Email Co-Pilot
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Sloth Philosophy:&lt;/strong&gt; Sloths don't hurry, stress over backlogs, or react to every stimulus in real time. They pace themselves, conserve their energy, and let the world catch up.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Go to sleep with an inbox full of obligations. Wake up with next week's replies ready.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;ReplyLater is a local-first, open-source AI co-pilot that turns a chaotic email backlog into an organized, week-ahead action board.&lt;/p&gt;

&lt;p&gt;Most AI email tools compete for your attention while you're already trying to read and respond. ReplyLater takes a different approach: &lt;strong&gt;batch the work, let it run in the background, and review the results when you're ready.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The workflow is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Import an unread &lt;code&gt;.eml&lt;/code&gt; backlog or email export.&lt;/li&gt;
&lt;li&gt;Let ReplyLater process the conversations.&lt;/li&gt;
&lt;li&gt;Review the results in three buckets:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Needs Your Call:&lt;/strong&gt; Emails that need your judgment or missing information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week-Ahead Queue:&lt;/strong&gt; Reply drafts and extracted commitments organized for the coming week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Info / Closed:&lt;/strong&gt; Receipts, digests, and other messages that don't need a reply.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ReplyLater can classify messages, extract commitments such as &lt;em&gt;“Send the revised design deck by 2 PM,”&lt;/em&gt; identify unanswered questions, and prepare reply drafts. When key information is missing, it is designed to flag the uncertainty rather than invent an answer.&lt;/p&gt;

&lt;p&gt;The people who benefit are anyone who ends the week with an inbox full of obligations: students, freelancers, developers, and busy professionals who want to spend less energy on inbox triage and more time on meaningful work.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://replylater.onrender.com" rel="noopener noreferrer"&gt;https://replylater.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎥 &lt;strong&gt;Walkthrough Video:&lt;/strong&gt; &lt;a href="https://youtu.be/FEGo_ktszOE" rel="noopener noreferrer"&gt;Watch the 60-Second Demo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hosted demo may have different privacy characteristics from a local installation. Use synthetic or non-sensitive email samples when testing a hosted instance unless its data-handling behavior has been verified.&lt;/p&gt;

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

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

&lt;p&gt;The project is organized around a React dashboard, a FastAPI backend, local model inference, durable workflow orchestration, and persistent semantic memory.&lt;/p&gt;

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

&lt;p&gt;ReplyLater is built as a modular, local-first application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, Vite, Tailwind CSS, Lucide Icons, and TanStack Query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI, Python, and SQLAlchemy Async.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight AI:&lt;/strong&gt; Google's &lt;strong&gt;Gemma 2B&lt;/strong&gt; (&lt;code&gt;gemma2:2b&lt;/code&gt;), running locally through Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durable orchestration:&lt;/strong&gt; The Temporal Python SDK (&lt;code&gt;temporalio&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic memory / RAG:&lt;/strong&gt; PostgreSQL with pgvector, using Tiger Data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability:&lt;/strong&gt; Sentry Python SDK with custom inference and workflow spans.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ Agent Build Log (DevRelay)
&lt;/h3&gt;

&lt;p&gt;We recorded and saved the entire agent session transcript and architectural reasoning using DevRelay. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;Full Agent Session &amp;amp; Trace:&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="GitHub Copilot"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;ReplyLater: Local-First Email Assistant Verification&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Inspect ReplyLater and verify its Python environment, FastAPI backend, React frontend, Ollama/Gemma, Temporal, Sentry, tests, and relevant DEV/MLH opportunities. Prepare technical documentation, but do not publish or submit anything without permission. Do not include secrets, tokens, DSNs, private environment values, private machine paths, or email content in a public session.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Repository inspection found a React/Vite dashboard connected to FastAPI, SQLite local storage, PostgreSQL/pgvector Docker configuration, local Ollama generation, Temporal workflows, and Sentry spans. Configurations were treated as claims to verify, not proof of working features.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-pythonenvironmentandruntimevalidation"&gt;python_environment_and_runtime_validation&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;Compare the project Python environments, inspect API/board responses, build t...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Compare the project Python environments, inspect API/board responses, build the frontend, and test local Ollama generation.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;The project Python 3.12 environment imports Pydantic 2 and pydantic-settings; a second Python 3.14 environment lacks Pydantic. Backend health and board endpoints responded, frontend production build passed, the Vite API proxy worked, and local Gemma generation returned a response.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-temporalintegrationvalidation"&gt;temporal_integration_validation&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;Start the local Temporal dev server and exercise the worker with isolated tes...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Start the local Temporal dev server and exercise the worker with isolated test data.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Temporal workflow validation initially failed because the workflows package imported activities eagerly. Removing those import side effects allowed the worker to start. Workflow IDs were made unique, style retrieval now uses the stored thread body in both execution paths, and Temporal plus direct-fallback synthetic workflow tests passed.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-sentryandembeddingvalidation"&gt;sentry_and_embedding_validation&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;Verify content-safe Sentry telemetry and check the configured local embedding...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Verify content-safe Sentry telemetry and check the configured local embedding path without transmitting email data.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Sentry spans now record counts and error type rather than prompt/output previews; two focused tests passed. No live Sentry event was sent. Gemma generation works, but the configured embedding request returned HTTP 500, so the deterministic 384-dimensional fallback is non-semantic; this limitation is now logged and documented.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Backend unit tests and Python compilation passed. The browser rendered the three board columns without a fetch error. The active project Python environment is functional, but the Pylance environment report continued to show system Python 3.14 after an interpreter-switch request. The user authorized saving this sanitized session only; no DEV article draft, challenge submission, or external Sentry test event was authorized.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        6 of 6 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Session Summary:&lt;/strong&gt; Contains complete prompt sequences, tool executions, and step-by-step refactoring logs recorded during development.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------------------+
|                React + Vite Dashboard                |
|    Needs Your Call | Week-Ahead Queue | Info/Closed  |
+----------------------------+-------------------------+
                             |
                         REST API
                             |
+----------------------------v-------------------------+
|                    FastAPI Backend                   |
+------------+-------------------+---------------------+
             |                   |
      +------v------+     +------v------+     +----------------+
      |  Temporal   |     | Local Gemma |     |   PostgreSQL   |
      |  Workflow   |&amp;lt;---&amp;gt;| via Ollama  |&amp;lt;---&amp;gt;|   + pgvector   |
      | &amp;amp; Activities|     |             |     |                |
      +------+------+     +-------------+     +----------------+
             |
      +------v-------------------------------------------+
      |             Sentry Observability                |
      |          Custom spans, latency, errors          |
      +--------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key design principle is separation of concerns: Temporal coordinates long-running work, FastAPI exposes application functionality, Gemma handles language tasks, PostgreSQL stores persistent data, and Sentry helps diagnose failures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma: Triage and drafting
&lt;/h3&gt;

&lt;p&gt;Gemma supports two main tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Triage and extraction:&lt;/strong&gt; Classifies emails, identifies urgency, extracts commitments, and suggests a target weekday.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drafting with honest uncertainty:&lt;/strong&gt; When an email requests information the system cannot verify—such as an hourly rate or meeting availability—it can flag the missing detail and route the message to &lt;strong&gt;Needs Your Call&lt;/strong&gt; instead of guessing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Temporal: Overnight orchestration
&lt;/h3&gt;

&lt;p&gt;Local batch processing can be interrupted by inference delays, hardware limits, or other transient failures. Temporal's &lt;code&gt;OvernightEmailPrepWorkflow&lt;/code&gt; coordinates the process through separate activities for parsing, semantic retrieval, extraction, and draft staging.&lt;/p&gt;

&lt;p&gt;Configured retry policies help recover from transient failures, while controlled concurrency helps avoid exhausting local CPU or GPU resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sentry: Observability
&lt;/h3&gt;

&lt;p&gt;Sentry is used to help inspect inference and workflow behavior, including custom spans, execution latency, activity transitions, and Ollama HTTP errors. Token counts are tracked where available.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tiger Data / pgvector: Semantic memory
&lt;/h3&gt;

&lt;p&gt;PostgreSQL and pgvector provide a semantic retrieval layer. Relevant sent-email examples can help the system condition drafts on a user's preferred greetings, phrasing, and sign-offs.&lt;/p&gt;

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

&lt;p&gt;Email contains some of our most sensitive information: personal correspondence, financial documents, travel plans, health messages, and work commitments. Sending all of that content to a hosted AI API should not be the default.&lt;/p&gt;

&lt;p&gt;Open-weight models and open-source infrastructure made a local-first architecture possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local inference:&lt;/strong&gt; Gemma runs through Ollama on the configured machine, so email content used for inference does not need to be sent to a third-party model API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fewer recurring costs:&lt;/strong&gt; Local inference avoids per-token charges from hosted model APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data control:&lt;/strong&gt; Users can keep imported emails and writing samples in their own environment, depending on their deployment and configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspectable orchestration:&lt;/strong&gt; Temporal workflows make the processing stages and retry behavior explicit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible infrastructure:&lt;/strong&gt; PostgreSQL and pgvector provide a foundation for semantic retrieval without locking the project to a single proprietary AI platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a claim that every deployment has zero network traffic. Privacy depends on the actual configuration, including telemetry, hosting, and any external integrations. The goal is to make local processing practical and keep private correspondence out of hosted model inference by design.&lt;/p&gt;

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

&lt;p&gt;The point of ReplyLater is not to make people answer email faster every minute of the day. It is to reduce the number of decisions waiting for them when they sit down to work.&lt;/p&gt;

&lt;p&gt;In a test run using &lt;strong&gt;30 &lt;code&gt;.eml&lt;/code&gt; messages&lt;/strong&gt;, the observed results were:&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;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total processed emails&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total batch execution time&lt;/td&gt;
&lt;td&gt;3 min 48 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average inference latency&lt;/td&gt;
&lt;td&gt;2.82 seconds per message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emails requiring replies&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messages routed to “Needs Your Call”&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Receipts/digests auto-archived&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External email-content egress during local inference&lt;/td&gt;
&lt;td&gt;0 KB under the tested configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are results from one test corpus, not a universal performance guarantee. The missing-information precision result should be interpreted in the context of the sample and labeling method.&lt;/p&gt;

&lt;p&gt;The intended payoff is a calmer start to the week: fewer repetitive triage decisions, commitments surfaced before they are forgotten, and drafts ready for human review. ReplyLater stages drafts; it is not intended to send messages without the user's review.&lt;/p&gt;

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

&lt;p&gt;ReplyLater is intended for the following partner categories, based on the technologies used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma:&lt;/strong&gt; Local open-weight language model for email triage, commitment extraction, and draft generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal:&lt;/strong&gt; Durable orchestration for overnight processing workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry:&lt;/strong&gt; Observability and tracing for inference and workflow execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiger Data:&lt;/strong&gt; PostgreSQL and pgvector-based semantic memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please confirm these categories match the challenge's official eligibility and submission rules before publishing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Technology shouldn't just accelerate how quickly we react; it should protect our attention and conserve our energy.&lt;/p&gt;

&lt;p&gt;With open-weight models like &lt;strong&gt;Gemma&lt;/strong&gt;, durable orchestration through &lt;strong&gt;Temporal&lt;/strong&gt;, and observability from &lt;strong&gt;Sentry&lt;/strong&gt;, ReplyLater explores a calmer way to handle the inbox: prepare the work while you rest, then let a human make the final call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shut your laptop. Get some sleep. Let ReplyLater prepare Monday morning.&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I built a privacy-first AI cash-flow copilot for freelancers using Gemma 3 and Python</title>
      <dc:creator>Avrojit Dutta</dc:creator>
      <pubDate>Sun, 18 Oct 2026 09:37:08 +0000</pubDate>
      <link>https://dev.to/avrojitduttaj/i-built-a-privacy-first-ai-cash-flow-copilot-for-freelancers-using-gemma-3-and-python-1p25</link>
      <guid>https://dev.to/avrojitduttaj/i-built-a-privacy-first-ai-cash-flow-copilot-for-freelancers-using-gemma-3-and-python-1p25</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;&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%2Fuud2tj3kvhogj2bqwghr.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%2Fuud2tj3kvhogj2bqwghr.png" alt=" " width="800" height="389"&gt;&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%2Fxy9j2jt8de4ilhs93nhe.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%2Fxy9j2jt8de4ilhs93nhe.png" alt=" " width="800" height="431"&gt;&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%2F9l8mzxit2z8twpohd9sh.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%2F9l8mzxit2z8twpohd9sh.png" alt=" " width="800" height="383"&gt;&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%2F9zky321yklxk7zkvgfqa.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%2F9zky321yklxk7zkvgfqa.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Freelancers can be busy with client work and still have no clear idea how much money they will actually have next month.&lt;/p&gt;

&lt;p&gt;An invoice might be issued today, but payment could arrive weeks late. Several delayed invoices can turn an otherwise profitable business into a cash flow problem. Spreadsheets help track what has happened, but spotting patterns, estimating future cash positions, and identifying unusual payment behaviour takes time.&lt;/p&gt;

&lt;p&gt;That is the problem I wanted to tackle with &lt;strong&gt;CashFlowLens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;CashFlowLens is a cash flow analysis and forecasting tool designed for freelancers, independent consultants, and small agencies. The idea is simple: upload invoice or payment data in CSV format and turn it into information that helps you make better financial decisions.&lt;/p&gt;

&lt;p&gt;The project focuses on three areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cash flow forecasting:&lt;/strong&gt; Use historical transaction data to help estimate what the coming weeks could look like.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment risk and anomaly analysis:&lt;/strong&gt; Identify unusual payment patterns and potential delays that deserve attention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-generated explanations:&lt;/strong&gt; Make financial results easier to understand instead of presenting users with numbers they have to interpret themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The potential paying customer is a freelancer or small agency that cannot justify expensive financial software but still needs better visibility into incoming payments.&lt;/p&gt;

&lt;p&gt;I wanted to build something more useful than another dashboard full of charts. The goal is to help answer practical questions: Which payments deserve attention? What does the historical data suggest about upcoming cash flow? What should I investigate before a cash shortage becomes a problem?&lt;/p&gt;

&lt;p&gt;CashFlowLens is still a work in progress, and I am actively working on making its forecasting and AI-assisted features reliable in the deployed environment.&lt;/p&gt;

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

&lt;p&gt;Try the deployed application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cashflowlens.onrender.com/" rel="noopener noreferrer"&gt;CashFlowLens Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The backend API and interactive documentation are also available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cashflowlens-api.onrender.com/" rel="noopener noreferrer"&gt;Backend API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cashflowlens-api.onrender.com/docs" rel="noopener noreferrer"&gt;API Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/avrojitduttaj/CashFlowLens" rel="noopener noreferrer"&gt;Source Code on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The backend health endpoint is available at &lt;code&gt;/health&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current limitation:&lt;/strong&gt; The application is deployed, but the AI briefing feature depends on an Ollama model service. A locally running Ollama instance is not automatically accessible from a cloud-hosted backend. I am working on a separate model-serving setup so the deployed application can use Gemma without depending on my personal computer being online.&lt;/p&gt;

&lt;p&gt;I would rather be transparent about that limitation than present a partially working deployment as a finished product.&lt;/p&gt;

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

&lt;p&gt;The project is open source:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/avrojitduttaj/CashFlowLens" rel="noopener noreferrer"&gt;github.com/avrojitduttaj/CashFlowLens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the frontend and backend implementation, including the API endpoints used for authentication, analytics uploads, payment-risk analysis, and AI-assisted explanations.&lt;/p&gt;

&lt;p&gt;I would especially appreciate feedback on the forecasting approach, the handling of financial data, and how the results could become more useful to someone running a real freelance business.&lt;/p&gt;

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

&lt;p&gt;CashFlowLens combines a conventional data-analysis pipeline with an open-weight language model.&lt;/p&gt;

&lt;p&gt;The current stack includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React, TypeScript, and Vite&lt;/strong&gt; for the frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python and FastAPI&lt;/strong&gt; for the backend API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pandas&lt;/strong&gt; for processing uploaded financial data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;scikit-learn&lt;/strong&gt; for machine-learning workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TabPFN&lt;/strong&gt; for experimentation with tabular prediction and financial-data modelling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama and Gemma 3:4b&lt;/strong&gt; for local open-weight language-model inference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; for lightweight account and application data storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; for deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One important design decision is to separate financial calculations from AI-generated explanations.&lt;/p&gt;

&lt;p&gt;The numerical pipeline should be responsible for calculating metrics and analysing transaction records. The language model's role is to help explain those results in plain English. An AI-generated paragraph should not be treated as proof that a forecast is accurate, and it should never replace the underlying calculations.&lt;/p&gt;

&lt;p&gt;I have also been experimenting with TabPFN because financial CSV data is tabular by nature. Rather than assuming that a general-purpose language model is the right tool for every task, I want to evaluate specialised models for structured prediction and anomaly detection.&lt;/p&gt;

&lt;p&gt;There is still work to do here. Model selection, forecasting accuracy, validation against historical outcomes, and handling missing or inconsistent dates all matter more than simply adding an AI label to the application.&lt;/p&gt;

&lt;p&gt;The biggest deployment lesson so far has been that running a model locally during development is not the same as making it available to a cloud application. My next step is to establish a secure, separately hosted Ollama service and connect it to the backend without exposing an unauthenticated model endpoint to the public internet.&lt;/p&gt;

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

&lt;p&gt;Financial data is sensitive. Freelancers may be uploading invoice amounts, payment dates, client identifiers, and other information they would not want casually shared with a third-party service.&lt;/p&gt;

&lt;p&gt;That makes the choice of AI infrastructure important.&lt;/p&gt;

&lt;p&gt;Using an open-weight model such as Gemma gives CashFlowLens more control over where inference happens, how the model is served, and which model is used. With Ollama, I can experiment with inference on my own machine instead of making every development request depend on a paid, closed-model API.&lt;/p&gt;

&lt;p&gt;It also gives me room to compare models and control infrastructure costs as the project evolves. That matters for a tool aimed at people who may not have the budget for expensive subscriptions.&lt;/p&gt;

&lt;p&gt;There is a distinction I want to preserve, though: &lt;strong&gt;using an open-weight model does not automatically make an application private.&lt;/strong&gt; The deployment architecture, logging, data retention, access controls, and hosting provider still matter. CashFlowLens needs to make those choices deliberately.&lt;/p&gt;

&lt;p&gt;Open tools have also made it practical for me to experiment with data-processing libraries, machine-learning models, and local inference without building everything from scratch or committing to a single proprietary AI provider.&lt;/p&gt;

&lt;p&gt;For a small project, that flexibility is valuable. I can test an idea, inspect the implementation, replace a component, and learn from the results without having to redesign the entire application around one vendor.&lt;/p&gt;

&lt;p&gt;The longer-term goal is to let users choose a deployment model that fits their needs: local inference for those who prioritise keeping data on their own machine, or a properly secured hosted inference service for those who need cloud access.&lt;/p&gt;

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

&lt;p&gt;I used AI-assisted development while building and debugging the project, including work on the backend, data-processing pipeline, and deployment issues.&lt;/p&gt;

&lt;p&gt;I do not have a verified public DevRelay session link to include here, so I am leaving this section out rather than inventing one. If I publish a session that shows the actual development process, I can add it to this submission.&lt;/p&gt;

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

&lt;p&gt;The categories most relevant to CashFlowLens are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3:4b is the open-weight model used for AI-assisted financial explanations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN:&lt;/strong&gt; TabPFN is being explored for prediction and analysis of structured financial data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; The frontend and backend are deployed on Render.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the categories the project is built to target; inclusion here is not a claim that the project has already won or fully satisfied every judging requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;I want CashFlowLens to become useful for an actual freelancer, not just look convincing in a demo.&lt;/p&gt;

&lt;p&gt;The next priorities are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make the deployed AI briefing workflow reliable.&lt;/li&gt;
&lt;li&gt;Test forecasts against historical data and report meaningful evaluation results.&lt;/li&gt;
&lt;li&gt;Improve payment-delay and anomaly detection using realistic datasets.&lt;/li&gt;
&lt;li&gt;Strengthen validation, authentication, and privacy protections.&lt;/li&gt;
&lt;li&gt;Get feedback from freelancers or small-agency owners and use it to guide the next iteration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you manage your own freelance income, I would love to know what you currently use to track incoming payments, what you find frustrating about it, and whether a tool like this would be useful.&lt;/p&gt;

&lt;p&gt;I built CashFlowLens because I think independent workers deserve better financial visibility without needing an expensive enterprise tool. Now I want to find out whether the idea holds up against real-world needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/avrojitduttaj/CashFlowLens" rel="noopener noreferrer"&gt;CashFlowLens on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://cashflowlens.onrender.com/" rel="noopener noreferrer"&gt;cashflowlens.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  devchallenge #hf26challenge #python #ai #opensource #webdev
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>What If AI Helped You Log Off and Go Outside?</title>
      <dc:creator>Avrojit Dutta</dc:creator>
      <pubDate>Sun, 11 Oct 2026 07:17:17 +0000</pubDate>
      <link>https://dev.to/avrojitduttaj/what-if-ai-helped-you-log-off-and-go-outside-2oe</link>
      <guid>https://dev.to/avrojitduttaj/what-if-ai-helped-you-log-off-and-go-outside-2oe</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;h1&gt;
  
  
  GrassRoute: Using AI to Spend Less Time on Your Phone
&lt;/h1&gt;

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

&lt;p&gt;I wanted to build something that uses technology to get people away from technology.&lt;/p&gt;

&lt;p&gt;Most of us spend a lot of time on our phones, even when we have some free time. Sometimes we want to go outside but end up scrolling because we do not know where to go or what to do.&lt;/p&gt;

&lt;p&gt;That was the idea behind GrassRoute.&lt;/p&gt;

&lt;p&gt;GrassRoute is an outdoor exploration app that helps people discover nearby green spaces, plan walking routes, and generate small missions based on the time they have.&lt;/p&gt;

&lt;p&gt;You can choose between 15, 30, 45, and 60 minutes, select an exploration radius, and look for nearby outdoor places. The app can then help you plan a walk and generate a mission to make it a little more interesting.&lt;/p&gt;

&lt;p&gt;The goal is not to keep people using another app for hours. It is to help them find something to do outside, get the information they need, and put their phones away.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live website:&lt;/strong&gt; &lt;a href="https://grassroute-web1.onrender.com/" rel="noopener noreferrer"&gt;https://grassroute-web1.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The frontend and backend are deployed on Render, so you can try the application online.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; &lt;a href="https://github.com/avrojitduttaj/GrassRoute" rel="noopener noreferrer"&gt;https://github.com/avrojitduttaj/GrassRoute&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the source code and setup instructions for running the project locally.&lt;/p&gt;

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

&lt;p&gt;I built GrassRoute using React, Vite, TypeScript, Express, and Python.&lt;/p&gt;

&lt;p&gt;Here is how the main parts fit together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, Vite, TypeScript, Leaflet, and React-Leaflet power the interface and interactive map.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Express and TypeScript handle API requests, validate inputs, and connect the different services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; I used Gemma 3 4B for the mission-generation feature. During local development, it can run through Ollama, with a Python FastAPI service handling requests. The deployed backend is configured to use Gemma through OpenRouter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Place discovery:&lt;/strong&gt; OpenStreetMap data and public Overpass API instances help find mapped parks, gardens, nature reserves, and other green spaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walking routes:&lt;/strong&gt; A Valhalla routing service provides walking route geometry, estimated distance, duration, and available directions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; The frontend is deployed as a Render Static Site, while the backend runs as a separate Render Web Service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing I wanted to account for was the possibility of the AI service failing. The app includes a fallback mission generator so that it can still return a basic mission when AI generation is unavailable.&lt;/p&gt;

&lt;p&gt;Getting everything to work together took more effort than I initially expected. I had to fix TypeScript errors, deal with API integration problems, configure the deployment settings, and troubleshoot timeouts from public map-data services. There were several moments when something worked locally but needed more debugging after deployment.&lt;/p&gt;

&lt;p&gt;Eventually, I got both services running online.&lt;/p&gt;

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

&lt;p&gt;I chose an open-weight model because I wanted to experiment with the AI instead of depending entirely on a closed model API.&lt;/p&gt;

&lt;p&gt;With Gemma, I can change the prompts, experiment with different approaches to generating missions, and explore running the model locally through Ollama. This gives me more control over the AI component and makes local experimentation possible without depending on a hosted model endpoint.&lt;/p&gt;

&lt;p&gt;For deployment, I chose a hosted inference option because running a model server continuously was not practical for my current setup.&lt;/p&gt;

&lt;p&gt;There is an important distinction here: GrassRoute is not a completely offline application. The map, place discovery, and walking routes depend on internet services, and the deployed AI setup also uses a hosted endpoint.&lt;/p&gt;

&lt;p&gt;Still, using an open-weight model gives me the flexibility to experiment locally and explore different ways of serving the model as the project develops.&lt;/p&gt;

&lt;p&gt;I also wanted the application to remain useful when AI generation fails. A simple fallback mission is better than leaving the user with nothing because an external service is unavailable.&lt;/p&gt;

&lt;p&gt;For me, open innovation is valuable because it gives developers room to understand, modify, and experiment with the technology they build on. It makes it easier to start small and improve a project without locking every part of it to one provider.&lt;/p&gt;

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

&lt;p&gt;I created a curated agent session for GrassRoute that summarizes the project and its development and deployment approach. The original IDE transcript was unavailable, so this is a curated build summary rather than a complete recording of the original development process.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="GitHub Copilot"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;GrassRoute: Building and Deploying an Open-Source AI Outdoor Companion&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Prepare a curated build summary for GrassRoute. The original IDE development/deployment transcript was unavailable. Base the summary on the project brief and public repository documentation; do not fabricate tool calls or claim unobserved actions.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;CURATED BUILD SUMMARY — ORIGINAL IDE DEVELOPMENT/DEPLOYMENT TRANSCRIPT UNAVAILABLE&lt;/p&gt;

&lt;p&gt;GrassRoute grew from the “Touch Grass” idea: turn a nudge to spend less time on screens into an outdoor companion that helps someone choose a time, discover a nearby place, plan a walk, and take a small mission.&lt;/p&gt;

&lt;p&gt;The project pairs a React, TypeScript, Vite, and React-Leaflet frontend with an Express/TypeScript API. It discovers outdoor places from OpenStreetMap via Overpass and requests pedestrian round-trip routes from Valhalla. The app can use browser geolocation after the user opts in, and the interface offers voice-friendly mission and route briefings.&lt;/p&gt;

&lt;p&gt;For mission generation, the documented local-development setup uses a Python FastAPI service and the open-weight Gemma 3 4B model served by Ollama. If the AI service is unavailable, the backend can provide a deterministic fallback mission. Generated missions and public map/routing data have limitations and should not be treated as verified for feasibility, safety, accessibility, or current conditions.&lt;/p&gt;

&lt;p&gt;The project brief identifies a Render deployment and debugging milestone. However, the original IDE transcript, Render logs, and deployment configuration were not available here, so this summary does not invent specific errors, fixes, commands, or deployment checks. The repository documentation describes local Ollama inference; the hosted demo’s inference provider and runtime path were not independently verified, and this session does not claim that hosted inference runs Ollama locally. GrassRoute is not fully offline: map tiles, place discovery, and route planning depend on internet services.&lt;/p&gt;

&lt;p&gt;This is a curated summary based on the user’s project brief and the public repository README, not a record of observed build/deployment tool calls.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        2 of 2 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;You can also &lt;a href="https://dev.to/agent_sessions/grassroute-building-and-deploying-an-open-source-ai-outdoor-companion-rsrd1s"&gt;view the GrassRoute Agent Session directly&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GrassRoute uses Gemma 3 4B for its outdoor mission-generation feature, with local experimentation through Ollama and a hosted inference setup for deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Render&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I deployed the frontend and backend as separate Render services, making the project available online without having to maintain my own server infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;GrassRoute is still an early-stage project, and there is a lot I would like to improve.&lt;/p&gt;

&lt;p&gt;I want to make place discovery more reliable, improve mission personalization, and test the app during actual walks to see how useful the missions are in practice.&lt;/p&gt;

&lt;p&gt;There are also limitations to account for. OpenStreetMap data may be incomplete, public services can experience downtime, and a mapped location or calculated route does not guarantee that a place is accessible, open, or safe.&lt;/p&gt;

&lt;p&gt;I would like to keep improving the project based on how it performs outside a development environment.&lt;/p&gt;

&lt;p&gt;Building GrassRoute for the Touch Grass theme gave me an opportunity to explore a different use of AI. Instead of using it to generate more content for someone to consume on a screen, I wanted to use it to help someone decide what to do after putting the screen away.&lt;/p&gt;

&lt;p&gt;That is what I hope GrassRoute can do.&lt;/p&gt;

&lt;h1&gt;
  
  
  devchallenge #hf26challenge
&lt;/h1&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%2F21q9ddtmy3eu011m7zls.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%2F21q9ddtmy3eu011m7zls.png" alt=" " width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>HearthLore - Preserving the Recipes, Voices &amp; Stories of Home</title>
      <dc:creator>Avrojit Dutta</dc:creator>
      <pubDate>Sun, 04 Oct 2026 18:57:31 +0000</pubDate>
      <link>https://dev.to/avrojitduttaj/hearthlore-preserving-the-recipes-voices-stories-of-home-2mbl</link>
      <guid>https://dev.to/avrojitduttaj/hearthlore-preserving-the-recipes-voices-stories-of-home-2mbl</guid>
      <description>&lt;h1&gt;
  
  
  HearthLore: Preserving the Recipes, Voices, and Stories of Home
&lt;/h1&gt;

&lt;p&gt;This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.&lt;/p&gt;

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

&lt;p&gt;HearthLore is an AI-powered family recipe and oral history preservation app built for the people in our lives whose best dishes exist only in memory, voice notes, and casual conversations rather than neat cookbooks.&lt;/p&gt;

&lt;p&gt;Think of that one relative who explains a dish with phrases like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Bas thoda sa daalna hai... jab tak khushboo na aaye tab tak pakao."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everyone at the table knows exactly what that tastes like, but nobody actually has the measurements written down. The instructions rely on intuition and aroma, and the stories tied to those meals risk being lost when the person who cooks them is no longer around.&lt;/p&gt;

&lt;p&gt;HearthLore lets you record a family member talking through a recipe naturally in their own language. The application takes that spoken audio and handles the heavy lifting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transcribes the recording using Whisper&lt;/li&gt;
&lt;li&gt;Detects the spoken language automatically&lt;/li&gt;
&lt;li&gt;Interprets the raw transcript using Gemma&lt;/li&gt;
&lt;li&gt;Extracts structured ingredients, measurements, and cooking steps&lt;/li&gt;
&lt;li&gt;Preserves the verbatim original transcript alongside the parsed recipe&lt;/li&gt;
&lt;li&gt;Stores everything in MongoDB Atlas so it stays accessible for the family&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The aim is not simply running speech-to-text. It is about keeping a piece of family heritage intact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo and Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Frontend:&lt;/strong&gt; &lt;a href="https://hearthlore.onrender.com" rel="noopener noreferrer"&gt;https://hearthlore.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/avrojitduttaj/HearthLore" rel="noopener noreferrer"&gt;https://github.com/avrojitduttaj/HearthLore&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend is live on Render. The AI pipeline runs locally for this demo, as Render's free tier has a 512 MB memory threshold that cannot comfortably load the Whisper and PyTorch runtime. The production backend can be hosted on a dedicated instance with sufficient RAM.&lt;/p&gt;

&lt;p&gt;This is a solo project: I handled the design, pipeline architecture, API integration, and deployment.&lt;/p&gt;

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

&lt;p&gt;The data flows through a straightforward pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Voice Input:&lt;/strong&gt; User records or uploads an audio clip of a family member explaining a dish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio Processing:&lt;/strong&gt; Whisper transcribes the speech and identifies the primary language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Extraction:&lt;/strong&gt; Gemma analyzes the transcript via Ollama, separating actual kitchen steps from conversational banter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Persistence:&lt;/strong&gt; The parsed recipe, metadata, and original transcript are saved to MongoDB Atlas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation:&lt;/strong&gt; The React interface displays the clean recipe side-by-side with the original transcript and audio context.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, Vite, JavaScript, CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python, FastAPI, Whisper, Ollama (Gemma)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; MongoDB Atlas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Render&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Instead of routing personal recordings to a closed, third-party recipe generator, HearthLore relies on open-source AI tooling: Whisper for speech recognition and Gemma (via Ollama) for comprehension and extraction.&lt;/p&gt;

&lt;p&gt;Family memories and personal voices are sensitive. Uploading intimate audio to a black-box commercial service felt counter to the spirit of the project. Using open models allowed me to keep data pipelines transparent, run inference locally, and tune prompts specifically around how families actually talk about food:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding multi-lingual code-switching&lt;/li&gt;
&lt;li&gt;Preserving approximate measurements instead of fabricating exact grams&lt;/li&gt;
&lt;li&gt;Converting free-form narratives into step-by-step instructions&lt;/li&gt;
&lt;li&gt;Distinguishing kitchen instructions from personal anecdotes without throwing the stories away&lt;/li&gt;
&lt;li&gt;Acknowledging gaps when a detail was left unspoken, rather than hallucinating ingredients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whisper provides the listening layer, Gemma provides the language understanding, and MongoDB Atlas provides the long-term memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development Workflow
&lt;/h2&gt;

&lt;p&gt;I developed HearthLore iteratively, pairing manual coding with AI-assisted debugging sessions to tune prompt constraints for Gemma, debug memory constraints during local audio transcription, and streamline the FastAPI endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Render (Best Use of Render):&lt;/strong&gt; Deployed the frontend client and structured the repository for modular production hosting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma (Best Use of Gemma):&lt;/strong&gt; Gemma powers the core extraction engine, converting messy spoken transcripts into reliable culinary steps without losing conversational context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas:&lt;/strong&gt; Serves as the primary operational database, keeping structured recipes, raw transcripts, and metadata indexed and queryable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Author
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Builder:&lt;/strong&gt; Avrojit Dutta (Solo submission) DEV: &lt;a class="mentioned-user" href="https://dev.to/avrojitduttaj"&gt;@avrojitduttaj&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of the most valuable culinary knowledge never makes it into print. It lives in someone's cadence, their memories, and their kitchen habits. HearthLore exists so those recipes and the voices behind them remain part of the family table for years to come.&lt;/p&gt;

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