writing

the ai brief i actually wanted to read

i got tired of ai newsletters that all repeat each other and inflate every launch, so i built one that only tells me what changed, remembers what it already told me, and knows when it's citing a biased source.

i read a lot of ai newsletters. tldr ai, the rundown, ben's bites, the usual pile. after a while i noticed i was skimming the same three stories phrased three different ways, with a "game-changing" or "massive" bolted onto whichever one needed the most help. so i built my own — an obsidian vault that two scheduled agents write to every twelve hours, plus a small desktop app to read it in — and then spent way too long arguing with myself about what it should actually say.

the repo is at github.com/krish-shahh/ai-intel if you want to see where this landed.

Open sourceGitHub repositorykrish-shahh/ai-intelA self-writing AI intel wiki: two cloud routines research and write a dated brief every 12 hours, read through an Electron desktop app.github.comOpen repository

what it actually is

two cloud routines — morning and evening — wake up, read a folder of tracked people and topics, go sweep x, reddit, hacker news, polymarket, and github trending for anything from the last ten hours, and write a dated markdown brief. everything is wikilinked, so a brief mentioning [[karpathy]] or a topic like model releases links straight to that person's or topic's own page, which the routine also keeps updated. the desktop app reads the same folder and gives it a dashboard, a file browser, and a force-directed graph of how everyone and everything connects.

the whole point was to get the parts of a good newsletter — density, a five-minute read, real sourcing — without the parts that make them forgettable: no sponsor block, no seven paragraphs to say "gpt-5.6 shipped," no pretending every week is the biggest week yet.

the graph that wouldn't sit still

first real bug: the graph looked like it was having a seizure. nodes never stopped drifting, and it got worse the more briefs piled up. turned out the physics simulation had no cooldown — it kept recomputing full-strength repulsion between every pair of nodes, forever, so it never settled into a resting layout. i clamped the repulsion so near-overlapping nodes couldn't fling each other across the canvas, added an alpha decay so the simulation cools down and freezes once it's stable, and ran a batch of ticks silently before the first frame ever draws, so you open the tab to something already calm instead of watching it thrash into place.

that fixed the jitter, but not the real problem underneath it: at two briefs a day, the graph was going to be mostly brief nodes forever, drowning out the people and topics that actually make it interesting. so briefs now cluster into weeks, weeks cluster into months, and you expand one at a time — an accordion, not a firehose.

rewriting the brief itself

the content redesign mattered more than any of the graph work. the old format was a flat "tl;dr plus bullet points," which is exactly what every other ai newsletter already does. i replaced it with:

  • the signal — at most three items, only the ones that would actually change your mental model of the industry, each with a confidence level (confirmed / reported / unconfirmed) and sources labeled by tier (primary, independent, community, rumor)
  • since last brief — deltas only. if a story is still developing, report what changed, not the whole thing again
  • models & research — claim, evidence, caveat, worth-your-time. the caveat field turned out to matter the most, because "here's what's unverified about this" is the one sentence every launch post is missing
  • a watchlist — unresolved threads that carry forward brief to brief until they resolve, at which point they graduate into "since last brief" and disappear from the list

there's also a scoring rubric now — importance, engineering relevance, novelty, evidence quality, personal fit, minus a hype penalty — and a config file so i can tune what i care about without touching the routine itself.

the reddit dead end

somewhere in here i wanted the routine to pull from reddit more reliably, so i went looking at a well-starred reddit mcp server to see how it handled auth.

References

1 source
  1. 01karanb192/reddit-mcp-buddyRepositorygithub.com

its "anonymous mode," the one that needs zero setup, turned out to hit the exact same public .json endpoint my routine was already using — and i'd already confirmed that endpoint is now blocked outright from cloud ips, both from my own sandbox and from a live github actions runner. old.reddit.com just redirects straight to a login wall now. but the same tool's "app-only" mode uses reddit's real oauth api with nothing but a client id and secret — no personal login, no browser cookies — which is exactly the kind of stateless credential that works from a cloud job.

so now a small github action runs every four hours, hits hacker news, polymarket, and (once i register a reddit app) authenticated reddit, and drops the results in a json file the routine reads first. pure fetching moved off the model entirely — it's cheaper, faster, and doesn't burn tokens re-discovering that reddit's public api died sometime in 2026.

pruning who it actually tracks

the graph work surfaced something i wouldn't have caught otherwise: eight of my twenty-one tracked people had never once appeared in a brief. permanently floating dots, no connections, because there was nothing to connect them to. a couple were genuinely mismatched — indie-builder voices that don't generate ai-race news at daily cadence, wrong fit for what this vault is for. i retired those and, while i was at it, noticed the list was missing some of the people who actually dominate the coverage — dario amodei, demis hassabis, yann lecun, jensen huang — and added them.

teaching it to flag its own bias

last thing, and the one i like most: i noticed the sources it was citing were almost entirely centrist tech press. reasonable, since that's most of what covers ai, but it meant the routine had no way to signal when a story was genuinely contested along political lines — the ai pacing letters, export controls, that kind of thing. i wanted something like the ground news browser extension, which rates every outlet's lean and shows you the spread of coverage instead of just one angle.

References

1 source
  1. 01Ground NewsSourceground.news

the easy version would've been a client-side lookup: hostname in, bias label out. but that would tag a plain techcrunch product post the same way it tags a wsj op-ed on ai regulation, which misses the actual point — bias only matters when the story is contested, and only the model doing the writing knows when that's true. so instead the routine gets a small reference table of outlet ratings, and when — and only when — a story is genuinely policy-adjacent, it tags the source link itself with a real css class: {.bias-lean-right title="Lean right"}. the app renders that as a small colored dot next to the link. no parsing, no guessing, just the model's own editorial judgment turned into a real ui element instead of a sentence explaining itself.

that's the part i keep coming back to across this whole project: every time i was tempted to fix something with a client-side heuristic, the better fix was giving the model a structured way to say what it already knew, and getting out of the way.

it's still running twice a day, still finding its own bugs, still occasionally floating a node with nothing to say. that's fine. it's mine, and it argues with itself about sourcing now, which is more than i can say for the newsletters it replaced.