пул-реквест
#2,000
злито в один репозиторій за 151 день
Two thousand pull requests in 151 days
engineering7 min read
Builder · Applied AI

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.

merged · July 11, 2026 · 18:21 UTC
#0
pull requests into one repo, and counting
0
days from PR #1 to PR #2000
0
pull requests merged so far
0s
how long #2000 sat open before merging
0+
tests green on the way in
The milestone band. Every number is real, pulled from the GitHub API the evening #2000 merged. Fair warning: the button covers your whole screen in confetti and makes noise, so maybe not in a meeting.

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.

1,668 merged PRs11 closed unmerged321 issuesringed: #1 #500 #1000 #1500 #2000
57
Feb
80
Mar
166
Apr
196
May
970
Jun
199
Jul
10 min
median open-to-merge, across all 1,668 merges
90.2%
merged within an hour of opening
68
merges on June 13, the busiest day
116/151
days in the run with at least one merge
The Merge Wall. Every square is one of the first 2,000 numbers, in order, left to right and top to bottom; hover or tap a square to identify it. Below: merges per month, then the uncut stat sheet, all derived from one committed, drift-guarded dataset.

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.

The games reel, filmed headlessly from the live pages by the /studio recorder, which is also in the 2,000.

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.

The household to-do system, the tenant-one board the multi-tenant version was carved from.

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.

Cover art for The Pandora Threshold, a novel published as a web experience
The Pandora Threshold, the reference build for the site’s page-experience standard.

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.

A 3D rendering of Tashkent International Airport built from OpenStreetMap data
Tashkent International in three.js, from public OSM data. No key, no database, one committed artifact.

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.

A Merge Conflicts comic strip about a burndown chart that only goes up
From Merge Conflicts, the daily strip: a human and his agents building a site that will not stop building itself. Subject matter: this exact post.

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.

Experience it yourselfSee what two thousand merges built: the live system map
ShareXLinkedInHacker NewsEmail

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 →