← all case studies

case 07

One a Day

An agent ships one template a day, in public. Nobody reviews it but the gate.

// the problem

Template libraries are made by hand, one careful author at a time. That is the right way to make the ones people depend on — and the wrong way to find out what the long tail of media chores even looks like. The question worth answering was narrower than “can an agent make video”: can an agent, unattended, turn a chore it found on the web into a reusable, deterministic media program — typed props, tests, a layout contract, a frozen render — every day, and leave a record honest enough that a stranger can judge it?

m0saic-project/one-a-day is that experiment: a third-party template repo (namespace @one-a-day, unsigned, shown as 3P in Mosaic Desktop) where an AI agent — Claude Code some days, Codex or Kimi on others — does the same five things every day and pushes the result to main. Nobody codes in it by hand. Nobody reviews a day before it ships except a gate that is code.

// the loop

A day is five fresh agent calls. Nothing survives between them except files, so the journal folder is the agent’s only memory — and the public record.

scout     → what recurring media chore is out there? (HN, forums; every source opened)
plan      → the brief: canvas, props, beats, the layout contract, a rubric
build     → one template, up to three variants, each rendered at three canvases
critique  → adversarial scores against the rubric; SHIP <x> or NO SHIP
ship      → previews, verify, the why-tutorial
gate      → deterministic, no model: scope guard, build, doctor, freeze, ONE commit

The gate is the part that makes it safe to leave alone. Only the day’s allowed paths may change; exactly one new template folder; the conventions gate renders every template at its defaults; an error mosaic anywhere fails the day; the new folder is frozen by byte hash and never changes again. Some days ship nothing. Every day leaves a journal entry — the scout notes with sources, the brief, the build log, the critique with scores, the ship note, and every variant that lost. The losers are kept on purpose: the decision is the interesting part.

// every template explains itself

Make has no prose surface and a link preview has no README, so each template carries the day’s story as its tutorial — the “?” pill on the Make page, or m0saic make <id> --tutorial on the CLI. It is six pages: the run (day, date, which agent, which model it said it was), the problem with the online sources the agent actually opened, the solution, how to use it, the template itself at its defaults, and how the day was made — the run’s phases as a waterfall with tool calls, tokens and dollars, because developers read tokens and leadership reads dollars. The words and the numbers are frozen into the template file with the code.

day 001's why-tutorial, rendered by the CLI — six pages, 59 seconds1280×720 · rendered from the frozen template
The problem page: who was observed, what was observed in the evidence's words, and the sources the agent opened
2 / 6 — the problem: who, what was observed, the sources the agent opened
The solution page: what the template attempts and its known weak spots
3 / 6 — the solution, with the weak spots the critic found
The template itself at its defaults: an Open Graph card with a kicker, title, summary and accent band
5 / 6 — the template at its defaults
How it was made: the run's phases as a waterfall with tool calls, and where the numbers came from
6 / 6 — how it was made: phases, tool calls, tokens and dollars

The build refuses a tutorial that lies by omission: a placeholder left in, a source that is not a URL, a day or model that disagrees with the journal, a timeline that disagrees with the runner’s trace. The critic scores whether the pages tell the truth. And every template declares a layout contract — every text fits its box, the chrome lives where the design says — that the build sweeps at seven canvases before anything ships.

// day 001

The first scout found developers on Hacker News and dev.to running headless browsers and paid screenshot APIs to put five strings on a rectangle: the og:image every blog post needs. Three Show HNs in one year had rebuilt the same plumbing. The agent planned an Open Graph card from front matter, built three variants (a top bar, a left rule, a bottom band), and its critique picked the band — the one accent that survives thumbnail scaling, which is where these images actually live. It shipped as @one-a-day/dev/og-card/v1, titled by its date so the grid reads as a calendar.

The shipped Open Graph card at 1200×630: kicker, two-line title, summary, and an accent band with the site and author
@one-a-day/dev/og-card/v1 at its defaults, 1200×630 — the same props also lay out square and story cropsstill · png

// use the templates

Mosaic Desktop. Templates → Add source → paste the repository URL → consent. Desktop installs the repo pinned at that day’s commit; Update now picks up a new day on your terms, and Follow upstream is an explicit opt-in with a warning that says what it means — an agent-run channel is not something Desktop auto-updates for you.

https://github.com/m0saic-project/one-a-day

CLI. Clone it and point the CLI at the folder. The repo commits its build, so a clone loads with no build step; each day’s journal/<date>/50-ship.md has the render one-liner and the props worth trying.

git clone https://github.com/m0saic-project/one-a-day
npx m0saic list-templates --template-repo ./one-a-day --json
npx m0saic make @one-a-day/dev/og-card/v1 --template-repo ./one-a-day -w 1200 -h 630 --props @post.json -o og.png
npx m0saic make @one-a-day/dev/og-card/v1 --template-repo ./one-a-day --tutorial -w 1280 -h 720 -o why.mp4

Loading any template repo runs its code on your machine, and this one is written by an agent and reviewed by a gate. Look at src/ first — it is the whole story; dist/ is its build.

// how it was done before

Agents that make media today mostly make files: a screen recording, a browser-rendered PNG, an ffmpeg one-off — output with no program behind it, different bytes on the next run, nothing to reuse. Or they write code nobody gates, and the second day breaks the first. Here the unit of work is a typed template with its tests, its contract and its own explanation, and the freeze means (template id, props) renders the same pixels on the pinned toolchain forever. A template that turns out good gets polished by a human elsewhere and promoted to the official community library; the repo stays what it is.

// run it yourself

One command, straight from a terminal. The CLI carries the template, the engine, and the validator — if the layout can’t render correctly, it fails before a single frame is written.

git clone https://github.com/m0saic-project/one-a-day && npx m0saic make @one-a-day/dev/og-card/v1 --template-repo ./one-a-day -w 1200 -h 630 -o og.png

// read the source

The template behind this study is @one-a-day/dev/og-card/v1 — a typed, unit-tested program, not a script, and every line of it is public: the folder behind each link is the source that ships, with its tests and its layout contract beside it. Copy it, fork it into your own repo, or read how a decision was made.

The pipeline that calls the agent — the prompts, the adapters for each CLI, the deterministic gate, the trace recorder — lives in the same repo under pipeline/, and AGENTS.md is the contract the agent works under. Point it at your own coding-agent CLI and run one day: node pipeline/run.mjs --no-push.