Skip to main content
Back to blog

My Homelab Reads arXiv and Proposes Its Own Upgrades

5 min read

One morning last week I opened Slack to find that my infrastructure had read a research announcement, decided it was relevant, and filed three proposals to change its own code — each one tagged with the exact file it wanted to touch. I hadn't asked for any of it. I'd been asleep.

I call this the evolution engine, and it's the part of my homelab I'd have the hardest time giving up.

The worker most people would call an RSS reader

Every night, one step in my overnight chain pulls from around eighteen sources — arXiv, Hacker News, Lobsters, a handful of research blogs. On a typical night it fetches something like 160 items. That number alone is the reason the thing exists: I am not going to read 160 links a day, and neither are you.

So it doesn't hand me 160 links. A local model — running on the same Mac Mini as everything else, no cloud call, no per-token bill — scores each item for relevance against what I'm actually working on, not against some generic "AI news" feed. Most get dropped. The few dozen worth keeping get summarized. The handful that genuinely matter get written into Coquina, my memory layer, so that by the time I wake up, the agents I work with already know about them.

That would be useful on its own. But for the highest-signal items, it does one more thing.

It doesn't say "interesting." It says "here's the change."

For the top of the pile, the engine drafts a concrete proposal. Not "here's an interesting paper""here's a change to agent-runtime/config.py that would let us do what this paper describes, and here's why it scored 9 out of 10."

The proposal names the target file. It names the repo. It carries a score and a one-paragraph rationale pointing back at the source. It lands in a backlog where I can accept it, reject it, or ignore it entirely.

Last week the source was CurrentAI's Open Source AI Gap Map — a nonprofit sitting on roughly $400 million published an index of the open-source AI ecosystem. Version 0.1 catalogs 421 products from 228 organizations across three layers of the stack, with a long tail of about 24,400 uncategorized artifacts, all released as 1,184 MIT-licensed YAML files.

My article scanner read the announcement, scored it a 9, and filed three proposals against my own code:

  • add a tool that queries the Gap Map for the missing hardware or datasets relevant to a given task,
  • extend my dashboard to show which layers of my stack have no local implementation yet,
  • wire the YAML datasets into my config loader so new community tools get discovered automatically.

The joke writes itself. An engine whose entire job is finding gaps read the announcement of a map of the ecosystem's gaps — and proposed using it to find its own.

It proposes. It does not merge.

This is the line I care most about, because it's the one that makes the whole thing safe to run unattended.

A proposal is a hypothesis, not a change. Nothing the evolution engine dreams up ships on its own. It writes into a backlog; I decide what's real — often with a second model in the loop whose only job is to try to break the first one's reasoning before I ever see it. Most mornings, the proposals are wrong, premature, or describe something I already did last month.

There's exactly one thing it's allowed to touch without me, and it's boring on purpose: a nightly job notices when a hardcoded number in my code has drifted from the live system — a worker count, a model count — and opens a small, self-contained pull request to fix just that one fact. Facts, not features. Every change branch-first, every change reversible. The engine is allowed to correct the record. It is not allowed to decide the architecture.

The scarce resource was never compute

For a solo operator, the constraint isn't the hardware and it isn't the code — with the tools I have now I can generate far more code than I can responsibly read. The constraint is attention. There is more happening in this field in any given week than one person can track, and the cost of missing the single paper that would have changed your architecture is measured in months, not minutes.

The evolution engine doesn't make my decisions. It front-loads the noticing, so that my judgment has somewhere to point the moment I wake up. Automation that acts is easy to build and, frankly, easy to distrust. Automation that notices — and then waits for me — turned out to be the kind I actually rely on.

I'd rather delete nine bad ideas at breakfast than miss the tenth.