← All posts

Shipping a Product in 24 Hours: AI-Native Product Engineering

A new customer-facing dashboard widget went from concept to shared prototype overnight, and to production in about a day. One engineer, an AI coding agent, zero meetings. Here's the architecture that made the speed safe.

By LegalZoom Engineering · · 7 min read

A new customer-facing widget on our logged-in dashboard was built late one night, shared as a working prototype the next morning, and running in production within roughly 24 hours. One engineer. An AI coding agent. Zero coordination meetings.

It would be easy to file that under “heroic all-nighter” or “AI magically writes apps.” It is neither. The clock only ran that fast because of an architectural decision we made months earlier: we made our dashboard an “agent-authorable” surface and shrank the unit of delivery from a whole page down to a single widget. What follows is the actual timeline, with the architecture surfacing where it earned its keep.

Why a single box, and not a page

Start with the thing the engineer was building against that night. Our logged-in customer dashboard is a shared shell: a React stack with a server-rendered account shell built on Remix, backed by a typed, server-side data layer where each route’s loader fetches what the page needs. That design has served us well, but it had quietly made shipping hard. The traditional unit of change was a page, and our pages are heavy. A single legacy page loader could fan out to dozens of backend services. The page was the atom.

Any new experience meant touching that atom. You either rebuilt a page or stood up a mini-app, and either way you dragged along the page’s existing data-fetching, its shell behavior, and several teams. Every feature carried a coordination tax: scoping cycles, cross-team sequencing, and the ordinary friction of getting calendars to agree. Dropping in brand-new, AI-generated code was genuinely risky, because the new code arrived entangled with all the legacy fetching around it.

So months before this night, we shrank the atom. Instead of rebuilding a page, you ship a small, self-contained widget into the existing page shell. The dashboard runtime stays untouched. The widget brings its own loader, fetches only what it needs, and renders into a slot. The blast radius of a new experience drops from “an entire page and all of its service calls” to “one box.” That single change is what let one engineer, that evening, sit down and build a new customer experience without rebuilding pages or dragging legacy fetching along.

The evening: a plain-English spec becomes a draft PR

The widget started as a sentence. The engineer described it in plain English, and the agent went to work against a surface we had deliberately made legible to it. An agent is only as good as what it can discover and the conventions it can safely follow, so the authoring environment carries real weight here:

  • Flat, predictable route conventions, so a new widget has an obvious, isolated home.
  • Per-widget server loaders with explicit wiring annotations, and a typed data layer the agent can introspect to discover which services and endpoints exist. The agent doesn’t guess at an API. It reads the types.
  • Visible mock and fallback overlays. When a widget renders against mock data, or a service isn’t wired yet, that shows on screen. Missing wiring is obvious to both the engineer and the agent reviewing the output.
  • The real design-system component library, so generated UI uses real, accessible components rather than bespoke markup.

With that surface in place, the loop ran fast. The agent generated production-shaped code against the real component library and real service calls, generated tests and product analytics from the same spec, and then a preview step took over: it auto-fixed typecheck and lint errors, committed, pushed, and opened a draft PR.

Engineer (plain-English spec)


  AI agent  ──►  introspects typed loaders / wiring contracts
        │        generates widget + loader + tests + analytics

  preview step ──►  auto-fix lint/typecheck → commit → push → draft PR


  human review  ──►  graduate behind a managed flag → merge

Through all of this, the widget hid behind a local environment-file flag. Nothing reached real customers, and there was no production flag plumbing to set up. The engineer could build against real services all night without touching anything customer-facing. This is the detail that turns overnight prototyping from scary into routine: it removes the single biggest source of “I’ll do it tomorrow when someone can provision the flag” friction. We also keep the agent grounded with a continuously refreshed internal knowledge layer, updated as PRs merge, so generated code stays aligned with our actual codebase and our own vocabulary rather than a plausible-sounding average of the public internet.

By the time the engineer stopped for the night, the prototype already followed production conventions: real components, real service wiring, real accessibility. That is the property that mattered most for what came next. The gap from prototype to production was a code review, not a rewrite.

