"Don't build the production pipeline for a second user you don't have yet."
One User, One Consumer, No Reason to Build
Bonfire's engine and UI run as one always-on command, and the UI is served by the dev Vite server, not a production static build. That looks sloppy until you see the situation honestly: right now Bonfire is a single-user app under active development on one machine. The UI has exactly one consumer — itself — and the same person both builds it and uses it. In that situation a production dist buys nothing and costs a rebuild on every single change. Dev Vite reflects each edit instantly through HMR. The 'sloppy' choice is actually the correct one.
The Premature-Dist Cautionary Tale
Bonfire first copied a prod-static-dist always-on setup from a sibling engine — and it backfired. Restarting the server never reflected code changes, because nothing rebuilt the dist. That's the signature of premature generalization: you stand up production-serving infrastructure before there's a production situation, and it quietly does the wrong thing. The fix wasn't more infrastructure; it was less — drop to dev Vite and let HMR do its job.
The Trigger to Flip
This isn't 'never ship a prod build.' It's 'flip when the situation actually changes.' The trigger is concrete: the moment an external client consumes the engine API, or Bonfire deploys to the server as a stable prod engine, switch to a prod static build (npm run build → frontend/dist, served by a StaticFiles mount that already sits dormant, mounted last so the API always wins). Until one of those is true, dev Vite is correct. Concrete-first: build the prod path when there's a prod reason, not in anticipation of one.