A while back I built two birds to read the web for me: a Magpie that watches my GitHub stars and only speaks when one finally touches live work, and a Blue Jay that reads RSS feeds and buries distant, not-yet- relevant ideas in a quarantine folder like acorns. One hoards relevance, one scatters serendipity.

Both read content — articles, READMEs, headlines. The whole time I was building them, there was an obvious unbuilt half: every serendipity tool I own mines inward. None of them ever surfaces a person. I’m a solo operator with no colleagues down the hall. What I’m short on isn’t more to read — it’s people to learn from and people to think with.

So this is the third bird. It points the same engine at people instead of pages. Meet the Jackdaw — the corvid that recognises individual human faces and bonds with specific people. The right mascot for an agent whose whole job is “which person should you reach out to.”

One word changed everything: who

The Magpie and the Blue Jay produce a note. Worst case, a bad one wastes thirty seconds and gets deleted. The Jackdaw produces a draft message to a real human. The output isn’t something I read — it’s something I might send. That single shift, from what to read to who to talk to, drags the blast radius from “a file I’ll ignore” up to “a stranger’s inbox.” So it gets one rule the other birds never needed:

Sending is always a human act.

The Jackdaw drafts. It never sends, never resolves a contact detail, never guesses an email, never touches a mailbox — every person is referenced by their public GitHub handle and nothing more. Drafts land in quarantine; I find the contact and send by hand, in my own voice, if I send at all. Most “AI outreach” tooling races to automate exactly the step I left manual. That’s the point. An agent that can DM forty strangers a week on your behalf isn’t a serendipity engine, it’s a spam cannon with good branding.

The trap: similarity is the easy find

Here’s the part I’m proudest of, because it’s a mistake I nearly shipped. My first instinct was simple: find people whose work looks like mine. Peers. And that’s a real need — when you have no colleagues, you want peers to think with.

But it’s a trap, and the trap is mechanical. Similarity is precisely what embeddings are best at. Rank everyone on one “how related is this person to me” score and the people-like-me hits come back fast and confident — and bury the rare ones who are genuinely ahead of me, who already shipped the thing I’m circling. Asymmetry is hard to detect; resemblance is cheap. Left alone, the bird decays into a “find people like me” echo-finder, the most comfortable and least useful thing it could become.

So it doesn’t rank on one axis. It sorts each candidate into four lanes by the direction of the collision:

LaneWhat it meansSignal
AHEADalready shipped the thing I’m circlingasymmetry (hard, high value)
COMPLEMENTholds a specific missing piece I namedasymmetry
ALLYdifferent field, but their problem rhymes with minethe true serendipity case
KINDREDsame niche, same altitude — a peer to think withsimilarity (easy)

Then the safeguard: a per-lane quota. At most three or four finds a run, and KINDRED is capped at one — the easy hits are never allowed to eat the slots reserved for the hard, asymmetric lanes. An empty AHEAD lane is a fine, honest outcome. A run that’s all KINDRED is the failure I designed against. One real ahead-of-me find beats five people who are basically me with a different repo.

The voice changes by lane too: AHEAD and COMPLEMENT get an honest student’s question — name the exact wall, prove I read their work, ask one precise thing, no collaboration pitch, because I have little to offer those people yet. The rest of the chassis is the same as the other two birds: the model fetches nothing itself, drafts with no shell or network, writes one quarantine file and nothing else, and a run that finds nobody is a success. No quota to fill means no manufactured strangers.

The first run found exactly one person

The first supervised dry-run scanned 40 people off my starred-repo graph and surfaced exactly one — an AHEAD: Igor Ilic (@dexters1), a core engineer on Cognee (“building memory for AI agents”). That collides with my exocortex — a hand-rolled markdown memory layer with BM25, a graph, and an MCP server. Cognee is the mature open-source version of the thing I built in my spare room, and they bet hard on the graph as memory.

The draft it wrote points straight at a scar I already blogged about — the time I benchmarked my own search and the graph lost:

I’m building a small markdown memory layer for my own AI sessions — BM25 + a graph

  • an MCP server, the same shape Cognee aims at. When I benchmarked retrieval, graph expansion hurt my ranking — I ended up zeroing the graph weight and plain lexical search won, and my vector layer never beat BM25 either. Cognee leans hard on the knowledge graph as memory — what retrieval wins did the graph actually buy you over plain lexical, and on what queries did it pay off? Trying to work out if I gave up on it too early.

That’s the whole pitch in one paragraph. It found a person genuinely ahead of me on the exact problem I quit on, and wrote a question I’d be glad to send. The other 39 mapped to nothing specific and were correctly dropped.

Where it stands

Honest status: the wrapper is built and the first dry-run is done. It’s not on a cron yet, and it has never sent anything — by design, it never will. When I trust it, it’ll run roughly monthly; every find is real human send-work, and a weekly drip would just manufacture outreach pressure, the exact spammy feeling the whole thing exists to avoid. Until then it’s on probation, where everything that reads the internet starts in my house.

So the fleet is three birds now. The Magpie hoards what’s already shiny. The Blue Jay scatters acorns. And the Jackdaw — the one that knows faces — finds the person, writes the first line, and stops dead at the one step that was always supposed to be mine. It points. I send.