The morning: a working prototype, shared

The next morning, the widget was shareable as a real, running thing. Where it lives in the shell isn’t one fixed answer. A prototype is only useful if it can sit next to production code without endangering it, so we embed widgets three ways, depending on how close to the real path we need to be:

  1. Sibling experiment route. The widget lives as a flat, isolated route next to production. Nothing in the live path is touched. Good for early exploration.
  2. Bridge mode. We swap exactly one module or component on an existing production route, leaving everything else in place. A new widget renders in its real context without forking the whole page.
  3. Page-level flag gating. A flag decides which path runs. When it’s on, the new widget’s self-contained loaders execute; when it’s off, the legacy path runs completely untouched. There is no in-between state where both are half-live.

These three patterns are what let the morning’s prototype land inside a shared production shell while the legacy path stayed exactly as it was.

Graduation: one flag, one reversible switch

Getting to production the same day was a deliberate, staged step, not a leap. At graduation, the engineer converted the local flag into a real managed feature flag (we use LaunchDarkly), added monitoring and analytics, and merged only after code review. The rule we hold to is one flag per experiment. Everything shipped is reversible by configuration: if a widget misbehaves, you flip one switch and the legacy path is exactly as it was.

The night-to-production widget in this story followed that path precisely. It shipped behind a managed flag with a query-param test override, and review surfaced one concrete fix: a mock-data code path that needed to be gated to non-production environments only. That is exactly what review is for, and it’s cheap to catch when the change is one isolated box rather than a rebuilt page.

It’s worth being honest about what this costs. Shrinking to widgets means we maintain embedding machinery (three patterns, flag conventions, wiring annotations) that a simpler “just edit the page” model wouldn’t need. We accept some duplication: a widget’s loader may fetch data a neighboring widget also fetches, because isolation matters more to us than perfectly deduplicated service calls. And making a surface legible to an agent is ongoing work. The typed loaders and wiring contracts have to stay honest, or the agent’s output quietly degrades. We treat that authoring surface as a product with its own maintenance cost.

What the clock was actually measuring

The number to remember from this story is not 24 hours. Velocity here is an architecture property, not a heroics property. We didn’t reach overnight turnaround by working harder on one night. We reached it by making the expensive parts (isolation, wiring discovery, reversibility) cheap and repeatable beforehand.

The cultural point underneath that: you ship fast because you build it right. Simple systems that are legible to both humans and agents are what let an AI generate production-shaped code and a single reviewer trust it. Tests, alerts, and observability are part of “done,” not a follow-up ticket. As this workflow rolled out, deployment frequency and delivery throughput improved meaningfully, and they stayed sustainable precisely because the safety rails were part of the design rather than bolted on after.

We’re watching the role of the engineer shift with it. Increasingly, one developer plus an agent handles the loop (spec, code, review-assist, validation) that used to require multi-engineer coordination. The senior-most work is moving toward building reusable harnesses, encoding institutional knowledge into agent-readable docs and conventions, and reviewing rather than hand-typing every feature.

The widget delivery model is the first surface where we’ve felt that shift end to end. The 24-hour story is real, but the headline isn’t the clock. It’s that we can now treat “add a new customer experience” as a small, safe, reversible move. That is a far more durable advantage than any single fast night.

AI-native engineering developer productivity feature flags React Remix software delivery

We're building this — want in?

If shipping pragmatic, AI-native systems at the scale of millions of small businesses sounds like your kind of problem, we'd love to talk.

See open roles

More in AI-Native Product Engineering

AI-Native Product Engineering

Describe It, and Ship It: AI-Assisted Frontend at Scale

How we turned an AI-generated UI prototype into a production dashboard experience: wired to live state, fully accessible, and shipped behind feature flags in days, not sprints.

LegalZoom Engineering · · 7 min read

AI-Native Product Engineering

How We Ship Continuously Without the Coordination Tax

Velocity isn't about typing faster. It's about removing handoffs, moving knowledge into reusable AI harnesses, and treating tests, monitoring, and review as part of "done."

LegalZoom Engineering · · 7 min read