<?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: Danish Irfan</title>
    <description>The latest articles on DEV Community by Danish Irfan (@danish_irfan).</description>
    <link>https://dev.to/danish_irfan</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%2F3915689%2F37b61933-305e-46b4-a2e4-e889707ce2c6.jpg</url>
      <title>DEV Community: Danish Irfan</title>
      <link>https://dev.to/danish_irfan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danish_irfan"/>
    <language>en</language>
    <item>
      <title>I Built an AI App That Actually Wants You to Put Your Phone Away 🌿</title>
      <dc:creator>Danish Irfan</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:58:21 +0000</pubDate>
      <link>https://dev.to/danish_irfan/i-built-an-ai-app-that-actually-wants-you-to-put-your-phone-away-1c6o</link>
      <guid>https://dev.to/danish_irfan/i-built-an-ai-app-that-actually-wants-you-to-put-your-phone-away-1c6o</guid>
      <description>&lt;h1&gt;
  
  
  I Built an AI App That Actually Wants You to Put Your Phone Away 🌿
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is my submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest 2026 Week 1: Touch Grass Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I spend most of my day in front of a computer.&lt;/p&gt;

&lt;p&gt;I work in software engineering, and since I work remotely, there are days when I barely have a reason to leave the house.&lt;/p&gt;

&lt;p&gt;And I realized something funny while thinking about this challenge.&lt;/p&gt;

&lt;p&gt;We already have apps for almost everything. Apps to make us productive, apps to entertain us, apps to track our habits, and apps to remind us to use other apps.&lt;/p&gt;

&lt;p&gt;But what if I built something that actually encouraged people to &lt;strong&gt;put their phones away?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's how I came up with &lt;strong&gt;Outside Lab&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outside Lab is a small AI-powered outdoor experiment app that helps you discover which outdoor activities work best for you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea is simple.&lt;/p&gt;

&lt;p&gt;Instead of telling everyone to walk 10,000 steps or spend an hour exercising, the app encourages you to try little outdoor experiments and pay attention to how you feel.&lt;/p&gt;

&lt;p&gt;Maybe you spend five minutes sitting in your courtyard.&lt;/p&gt;

&lt;p&gt;Maybe you take a short walk.&lt;/p&gt;

&lt;p&gt;Maybe you spend a few minutes playing with your dog.&lt;/p&gt;

&lt;p&gt;Nothing particularly extraordinary. Just small moments away from your screen.&lt;/p&gt;

&lt;p&gt;And yes, your own courtyard counts. You shouldn't need to organize a hiking expedition just to get some fresh air.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the prototype works
&lt;/h3&gt;

&lt;p&gt;I built the prototype around a simple three-step experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Check in before going outside&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You tell Outside Lab how you're feeling, choose an activity, and decide how many minutes you'd like to spend outdoors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Put your phone away&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start the session, leave your phone alone, and go do whatever you chose.&lt;/p&gt;

&lt;p&gt;The timer keeps track of elapsed time using actual timestamps, so you don't need to keep the app open and stare at a ticking clock.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Come back and reflect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're done, you record how you're feeling afterward and optionally write a short observation.&lt;/p&gt;

&lt;p&gt;The app saves your session to a personal journal, where you can see your outdoor time, activities, and before-and-after mood ratings.&lt;/p&gt;

&lt;p&gt;That's the prototype's core experience.&lt;/p&gt;

&lt;p&gt;But I wanted to take the idea further.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where AI comes in
&lt;/h3&gt;

&lt;p&gt;Imagine using Outside Lab for a couple of weeks.&lt;/p&gt;

&lt;p&gt;You might discover that sitting outside for five minutes doesn't seem to change much for you, but walking around for ten minutes often leaves you feeling more refreshed.&lt;/p&gt;

&lt;p&gt;Or perhaps spending time with your dog feels more enjoyable than walking alone.&lt;/p&gt;

&lt;p&gt;Instead of giving everyone the same advice, I want Outside Lab to learn from these little experiments and suggest what each person should try next.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"You've tried sitting outside a few times. How about a short walk today? Let's see whether changing the activity makes a difference."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the reason I integrated an open-weight Qwen model through Backboard.&lt;/p&gt;

