ISS
← Field Notes
AI & AGENTS
August 31, 2026 · AI & Agents · 2 min read

Shipping the Moonshine Labs Site With a Bun Contact API

The Moonshine Labs studio site is a static front end paired with a tiny Bun-powered contact API and a repeatable deploy path.

Every studio needs a front door, and I wanted the Moonshine Labs one to be boring in all the right ways. Fast to load, easy to change, and nothing running that I have to babysit. That meant a static site for everything a visitor reads, and a single small server process for the one thing that actually needs a backend: the contact form.

Static Where It Can Be, Dynamic Where It Has To Be

The bulk of moonshinelabs.io is plain HTML. There is no framework hydrating the page, no build step turning components into more components, no client bundle to ship. The browser gets markup and styling and renders it. That decision pays off in the obvious ways, quick first paint and trivial hosting, but the part I care about more is the mental overhead. When the copy is wrong I edit a file. There is nothing between me and the change.

The contact form is the one piece that cannot be static. A form has to send its payload somewhere, validate it, and do something useful on the other end. So that became a small Bun API. Bun starts fast, handles the HTTP surface with no ceremony, and keeps the whole thing to a single runtime instead of dragging in a heavier stack for what amounts to a handful of routes.

Deploy Tooling So I Actually Ship

The third leg here is the deploy tooling, and it is the part that keeps the other two honest. A static site and a tiny API are only low-maintenance if pushing an update is one predictable command rather than a sequence I half-remember. So I wrapped the deploy into repeatable scripts. The goal was that a copy fix and a full redeploy feel like the same size of action, because when shipping is cheap you ship, and when it is fiddly the site quietly rots.

The lesson I keep relearning is that the architecture of a small site is mostly a question of what you are willing to maintain. Splitting it into static content plus one narrow dynamic endpoint means almost nothing can break, and the one thing that can is small enough to reason about completely. That is the whole trade I was after.

Have something that needs building, or stabilizing?

These notes are the work log. The paid work runs through Moonshine Labs, my product and engineering studio. Tell us what you're building, or grab a call.

Work with us →
the studio: moonshinelabs.io