
The AI website builder market settled into one shape fast: type a sentence, get a website, pay every month forever. Lovable reached $200M ARR in under a year doing exactly that. Durable, Framer, Wix's ADI, and Vercel's v0 all run the same loop. The product is genuinely good. The arrangement — you rent the engine and never own it — is the part we wanted to take apart.
Adorable is what came out of that: a complete AI website builder that ships as code a buyer owns and runs as their own multi-tenant SaaS. This is the log of how it got built, what we decided, and what fought back.
Starting from the category, not a blank page
The fastest way to build something hard correctly is to be honest about what the category has already worked out. In the abstract, AI website generation is a well-understood loop: classify what the user is asking for, generate structured HTML against a remembered design system, let them refine it, keep the output portable. The engineering is demanding, but the shape is known. What the category has not worked out is ownership — every product that does this well hands you a runtime you rent and never hold.
So the real work was never reinventing AI generation. It was building that well-understood capability as a business the buyer owns: a multi-tenant SaaS where an operator signs up many customers — each with their own projects, billing, and limits — on a stack they can run themselves. Next.js, TypeScript, Supabase with row-level security, OpenRouter for the model layer, Stripe for billing. Original code, an ownable stack, and the one thing the incumbents won't sell you — the platform itself.
Reading the market by its complaints
The clearest product spec a category gives you is the list of things its users are angry about. The incumbents each leave a specific gap:
- Lovable is a capable hosted platform — full-stack app generation, visual edits, version history, backend and custom domains (docs.lovable.dev, checked 2026-08-30) — but it stays rented and credit-metered: users report the AI rewriting working code while fixing something unrelated, and the dominant complaint is credit depletion on edits nobody asked for.
- Framer locks the output inside its platform — no code export. The site is never fully yours.
- v0 has grown past components into full-stack app scaffolding inside the Vercel ecosystem (v0.app docs, checked 2026-08-30) — but it is a metered tool that builds apps for you; it is not a website-builder platform you can brand, operate and charge your own customers on.
- Wix's AI has the largest small-business base and the reputation to match — slow pages, low review scores.
Read together, those complaints describe one missing product: an AI builder that gives precise control over what the AI touches, produces portable output the user owns, and ships as code the operator owns rather than a runtime they rent. That became the design brief.
The decisions that shaped it
Two models, not one. Routing every message through a single large model is slow and expensive, and it makes intent ambiguous. Adorable splits the pipeline: a fast, cheap intent model classifies each request into one of a handful of actions — create a site, edit a page, change the design, edit a section, inline-edit a code block — before the capable worker model does the actual generation. The classifier is cheap enough to run on every keystroke-level interaction; the worker is reserved for work that earns its cost. Both are configurable through OpenRouter, so the operator picks the price-performance point rather than inheriting ours.
Three editing modes, because one is the actual bug. The chat-box-only design is why incumbents burn credits: when the only way to say "move this 4 pixels" is a paragraph of English, the model guesses, and guessing is where working code gets overwritten. Adorable ships three surfaces over the same project. Chat handles structural changes. A visual editor lets a user click an element and adjust typography, spacing, and color directly — no model call, no guessing. A Monaco code editor with Cmd+K inline AI rewrites exactly the selection you highlight, nothing else. A restaurant owner lives in chat; a designer in the visual editor; a developer in code — same project, same tool.
Design intelligence as persistent state. A model with no memory of its own past decisions produces a different-looking page every time. Adorable stores a per-project design profile — exact HSL values, font families with weights and tracking, spacing rhythm, radius personality, shadow rules, image direction — and injects it into every request. Page six matches page one without anyone re-specifying the brand, and a site revisited a month later still generates consistently.
Site memory, for the same reason at the content layer. Business name, hours, services, differentiators — stored once per project and carried into every generation, so the user never repeats themselves and the AI never invents facts it was already told.
Snapshots on every action. Generation is probabilistic; the safety net has to be deterministic. Every AI action and every edit writes a snapshot, so any state is restorable and any two are comparable. A user can take the headline from one version and the layout from another and lose nothing in between.
Stream the work, render as it lands. Generation runs over server-sent events. File operations are parsed out of the stream in real time and the preview updates progressively, so the user watches the site appear rather than staring at a spinner for thirty seconds.
Portable output by construction. The preview renders through the Tailwind Play CDN for instant feedback; export compiles Tailwind server-side so only the classes actually used ship. The result is plain HTML, Tailwind, and vanilla JavaScript — no React runtime, no build step, a five-page site under a second on any static host. Portability isn't a feature bolted on at the end; it's the output format.
What fought back
A build log that only lists wins is marketing. The honest parts:
Vercel's function ceiling versus full-site generation. Generating a complete multi-page site can take longer than a minute, and serverless functions cap out — Vercel's Hobby tier at sixty seconds. The generation route is set to a 120-second budget, which means deployment-target choices matter, and long generations need a recovery path. We added bounded continuation: if a generation truncates, up to two non-streaming follow-up calls finish the job. It works, and it costs extra tokens — a real tradeoff documented rather than hidden.
Snapshots are cheap until they aren't. Writing a snapshot on every AI action means heavy editing sessions accumulate a lot of them. The safety net is worth it; the deduplication to keep it lean is on the list.
The studio got rebuilt. The first pass at the editing workspace — the panels, the preview bridge, the code editor wiring — didn't hold up, and the studio components were rebuilt rather than patched. The original build carried dozens of post-deploy fixes before it stabilized. That's the real shape of building a bidirectional postMessage editor with a live iframe: the architecture is simple to describe and unforgiving to get exactly right.
A rename leaves residue. The project was called PageForge before it was Adorable, and renames are never fully clean the first time — a few internal references and a published-site script still carry the old name. Cosmetic, tracked, and a useful reminder that "rename the product" is a migration, not a find-and-replace.
What shipped
A multi-tenant AI website builder: AI generation with streaming, three editing modes, persistent design intelligence and site memory, versioned snapshots, subdomain publishing and ZIP export, an asset manager, a full admin panel with an editable AI-prompt layer and per-action model configuration, billing, internationalization, and rate limiting — a complete multi-tenant build, not a skeleton. It runs on a stack the operator owns, with the model layer abstracted so the per-generation cost is theirs to control.
The thesis underneath all of it: an AI website builder doesn't have to be a runtime you rent. The hard parts — intent routing, design persistence, portable export, a forgiving editor — factor into code that ships. Once they do, the monthly-subscription shape that defines the category has nowhere left to attach.