&lt;p&gt;The idea isn't for AI to tell you how happy you should be. It's to help you ask better questions about your own experiences.&lt;/p&gt;

&lt;p&gt;And importantly, a change in mood doesn't prove that an activity caused it. Outside Lab treats these observations as clues worth exploring, not scientific conclusions.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; &lt;a href="https://github.com/danishirfan21/Outside-Lab" rel="noopener noreferrer"&gt;https://github.com/danishirfan21/Outside-Lab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the working session-tracking prototype, including a React frontend and a lightweight browser preview.&lt;/p&gt;

&lt;p&gt;You can try the basic experience without needing an API key. The repository's README explains how to run the full application locally.&lt;/p&gt;

&lt;p&gt;The AI integration is also implemented, although successful live inference is still being verified. During testing, Backboard accepted our requests but reported failed model runs. Rather than pretending those requests succeeded, the app keeps its ordinary starter suggestions separate from AI-generated recommendations.&lt;/p&gt;

&lt;p&gt;This is an early prototype, and I'm sharing it as one.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/danishirfan21/Outside-Lab" rel="noopener noreferrer"&gt;https://github.com/danishirfan21/Outside-Lab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is open source under the MIT License.&lt;/p&gt;

&lt;p&gt;I wanted the code to be approachable enough for someone else to clone it, try it, experiment with another open-weight model, or build something better on top of it.&lt;/p&gt;

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

&lt;p&gt;For the prototype, I kept the architecture fairly simple.&lt;/p&gt;

&lt;p&gt;The frontend is built with &lt;strong&gt;React and TypeScript&lt;/strong&gt;, with &lt;strong&gt;FastAPI&lt;/strong&gt; handling the backend.&lt;/p&gt;

&lt;p&gt;I used browser storage for the personal journal, so you don't need to create an account just to record a few minutes spent outside.&lt;/p&gt;

&lt;p&gt;For AI, I integrated &lt;strong&gt;Backboard&lt;/strong&gt; with an open-weight &lt;strong&gt;Qwen&lt;/strong&gt; model.&lt;/p&gt;

&lt;p&gt;When you request an AI recommendation, the backend is designed to send a small summary of your previous sessions to the model. The model's job is to propose one realistic outdoor experiment based on that history.&lt;/p&gt;

&lt;p&gt;The application itself handles the actual numbers, like elapsed time and the difference between mood ratings. I didn't want an LLM making up statistics that ordinary code could calculate more reliably.&lt;/p&gt;

&lt;p&gt;One surprisingly important detail was the timer.&lt;/p&gt;

&lt;p&gt;If you put your phone away or lock the screen, browser timers aren't always dependable. So I used timestamps to calculate elapsed time and added recovery for interrupted sessions.&lt;/p&gt;

&lt;p&gt;I also wanted the app to remain useful when AI wasn't available. You can still complete an outdoor session, record your mood, and review your journal without making a model request.&lt;/p&gt;

&lt;p&gt;For the current prototype, the React production build passes, along with 8 frontend tests and 12 backend tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'd like to build next
&lt;/h3&gt;

&lt;p&gt;This is the part that excites me most.&lt;/p&gt;

&lt;p&gt;Right now, Outside Lab is a prototype for recording simple outdoor experiments.&lt;/p&gt;

&lt;p&gt;Eventually, I'd like it to become a &lt;strong&gt;personal AI outdoor companion that gets to know what works for you over time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here are some directions I'd love to explore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personalized experiments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather than suggesting random activities, the AI could look at your previous experiences and design small comparisons.&lt;/p&gt;

&lt;p&gt;Maybe you try walking instead of sitting. Or spending ten minutes outside instead of five.&lt;/p&gt;

&lt;p&gt;Over time, it could help you discover which activities you actually enjoy repeating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning from longer-term patterns&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A single session doesn't tell us much.&lt;/p&gt;

&lt;p&gt;But what happens after 20 or 30 sessions?&lt;/p&gt;

