A publish-ready longform-writing template. Scaffold a new essay site with:

ck new <name> --template essay-series --host <name>.highline.work
cd ~/Work/<name>
ck validate --offline                    # 6/0/0 expected
.venv/bin/uvicorn server.serve:app       # local preview at :18210

What is in the box

PathPurpose
content/essays/*.mdxEssay source. YAML frontmatter (title, slug, date, tags, summary) plus markdown body. Two seeds ship: 00-on-open-loops.mdx (the Candlefish register) and 01-what-this-site-is.mdx (a meta intro).
server/serve.pyFastAPI server with Basic Auth and four routes: /, /<slug>, /_system/<path>, /static/<path>. Renders MDX as markdown plus YAML frontmatter (full MDX/JSX deferred to v2).
server/render.pyThe markdown renderer. Reads frontmatter, renders body, applies voice-rule guardrails.
server/templates/Jinja2 templates: base.html, index.html, essay.html.
public/_system/{_system,_patterns,_example}.cssThree-stylesheet load order at <head>. _system.css is the vendored Candlefish Design System (M2 W6); _patterns.css is the kit-authored semantic-tokens layer; _example.css carries the essay-series-specific extensions.
public/static/Per-project static assets (images, etc.).
validate_essays.pyPer-template validator. Asserts that every essay’s frontmatter has the required keys, voice rules pass (no emoji, no exclamation marks outside code blocks, em-dashes preferred over --), every image has alt text, the date frontmatter parses as ISO-8601. Run as python3 validate_essays.py; integrated into ck validate --offline via the project’s docs/contracts/agent-runtime-files.json.
ck.config.jsonTemplate metadata consumed by ck-new (template name, default surface, validator command).
tests/test_essays.pyUnit tests for the validator (positive plus negative fixtures).
tests/visual-targets.jsonEmpty placeholder; the estimator-demo template populates the visual-regression target list.

What is not in the box (deferred)

Voice rules (enforced by validate_essays.py)

These match the Candlefish register documented in the kit’s CLAUDE.md and the architecture-series chapters.

Running locally

cd ~/Work/<your-essay-site>
uv venv .venv
.venv/bin/python -m pip install -r server/requirements.txt
.venv/bin/python validate_essays.py            # zero FAIL rows
.venv/bin/uvicorn server.serve:app --port 18210 --reload
# preview at http://demo:<password>@localhost:18210/

The default Basic Auth user is demo; the password is read from ~/.config/<project>.env (SITE_PASSWORD or ARCH_PASSWORD). M1 W4’s ck publish wires this to a launchd plist plus cloudflared rule for production.

See also