Building an AI-Powered Micro-Website Factory on Amazon Bedrock
Most of the small business sites we built at Digitspots followed the same shape. A hero, a few service blocks, a contact section, a deploy step, a domain. The work was not hard. It was just slow, repetitive, and easy to get slightly wrong every time. So I asked a simple question: what is the smallest amount of input a human needs to give before a site can build itself?
The answer turned out to be a short JSON payload. Business name, sector, a few service descriptions, brand colour, and a domain. Everything else could be generated, assembled and shipped without anyone touching a code editor.
The pipeline
The flow is intentionally boring, because boring is what survives in production. A payload lands, a Lambda function picks it up, Bedrock generates the copy and structure, the site is committed to a fresh GitHub repository, GitHub Pages serves it, and Route 53 attaches the custom domain. No step waits on a person.
json{ "business": "Adunni Foods", "sector": "food", "services": ["catering", "meal prep", "events"], "brand": { "primary": "#1f7a4d" }, "domain": "adunnifoods.com" }
That payload is the entire human contribution. Everything downstream is deterministic plumbing wrapped around one generative step.
Why Bedrock and not a raw model call
Bedrock gave me a managed endpoint with IAM-scoped access, so the generation step inherited the same identity and audit story as the rest of the stack. The Lambda execution role gets a tight policy that allows one model action and nothing else. There is no API key sitting in an environment variable waiting to leak.
- The model is prompted with a strict structure, not a freeform brief, so output stays predictable.
- Generated copy is validated against a schema before it is ever written to a repository.
- If validation fails, the payload is parked in a dead-letter queue instead of shipping something broken.
The part that actually mattered
The generative step was the easy headline. The real engineering was idempotency. Re-running the same payload had to produce the same result without creating a second repository or a duplicate DNS record. I keyed every external action on a hash of the payload, so a retry is safe by construction. That single decision is the difference between a demo and something you can leave running.
Generation is the headline. Idempotency is the product.
What it bought us
Delivery went from roughly two weeks to under two hours, and most of those two hours are propagation and review, not work. Outsourcing cost dropped sharply because the variable cost of one more site is now a Lambda invocation and a model call. The team moved from building sites to improving the factory, which is a far better place to spend an engineer's attention.