&lt;p&gt;I'd like Outside Lab to help people explore patterns across activities, durations, and different times of day, without pretending correlation is causation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Making outdoor time easier to remember&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For people who work remotely, it's surprisingly easy to spend an entire day indoors without noticing.&lt;/p&gt;

&lt;p&gt;In the future, I'd like to explore gentle reminders and optional outdoor-time detection, perhaps through phone or wearable sensors.&lt;/p&gt;

&lt;p&gt;But I'd want these features to respect privacy and avoid constantly tracking someone's location.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More real-world context&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eventually, the app could consider things like weather, available outdoor space, and personal preferences.&lt;/p&gt;

&lt;p&gt;Someone with a courtyard should receive different suggestions from someone who prefers visiting a park.&lt;/p&gt;

&lt;p&gt;Someone who only has five minutes should still be able to participate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less screen time, not more engagement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the principle I want to preserve as Outside Lab evolves.&lt;/p&gt;

&lt;p&gt;I don't want to turn it into another app that pressures people to maintain streaks, collect badges, or keep checking notifications.&lt;/p&gt;

&lt;p&gt;The best part should always happen outside the app.&lt;/p&gt;

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

&lt;p&gt;I think open innovation matters because ideas become much more interesting when other people can explore them, question them, and improve them.&lt;/p&gt;

&lt;p&gt;Outside Lab is a small experiment, and I'm not pretending I've figured out the perfect way to encourage outdoor activity.&lt;/p&gt;

&lt;p&gt;Maybe someone has a better idea for personalizing experiments.&lt;/p&gt;

&lt;p&gt;Maybe someone wants to connect an open-weight model running locally.&lt;/p&gt;

&lt;p&gt;Maybe someone can make the experience more accessible, improve the privacy approach, or help people who have limited access to outdoor spaces.&lt;/p&gt;

&lt;p&gt;That's what I like about building this in the open.&lt;/p&gt;

&lt;p&gt;Using an open-weight Qwen model also means the AI side doesn't have to remain dependent on one proprietary model forever. There are opportunities to experiment with different models, hosting arrangements, and recommendation approaches.&lt;/p&gt;

&lt;p&gt;The prototype currently uses hosted inference through Backboard, but the underlying model and application logic are not meant to be locked to that setup permanently.&lt;/p&gt;

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

&lt;p&gt;I used Codex during development to help implement the prototype, review the code, fix bugs, and strengthen the tests.&lt;/p&gt;

&lt;p&gt;One useful lesson was that getting automated tests to pass isn't the same thing as proving an external AI service works.&lt;/p&gt;

&lt;p&gt;We got the application and its integration tests working, then discovered that our live Backboard requests were failing during model execution.&lt;/p&gt;

&lt;p&gt;So we added better diagnostics and documented the problem instead of hiding it.&lt;/p&gt;

&lt;p&gt;AI coding tools made it possible to build and iterate on the prototype quickly, but testing and verification still matter.&lt;/p&gt;

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

&lt;p&gt;I'm submitting Outside Lab for the &lt;strong&gt;Overall Touch Grass&lt;/strong&gt; category.&lt;/p&gt;

&lt;p&gt;The project also explores &lt;strong&gt;Backboard&lt;/strong&gt; integration with an open-weight model, although that part is still undergoing live verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  One last thought
&lt;/h2&gt;

&lt;p&gt;I originally approached this challenge wondering what kind of AI application I could build that would genuinely involve the physical world.&lt;/p&gt;

&lt;p&gt;I kept coming back to the same thought.&lt;/p&gt;

&lt;p&gt;Maybe we don't need another complicated reason to go outside.&lt;/p&gt;

&lt;p&gt;Maybe we just need a little encouragement to do it, and a way to discover which experiences make us want to do it again.&lt;/p&gt;

&lt;p&gt;That's what I hope Outside Lab can eventually become.&lt;/p&gt;

