Project · Lakshay Mehandru · Jun 2026

Curio

A reading engine that runs in the background for my agents. It goes through what's new in the fields I care about, keeps the few things that matter to what I'm thinking about, and lets the rest go.

PythonSQLiteClaudeAgents
Two small round creatures, one pale and one darker, kneel at the edge of an open trapdoor and look down. Below, the same two look down into another trapdoor, and inside that one a smaller pair does the same, repeating deeper. A grayscale ink drawing.

Curious on purpose

Why do some things grab you and most things don't?

I started asking that because of my agents. They know everything up to the day they were trained and nothing after. The obvious fix is to feed them everything new. The trouble with that is everything new. Every launch, every library, every thread, and almost none of it has anything to do with what I'm working on.

Keeping an agent current turned out to be the easy half. The hard half is getting it to care about the same things I care about this week.

How people do it

People are weirdly good at this. Nobody reads everything, and nobody hands you a list of what to be curious about. Something just catches.

The best explanation I've found is George Loewenstein's. Curiosity kicks in when you notice a gap between what you know and what you want to know, and you can only notice a gap if you already know a little. Know nothing about a topic and there's nothing to pull at. Know all of it and there's nothing left. The pull is strongest in the middle, which is what a 2009 trivia study by Kang and colleagues found: people were most curious about answers they almost knew.

Daniel Berlyne split curiosity into two kinds back in 1960. Diversive curiosity is the bored scroll, where anything new will do. Specific curiosity wants one answer to a question you already have. A feed is all diversive. It has no half-finished thoughts, so nothing in it is aimed at you.

Borrowing my gaps

An agent doesn't have gaps of its own either. So I lend it mine. The things I'm in the middle of, the questions I haven't closed yet, that's where the itch is, and that's what Curio reads against.

What Curio does

Every morning Curio reads GitHub, Hacker News and a few RSS feeds I picked. When the same thing shows up in more than one place, the mentions stack, and that count is its momentum. It's plain arithmetic, so no clever post can talk its way up the list.

Then a small model checks each item against what each agent cares about, and one of those lists is my own open questions, which never leave my laptop. Fit counts most, momentum second, newness least. Newness is the cheapest thing on the internet.

The few things that make it become short notes in the agent's memory. Everything else goes on a shelf the agent can search later. Notes expire after three weeks and go back on the shelf, and nothing gets deleted. Curio never tells an agent what to learn. It leaves the note where the agent will find it, and I read the short list too.

The bug

My first version multiplied fit by momentum. Out of 968 scores, exactly one item ever made the top tier. Multiplying meant any weak number dragged the whole score toward zero, so a decent fit with a lot of buzz never had a chance. A weighted blend fixed it. Run over the same items, the busiest agents went from nothing to dozens.

What I want

Keeping a model current is mostly a filtering problem, and the hard part of filtering is deciding what to throw away. You can't decide that without knowing what someone is thinking about.

That's what I want from my agents. Read everything, and bring me back the two things that matter. Read everything, and know which question I'm still stuck on. Read everything, and be curious about the same things I am.

How it's built

Discovery

Three public sources, all keyless: GitHub Search, Hacker News through Algolia, and RSS. The same item seen in several places collapses to one key, so its mentions stack. X is a stub for now.

Relevance

Velocity is the recency-weighted count of distinct sources, so it is deterministic and a prompt can't move it. A cheap model scores domain fit. The final score is 0.55 fit, 0.30 velocity and 0.15 novelty. Every keep or shelve writes a plain-language reason.

Tiered memory

High-signal items become short markdown notes in the agent's memory, with a 21-day expiry. The rest sit in one SQLite file with vectors from sqlite-vec, and agents pull from it over MCP. Adding an agent is one YAML file with its topics and the technologies to watch.

Obsolescence

A weekly pass asks, for each technology an agent depends on, whether it is still the move. Stale notes decay back to the shelf instead of being deleted.

Security

Curio reads untrusted public text, so model output only sets a score and the text of a note. There is no tool calling and no code execution driven by it, which means an injected string can mis-rank one item and nothing more. Filenames are slugified and the notes it writes go in one folder.