This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend
What I Built
My friend Hammad didn't need more news.
He needed less noise.
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.
That became Dispatch.
Dispatch is a personalized AI news agent that learns what you care about, retrieves current reporting, and builds a concise Brief around your interests.
But while building it, I realized that summarization alone doesn't solve the harder problem.
If I follow a developing story, I don't want to be notified because another article was published. I want to know when the underlying story actually changed.
So Dispatch also lets you follow a story and tell it exactly what you are waiting for.
For example:
Notify me when API access becomes publicly available.
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.
What Dispatch can do
- Understand interests written in natural language
- Turn those interests into structured topics and search terms
- Retrieve live Google News results
- Build a personalized AI-curated Brief
- Explain why each story matters to you
- Let you dictate your interests by voice
- Read your Brief aloud with synchronized text highlighting
- Let you follow developing stories
- Remember what you already know about a story
- Let you define a specific notification condition
- Distinguish repeated reporting from meaningful developments
- Maintain a timeline of genuine developments
- Automatically recheck followed stories every hour
- Send an email when a development is actually worth notifying you about
The goal is simple:
Don't tell me that another headline exists. Tell me when something changed.
Demo
Live app
https://dispatch-55oo.onrender.com
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.
Code
https://github.com/danishirfan21/Dispatch-News-Agent
danishirfan21
/
Dispatch-News-Agent
Personalized AI news agent that builds concise briefs, tracks developing stories, and alerts you only when something meaningfully changes.
Your news, without the noise. A personalized AI news agent that builds concise briefs, follows developing stories, and alerts you only when something meaningfully changes.
Why Dispatch exists
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.
That simple idea exposed a bigger problem: getting more news is easy; knowing what is new, relevant, and worth interrupting you for is hard.
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.
The result is a news workflow built around signal instead of volume.
What it
โฆHow I Built It
Dispatch has a React + TypeScript frontend and a FastAPI backend, with MongoDB Atlas storing user profiles, Briefs, Watches, development history, and the notification outbox.
The core stack is:
- React + TypeScript + Vite + Tailwind CSS for the frontend
- FastAPI + Python for the backend
- MongoDB Atlas for persistent application state
- Backboard for the AI reasoning layer
- MoonshotAI Kimi-family open-weight model, routed through Backboard/OpenRouter
- SerpApi for live Google News retrieval
- ElevenLabs for speech-to-text and narrated Briefs
- Mailjet for email notifications
- Render for the web application and hourly background monitoring
Backboard + open-weight AI
AI is not an optional decoration in Dispatch. It sits in three core parts of the product.
1. Understanding the user
A user can write something messy and human like:
New AI models and developer tools, major cybersecurity news, NVIDIA and semiconductor updates. Skip celebrity news and speculation.
The model converts that into structured interests, search terms, and excluded topics.
2. Building the Brief
SerpApi retrieves current reporting, but raw search results are still just another feed.
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.
Each story also includes a personalized explanation of why it matters to that particular user.
3. Detecting meaningful change
This became the most interesting part of the project.
For every followed story, Dispatch stores a known_state: what the user already knows.
When a Watch is checked:
- Dispatch searches for fresh reporting about that story.
- Previously seen URLs are removed.
- The model receives the current known state, the new evidence, the user's optional notification condition, and recent recorded developments.
- It returns structured fields including:
- whether a material change occurred
- whether the user's condition was satisfied
- a summary of the change
- an updated known state
- supporting article IDs
- The backend verifies that the model actually cited articles from the retrieved evidence.
- A deterministic similarity check prevents a reworded version of a recent development from being recorded again.
- Only then is the development persisted.
I deliberately made this conservative.
A model claiming "something changed" is not enough by itself.
Automatic monitoring
A separate Render Cron service runs every hour.
It does not call the public web application. Instead, it directly invokes the same Python monitoring services used by manual checks.
For every due active Watch it:
- retrieves fresh news
- runs meaningful-change analysis
- records verified developments
- creates notification jobs when appropriate
- processes the email outbox
A failure checking one Watch does not stop the rest of the batch.
Reliable notifications
Notifications use a small transactional outbox in MongoDB.
A notification moves through:
pending โ processing โ sent
or, if delivery keeps failing:
pending โ processing โ retry โ failed
The worker atomically claims each notification before sending it, which prevents two concurrent workers from sending the same email twice.
Retryable failures are attempted up to three times with backoff.
ElevenLabs
I used ElevenLabs in both directions.
Speech-to-text: 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.
Text-to-speech: Dispatch can narrate the current Brief using ElevenLabs' timestamp-enabled TTS API.
The backend maps ElevenLabs' character-level timestamps back to the corresponding headline and summary sentences. The frontend then highlights the sentence currently being spoken.
So the audio player is not simply playing an MP3. The text follows the narration.
Why Does Open Innovation Matter?
Dispatch depends on language-model reasoning for much more than producing text.
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.
Using an open-weight model means that this reasoning layer does not have to be permanently tied to one closed model vendor.
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.
A closed API could perform many of the same individual tasks. What open innovation changes is control and portability.
The intelligence at the center of Dispatch can evolve independently of a single provider.
That matters especially for a product whose long-term value depends on improving how it decides:
Is this actually new, or is the news cycle just repeating itself?
Prize Categories
I'm entering Dispatch in the following categories:
- Best Use of Render
- Best Use of Backboard
- Best Use of ElevenLabs
- Best Use of MongoDB Atlas
- Best Use of SerpApi
Best Use of Render
Render hosts the production FastAPI + React application and runs the independent hourly Cron job responsible for continuous story monitoring and notification delivery.
Best Use of Backboard
Backboard is the central model gateway for Dispatch. It powers natural-language interest parsing, personalized Brief curation, and structured meaningful-change reasoning.
Best Use of ElevenLabs
ElevenLabs powers both voice input through Scribe v2 and narrated Briefs through timestamp-aware text-to-speech, including synchronized sentence highlighting.
Best Use of MongoDB Atlas
MongoDB Atlas stores users, structured interest profiles, saved Briefs, Watches, known story state, development history, scheduling state, and the durable email-notification outbox.
Best Use of SerpApi
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.

Top comments (0)