← all exhibits
Exhibit§ 02 · ai-radar Status● running daily at 09:00 Roledesign · build · operate Since2026 · daily + intraday pulses

ai-radar

Every morning at 9, a headless agent sweeps the AI landscape through six parallel lenses — and publishes only the part that's safe to show you.

TL;DR · 10-second read

Every morning a bot reads the day's AI news across six angles and writes me a private briefing. This page is the public, headlines-only slice of it — regenerated automatically each morning, with everything personal stripped out.

Cron autonomy6-lens parallel fan-outFail-closed publish
§ 02 / DEMO

Run it live

embedded · interactive
ai-radar · this morning's public sweep LIVE
Ken's AI Radar — daily six-lens sweep generated Mon, Jun 1, 03:11 AM ET
headlines only · external sources · refreshed each morning
§ 03 / ARCHITECTURE

How it works

tap a node · drag + zoom
6-lens parallel fan-out cron Trigger headless Claude launches Releases reddit · hn · x Chatter market Business unmet needs Gaps policy News how-to Craft synthesize Digest backstops ×3 Publish
§ 04 / REASONING

The ideas behind it

tradeoffs, stated
decision 01Why a daily cron run, not a chatbot or a feed

The run is the unit of work — it has a clear start, a token and wall-clock budget, and a full log. A scheduled sweep that fails pings me on its own; I don't have to remember to ask it anything. No always-on swarm, no chat session to babysit — just a result on the vault every morning before I'm at the desk.

tradeoff Latency is measured in the cadence, not in seconds — this is a morning briefing, not a live alerting system. For "what moved in AI overnight" that's exactly the right unit; anything genuinely real-time would get a different path.
decision 02Why six parallel lenses instead of one big prompt

Each lens has a different intent — releases, practitioner chatter, business, gaps, news, craft — so each is independently tunable and runs in parallel. The hard rule across all of them: every item links a real source. The lens that hunts unmet needs is the one that turns a news feed into a wedge list.

tradeoff Six lenses cost more tokens than one pass and can surface the same story twice — so a dedup stage collapses overlaps before the digest is written. Worth it: separate lenses catch things a single "summarize AI news" prompt blends into mush.
decision 03Why the public snapshot is headlines-only and fail-closed

The full brief is deliberately personalized — it names projects, strategy, and priorities, which is the whole point of it being useful to me. So the public surface is a deliberately narrowed projection: a deterministic backstop reads only the external Releases and News lenses, strips the personalized editorial from each item, and drops anything that still names a private project against a denylist — then aborts the write entirely if a flagged token survives.

tradeoff The public page shows less than I see, and the denylist will occasionally drop a borderline item that was actually fine. That's the trade every time: a snapshot that ships nothing private beats one that ships everything interesting.
decision 04Why it writes into an Obsidian vault graph

The digest isn't a throwaway feed — it's connected knowledge. Each run wires itself into the vault graph with bidirectional links and drops a backlink into the tracker of every project it touched, so a signal from this morning is one hop from the work it affects.

tradeoff It only pays off if the graph is tended — orphaned notes are worse than no notes. The deterministic backstops (daily-note link, index entry) are what keep the graph from rotting when a run is messy.

The brief I actually read every morning is full of things I’d never put on a public page — which project a signal feeds, what it’s worth, what I’d build next. That’s not a problem to scrub away after the fact; it’s the design constraint up front. The public surface is a separate, deterministic projection of the run: it reads only the external lenses, strips the personalized framing, and fails closed if anything private survives. Same discipline as the rest of this site — the safe version is built, not bolted on.

§ 05 / PROOF

Proof it's real

recorded run + artifact
run-trace · daily · ai-radar
cron 09:00 EDT $ run-daily.sh [09:00:01] start headless claude · model=opus [09:00:02] sweep fan-out · 6 lenses in parallel [09:07:13] digest written · 104 lines · deduped + wikilinked [09:07:13] backstop-1 daily-note radar link ✓ [09:07:14] backstop-2 telegram phone summary sent ✓ [09:07:14] backstop-3 public snapshot · reads Releases/News only [09:07:14] scrub 7 headlines kept · 0 leaked · denylist PASS [09:07:15] publish latest.json → CF KV → kenlly.dev ✓ done in 7m13s · digest + 3 backstops · 0 leaks
recorded · 7m13s · daily 09:00
generated artifact ● validator passed

Public snapshot — latest.json

external Releases/News only · personalized lenses never read · denylist PASS
6
lenses swept
headlines
public surface
0
private leaks
§ 06 / STACK

Stack & patterns

what it's built from

Orchestration

cron / crontabclaude -p headlessOpus (daily)timeout-boundedself-alerting

Sweep

6 parallel lensesevery item source-linkeddedup + rankintraday pulses

Outputs

Obsidian vault graphTelegram phone summaryPublic headlines snapshot

Publish safety

Reads external lenses onlyStrips personalized editorialFail-closed denylistCloudflare KV + Pages Function