Or scaffold it yourself
When the corpus is already authored, the path from a blank directory to a serving deployment is four commands. Every file the scaffolder writes is ordinary, reviewable code.
01
Scaffold the deployment
npm create @konneal/publisher my-sdo -- --with-site
An interview asks for the publisher's facts — id, name, domains, identity issuer, first dataset — then writes the whole skeleton: profile/*.yaml (the single edit surface), the ten-line worker entry that injects the profile into the engine, the Cloudflare wiring, the profile codegen, and (with --with-site) a minimal Astro+Vue frontend consuming @konneal/client. Every file is ordinary, reviewable code; the scaffolder never runs again.
02
Declare the corpus, generate the profile
cd my-sdo && npm install && node scripts/gen_profile.mjs
profile/corpora.yaml names the corpus repository; profile/prompts.yaml carries the publisher's voice (identity, refusal, citation examples), so questions about the publisher itself are answered from the profile and never refused. Every profile edit regenerates a committed TypeScript module; a drift test keeps both sides honest.
03
Ingest the corpus
python -m ingest.cli parse && …embed && …graph && …upsert
The engine's Python CLI parses the corpus along its own clause structure, embeds it via the same binding the server uses, builds the graph projection — the registry, the concepts, and the citation edges from the bibliographies — and upserts the Vectorize index. One-time cost, bounded by corpus size.
04
Build the site, serve under your brand
cd site && npm install && npm run build && cd .. && npm run deploy
The frontend's entire answer-contract surface — the SSE ask client, the markdown renderer, citation chips, typed blocks — comes from @konneal/client. What remains is the publisher's own: theme tokens, page chrome, conversation state. Deploy the Worker; it serves site/dist as its assets.