Disclosure: The Blitz Global Journal is published by Blitz Global LLC. We write about our own products, and we say so plainly when we do.
Blitz Global LLC

Blitz Global Journal

Notes on building software products, one platform at a time.

How we ship small changes fast

Why we ship one small pull request at a time instead of big batched releases, and why that discipline is what actually lets a small team move quickly.

A small team that ships fast looks, from the outside, like it is moving recklessly. In practice the opposite is usually true. The teams that ship the most changes with the fewest incidents are almost never the ones taking the biggest risks per change. They are the ones who have shrunk the size of each individual change until the risk of any single one is small, and then built a pipeline that catches the mistakes that still slip through. This post is about the shape of that pipeline, described in general terms rather than as a tour of our internal tooling.

One pull request per change

The single biggest lever we have found for shipping safely is refusing to let changes grow. Every pull request is scoped to one change: one bug fix, one small feature, one refactor. Not a bundle of three unrelated fixes because they happened to land in the same week, and not a feature plus the two-line typo fix an engineer noticed along the way. Bundling feels efficient in the moment. It is not. A bundled pull request is harder to review carefully, harder to reason about if something goes wrong after deploy, and harder to roll back cleanly, because rolling it back also reverts the unrelated changes that were riding along with it.

Small pull requests have a second, quieter benefit: they make code review actually work. A reviewer can hold a 40-line diff in their head and reason about every edge case. A reviewer looking at an 800-line diff is, realistically, skimming. We would rather have five small pull requests reviewed carefully than one large one reviewed quickly.

CI gates that actually block

None of that discipline matters if the checks around it are advisory. A CI gate that engineers can merge past when they are in a hurry is not a gate, it is a suggestion, and suggestions get skipped under deadline pressure precisely when you need them most. Our rule is that required checks are required: automated tests, type and lint checks, and a build step have to pass before a pull request can merge, with no manual override built into the everyday workflow. If a check is flaky enough that people want to bypass it routinely, that is a sign the check itself needs fixing, not a sign the gate should be optional.

This matters more, not less, as more of the work moves toward automated and AI-assisted contributions. An automated gate does not care whether a change was written by a person or an agent under supervision; it holds every change to the same bar. That consistency is what lets us trust a growing share of routine changes to automation without lowering our standards for what ships.

Automated deploys with post-deploy verification

Once a change merges, the deploy itself should be boring. A human clicking through a manual deploy checklist is a human who will eventually skip a step, especially the tenth time that week. We automate the deploy path so the same sequence runs every time: build, deploy, then verify. Verification is the part that is easy to skip and the part that matters most. After a deploy completes, we check that the service is actually healthy: that it responds, that its core paths behave as expected, and that nothing regressed relative to before the deploy. A deploy that "completed" but left the service broken is not a successful deploy, and our pipeline is built to treat it that way rather than declaring victory the moment the new code is running somewhere.

Immutable rollback versions

The other half of shipping fast is being able to reverse a bad change just as fast. We keep every deployed version as an immutable, addressable artifact, not something we rebuild from source under pressure at 2 a.m. If a deploy turns out to be bad, rolling back means pointing traffic at the previous known-good version, not starting a fresh build and hoping it comes out the same. Speed of rollback is what actually gives us the confidence to ship small changes frequently. If reverting a bad change took an hour, we would ship far more cautiously, and far less often. Because reverting is fast and boring, shipping can be frequent and low-drama.

One shared pipeline pattern across products

We run several products, and every one of them uses the same shape of pipeline: small pull requests, required checks, automated deploy, post-deploy verification, and fast rollback. We do not let each product invent its own release process, for the same reason we do not let each product invent its own authentication system. A shared pattern means an engineer moving between products already knows how changes ship there. It means a fix to the pipeline itself, a faster verification check or a better rollback mechanism, benefits every product at once instead of needing to be reinvented and re-earned nine separate times.

Why this compounds

None of these five practices is exotic on its own. What compounds is having all of them together, consistently, on every change, for every product. Small changes reduce the blast radius of any single mistake. Real CI gates catch the mistakes that slip through review. Automated deploys with verification catch the ones that slip through CI. Fast rollback limits the damage from the ones that slip through everything else. And one shared pattern means we only have to get this right once, not once per product. That is the actual reason a small team can ship as often as we do: not because we take bigger risks, but because we have made each individual risk small enough that shipping often is the safe choice, not the reckless one.

← Back to Journal