Home / DailyAI
Product deep dive · AI news

DailyAI: summarise once,
serve everyone.

AI news moves fast and is full of repeated headlines. DailyAI gathers the day's stories, drops the duplicates, and uses an LLM to pick what matters and explain why it matters. It scores each source's trustworthiness and groups related stories into threads, all ahead of time, so readers get instant pages that cost nothing in model calls.

9nodes in the LangGraph news pipeline
0LLM calls when a reader opens the feed
3summary modes: rss, openai, full
11AI topics, from LLMs and funding to safety
The problem

Too many headlines, too little signal, and an LLM bill that grows with every reader.

A single model launch can generate forty near-identical headlines. Readers want a short, trustworthy digest with the "so what?" spelled out.

The obvious build, calling an LLM whenever someone opens the page, gets expensive quickly and makes every page load slow. DailyAI moves all of the intelligence into a scheduled batch job, and the reader-facing app only reads from a database.

Topics tracked
LLMsBig TechStartupsResearchFundingRegulationOpen SourceAI SafetyRoboticsHealthcareAutonomous
Regions & languages
GlobalUSUKGermanyIndiaUI: English · Deutsch
What a reader sees

News cards with a 60–80-word summary, a one-line why it matters, a topic, a sentiment tag (bullish, bearish or neutral), a source trust tier and a story-thread label. Tapping a card opens a longer brief, which is generated once and then cached.


01 — Architecture

A batch job on one side, a fast reader on the other

The diagram splits into two halves. The top half runs on a schedule: news sources feed into a LangGraph pipeline that writes finished cards to storage. The bottom half runs when a reader visits: FastAPI reads those cards and serves them to the web app, email and push. No arrow connects a reader's request to the LLM.

← swipe to see the whole diagram →

DailyAI architecture: a scheduler triggers a nine-node LangGraph pipeline that reads news sources, calls an LLM provider chain during curation, and writes to storage; FastAPI reads storage to serve the reader app, email edition and push notifications. Google News RSS per country + language Serper News optional discovery APScheduler every 30 min · edition 08:00 UTC trigger LangGraph pipeline · runs on refresh, never on page view collect dedupe scrape curate ✦ trust sentiment thread personalize format LLM provider chain OpenAI → Gemini → Groq → … save cards SQLite / Supabase cards · briefs · profiles serving path · reads only FastAPI /api/articles /api/v1/feed · /trending Reader React PWA EN · DE Morning Edition Mailgun email web push (VAPID) Arize Phoenix LLM runs + output_quality (optional)

✦ marks the only node that calls a model in the default openai mode. Everything below the dotted line is database reads only.


02 — Data flow

Follow one refresh cycle, node by node

Each LangGraph node reads one key from the shared state and writes the next one (raw_articles → deduplicated → curated → trust_scored → …). Use the summary mode toggle to see how the same graph behaves at different budgets.


03 — Why it's cheap

Model calls per day, per-view vs summarise-once

Move the sliders. A per-view design pays for a model call on every page open. DailyAI pays once per feed per refresh, however many people read it.

Per-view LLMsummarise on every page open
DailyAI · openaicurate once per feed per refresh
DailyAI · rssfeed summaries + rule-based tags

Simplified model: one curation run per feed per refresh. In practice curation runs in bounded parallel chunks (CURATOR_CHUNK_SIZE), so the real number is a small multiple of this, and it still doesn't grow with readers.


04 — Beyond the feed

Built as a product, not a demo

services/edition.py

Morning Edition

A shared daily magazine issue built at 08:00 UTC with a transparent list of sources. It is emailed through Mailgun and can be previewed at /edition/YYYY-MM-DD.

services/profiles.py

Accounts without sign-up

Anonymous profiles identified by a sync code. Preferences, saved stories and reading signals move between devices without an email address or password.

pages/Quiz · Leaderboard

Learning loop

Streaks, a quiz, a knowledge page and a leaderboard turn passive scrolling into a habit of actually understanding the AI news.

/api/v1/*

Public developer API

Read-only endpoints for the feed, categories and trending story threads, documented at /api-docs, so other apps can build on the curated data.

observability.py

Quality guardrail

Every LLM run gets a deterministic output_quality score (non-empty, sensible length, complete sentences, no prompt leakage) without an extra model call.

templates/ · i18n

Ready for Germany

Impressum, Datenschutz and terms pages, plus English and German UI strings served from the backend. It is also an installable PWA with a service worker and push notifications.


05 — Learn the concepts

Glossary for the curious

RSS graph/nodes/collector.py
Really Simple Syndication is an XML format that news sites publish so machines can read their latest headlines. DailyAI builds Google News RSS search URLs per region and language, then strips the HTML out of each item. It is free, fast and needs no API key, which makes it a good base layer for a budget product.
LangGraph StateGraph graph/pipeline.py
A LangGraph pipeline is a set of nodes (async functions) joined by edges, all sharing a typed state dictionary. Each node here reads one key and writes the next, and records its own timing in node_timings. That lets you swap, reorder or test nodes on their own and see exactly where time goes.
Near-duplicate detection graph/nodes/deduplicator.py
"OpenAI launches X - Reuters" and "OpenAI Launches X | TechCrunch" are the same story. Before comparing, titles are lower-cased, stripped of publisher suffixes and punctuation, and whitespace is collapsed. It is cheap string normalisation, but it removes most repeats before any expensive step runs.
Provider fallback chain llm/provider.py
Rather than relying on a single LLM vendor, DailyAI builds an ordered list of providers (OpenAI, then Gemini, Groq, NVIDIA, Hugging Face, ArliAI and Ollama) and moves to the next one when a call fails or is rate-limited. If every provider fails, it uses deterministic RSS summaries, so the feed always has content.
Source trust tiers graph/nodes/trust.py
A curated registry puts outlets into high (Reuters, AP, FT, Bloomberg…), medium or low tiers, worth 2, 1 or 0 points. The score is shown on the card and feeds into ranking. It is a transparent rule a reader can understand, not a black-box score.
Ranking formula graph/nodes/personalizer.py
By default each story is scored as importance × 10 + trust × 3 + recency, where recency is +2 if the story is under 8 h old and +1 if under 24 h. When a profile has reading signals, preferred topics and categories raise that reader's score for matching stories.
Story threading graph/nodes/threader.py
During curation the LLM gives each story a short thread label (for example "EU AI Act rollout"). The threader counts how many stories share each label, which powers the "trending" view and shows readers when a single card is part of a larger developing story.