Sites That Differ by Data, Not Code — a Generator for Trade-Business Websites

Small-business web · generators ·

Bar chart of the five-minute contract by step, measured steps in dark grey and estimates in gold.

A private template and generator that builds, deploys and verifies a lead-gen website for a trade business from one intake file, with quality gates that refuse a dishonest or thin site.

Problem

A small trade business needs a website that says what it sells, where it works, takes a lead and can be found. Built as a project, every site carries the full cost of a project, so most of them freeze on the day the agency invoice clears. The way out is to make sites differ by data, not by code: one kit renders every site, one validated file describes each business, and a fix to the kit reaches every client at once.

The hard part is not the rendering. It is that a generator is tempted to invent the trust content a real site has (reviews, licence numbers, hours, addresses), and that a thin site is worse than no site once it is measured against a competitor.

Constraints

  • The generator never fabricates trust content. Reviews and credentials require client-supplied provenance, in the schema, not in a style guide.
  • Live means verified: every sitemap URL serving 200, no internal link redirecting, and a tokenless lead proven blocked before the scaffold reports success.
  • Client data reaches the client repository only. The template never carries a database id, an image pack or a site file.
  • A gate failing on one site is a kit finding, not a per-site waiver.

My role

I owned the contract (what five minutes means), the decision records, the media policy, the fabrication rules in the schema, and the verification step that decides when a deploy is allowed to call itself live. The kit, the gates and the two client sites were built with an agent; the rules it builds against are mine.

What shipped

  • A private GitHub template (Astro on Cloudflare Workers with D1 for leads) with nine section components, token-only theming and CSS-first motion.
  • Six fixtures (lighting, roofing, HVAC, restaurant software, real estate, full) and per-trade image-pack prompts with alt text.
  • Scaffold and destroy scripts, a structured intake schema, a client-site harvester, a six-category SEO scorer with a reference comparison, and a site CLI.
  • Quality gates: schema and copy lint, content depth, prose links, axe, overflow, no-JS, reduced motion, focus ring, JS budget, CLS, CTA above the fold, visitor-first UI, local Worker end-to-end, and live verify.
  • Two client sites generated on 2026-09-21 and 2026-09-22.

Outcome

  • 46.5 s from template to verified live site — Database 2.2 s, bot-check widget 0.3 s, build 1.3 s, repository from template 17.6 s, deploy 11.2 s, verify 13.8 s. Measured 2026-09-21. White paper, section 3
  • 21% → parity-plus on content depth — The first launched site had 1,613 words against a 7,722-word reference and was destroyed the same day. Rewritten fixtures carry 10,000 to 12,000 words and score 92+ where the reference scores 75.9. White paper, section 4
  • Image generation sized to the budget: 43 s hero, 15.2 s everything else — Four settings measured on 2026-09-21; all judged usable by eye. Nine images run in parallel with harvesting and writing, so the critical path is 200 to 260 s. White paper, section 3

By the numbers

Template to verified live site: 46.5 s. Template repository created and 101 files pushed: 5.2 s. Local end-to-end (real Worker, local D1, no account): 3.5 s. First site's content vs the reference: 1,613 vs 7,722 words. Rewritten fixtures: 10,000 to 12,000 words, 45 to 66 validated prose links, score 92+ vs the reference's 75.9. Image generation: 43.1 s for the hero at 1376×768, 15.2 s for each of eight others at 1024×576 quantized. Decision records: 12.

The rule in the schema

Trust content requires provenance. A reviews page renders only when client-supplied reviews exist. Unsupplied hours, addresses and coordinates are omitted from the page and from the JSON-LD, never inferred. The copy linter refuses specific warranty, insurance and licence claims. Sites launch honest but thinner until the client supplies the real thing.

What the first live deploys got wrong

Every internal link took a 307, because directory-style output made the platform redirect and the canonical pointed at a redirecting URL. Pages returned 404 briefly while the home page was up, because assets reach the edge seconds apart. The lead endpoint accepted unverified leads for the width of one deploy step, because the bot-check secret was set after the code shipped. Each is now a gate: slashless URLs with a test that fails on any redirecting link, a verify step that polls every sitemap URL, and a secret that ships in the same Worker version as the code with a fail-closed endpoint.

Stack

Astro · TypeScript · Cloudflare Workers · D1 · Turnstile · Vitest · Playwright

Artifacts

Lead volume from the generated client sites is not yet reported; both sites are days old. The full five-minute run including content generation for a new business is measured for the deploy half only.

All projects · Michael Kaminski


Book a Call · Download Resume · MKaminski1337@gmail.com · (404) 838-8613 · LinkedIn · GitHub · DEV · X