Every page can begin with a front matter block - a small piece of YAML between two --- lines that sets the page's metadata. It is optional, but a title is recommended for most pages.
---
title: My Page
subtitle: A short description shown under the title
register:
- sitemap.xml
---
Your content, in Markdown, starts here.
Everything below the closing --- is the page body. All keys are optional unless noted.
title<title> tag and the page header. Recommended for most pages.
subtitledateYYYY-MM-DD. Used in feed entries; falls back to the file's modification time if unset.
tagslayoutlazysite/layouts/NAME/layout.tt, or may be a remote URL (see remote layouts).
searchtrue or false to include or exclude the page from the search index. Defaults to the site-wide search_default.
registerlazysite/templates/registries/ without the .tt. Common values: sitemap.xml, llms.txt, feed.rss, feed.atom.
aliases/). A request for an alias returns a 301 Moved Permanently to the page's real URL - so links to a renamed or moved page keep working. The redirect always targets this page (an alias cannot point elsewhere). Example:
---
title: Pricing
aliases:
- /old-pricing
- /plans
---
A real page always wins over an alias, so an alias only takes effect when nothing else lives at that path. The alias list is kept up to date whenever the page is saved, renamed, moved or copied (manager or WebDAV) and cleared when it is deleted.
aliases_tempaliases, but the redirect is a 302 Found (temporary) instead of a 301 Moved Permanently - use it while a URL is only provisionally forwarding, so browsers and search engines do not cache the redirect. Same list syntax and same rules; a path listed under both keys is treated as temporary. Example:
---
title: Summer Sale
aliases_temp:
- /offer
---
The current alias map (with each entry's redirect type) is shown read-only on the manager Files page.
tt_page_varurl: (fetch a remote value), scan: (a list of pages), json: (decode a local JSON file into a data structure you can loop over), or ${ENV}. Page variables override site variables of the same name.
ttlttl: 300
nocachenocache: true renders the page fresh on every request - never served from or written to the cache. Use it for genuinely per-request content, such as showing the visitor their own IP with [% client_ip %]. See Showing the visitor's IP.
query_params[% query.name %]. Requests with matching parameters bypass the cache. See API and raw mode.
rawraw: true outputs the converted body with no layout wrapper (TT still resolves) - good for fragments and partials.
apiapi: true serves the body as data, with no Markdown pipeline and no layout. Default content type is application/json. Combine with tt_page_var and query_params for dynamic JSON.
content_typeContent-type header, used with raw: or api:, for a data artifact. Example: content_type: text/csv; charset=utf-8. Script-capable types (text/html, application/xhtml+xml, image/svg+xml) are not allowed on a raw/api page - they are downgraded to text/plain at serve time, because a verbatim, unescaped page served as HTML would be a cross-site-scripting vector. Publish HTML through a layout, or as a static file.
authrequired, optional, or none (default). See Authentication.
auth_groupspaymentformlazysite/forms/NAME.conf must exist. See Forms.
lazysite reads a practical subset of YAML. Use block style for lists and maps (one item per line under the key); quote values that begin with a special character or contain a colon; and write &/#-leading or ambiguous values in quotes. Folded (>) and literal (|) block scalars are not supported - keep a long value on one line.
See Authoring to get started, Advanced authoring for the how-to by topic, or the full Reference for configuration and template-variable keys.