Two thousand pull requests in 151 days
Pull request #2000 merged into this repo on a Friday evening, thirteen seconds after it opened. Here is the confetti, a picture tour of what 2,000 pull requests built, and the honest footnotes about what the number does not prove.
Pull request #2000 merged into this site's repo at 18:21 UTC on a Friday in July, thirteen seconds after it opened. Pull request #1 merged 151 days earlier, in the second week of February. Between those two timestamps the counter burned through roughly thirteen numbers a day, every day, into one Next.js monolith that is also my personal website, with nearly every branch drafted by Claude Code agents and merged by one human. This post is the celebration, confetti included. It is also the honest version: what the number actually counts, what those merges built, and what the milestone does not prove.
What number 2,000 actually counts
First, the footnote that keeps the confetti honest. GitHub numbers issues and pull requests on one shared line (its own REST API considers every pull request an issue), so #2000 is the two-thousandth number the repo has spent, not the two-thousandth pull request. The full accounting of those first 2,000 numbers: 1,679 went to pull requests and 321 to issues. Of the pull requests, 1,668 merged and 11 closed without merging. A purist can hold the applause until the two-thousandth literal PR, due sometime around number 2,380 at the current mix.
I am throwing the confetti now anyway, for two reasons. Number 2000 happened to land on a real merged pull request rather than an issue, which felt like the repo cooperating. And the ratio buried in that pile is the statistic I actually care about: a 99.3 percent merge rate. Almost nothing gets opened here that is not intended to land.
The wall of two thousand
Numbers that size deserve to be looked at, not just quoted, so here is all of them at once. The wall below draws every number from #1 to #2000 as one square, in order, colored by what became of it: merged pull requests in green, the eleven that died in red, issues in gray. Hover or tap any square to see which number it is; the ringed squares are the round-number milestones, including #500, which turns out to be a pull request that never merged. Even the round numbers do not all make it.
The data under the wall is committed to the repo and drift-guarded by a test, the same pattern as the research Claims Ledger: if the dataset is ever regenerated, every figure in this essay has to move with it or the post cannot merge.
The uncut stat sheet is my favorite part. The median pull request here goes from opened to merged in 10 minutes, and 90.2 percent merge within the hour. June alone absorbed 970 merges, including the single busiest day of the run, June 13, when 68 pull requests landed. The slowest merge of the whole era took three days, which in most repos would be a rounding error on the review queue.
From error boundaries to a design editor
The two endpoint PRs tell the story better than the count does. PR #1, February 10: unit tests for three game logic modules, error boundaries, a skip-to-content link. The boring, load-bearing stuff a repo ships when it intends to be maintained rather than admired. PR #2000, July 11: an opt-in cloud store so Atelier, the site's edit-the-site-from-the-site design tool, can carry an in-progress draft across devices.
The unit of work in between was always the same: one branch, one intention, one merge, even when the diff is a single line. Nearly every branch was written by an AI agent working inside this repo, a setup I have documented in the parallel-agents build log and the concurrent-sessions post. What follows is what that actually bought.
The grand tour, in pictures
A number that size flattens five months into one gray statistic, so here is the un-flattened version: a short walking tour of what those branches carried, with pictures. Everything below shipped inside the 2,000. The system map draws the whole thing as a graph, and the store catalogs the reusable machinery; this tour just hits the landmarks.
Stop one: the arcade
Twenty-some games live here now, each built on a real theorem or decision problem: optimal stopping, the four-color theorem, Nim, the Josephus circle, Euler's bridges. They come with a personal console for your library, and every one of them answers to a nightly robot QA rig that boots a simulated phone and taps through the whole arcade while I sleep.
Stop two: the household stack
The least glamorous stop and the most used. Shared to-do boards, weather boards with their own landing page, trip boards, and countdowns, all multi-tenant, all self-provisioned from one tools landing. They grew out of a private household spine (calendar, chores, money, mail) that stays unlisted; the public halves are the part anyone can spin up for their own family in about a minute.
Stop three: the library
The wordy wing. Novels written and shipped as designed web experiences, The Pandora Threshold most recently; an 1881 eight-volume anthology rebuilt as a searchable, cited corpus; curated reading lists that picked up an in-browser semantic search where the embedding model from Hugging Face downloads into your browser and nothing you type leaves the page; and a site radio that streams the site's own narrated audio across routes while you read.
Stop four: the world models
The stretch where the site started rendering places. A walkable 3D sim of the village whose civic rules corpus the site already documents; a 3D model of Tashkent's airport built from OpenStreetMap open data with an arrival walkthrough; and a full Ukrainian-language edition of the site, hreflang twins and all, which began as a language-learning experiment and became infrastructure.
Stop five: the mirror hall
My favorite wing: the site watching itself. Research entries whose claims re-verify live in the browser; field data behind the essay series; self-checking AI benchmarks where the verifier reruns the scores on every visit; a voice-fit meter that scores prose against a human calibration, built to de-LLM-ify the writing here. Then the softer mirrors: a public status page, a distribution graph of how content travels, a weekly changelog that drafts itself, an assistant that knows the whole site, and a daily comic strip about the entire arrangement, drawn in code.
Two thousand pull requests is not a velocity story. It is what the counter reads when merging becomes the cheapest safe thing the repo can do.
Why the pace holds
The honest answer is gates, not heroics. Every PR runs a Vitest suite that is now north of 7,800 unit tests, and game-touching changes pass a deterministic Playwright gate against the production build. Content has gates of its own: this very post had to pass a merge test that forbids em dashes and checks the stated read time against the word count. Even the crons that keep the site alive get audited for silently doing nothing, and the harness around the model does more of the work than the model does.
Several Claude Code sessions run against main in parallel, deploying through Vercel with content in Supabase, and main moves twenty to sixty commits on a busy day. The convention that keeps that from being chaos is deliberately dull: registries append, conflicts resolve keep-both, and nothing merges red. When merging is cheap and safe, batch size falls, and the PR count climbs as a side effect. The count is the exhaust, not the goal.
What two thousand is not
It is not two thousand features. A fair share of those PRs exist to fix the PR before them, and the milestone itself makes the point: #2001, merged about twenty minutes later, spent part of its diff repairing a build break that #2000 shipped. For exactly one PR of the celebration window, main did not build.
Review here also does not mean a second human. It means the gate suite plus one person reading diffs that agents wrote, which works for a personal platform and is not a claim about what a team with users and revenue should do. And a PR count measures batch size, not value; I could double it tomorrow by splitting every change in half, and the site would be no better. What the number does measure honestly is how cheap change has become, and cheap change is the property everything else here depends on.
This post, uncut
A confession to close the celebration properly: this post is on its third pull request, and the first two were not clean. Version one scheduled itself for eight in the evening and then hid for two hours behind the site's own scheduled-release feature while I wondered where it had gone. Version two linked proudly to the milestone pull requests before remembering that the repo is private, which made every receipt a locked door for readers. Version three added the full-screen opening, the wall, and the sound, on the theory that if a milestone post exists it might as well commit. Each version was drafted by an agent, held to the same gates as everything else here, and merged in minutes. The comic strip about a site that will not stop building itself is not fiction; this page is now one of its own examples.
Here is to the next thousand
The site already has surfaces built for looking back: the changelog writes itself a weekly issue, and the comic strip has been narrating the whole arrangement daily. Milestone posts are rarer, and this one earns its confetti. One admission before the toast: the repo itself is private, so the PR numbers in this post are receipts you cannot click. What you can click is the live system map, the public picture of what all those merges add up to.
The counter was at 2,001 before I finished the first draft of this post, and past 2,007 before the second. Here is to the next thousand.
Get the next one
An occasional note when something genuinely new ships here — essays, free tools, projects. No schedule, no filler, easy out.
Need something like this built?
I design and ship AI tools, full-stack apps, and data pipelines — end to end, to production. Tell me the problem in a sentence; I'll give you an honest read on fit within a day.
Work with me →

