← // all posts
field notes // deployment

Shipping Without a Build Step

2026-06-26 // Nicholas Rushing // 7 min read

Open the average web project in 2026 and before you've written a line of your own code, there's a build pipeline waiting for you: a bundler, a transpiler, a dependency tree thousands of packages deep, and a CI job whose entire purpose is to turn the code you wrote into the code that actually runs. For a lot of applications that machinery earns its keep. For a small-business site, it's frequently the single largest source of friction in the whole project — and most of the time, it's optional.

A meaningful share of what I ship has no build step at all. The HTML in the repo is the HTML the browser receives. The JavaScript I write is the JavaScript that runs. There's no compile, no bundle, no transform standing between the source and production. This post is about why I keep choosing that, what it costs, and the line where I stop.

What a build step quietly costs

The pitch for a build pipeline is real: tree-shaking, minification, modern syntax on old browsers, a tidy dist/ folder. But every one of those benefits arrives bundled with a tax that doesn't show up until later:

A build step is a bet that the time it saves you in production exceeds the time it costs you in maintenance. For a brochure site or a lean web app, that bet usually loses.

What build-free actually looks like

The architecture is deliberately boring. Static HTML, CSS, and vanilla JavaScript live in the repo exactly as they're served. A Cloudflare Worker fronts everything — serving the static assets and handling the handful of dynamic endpoints a small site actually needs, like a contact form or a feedback submission. Deployment is a git push.

# the entire "build" pipeline
git push origin main
# Cloudflare's GitHub integration deploys on push.
# no CI artifact, no bundle, no dist/ folder.

That's not a simplified example. That's the real flow on a number of live projects. The code in the editor is the code in production, and the path between them has no moving parts to fail.

Modern browsers removed most of the reasons

A lot of the build-step orthodoxy is muscle memory from a harder era. The browser quietly absorbed most of what bundlers were invented to paper over:

Where I stop

This isn't a crusade. A build step is the right call the moment a project genuinely needs what it provides, and I reach for one without hesitation when:

The mistake isn't using a build step. The mistake is reaching for one reflexively, on a five-page business site, because the tutorial did — and then carrying that complexity for the entire life of the project. The right default is the simplest architecture that meets the requirement, and for a lot of real-world work, the simplest architecture has no build step in it at all.

// want it simple and fast

If you've got a site that's slow to change or expensive to maintain, the architecture is often the reason. Let's look at what it actually needs — and what it doesn't.

transmit_message