&lt;p&gt;An app that helps you understand your relationship with the world outside your screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because sometimes the best thing technology can do for us is remind us to stop using it.&lt;/strong&gt; 🌿&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Dispatch: I Built My Friend an AI News Agent That Knows When News Actually Changes</title>
      <dc:creator>Danish Irfan</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:16:49 +0000</pubDate>
      <link>https://dev.to/danish_irfan/dispatch-i-built-my-friend-an-ai-news-agent-that-knows-when-news-actually-changes-2okh</link>
      <guid>https://dev.to/danish_irfan/dispatch-i-built-my-friend-an-ai-news-agent-that-knows-when-news-actually-changes-2okh</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;My friend Hammad didn't need more news.&lt;/p&gt;

&lt;p&gt;He needed less noise.&lt;/p&gt;

&lt;p&gt;The idea started with a simple request: an AI news scanner that could understand what a user cares about and produce a brief summary so they could catch up quickly, with Pakistani news being one of the original use cases.&lt;/p&gt;

&lt;p&gt;That became &lt;strong&gt;Dispatch&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dispatch is a personalized AI news agent that learns what you care about, retrieves current reporting, and builds a concise Brief around your interests.&lt;/p&gt;

&lt;p&gt;But while building it, I realized that summarization alone doesn't solve the harder problem.&lt;/p&gt;

&lt;p&gt;If I follow a developing story, I don't want to be notified because another article was published. I want to know when the &lt;strong&gt;underlying story actually changed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So Dispatch also lets you follow a story and tell it exactly what you are waiting for.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Notify me when API access becomes publicly available.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dispatch then keeps track of what you already know, checks new reporting in the background, filters repeated coverage, and records a development only when there is evidence of a meaningful change.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Dispatch can do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Understand interests written in natural language&lt;/li&gt;
&lt;li&gt;Turn those interests into structured topics and search terms&lt;/li&gt;
&lt;li&gt;Retrieve live Google News results&lt;/li&gt;
&lt;li&gt;Build a personalized AI-curated Brief&lt;/li&gt;
&lt;li&gt;Explain &lt;strong&gt;why each story matters to you&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Let you dictate your interests by voice&lt;/li&gt;
&lt;li&gt;Read your Brief aloud with synchronized text highlighting&lt;/li&gt;
&lt;li&gt;Let you follow developing stories&lt;/li&gt;
&lt;li&gt;Remember what you already know about a story&lt;/li&gt;
&lt;li&gt;Let you define a specific notification condition&lt;/li&gt;
&lt;li&gt;Distinguish repeated reporting from meaningful developments&lt;/li&gt;
&lt;li&gt;Maintain a timeline of genuine developments&lt;/li&gt;
&lt;li&gt;Automatically recheck followed stories every hour&lt;/li&gt;
&lt;li&gt;Send an email when a development is actually worth notifying you about&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Don't tell me that another headline exists. Tell me when something changed.&lt;/strong&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Live app
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dispatch-55oo.onrender.com" rel="noopener noreferrer"&gt;https://dispatch-55oo.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is deployed as a single-origin application on Render: FastAPI serves the API and the built React frontend, while a separate Render Cron job runs the background monitoring cycle.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/danishirfan21/Dispatch-News-Agent" rel="noopener noreferrer"&gt;https://github.com/danishirfan21/Dispatch-News-Agent&lt;/a&gt;&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/danishirfan21" rel="noopener noreferrer"&gt;
        danishirfan21
      &lt;/a&gt; / &lt;a href="https://github.com/danishirfan21/Dispatch-News-Agent" rel="noopener noreferrer"&gt;
        Dispatch-News-Agent
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Personalized AI news agent that builds concise briefs, tracks developing stories, and alerts you only when something meaningfully changes.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/danishirfan21/Dispatch-News-Agent/./public/brand/dispatch-lockup-primary.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fdanishirfan21%2FDispatch-News-Agent%2FHEAD%2F.%2Fpublic%2Fbrand%2Fdispatch-lockup-primary.png" alt="Dispatch"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your news, without the noise.&lt;/strong&gt;
A personalized AI news agent that builds concise briefs, follows developing stories, and alerts you only when something meaningfully changes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dispatch-55oo.onrender.com/" rel="nofollow noopener noreferrer"&gt;Live app&lt;/a&gt; · &lt;a href="https://github.com/danishirfan21/Dispatch-News-Agent" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Dispatch exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Dispatch started with a request from my friend Hammad: he wanted an AI news scanner that could understand a user's interests and turn the day's reporting into a short brief that was actually worth catching up on.&lt;/p&gt;
&lt;p&gt;That simple idea exposed a bigger problem: &lt;strong&gt;getting more news is easy; knowing what is new, relevant, and worth interrupting you for is hard.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dispatch therefore does more than summarize headlines. It learns what you care about, creates a personalized Brief, remembers the state of stories you follow, checks fresh coverage over time, and distinguishes a genuine development from another article repeating the same facts.&lt;/p&gt;
&lt;p&gt;The result is a news workflow built around &lt;strong&gt;signal instead of volume&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it&lt;/h2&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/danishirfan21/Dispatch-News-Agent" 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;Dispatch has a React + TypeScript frontend and a FastAPI backend, with MongoDB Atlas storing user profiles, Briefs, Watches, development history, and the notification outbox.&lt;/p&gt;

