Run Auxon as an HTTP engine that generates a page — or one section of a page — per request, on brand, at runtime.
Everything else in these docs produces files: you build a site, the pages land on disk, you deploy them. This is the other mode.sitekit serve turns the engine into an HTTP service that generates HTML per request, bound to a playbook. Same voice, same style, same shapes, same verify — but the output is a response body instead of a file. A page can be generated on demand for a visitor, or a single section of an otherwise static page can be filled in at runtime.
The brand guarantee is unchanged. A response is composed from the same voice pack, style pack, and shape as a built page, and runs through verify before it’s returned. Dynamic doesn’t mean unaligned.
--host 0.0.0.0 exposes the engine on all interfaces with no authentication. There is no auth layer in the engine — that is deliberately the consumer’s job. If you bind it publicly, put your own auth, rate limiting, and quota in front of it.
POST /generateContent-Type: application/json{ "prompt": "freelance time tracking app" }
Streams Server-Sent Events by default. Set Accept: text/html for a buffered document, or Accept: application/json for { html, meta }.A full page is a big generation — expect it to be slow in model terms. Which is why the interesting endpoint is the next one.
Latency. A full page is on the order of a couple of minutes on a frontier model. One element is roughly 800 ms to 3 s.
Wasted tokens. Around 3K tokens per page call go to re-emitting the canonical stylesheet that’s already on the page. The per-element prompt skips it — the parent document already has the CSS.
Zero-cost elements. An element that doesn’t need personalizing (a footer, a social-proof strip) can ship a static.html and return in 1–3 ms with no model call at all.
pageContext.siblingElements is what stops four independently generated sections from reading like four different products. Pass it whenever you fan out.
The page endpoint can multiplex. Supply fanout or fanoutShape and it switches into parallel mode and always responds as SSE.
POST /generateContent-Type: application/json# Form A — an explicit ordered list (1–10 elements){ "fanout": ["hero", "features", "proof", "cta"], "prompt": "freelance time tracking" }# Form B — driven by a page shape's composes[]{ "fanoutShape": "landing", "prompt": "freelance time tracking" }
The engine launches N parallel calls (capped by maxConcurrency, default 5) and pipes each completion into one SSE stream as it finishes. Fast elements arrive first. Time-to-first-element is one element-latency, not the whole page’s.
By default a failed element is non-fatal — its siblings continue and you render what arrived. Pass strict: true to abort every sibling on the first failure. Per-element content overrides go in content keyed by element name.
The engine holds the invariants at boot — the composed system prompt, the pack’s style.css, the fonts URL, the marker template — for the process lifetime.--cache-responses <n> adds an optional in-memory LRU keyed by (playbook, prompt-sha). It’s off by default. Richer caching — semantic similarity, edge KV, pre-rendered tranches — is deliberately left to the consumer; the engine stays simple.
If you want one section as a file rather than a response, the build verb does it directly:
sitekit run --element=hero --slug=hero-a --topic="freelance time tracking"
Same composition, same checks, written to disk. That’s the right tool for a fragment you’ll commit — including authoring experiment arms. Use serve when the fragment has to differ per visitor.
Static build and dynamic generation aren’t alternatives; most real deployments use both. Build the site the ordinary way, then let one region come from the engine — a hero that changes by campaign, a proof strip that reflects the visitor’s industry — while the rest stays a plain, fast, cacheable file.
Shapes
Element shapes are what these endpoints render.
Experiments
Split-test a region — including a section that keeps regenerating.