Summary
AI reads the news overnight. You get one role-specific brief at 7 AM.
Context
Started at Prodhacks, a week-long CMU hackathon. Rebuilt on AWS and shipping daily since.
The Problem
Feeds optimize for clicks, not clarity.
6
sources checked weekly
2+ hrs
daily on social feeds
US adults · industry research
What I Built
The full system: Product, pipeline, brand.
Nightly pipeline: 496 active feeds, 29 topics Role-specific "For You" insights per reader Four depths: Quick Scan, Tactical Overview, Strategic Briefing, Deep Reading Timezone-aware 7 AM delivery
Product Approach
→Pull, not push.
→Clarity over clicks. Signal over volume.
→One brief replaces 5 to 6 newsletters.
Outcomes
680
briefs shipped
23
active readers
0
unsubscribes
$0
marketing spend
Bulletyn · rebuilt system · 2026-07-28 to 2026-09-02
Live at readbulletyn.com.
"Nobody complained. That was the problem."
Two months of beta silence read as success. I went looking for the feedback nobody was sending, then cut the feature I was proudest of.
37%
of personalization notes now stay silent, on purpose
3
readers interviewed, picked by engagement rank
5
nights of degraded briefs a green health check missed
13
plays for the audio feature. Not traction.
Research & Validation
The gap in the market
The pain isn't reading. The pain is filtering.
Every interview landed in the same place: People need signal, not more content.
→Users want their news, not the news.
User Journey
The broken loop before Bulletyn
Intent
Wants to stay informed.
Hunt
Jumps across apps and aggregators.
Fatigue
Filters noise by hand. Gives up.
Hunt, filter, repeat, every day.
→One structured delivery, every morning.
The silence was the signal
Closed beta, 53 users, March to June 2026
Two months in, nobody had written to me with a problem. I read that as good news.
Watched, did not ask.
Session recordings. The first viewer scrolled straight past the feature I was proudest of, then quit onboarding.
Nothing was broken, so he had nothing to email me about
Ranked, did not guess.
Sorted readers by opens against briefs sent, set a floor of 50 received, interviewed the top three.
Availability is not a sampling method
Asked five ways.
Only then did one reader admit the personalization line felt forced.
Small annoyances never become complaints. They become churn.
My system tried to find a connection to every story, because I built it to always find one. And it always did.
What I changed, and why
Four decisions from the beta. The first one removed the feature I had been proudest of.
The personalization note learned to stay quiet.
The feature that made the product worth building was the one quietly driving people away. The fix was to make it speak less, and to track the silence rate so it cannot drift either way.
539 of 1,474 notes · 14 days
Zero publisher sentences.
Every description is written from scratch. A legal exposure most newsletters ignore, enforced by the pipeline rather than by good intentions.
→Shares a seven word run with the source, rejected
→Contains a name or number not in the original, rejected
The second rule is what stops it inventing facts while dodging plagiarism
One story, not three versions of it.
Group stories by meaning, using embeddings
→Group by the rare entities they share
Embeddings measure wording, and newsrooms covering one event choose different words on purpose. What survives paraphrase is the cast: The same people, places, and numbers.
No quality change ships on instinct.
Every change to story scoring replays against real archived news and is compared to current behavior before it goes live.
System Architecture
Three stages, each an internal gate
1. Ingest & Cache
Nightly cron scans 496 active feeds. Quality filters keep only high-signal articles.
2. Enrich & Personalize
Role-specific "For You" insights per subscriber. Pre-rendered, zero AI calls at send time.
3. Deliver at 7 AM
Checks every 30 minutes for local 7 AM. Pre-built briefs ship via email.
The rebuild
Started on Supabase with a Lovable-generated front end. That got it working. It was not going to survive a real product.
Every brief is pre-rendered overnight. Zero AI calls at send time, which is why it lands at 7 AM local instead of whenever a model finishes thinking.
Building a system that cannot hide
The beta taught me that silence hides problems. So I built the product to be incapable of it.
A degraded brief still sends.
5 nights unnoticedHealth check asks: Did the email go out?
→Alarm on the degradation rate itself
A failed AI call left nothing behind.
The table looked cleanNo row, no error, just an absence
→Failures written as records, so a gap is queryable
A broken grouper looks like a quiet news day.
Both give one story per eventTrust the story count
→Measure substance extracted per headline, which the news cannot move
→The same lesson as the beta, one level down. Absence of a complaint is not evidence of health.
What has not worked yet
I shipped spoken briefs and I am not going to call that traction. It sits behind a click into a dashboard instead of arriving where people already listen, so the next test is a podcast feed, not more audio.
A distribution problem, not an audio problem
Market Context
Adjacent innovation in a proven market
NYT and Substack proved people pay for curation. Bulletyn makes existing subscriptions worth having.
Type of Innovation
Adjacent innovation
Trusted journalism stays. AI solves integration, not content.
vs. the Competition
Morning Brew
General businessSame content for everyone.
TLDR
Tech-focusedWhat happened, not why it matters to you.
Google News / Social Feeds
Algorithm-drivenMore articles, not better ones. Engagement-optimized.
Bulletyn
Role-specificPer-reader, per-topic AI insight, at multiple depths, every morning.
Go-to-Market
Concentric circles, starting where feedback density is highest.
Community First
Build with users who synthesize information daily.
Peer-Driven Growth
Colleague recommendations beat paid channels.
Enterprise Layer
Per-seat B2B turns a personal brief into a team productivity tool.
Business Model
Capital-efficient with SaaS-grade margins
Free Tier
Core brief, limited topics.
Premium
Full customization, deeper analysis, every reading format.
Enterprise
Briefs scoped to company and team context.
Pre-rendering separates AI compute from delivery. Margins improve with scale.
Nobody complained. That was the problem.
No signal is a signal. The absence of complaints is not evidence that something is working, and I had to build a way to hear what nobody was saying.