
Feeds that write themselves.
planning · spec of recordA feed generator: describe the feed you want in a sentence, and it publishes on a schedule to any reader you already use.
A recipe carries a prompt, a schedule, a model and a budget. It runs on time, writes the items, and publishes them at a stable address as RSS, Atom and JSON Feed — so the thing you subscribe to is an ordinary feed, and nothing downstream has to know a model wrote it. The whole product surface is one sentence: a URL that returns valid XML and never lies.

Brand artwork for AnimeFeedFlux. The specification is real and linked above; the poster is a design exercise, not a claim.
A recipe is a prompt, a schedule, a model and a spend cap. What comes out is an ordinary feed address that Slack, or any reader, can subscribe to without knowing a model wrote it.
Generative items — trivia, on-this-day — are written by the model, which is the source. Grounded items — news, releases — are only edited by it; the facts and the links come from the publisher. Conflating the two is named in the plan as the main way the project fails, so they are split at the architecture level rather than by convention.
A reader that has already seen an item never re-fetches it, so editing one reaches nobody. Corrections are published as new items instead, which is the only version a subscriber will actually receive.
The recipes it ships with are the ones an anime audience actually wants: a daily trivia question, the day's news ranked by impact, and a seasonal roundup of what is worth watching.
Including the two libraries underneath it that are my own work — the framework the interface is written in, and the transport it talks over.
The problems worth describing, and what the measurement said. Not the technology list — that is above.
The obvious failure of an AI-written news feed is a confident link to a page that does not exist, and prompting is not a defence against it. Sources are fetched first, their URLs normalised once, and only that candidate set is ever shown to the model; a link may be published only if it is byte-equal to a URL that was actually retrieved. An invented URL is not improbable — there is no code path that can emit one.
It does not error on a feed it dislikes; it simply stops posting. It needs a date on every item, items in sequence, and no duplicate timestamps — so a news run publishing three items at once would have had two dropped with no signal. It also bookmarks the newest date it has seen, which makes a backdated item invisible forever. That produced real constraints: strictly increasing timestamps enforced by a database constraint, a no-backdating rule, plain-text descriptions with the rich HTML in content:encoded, and trivia answers kept out of the description so a channel preview cannot spoil the question.
The publish plane is plain HTTPS, GET and HEAD only, unauthenticated, and holds a read-only database handle — a bug in the code path serving the public internet has no writer available to corrupt anything with. Every mutation is a gRPC call on a separate, authenticated, IP-allowlisted control plane. The split is the defence; the authentication is only the lock on the half that can write.
Figures taken from the repository itself. No line-of-code count — it rewards duplication and every reader knows it.
The newest of the six and the earliest: designed, not yet running. The architecture, the compliance rules and the failure modes are settled; the engine that executes them is being built engine-first, so it is delivering feeds to Slack before a single screen exists. What makes it more than a plan is that the idea already runs in miniature on this very site, which generates /anime.xml and /anime/qotd.xml and posts them on a schedule. AnimeFeedFlux is that, generalised.
These are personal projects, built on nights and weekends with AI agents in the loop — that is how one person ships this much surface area at once. Most of them are early: alpha or prototype, with polish that varies a lot by area. What is not early is the architecture, the test suites, and the measurements — every number on this page is counted from the repository and every claim is one you can check against the code.