Start with Single downloads or Catalog. Both read an explicit TOML file selected by extra.data in section or page front matter. They do not read global config.extra.downloads.

TemplateContentRequired front matter
downloads-hub.htmlSection (_index.md)title, extra.data
downloads-product.htmlPage inside a catalogtitle, extra.data, extra.product
downloads.htmlSection with simple download cardsSeparate front-matter contract

Root fields

FieldDefaultMeaning
modesinglesingle requires exactly one product; catalog lists products and links to their pages.
titleSection titleCatalog heading. Single and detail headings use the product name.
eyebrowEmptyShort text above the heading.
descriptionSection description in Single; empty in CatalogPage lead.
introEmptyMarkdown below the lead.
actionsEmptyHero actions: required label and url, optional style (primary or secondary).
channelEmptyOrdered release channels; each needs a unique non-empty id and label, with optional description.
supportEmptySupport levels with id, label, optional tone. Their order also controls support sorting, and each level becomes a filter pill with a build-time count.
productEmptyProduct records described below.
featuredOmittedOptional Catalog shortcuts: title, label, description, see_all_label. Only products marked featured = true appear here.
verificationOmittedShared instructions, commands and signing-key link.
mirrorEmptyShared download locations; each requires name and url.
labelsEnglish defaultsTranslatable interface labels.

TOML placement matters: root values and tables such as [verification] are separate from [product.status]. A field written under the wrong table will not configure the intended block. Keep root scalar values before any tables.

Products

Each [[product]] has these fields:

FieldRequiredMeaning
idYesUnique non-empty key matched by extra.product; not an inferred URL.
nameYesProduct heading.
urlCatalog onlyProduct detail route; prefer a Zola @/ content link.
vendorNoVendor label and Catalog filter value.
supportNoA declared support ID, used for the badge and Catalog filters.
summaryNoCatalog card summary and detail-page lead.
tagsNoArray of plain-text labels, also searched by Catalog.
imageNoLocal or remote product image, shown as a wide preview beside the product heading. Without one, a neutral file icon keeps the frame. Images are decorative because the adjacent heading names the product.
docs_url, docs_labelNoDocumentation link and optional label (defaults to labels.docs).
featuredNoInclude in Catalog's featured shortcuts when [featured] exists.
statusNoInformation block with optional label, title, description, and items = [{ label, value }]. It renders as a card section with one card per item, above verification and mirrors.
artifactNoOrdered files, grouped by the declared channel order. The selected channel is remembered across product pages.

IDs are data keys, not CSS classes. Do not use all as a support ID or vendor name: that value is reserved by the unrestricted Catalog filters. Product pages use their own front-matter title and description for metadata, even when the visible heading comes from the data file.

Artifacts

Each [[product.artifact]] requires channel and a non-empty name. It describes a package, source archive or installation image.

FieldMeaning
channelMust match a declared channel id. Unknown channels stop the build instead of hiding files.
name, variantPackage heading and optional format/edition beside it.
version, date, arch, size, kernelOptional plain-text metadata. kernel is useful for installation images. Values are displayed as supplied.
statusready, development or planned; defaults to planned.
urlDownload target. Missing/empty means unavailable.
recommendedShows a recommendation only when the download is enabled.
demoIf true, suppresses download/checksum/signature/torrent links and adds an Example label. Defaults to false.
sha_url, sig_url, torrent_urlOptional companion links. Rendered only when the artifact's download is enabled.
release_notesOptional release-notes route; can remain available for an unpublished artifact.

A non-empty url enables the link unless demo = true; status does not gate downloads. The Available badge additionally requires status = "ready". Unsupported status values should be corrected rather than used for custom labels; customize [labels] instead.

Links use DevLab's URL resolver: local paths include the deployment subpath, @/ links resolve content, and absolute HTTPS links stay unchanged. The theme does not add a download attribute, fetch release APIs, verify remote files or calculate metadata.

Verification and mirrors

[verification] accepts label, title, description, commands, key_url, key_label, sha_label and sig_label. Commands render as escaped code with a copy button. The other fields are plain text except the URLs. sha_label defaults to SHA256; sig_label defaults to labels.signature.

Each [[mirror]] needs name and url. Mirrors and verification are shared by every product in the data file. Omit them if there are no real instructions or published locations. Root instructions are not a substitute for matching each artifact with its own checksum and signature URL.

Both blocks render as full-width card sections below the product: verification keeps its heading and command block together, and mirrors wrap into a responsive grid of links with the visible URL beside each name. The command block stays inside a .content wrapper, which is what attaches the copy button.

Labels

All labels below can be overridden under [labels] in the data file. A translated data file can use a different subset; omitted labels fall back to English. Product names, channel labels and descriptions are authored data and must be translated separately.

KeysEnglish defaults
downloads, artifacts, channelsDownloads; Downloads; Release channels
download, unavailable, no_artifactsDownload; Not published; No files have been published for this product yet.
ready, development, plannedAvailable; In development; Planned
recommended, demo, release_notesRecommended; Example; Release notes
kernel, version, date, arch, sizeKernel; Version; Published; Architecture; Size
signature, docs, filesSignature; Documentation; Files
status, status_titleStatus; Project status
verification, verification_title, keyVerification; Verify your download; Public signing key
mirrors, mirrors_titleMirrors; Other download locations
catalog, featured, featured_title, all_productsProduct catalog; Featured; Selected products; All products
search, search_placeholderSearch; Name, vendor or tag
support, vendor, allSupport level; Vendor; All
sort, sort_default, sort_name, sort_supportSort; Default order; Name; Support level
resetReset filters
resultsShowing {count} of {total} products
no_resultsNo products match. Change the search or reset the filters.

Preserve {count} and {total} in results; the filter script replaces them with the current count. Sorting uses the page language. The control labels do not imply translation of your data.

Validation

The build rejects unknown modes, duplicate product/channel IDs, missing product IDs or names, missing Catalog product URLs, unknown artifact channels, and missing artifact names. A detail page must match exactly one product. Single must contain exactly one product.

Zola's normal template errors report missing required keys or malformed data. Run zola check as well as zola build: a syntactically valid URL is not proof that a remote file exists. Test controls in the browser; a static build does not verify filtering or the accessibility of your own labels.