01Problem
Studio White Tiger rebuilds websites for local businesses: a bakery, an auto shop, a pool store, an accounting firm, a glass company, a restoration contractor. The first six sites were built by hand. They shared an architecture and almost no pixels, which is exactly why they beat the template-builder sites they replaced. But each one also reinvented the same layer: a business-data file, an opening-hours calculation, and a JSON-LD generator.
The obvious way to go faster is to hand more of the build to coding agents. Unguided, that fails in two predictable ways:
- Generic design. Agents derive palettes from competitor research and their own priors, and land on the same look every time.
- Invented proof. Agents fill gaps with reviews, ratings, credentials, and business facts the client never supplied.
Every home-services leader is navy and orange. Research will say so, and the model's priors already say so. An agent that derives a palette from competitor research produces navy and orange every single time.docs/design-pipeline.md
The goal: make a whole bespoke site cheap enough to build before the sale, while keeping it bespoke and keeping it honest.
02Build
Three layers: a normative spec that tells the agent exactly what each stage must produce, a set of shared packages that make the right thing easy and the wrong thing a build error, and a preview pipeline that turns a finished site into a verified URL with one command.
The pipeline, as specified for the agent
The design pipeline is written as a build specification rather than guidance. Every requirement is marked MUST or MUST NOT, every stage has an artifact and an acceptance test, and a stage isn't done until its artifact validates. A sell pipeline wraps it so the whole thing can run speculatively for a prospect who hasn't signed yet.
- 00
Qualify
Go/no-go: real defects, real proof assets
- 01
Audit
Every legacy URL and business fact inventoried
- 02
Research
Structure and objections only, never palette
- 03
Brief
Zod-validated contract: audiences, proof, dials, sitemap
- 04
Theme
Tokens from the business's physical world
- 05
Compose
Section plan per page
- 06
Build
Bespoke Next.js site on the kit
- 07
Gate
Conformance, axe, metadata, Lighthouse
- 08+
Present
Pitch deck, sell, hand off
The kit: eight packages, zero shared pixels
The rule is components own behavior, themes own appearance, composition owns identity. Shared code owns semantics, accessibility, data, and gates. Colors, type, copy, photography, and layout stay in each client's repository.
conform in prebuildsitekit CLI: ejects source plus a machine-readable agent build specGenerated sites get infrastructure and a contract, never a visual template.
One-command preview publishing
sitekit preview publish takes a client repository from local main to a verified preview URL. It creates or verifies the private GitHub repo, syncs deploy secrets, and fast-forwards a preview branch. Then a reusable workflow, pinned to an immutable release, does the rest:
- Frozen install and
preview:check: typecheck, lint, formatting, tests, and production build. - Immutable image pushed to GHCR, tagged with the full commit SHA.
- Run the digest-pinned container locally, check
/api/healthfor the release SHA, then runpreview:quality: browser checks, axe, metadata, and Lighthouse ≥ 95 in every category. - Deploy over SSH with strict ED25519 host-key checking, to a key that can only run digest-pinned deploys.
- Verify the public URL: TLS, HTTP status, canonical, crawler blocking, and that health reports the expected SHA.
On the host, previewctl (written in Go) manages isolated containers behind NGINX with transactional state, wildcard TLS, 30-day expiry, and rollback to the previously retained image digest without rebuilding.
03Challenges
Speed without sameness
A component library with variant props produces sites that are visibly the same site. That's the look these clients were paying to escape.
Shared packages own zero pixels. Palettes come from the business's physical world (racing red on carbon for the auto shop, ledger navy and brass for the accountant), and any color found in competitor research is recorded in avoidPalette. Motion intensity is a "dial" in the brief, and importing a primitive above the site's level is a build error, not a review comment.
Agents that won't lie
A spec site with a fabricated review or invented owner photo isn't a stronger pitch. It's a retraction waiting to happen in front of the buyer.
The brief declares which proof assets actually exist, and the design can't require anything absent from that list. Unconfirmed facts become a TODO(client) ledger, which turns into the close in the sales conversation. conform fails the build if business facts are hand-typed instead of coming from core, and the agent spec lists prohibited claims outright.
Making "done" machine-checkable
Agents will report success. The question is whether anything can prove them wrong before a person looks.
Briefs and themes are validated artifacts, so a bad brief fails before code exists. conform runs in prebuild, which means violations fail next build locally. It also generates the theme CSS, so the validated theme is the only one that can ship. Failures arrive together as one AggregateError, so an agent fixes everything in one pass.
Unattended deploys that can't break things
The publisher runs from an agent's or a person's workstation, against real repositories and a shared VPS.
It never force-pushes. A diverged branch is surfaced for a human. A failed candidate never replaces the healthy preview. Host keys must be exactly one ED25519 entry. The single escape hatch, skipping Lighthouse, is an explicit flag that leaves an auditable commit and still runs every other gate.
04Impact
- 6 → 1six sites' duplicated data, hours, and SEO code consolidated into one tested kit
- 158automated tests passing across the TypeScript packages, plus Go tests for
previewctl - 3client previews published through the pipeline: Hoch Accounting, SRB Automotive, Paradise Dogs
- ≥ 95Lighthouse required in every category, plus axe, before any preview goes live
- 9 daysfrom kit extraction to one-command, gated preview publishing (34 commits)
The sell pipeline was proven on a real prospect first: Easton Repairs was built through the quality gate with the client not in the room, with a ten-item TODO(client) ledger in place of guesses.
Sources: the agency-site-builder repository and its git history. Test counts are from a local run in October 2026. Conversion and revenue figures are deliberately omitted.
05Stack
- Kit
- TypeScriptZodpnpm workspacesChangesetsGitHub Packages
- Client sites
- Next.js 16React 19Tailwind 4next/fontstandalone output
- Quality
- Playwrightaxe-coreLighthouseWCAG 2.2 contrast math
- Delivery
- GitHub Actions (reusable workflows)DockerGHCRGitHub CLI
- Hosting
- Go (previewctl)NGINXCertbotUbuntuUFW + Fail2ban
- Agents
- normative specssitekit.agent.jsonTODO(client) ledger