&lt;p&gt;The core stack is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React + TypeScript + Vite + Tailwind CSS&lt;/strong&gt; for the frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI + Python&lt;/strong&gt; for the backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas&lt;/strong&gt; for persistent application state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backboard&lt;/strong&gt; for the AI reasoning layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MoonshotAI Kimi-family open-weight model&lt;/strong&gt;, routed through Backboard/OpenRouter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SerpApi&lt;/strong&gt; for live Google News retrieval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs&lt;/strong&gt; for speech-to-text and narrated Briefs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mailjet&lt;/strong&gt; for email notifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; for the web application and hourly background monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backboard + open-weight AI
&lt;/h3&gt;

&lt;p&gt;AI is not an optional decoration in Dispatch. It sits in three core parts of the product.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Understanding the user
&lt;/h4&gt;

&lt;p&gt;A user can write something messy and human like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;New AI models and developer tools, major cybersecurity news, NVIDIA and semiconductor updates. Skip celebrity news and speculation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model converts that into structured interests, search terms, and excluded topics.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Building the Brief
&lt;/h4&gt;

&lt;p&gt;SerpApi retrieves current reporting, but raw search results are still just another feed.&lt;/p&gt;

&lt;p&gt;The model evaluates those articles against the user's interests, rejects weak matches, merges articles covering the same event, prioritizes substantive developments, and selects up to five stories for the Brief.&lt;/p&gt;

&lt;p&gt;Each story also includes a personalized explanation of why it matters to that particular user.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Detecting meaningful change
&lt;/h4&gt;

&lt;p&gt;This became the most interesting part of the project.&lt;/p&gt;

&lt;p&gt;For every followed story, Dispatch stores a &lt;code&gt;known_state&lt;/code&gt;: what the user already knows.&lt;/p&gt;

&lt;p&gt;When a Watch is checked:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dispatch searches for fresh reporting about that story.&lt;/li&gt;
&lt;li&gt;Previously seen URLs are removed.&lt;/li&gt;
&lt;li&gt;The model receives the current known state, the new evidence, the user's optional notification condition, and recent recorded developments.&lt;/li&gt;
&lt;li&gt;It returns structured fields including:

&lt;ul&gt;
&lt;li&gt;whether a material change occurred&lt;/li&gt;
&lt;li&gt;whether the user's condition was satisfied&lt;/li&gt;
&lt;li&gt;a summary of the change&lt;/li&gt;
&lt;li&gt;an updated known state&lt;/li&gt;
&lt;li&gt;supporting article IDs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The backend verifies that the model actually cited articles from the retrieved evidence.&lt;/li&gt;
&lt;li&gt;A deterministic similarity check prevents a reworded version of a recent development from being recorded again.&lt;/li&gt;
&lt;li&gt;Only then is the development persisted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I deliberately made this conservative.&lt;/p&gt;

&lt;p&gt;A model claiming "something changed" is not enough by itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatic monitoring
&lt;/h3&gt;

&lt;p&gt;A separate Render Cron service runs every hour.&lt;/p&gt;

