← All case studies

// case study 01 · agency platform · agentic engineering

Studio White Tiger Agentic Website Delivery Pipeline

A spec-driven pipeline that lets coding agents audit an existing small-business site, research the niche, design and build a bespoke replacement, and publish a gated preview, without converging on a template or inventing a single fact.

Role
Sole engineer: specs, packages, CLI, CI, and hosting
Timeline
Kit extracted and pipeline built July 2026
Status
In use on client builds; 3 previews published
Core stack
TypeScript, Next.js, Go, Docker, GitHub Actions

TL;DR

  • The problem: six hand-built client sites each reinvented the same plumbing, and unguided agents produce generic designs and fabricated proof.
  • The build: a 7-stage spec written for agents, 8 shared packages that own behavior but zero pixels, and a one-command preview pipeline.
  • The guardrails: typed briefs, WCAG contrast checks, and conformance checks fail the build. Lighthouse ≥ 95 and axe gate every preview.
  • The result: 158 package tests passing, three client previews live through the pipeline, and a spec site built through the gate before the sale.

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.

  1. 00

    Qualify

    Go/no-go: real defects, real proof assets

  2. 01

    Audit

    Every legacy URL and business fact inventoried

  3. 02

    Research

    Structure and objections only, never palette

  4. 03

    Brief

    Zod-validated contract: audiences, proof, dials, sitemap

  5. 04

    Theme

    Tokens from the business's physical world

  6. 05

    Compose

    Section plan per page

  7. 06

    Build

    Bespoke Next.js site on the kit

  8. 07

    Gate

    Conformance, axe, metadata, Lighthouse

  9. 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.

Generated 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:

  1. Frozen install and preview:check: typecheck, lint, formatting, tests, and production build.
  2. Immutable image pushed to GHCR, tagged with the full commit SHA.
  3. Run the digest-pinned container locally, check /api/health for the release SHA, then run preview:quality: browser checks, axe, metadata, and Lighthouse ≥ 95 in every category.
  4. Deploy over SSH with strict ED25519 host-key checking, to a key that can only run digest-pinned deploys.
  5. 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

Challenge

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.

Approach

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.

Challenge

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.

Approach

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.

Challenge

Making "done" machine-checkable

Agents will report success. The question is whether anything can prove them wrong before a person looks.

Approach

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.

Challenge

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.

Approach

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
Next case studyClipMix → Read