I ranted about frontend build steps at MagnoliaConf 2025
Back in October, I had the pleasure of speaking at MagnoliaConf 2025. I was thrilled that the organizers decided to put it together this year after skipping last year. It was perfect timing because I had the chance to talk about something that has been increasingly bothering me: our industry’s addiction to complexity.
My talk was titled No build tool? No problem! (notes and slides here).
If you’ve been following my writing on home-cooked apps or my (free!) web book HTML for People, you know I’m a fan of keeping things simple. But simple in modern web development is a loaded term. NPM installing something is simple, right? In the short term, maybe. In the long term, build step dependencies are rife with problems.
The core thesis of my talk is that while we were busy Webpack-ing our way to success, the web platform got good.
We used to need build tools for a good developer experience. We needed Sass for variables and nesting. We needed Babel to use modern JavaScript. We needed bundlers to manage dependencies. But browsers have leveled up enough that they obviate the need for many build step features.
The highlight reel
I had a ton of things to cover and not enough time to cover them all in depth. But here are the takeaways.
- CSS has since gained many of the features of Sass, and in some cases, like variables, CSS actually does them better.
- Using CSS plus some newer components of HTML, you can recreate controls that were only possible with JavaScript previously. For example, HTML now has native modal dialogs.
- Leverage your editor’s support of TypeScript and JSDoc to get type support for regular JavaScript files.
- The browser supports JavaScript modules natively, so you can skip the bundler.
- You can use many popular JavaScript frameworks directly in the browser using their ESM-compatible versions. Frameworks like AlpineJS can be included and used immediately without any build setup whatsoever.
- Web components offer a browser-native way to encapsulate functionality and are a resilient option compared to fragile builds.
- While there is a buildless alternative to Tailwind (Litewind), the only way to get true Tailwind support is via a build step. However, they offer a CLI that can do it without involving a separate build tool.
Embracing runtime
There is a specific kind of joy in writing code that just runs. You save the file, refresh the browser, and there it is. No watchers crashing, no node_modules black hole, no cryptic webpack errors. It reminds me of why I fell in love with the web in the first place—the ability to just make something and share it.
I’m not saying you should never use a build tool again. If you’re building the next Facebook, sure, bundle away. But for small websites, internal tools, or that fun side project? Try skipping the build step. You might find that the browser is enough.
Watch (or read) the talk
If you want to check out the notes, code demos, or see a full text version of the talk, I’ve made them available here:
- Talk notes and links (includes the slides and demos)
- HTML version (a full transcript/slide combo if you prefer reading)