&lt;p&gt;It does not call the public web application. Instead, it directly invokes the same Python monitoring services used by manual checks.&lt;/p&gt;

&lt;p&gt;For every due active Watch it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;retrieves fresh news&lt;/li&gt;
&lt;li&gt;runs meaningful-change analysis&lt;/li&gt;
&lt;li&gt;records verified developments&lt;/li&gt;
&lt;li&gt;creates notification jobs when appropriate&lt;/li&gt;
&lt;li&gt;processes the email outbox&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A failure checking one Watch does not stop the rest of the batch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reliable notifications
&lt;/h3&gt;

&lt;p&gt;Notifications use a small transactional outbox in MongoDB.&lt;/p&gt;

&lt;p&gt;A notification moves through:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pending → processing → sent&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or, if delivery keeps failing:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pending → processing → retry → failed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The worker atomically claims each notification before sending it, which prevents two concurrent workers from sending the same email twice.&lt;/p&gt;

&lt;p&gt;Retryable failures are attempted up to three times with backoff.&lt;/p&gt;

&lt;h3&gt;
  
  
  ElevenLabs
&lt;/h3&gt;

&lt;p&gt;I used ElevenLabs in both directions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speech-to-text:&lt;/strong&gt; the Setup screen can record the user's voice using the browser MediaRecorder API. The audio is sent to ElevenLabs Scribe v2 and the resulting transcript is placed back into the editable interests field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text-to-speech:&lt;/strong&gt; Dispatch can narrate the current Brief using ElevenLabs' timestamp-enabled TTS API.&lt;/p&gt;

&lt;p&gt;The backend maps ElevenLabs' character-level timestamps back to the corresponding headline and summary sentences. The frontend then highlights the sentence currently being spoken.&lt;/p&gt;

&lt;p&gt;So the audio player is not simply playing an MP3. The text follows the narration.&lt;/p&gt;

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

&lt;p&gt;Dispatch depends on language-model reasoning for much more than producing text.&lt;/p&gt;

&lt;p&gt;The model has to turn unstructured human preferences into structure, reason about relevance across multiple articles, compare new evidence with an existing known state, and decide whether something represents a genuinely new development.&lt;/p&gt;

&lt;p&gt;Using an open-weight model means that this reasoning layer does not have to be permanently tied to one closed model vendor.&lt;/p&gt;

&lt;p&gt;The application is built around structured prompts and validated JSON outputs rather than proprietary model-specific behavior. That gives me room to change hosts, experiment with different open models, self-host where practical, and keep improving the reasoning layer without redesigning the rest of the product.&lt;/p&gt;

&lt;p&gt;A closed API could perform many of the same individual tasks. What open innovation changes is &lt;strong&gt;control and portability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The intelligence at the center of Dispatch can evolve independently of a single provider.&lt;/p&gt;

&lt;p&gt;That matters especially for a product whose long-term value depends on improving how it decides:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this actually new, or is the news cycle just repeating itself?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;I'm entering Dispatch in the following categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Best Use of Render&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best Use of Backboard&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best Use of MongoDB Atlas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best Use of SerpApi&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Use of Render
&lt;/h3&gt;

&lt;p&gt;Render hosts the production FastAPI + React application and runs the independent hourly Cron job responsible for continuous story monitoring and notification delivery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Backboard
&lt;/h3&gt;

&lt;p&gt;Backboard is the central model gateway for Dispatch. It powers natural-language interest parsing, personalized Brief curation, and structured meaningful-change reasoning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs powers both voice input through Scribe v2 and narrated Briefs through timestamp-aware text-to-speech, including synchronized sentence highlighting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of MongoDB Atlas
&lt;/h3&gt;

&lt;p&gt;MongoDB Atlas stores users, structured interest profiles, saved Briefs, Watches, known story state, development history, scheduling state, and the durable email-notification outbox.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of SerpApi
&lt;/h3&gt;

&lt;p&gt;SerpApi provides the live news retrieval layer. Dispatch uses Google News search both for initial Brief generation and for focused rechecks of stories being actively watched.&lt;/p&gt;

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