Nothing selected. Click any node on the canvas to see what it takes in, what it emits, and the rule it enforces.
System library
Forty-two design-system kits, each extracted from a real site by the design-system-extract skill and shipped to design-systems-v1. This tool reads them and never writes back, so a kit can be re-extracted or corrected without touching anything here.
Takes inNothing. It is the source.
Hands onslug, palettes.json, brand-spec.md, pattern names
Only shipped kits appear. Client sites and half-built drafts are in the same manifest and are filtered out.
The brief
Six fields, two of which are load-bearing. Who it is for and what the offer is are the only inputs that change the copy from generic to specific, which is why they are the two that are required.
Takes inkit, creatives and counts, business, area, audience, offer, notes
Hands onone brief object, attached to every job in the batch
No audience or no offer, no submission. A brief without them produces copy about nothing that still looks like output.
Anything listening?
Generation runs on your Claude subscription, which authenticates through Claude Code on a machine, so the work happens in a local runner and not in the Cloudflare Function. That makes one check matter more than the others: this page is up whether or not a runner is running, and a brief submitted into an empty queue just sits there looking broken.
Checkslibrary reachable, queue writable, runner seen in the last two minutes
Hands ongo, or a named reason it cannot
All green or nothing runs. The gate names the failing check rather than reporting a generic error.
Design context
The kit's own files go into the prompt verbatim: every palette variant with its real token values, the type pairing, the corner radius, the voice note. A paraphrased design system is just a mood, and the output shows it.
Takes inthe kit slug
Hands onpalettes.json in full, brand-spec.md up to 24 KB
Colour comes only from the supplied tokens. A hex value that is not in the kit is a defect, not a choice.
Job queue
A submission becomes one row per version in D1, sharing a batch id. That is what lets the results area show four finished pieces while the fifth is still being written, instead of one spinner for the whole batch.
Takes inthe creatives and their counts
Hands onqueued rows, claimed one at a time by the runner
Eight versions per submission. Thirty-six pages is not a bigger idea, it is the same idea nobody reads.
Angle split
Asking for three landing pages from one brief normally returns the same page three times with the verbs swapped. Each version is instead assigned a different place to argue from, and the assignment travels with the job so a finished piece can still say why it differs from its siblings.
Takes inthe version number
Hands onone angle: outcome, objection, proof, offer, situation, contrast
Versions differ by argument, not by wording. Two rewordings of one angle is one idea shown twice.
Prompt assembly
The kit files, the creative's own specification, the angle, and the brief are assembled here, in the Function, and the house rules are appended last. Order is the point: notes typed into the form arrive before the constraints, so a note cannot argue its way past them.
Takes indesign context, creative spec, angle, brief
Hands onone system prompt and one user prompt, per job
Assembly lives in the deployed Function, not in the daemon. Changing how a landing page is asked for is a deploy, not a laptop restart.
Generate
A small daemon on your machine claims one job, runs Claude Code headless on the assembled prompt, and posts the file back. It holds no rules of its own: it does not know what a creative is and never reads the design-system library. That is deliberate, so the thing running unattended on a laptop has nothing in it worth versioning.
Takes inthe assembled prompt
Hands onone self-contained HTML document
Raw HTML only. No markdown fence, no commentary, no placeholder text, no invented statistics.
Shape check
Mechanical, not editorial. It does not judge whether the design is any good, only whether what came back is a document at all: a model that answered in prose, or was cut off mid-body, fails here instead of reaching a preview pane as a blank white box nobody can explain. A fenced answer is unwrapped rather than rejected, since the document inside is usually fine.
Takes inthe returned file
Hands ondone, or failed with the reason named
Doctype, closed html and body, no fence, no banned construction, under 400 KB. A failure says which one.
Live preview
Rendered at true page width in a frame on the results card, scaled down to a thumbnail. Scripts in the generated file are allowed to run so the piece behaves as built, but the frame is not same-origin, so nothing in it can reach this page.
Takes ina job that passed the shape check
Hands ona rendered thumbnail, and a full-size tab on request
Model-written markup never runs same-origin. The preview is sandboxed and the raw file is served as a download.
HTML download
One file with everything in it: styles inline in a single block, marks drawn as inline SVG, no build step and no asset folder. It opens by double-clicking, it deploys by dropping it on a host, and it can be handed to a developer without instructions.
Takes ina passed job
Hands onkit-creative-v1.html
One file, no external dependencies. Google Fonts is the only permitted outside request, and only for a typeface the kit names.
Figma import
Figma has no native HTML import. Getting one of these files onto a canvas means a third-party plugin such as html.to.design, and what arrives is absolutely positioned layers: no auto-layout, no components, text that often reflows. It is fine for tracing a layout and wrong for anything that has to enter a component library.
Takes inthe downloaded file
Hands onflat layers on a Figma canvas
Named as lossy on purpose. If the deliverable has to become real Figma components, this path will not get you there and no plumbing fixes it.
Another angle
The output of a batch is a decision, not a deliverable: usually one angle is right and the others explain why. Keep that one, change the angle or the brief, and run again. The kit stays fixed, which is what makes two runs comparable.
Takes inwhichever version won
Hands ona tighter brief for the next batch
Replace a rejected angle, do not re-roll it. The same prompt run twice is a coin toss, not an iteration.