How I Built A Daily Topic Digest That Tells Me What To Post
Published
I used to spend the first part of my day deciding what to write about. I'd open Reddit and Hacker News, scroll through threads, open the ones that looked promising, and try to work out in my head which of them were worth a post. Most of that time went into the deciding, not the reading.
Why The Decision Was The Part To Automate
So I built something to do the deciding for me. It runs every morning now, and it has been running since late June. This is how it works, and where it still falls short.
The reading itself isn't the hard part. Any thread can be read in a minute. What takes time is the judgment afterwards: is there a real problem here, do people actually disagree about the answer, and can I say something useful about it from real experience.
A pipeline can't make that call for me. It can narrow the list down to the threads where the call is worth making, and that narrowing is the whole point. I'd rather spend my attention on five good threads than on fifty mediocre ones.
Three Stages: Scan, Score, Deliver
The system has three parts. A scanner pulls recent discussions from Reddit and Hacker News. A scoring step ranks each one against what I sell. A delivery step sends one email in the morning with the decisions in it.
The scanner keeps almost everything it finds, and the scoring is what throws most of it away. Each run has seen between 157 and 226 items, and most of them never get a second look from me, which is exactly how it should be.
The Scoring Model I Care About Most
The heat score measures how much attention a thread is getting. I built a second score on purpose, because attention and disagreement aren't the same thing.
The argument score is the part I trust most. A thread with a lot of comments relative to its upvotes, and wording like "wrong," "broken," "debate," or "manual," usually means people are actually arguing. That's where a useful post tends to come from. Here's the function:
def item_argument_score(item):
ratio = item.comments / max(item.score, 1)
ratio_score = min(ratio / 1.5, 1.0) * 2.5
conflict_bonus = 1.5 if any(word in f"{item.title} {item.body}".lower()
for word in CONFLICT_WORDS) else 0.0
comments_score = min(math.log1p(item.comments) / math.log1p(200), 1.0) * 1.5
return min(ratio_score + conflict_bonus + comments_score, 5.0)
Each topic bucket also gets scored on five criteria: how relevant it is to what I sell, how intense the argument is, how much commercial weight it carries, how much first-hand authority I have on it, and how fresh it is. The total maps to one of three decisions:
def classify_topic(total_score: int) -> str:
if total_score >= 18:
return "POST"
if total_score >= 13:
return "COMMENT_ONLY"
return "IGNORE"
A POST is worth a standalone LinkedIn post. COMMENT_ONLY is better as a direct answer in a Reddit thread, since the value is one fix or recommendation rather than a full argument. Everything else is IGNORE, and that's most of what comes in.
Where The Draft Comes From
The morning email includes a draft for the top-scoring topic. A drafting step writes it using the topic, the evidence, and a voice file I maintain.
The scanner never writes the final wording, and I don't want it to. The scoring decides what's hot and what fits. The draft is a starting point I edit before anything goes out, because the words have to sound like me, and only I can decide that.
What It Has Actually Surfaced
Across roughly 96 daily runs, the scanner has produced about 237 POST decisions and 157 COMMENT_ONLY decisions. Those numbers look large, but POST means "a candidate worth considering," not "a post I'll publish." Each one still gets my own read before I write anything.
The digests also feed a Reddit comment alert, which runs every 15 minutes and has sent around 213 alerts. Those are the threads where a direct answer does more good than a standalone post.
What It Still Gets Wrong
Reddit's RSS feed is rate limited and doesn't include reliable vote or comment counts, so the scoring works with incomplete information and the heat numbers are rougher than they look. The POST list also includes threads that are interesting but off-brand, which is why I still read every candidate myself.
I've come to think that's the right division of labor. The system narrows the list, and I make the call on what's worth writing and how to say it.
Want a pipeline like this for your own content or research?
I build scanners, scoring models, and scheduled delivery around the decisions a team actually makes, not just the feeds it reads.