The highest-leverage move for an early-stage product team is often subtraction. A front end that ships with no build step, no bundler config and no toolchain to babysit will almost always outpace one buried under a stack of dependencies.

Configuration is a tax you pay every day

When we started Nova as an internal design system, our earliest prototypes shipped with the full modern stack — bundler, transpiler, CSS pipeline, the works. It felt capable, and it was exhausting. Every upgrade broke something, every new hire spent a day getting the dev server to boot, and every hot-path change waited on a rebuild.

The breakthrough came when we treated the toolchain as a cost to minimise rather than a badge of sophistication. Fewer moving parts means fewer things to break, fewer decisions for the next engineer, and a product that will still boot cleanly a year from now.

Good software feels quiet. It is confident enough not to shout, and considerate enough to let the next maintainer think.

That principle became the north star for the whole template. Wherever we were tempted to add a dependency, we asked first whether we could ship without it.

A practical checklist

Before adding any tool to the stack, we run it past a short list. If a dependency fails more than one of these, it usually gets cut:

  • Does it earn its place, or is it there because the ecosystem expects it?
  • Will a new engineer understand it on day one without a walkthrough?
  • Could the same result be reached with the platform alone?
  • Does it survive an upgrade six months from now without a migration?

The last point matters most. Our amber accent is striking precisely because it is scarce; our stack is durable precisely because it is small. Reach for a dependency on every problem and it becomes noise — reserve it for the ones the platform genuinely can't solve and it becomes leverage.

Restraint in code, too

The philosophy extends past the pipeline. The canonical Nova build ships as plain HTML, CSS and one small vanilla JavaScript file — no framework, no bundler, no compile step. You can open it and read the whole thing:

document.querySelectorAll(".reveal").forEach(el => io.observe(el));

The React port sits alongside it, sharing the exact same design tokens so both builds stay in lockstep. You reach for the framework when the product needs it — not before.

None of this is minimalism for its own sake. It is intention. Every dependency, every config flag, every build step should be a decision you can defend. When you can, the result feels calm — and calm, in software, is what lets a team move fast.

Product Tooling DX Velocity
EM
Founder

Emma Meyer

Founder of the Ventus studio. Obsessed with fast feedback loops, small dependency trees, and products that boot in a single frame.

Keep reading

Related articles