Shortcodes
Shortcodes are the in-body links between content pieces. A page or post body can point at a block, a stack, a document, or a form, and the static builder resolves each reference at build time; inserting the real render, never a placeholder. Four shortcodes exist; everything else (page lists, related content, galleries, videos) is a block type used through the {{block:name}} family rather than a different syntax.
The four families
{{block:name}}: one reusable block. Renders the named block’s template output exactly where it sits in the body. Block names are unique per language; a language’s content references its own language’s edition, falling back to a language-free copy when this language’s edition is missing.{{stack:name}}: one reusable stack. Stacks resolve fully: nested stacks resolve recursively (with the cycle/depth safety cap), then the stack’s layout wrapper applies, so a placed stack reads like a whole section inside the body.{{document:slug}}: a published document link: looked up from the build cache, rendered as the link to/documents/<slug>(the CMS-tracked download endpoint your host’s proxy routes to the CMS).[form:slug]: an embedded form: rendered inline when the slug is active at build time; falls back to a CMS-hosted iframe when onlycms_base_urlis configured; otherwise a build error.
Where shortcodes run
- Only in body text: page and post bodies (and landing page bodies share the same families). Titles, slugs, menu labels, and URLs do not process shortcodes.
- No template-level logic inside shortcodes: no conditions or loops at this layer. Conditional rendering lives in blocks (each its own TT file), not in the shortcode syntax.
- All four families resolve in the same render pass in any theme template, including raw and landing page bodies, which can be assembled from the same building material.
Broken references are build errors
A shortcode pointing at something that doesn’t exist (a block/stack name with no matching edition, a missing or unpublished document slug, an inactive form) leaves an HTML marker comment in the built page (<!-- form:<slug> not found --> and friends) and is recorded as a build error naming the shortcode and the reason. The promotion guard sees those like any pre-promotion failure, so a broken reference cannot ship silently; fix the reference (or publish/restore the target) and rebuild.
Choosing between them
- Blocks: the atom for content composition (hero, CTA, quote, gallery…); reference one wherever its single instance belongs.
- Stacks: a complete ordered section in one reference (shared feature rows, standing CTA groups, campaign sections).
- Documents: the tracked-download path; because replacement keeps the slug, built references survive updates.
- Forms: the submission surface; with
cms_base_urlset, embedding works even when the page is hosted away from the CMS.
They nest freely: a block can live inside a stack inside a body, and a form can sit inside a block; the builder resolves everything that appears in active content.