Agentic AI · LLM Applications · Full-Stack AI
IntelliCast AI — Personal news agent
A personal news agent that follows the world for you, checks claims across sources, and briefs you by voice.
Source is private — happy to walk through the architecture.
- Problem
- News products hand people more to read. Following the few stories that matter — and knowing which claims are actually confirmed — still takes time and judgment.
- Approach
- An agent cycle clusters articles into evolving stories, verifies claims across outlets, ranks stories against each listener's goals, and turns the result into a fact-checked, two-host audio briefing you can question.
Key results
- outlets on a 30-minute agent cycle
- 14
- tap to first audio · internal testing
- ~15 s
- offline backend tests in CI
- 180
01
Overview
IntelliCast is an independent AI product I design, build and operate. It reads the news continuously, groups articles into evolving stories, checks claims across outlets, and ranks what matters against each listener's goals. Then it delivers a short two-host audio briefing that can be paused and questioned.
02
What's live — and what isn't yet
Live today
- Account sign-up with personal goals instead of topic categories
- Two-host voice briefings ranked against those goals
- A fact-check pass on every script before it is voiced
- Follow-up questions answered from verified claims, with citations
- English and French voices
Rolling out
- Calendar meeting prep and newsletter digests (Gmail access is limited to test users until Google's verification completes)
- Plan-gated features — daily briefings, spoken answers, “both sides” episodes, a private podcast feed and alerts — arrive with paid plans; billing is not enabled yet
Next
- Separate staging and production environments
- A broader public launch after early access
- Languages beyond English and French
03
Problem & motivation
Most news products compete for more reading time. I wanted the opposite: an agent that decides what deserves attention, says why, and is honest about what is confirmed versus reported by a single outlet. That framing turns a podcast generator into an engineering problem about clustering, verification, ranking, grounding and latency.
04
My role
- Founder and sole engineer — product, architecture, backend, frontend and infrastructure.
- Designed the agent cycle, the trust layer and the streaming audio pipeline.
- Own deployment, CI and production operations on AWS.
05
System architecture
Stage 1:Ingest
14 RSS outlets
Refreshed every 30 min; only unseen links stored
Stage 2:Understand
Local embeddings
bge-small, 384-d, on the server
Story clustering
pgvector similarity; a model settles close calls
Stage 3:Verify
Claim extraction
Per story, across every outlet covering it
Cross-outlet status
Confirmed · single-source · disputed
Stage 4:Personalize
Goal-based ranking
Tier plus one sentence on why it matters
Listener memory
Visible, and every item can be forgotten
Stage 5:Produce
Script generation
Llama 3.3 70B, streamed turn by turn
Sentinel fact-check
Every line checked against claim status
Stage 6:Deliver
Two-host voices
Cartesia Sonic-2, English and French
Grounded Ask
Answers only from the story graph, cited
06
Technical implementation
Stories, not articles
Articles are embedded on the server with a small 384-dimension model and attached to stories by pgvector similarity; a language model only settles the close calls. A story's version moves only on a material change, which is what “since you last listened” counts.
A trust layer that is computed, not asserted
Claims are extracted per story and matched across the outlets covering it. Each claim's status — confirmed by two or more outlets, single-source, or disputed — is derived from the evidence and shown with a word and an icon, never color alone.
Fact-check before voice
Every script passes a Sentinel check before it is voiced: confirmed lines stay, single-source lines are attributed, disputed lines are framed with both sides, and unsupported lines are removed or generalized. The result travels with the episode.
Playing while still recording
The script streams from the model turn by turn, small batches are fact-checked and voiced in parallel, and the player stitches parts onto one timeline. A stream parser releases a line only once it is complete, so a cut-off sentence is never voiced.
Grounded conversation
Ask answers only from the story graph and its claims, labels whether an answer comes from confirmed reporting, cites its sources, and can speak the answer in the host's voice before the episode resumes.
07
Engineering decisions & challenges
One deployable unit
A single Docker image runs nginx, the FastAPI backend and the agent's background loop under supervisord. Deploys stay atomic and rollback is pointing at the previous commit-tagged image.
Embeddings run locally
Clustering needs many embeddings. A small local model costs nothing per call and keeps article text on the server, so the large models are reserved for judgment.
A model per task
A router sends each task to the right model: Llama 3.3 70B for writing (with a fallback model), a separate reasoning model for judgments, and deterministic settings for verification so the same input gets the same verdict.
Degrade visibly
If the fact-check step cannot run, the episode ships with an explicit “not fact-checked” label instead of silently passing as verified.
Private by default
Row-level security on every table, and episode audio in private storage served through short-lived signed links, with a private per-listener feed.
08
Evaluation & results
IntelliCast is in early access, so this section reports engineering measurements rather than adoption numbers.
- tap to first audioStreaming pipeline, internal testing
- ~15 s
- offline backend testsRun in CI before every image build
- 180
- outlets per agent cycleOne cycle every 30 minutes
- 14
- No user counts, revenue or growth figures are shown — the product is in early access and billing is not enabled.
- CI runs type checks, linting and the offline backend suite, then publishes a commit-tagged image. Production deploys are a deliberate, manual Terraform step.
09
Lessons learned
Reserve large models for judgment
Cheap local embeddings do the bulk work of clustering; the LLM only settles close calls. That split keeps cost and latency predictable.
Make uncertainty part of the interface
Computing claim status from evidence — and saying it out loud — matters more to trust than a more fluent script.
Degrade visibly
When a safety step can't run, label the output instead of letting it pass as checked.
10
Technologies used
- Python
- FastAPI
- React
- TypeScript
- PostgreSQL
- pgvector
- Llama 3.3 70B
- Cartesia
- Docker
- AWS EC2
- Terraform
- GitHub Actions
Want the deeper walkthrough?
I'm happy to go through the code, the trade-offs and what I'd do next.