<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Juicer</title>
  <link href="https://juicer.build/feed.xml" rel="self"/>
  <link href="https://juicer.build/"/>
  <id>https://juicer.build/feed.xml</id>
  <updated>2026-05-27T20:59:11.669095985Z</updated>
  <author><name>Ed Maxedon</name></author>
  <entry>
    <title>Troubleshooting</title>
    <link href="https://juicer.build/getting-started/troubleshooting/"/>
    <id>https://juicer.build/getting-started/troubleshooting/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Common things that go wrong with a fresh juicer install — and the one-line fix for each.</summary>
    <content type="html">&lt;p&gt;This page is organized by &lt;strong&gt;symptom&lt;/strong&gt;, not by feature. If something isn’t working, scan the headings for what you’re seeing on screen, then read the cause + fix below.&lt;/p&gt;
&lt;h2 id=&quot;build-install&quot;&gt;Build / install&lt;/h2&gt;
&lt;h3 id=&quot;sbt-juicerjvm-run-help-errors-out-before-printing-the-help-banner&quot;&gt;&lt;code&gt;sbt &apos;juicerJVM/run --help&apos;&lt;/code&gt; errors out before printing the help banner&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Either sbt itself can’t start (Java version too old; sbt couldn’t fetch its plugins) or the juicer build is broken (uncommitted edits to &lt;code&gt;build.sbt&lt;/code&gt;, missing dependency).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Confirm &lt;code&gt;java -version&lt;/code&gt; reports JDK 17 or newer; confirm &lt;code&gt;sbt sbtVersion&lt;/code&gt; reports 1.12.x. Then from the repo root:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;clean&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;compile&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;compile&lt;/code&gt; succeeds but &lt;code&gt;run&lt;/code&gt; doesn’t, the issue is dependency resolution — try &lt;code&gt;sbt update&lt;/code&gt; to re-fetch from Maven Central.&lt;/p&gt;
&lt;h3 id=&quot;not-a-readable-directory-src&quot;&gt;&lt;code&gt;not a readable directory: &amp;lt;src&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The &lt;code&gt;-s &amp;lt;src&amp;gt;&lt;/code&gt; path doesn’t exist, isn’t a directory, or you don’t have read permission. Often a typo or running from the wrong cwd.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Use an absolute path or &lt;code&gt;pwd &amp;amp;&amp;amp; ls &amp;lt;src&amp;gt;&lt;/code&gt; to confirm the directory exists from where you’re running sbt. Most juicer commands run relative to the cwd, so &lt;code&gt;sbt &apos;juicerJVM/run build -s docs/demos/juicerblog&apos;&lt;/code&gt; only works from the repo root.&lt;/p&gt;
&lt;h3 id=&quot;unknown-base-configuration-name&quot;&gt;&lt;code&gt;unknown base configuration: &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The &lt;code&gt;--config&lt;/code&gt; flag references a baseline that doesn’t exist. Valid values are &lt;code&gt;simple&lt;/code&gt;, &lt;code&gt;standard&lt;/code&gt; (default), and &lt;code&gt;norme&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Drop the flag — &lt;code&gt;standard&lt;/code&gt; is what 99% of sites want. If you need a different shape, see &lt;a href=&quot;/reference/config/&quot;&gt;Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;compile-errors-after-a-git-pull&quot;&gt;&lt;code&gt;compile&lt;/code&gt; errors after a &lt;code&gt;git pull&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; A dependency bumped to a version that needs &lt;code&gt;~/.ivy2/cache&lt;/code&gt; to refresh, or a Scala source file changed in a way sbt’s incremental compile didn’t catch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; &lt;code&gt;sbt clean&lt;/code&gt; then re-run. If a dep change is the issue, &lt;code&gt;sbt update&lt;/code&gt; first picks up the new artifacts before &lt;code&gt;compile&lt;/code&gt; rebuilds.&lt;/p&gt;
&lt;h2 id=&quot;layouts&quot;&gt;Layouts&lt;/h2&gt;
&lt;h3 id=&quot;layout-x-not-found-for-rendering-page-in-verbose-output&quot;&gt;&lt;code&gt;layout &apos;&amp;lt;X&amp;gt;&apos; not found for rendering &apos;&amp;lt;page&amp;gt;&apos;&lt;/code&gt; in verbose output&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Either the theme doesn’t ship a layout with that name, or the &lt;code&gt;layout:&lt;/code&gt; frontmatter on a page references one that isn’t there. Most often it’s a typo (&lt;code&gt;layout: hime&lt;/code&gt; instead of &lt;code&gt;layout: home&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Check the theme’s &lt;code&gt;layouts/_default/&lt;/code&gt; directory for the file you’re naming. Themes can opt out of certain layouts (juicerblog ships &lt;code&gt;home.html&lt;/code&gt; and &lt;code&gt;archive.html&lt;/code&gt;; juicerdocs doesn’t). The build doesn’t fail — it falls back to &lt;code&gt;file.html&lt;/code&gt; / &lt;code&gt;folder.html&lt;/code&gt; — but the page renders with default chrome instead of your intended layout.&lt;/p&gt;
&lt;h3 id=&quot;a-page-renders-with-the-wrong-layout&quot;&gt;A page renders with the wrong layout&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Frontmatter &lt;code&gt;layout: foo&lt;/code&gt; is being honored when you didn’t mean to set it, or vice versa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Inspect the page’s frontmatter — &lt;code&gt;layout:&lt;/code&gt; is the override; remove it to fall back to the theme default. See &lt;a href=&quot;/concepts/content-files/&quot;&gt;Content files&lt;/a&gt; for the layout-selection rules.&lt;/p&gt;
&lt;h3 id=&quot;a-index-md-renders-as-a-single-post-instead-of-a-section&quot;&gt;A &lt;code&gt;_index.md&lt;/code&gt; renders as a single post instead of a section&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The file isn’t named &lt;code&gt;_index.md&lt;/code&gt; (note the underscore) or sits in the wrong directory. Section pages MUST be named exactly &lt;code&gt;_index.md&lt;/code&gt; and live at the top of their section directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Rename &lt;code&gt;index.md&lt;/code&gt; → &lt;code&gt;_index.md&lt;/code&gt; and confirm it’s in the section root, not nested in a subdirectory.&lt;/p&gt;
&lt;h2 id=&quot;themes&quot;&gt;Themes&lt;/h2&gt;
&lt;h3 id=&quot;theme-renders-with-no-styling-at-all&quot;&gt;Theme renders with no styling at all&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The theme’s CSS file isn’t being copied to the output, OR the &lt;code&gt;&amp;lt;link rel=stylesheet&amp;gt;&lt;/code&gt; references a path that doesn’t resolve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; First check that the theme’s &lt;code&gt;static/&amp;lt;theme&amp;gt;.css&lt;/code&gt; was copied — &lt;code&gt;ls &amp;lt;dst&amp;gt;/&amp;lt;theme&amp;gt;.css&lt;/code&gt;. If it’s not there, your &lt;code&gt;themeDir&lt;/code&gt; / &lt;code&gt;theme&lt;/code&gt; keys in &lt;code&gt;site.toml&lt;/code&gt; aren’t pointing at the right directory. Run with &lt;code&gt;-v&lt;/code&gt; and look for a &lt;code&gt;theme: …&lt;/code&gt; line; the path it logs is what juicer is actually using.&lt;/p&gt;
&lt;h3 id=&quot;theme-add-git-url-fails-with-could-not-derive-theme-name&quot;&gt;&lt;code&gt;theme add &amp;lt;git-url&amp;gt;&lt;/code&gt; fails with “could not derive theme name”&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The git URL doesn’t end in something useful (&lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;repo-name&lt;/code&gt;). Common with custom git hosts or odd URL forms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Pass &lt;code&gt;-n &amp;lt;name&amp;gt;&lt;/code&gt; explicitly: &lt;code&gt;juicer theme add https://example.com/weird-url -n my-theme&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;a-new-theme-doesn-t-show-up-after-theme-add&quot;&gt;A new theme doesn’t show up after &lt;code&gt;theme add&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; You forgot to update &lt;code&gt;site.toml&lt;/code&gt; — &lt;code&gt;theme add&lt;/code&gt; only clones the directory; it doesn’t change the active theme.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Add &lt;code&gt;theme = &amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/code&gt; to &lt;code&gt;site.toml&lt;/code&gt;. Verify with &lt;code&gt;juicer config -s &amp;lt;src&amp;gt;&lt;/code&gt; — the active &lt;code&gt;theme&lt;/code&gt; value prints near the top.&lt;/p&gt;
&lt;h3 id=&quot;site-assets-logo-favicon-override-theme-assets-but-they-don-t-appear&quot;&gt;Site assets (logo, favicon) override theme assets but they don’t appear&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Site files DO win over theme files, but only when the file lives at the SAME relative path. A site &lt;code&gt;&amp;lt;src&amp;gt;/static/logo.png&lt;/code&gt; overrides a theme &lt;code&gt;themes/X/static/logo.png&lt;/code&gt; — but &lt;code&gt;&amp;lt;src&amp;gt;/img/logo.png&lt;/code&gt; doesn’t, because the theme expects &lt;code&gt;static/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Mirror the theme’s directory structure exactly. See &lt;a href=&quot;/concepts/themes/&quot;&gt;Themes&lt;/a&gt; for the overlay rules.&lt;/p&gt;
&lt;h2 id=&quot;blog-features&quot;&gt;Blog features&lt;/h2&gt;
&lt;h3 id=&quot;code-blocks-aren-t-highlighted&quot;&gt;Code blocks aren’t highlighted&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; No &lt;code&gt;&amp;lt;src&amp;gt;/grammars/&lt;/code&gt; directory exists, or the &lt;code&gt;*.tmLanguage.json&lt;/code&gt; file inside it doesn’t match the language tag on your fence. A block opened with &lt;code&gt;```scala&lt;/code&gt; looks for &lt;code&gt;grammars/scala.tmLanguage.json&lt;/code&gt; exactly — case-sensitive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Create &lt;code&gt;&amp;lt;src&amp;gt;/grammars/&lt;/code&gt;, drop in the grammar JSON for each language you use. See &lt;a href=&quot;/themes/juicerblog/configuration/#syntax-highlighting&quot;&gt;juicerblog → Configuration&lt;/a&gt; for the full setup. Run with &lt;code&gt;-v&lt;/code&gt; and look for the &lt;code&gt;highlighter: N grammar(s) loaded&lt;/code&gt; line — if you don’t see it, the directory is missing or empty.&lt;/p&gt;
&lt;h3 id=&quot;highlighted-code-has-no-colors&quot;&gt;Highlighted code has no colors&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The grammar loaded successfully but your theme has no CSS for the &lt;code&gt;.hl-*&lt;/code&gt; classes the highlighter emits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Themes that ship a palette (juicerblog, juicerdocs) handle this automatically. For a hand-rolled theme, copy the &lt;code&gt;.hl-keyword&lt;/code&gt; / &lt;code&gt;.hl-string&lt;/code&gt; / &lt;code&gt;.hl-comment&lt;/code&gt; / etc. block from &lt;code&gt;docs/themes/juicerblog/static/juicerblog.css&lt;/code&gt; and adapt the colors.&lt;/p&gt;
&lt;h3 id=&quot;date-archives-2024-etc-aren-t-being-emitted&quot;&gt;Date archives &lt;code&gt;/2024/&lt;/code&gt; etc. aren’t being emitted&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Either &lt;code&gt;dateArchives = true&lt;/code&gt; isn’t set in &lt;code&gt;site.toml&lt;/code&gt;, OR the theme doesn’t ship &lt;code&gt;_default/date-year.html&lt;/code&gt; and &lt;code&gt;date-month.html&lt;/code&gt; (missing layout = silent skip), OR no posts have parseable explicit &lt;code&gt;date:&lt;/code&gt; frontmatter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Confirm all three:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;grep dateArchives &amp;lt;src&amp;gt;/site.toml&lt;/code&gt; returns &lt;code&gt;dateArchives = true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The theme has the layouts: &lt;code&gt;ls &amp;lt;theme&amp;gt;/layouts/_default/date-*.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;At least one post has &lt;code&gt;date: 2024-MM-DD&lt;/code&gt; (or similar) in its frontmatter — pages whose date came from the filesystem mtime fallback are intentionally excluded.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;tag-pages-don-t-include-a-post-that-has-the-tag&quot;&gt;Tag pages don’t include a post that has the tag&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Either the post has &lt;code&gt;static: true&lt;/code&gt; frontmatter (filtered out of all post listings), or the tag’s slug doesn’t match what you typed in the URL. Tags are slugified (lowercased, ASCII-folded, runs of non-alphanumeric collapsed to &lt;code&gt;-&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Visit &lt;code&gt;/tags/&lt;/code&gt; to see the canonical slug juicer derived. If your post has &lt;code&gt;static: true&lt;/code&gt;, that’s why — see &lt;a href=&quot;/themes/juicerblog/configuration/#per-page-frontmatter&quot;&gt;juicerblog → Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;author-archive-page-is-empty-even-though-the-author-has-posts&quot;&gt;Author archive page is empty even though the author has posts&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The frontmatter &lt;code&gt;author:&lt;/code&gt; (or &lt;code&gt;authors:&lt;/code&gt;) value doesn’t match any &lt;code&gt;id&lt;/code&gt; in the &lt;code&gt;[[authors]]&lt;/code&gt; registry. juicer falls back to a stub &lt;code&gt;{id: &amp;lt;typo&amp;gt;}&lt;/code&gt; so templates don’t NPE, but the archive is empty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Compare &lt;code&gt;grep &amp;quot;^author:&amp;quot; content/*.md&lt;/code&gt; output against the &lt;code&gt;id =&lt;/code&gt; values in your &lt;code&gt;site.toml&lt;/code&gt; &lt;code&gt;[[authors]]&lt;/code&gt; blocks — typos are the usual culprit.&lt;/p&gt;
&lt;h3 id=&quot;permalinks-permalinks-aren-t-applying&quot;&gt;Permalinks &lt;code&gt;[permalinks]&lt;/code&gt; aren’t applying&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The section name in &lt;code&gt;[permalinks]&lt;/code&gt; doesn’t match the content directory. &lt;code&gt;[permalinks] posts = &amp;quot;:year/:slug/&amp;quot;&lt;/code&gt; only applies to pages under &lt;code&gt;content/posts/&lt;/code&gt; — posts at the root of &lt;code&gt;content/&lt;/code&gt; are unaffected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Either move posts under &lt;code&gt;content/posts/&lt;/code&gt; (recommended for blogs) or list the actual section names you have in &lt;code&gt;[permalinks]&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;aliases-redirect-to-the-wrong-place&quot;&gt;Aliases redirect to the wrong place&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The &lt;code&gt;aliases:&lt;/code&gt; frontmatter list contains the wrong shape — usually missing the leading &lt;code&gt;/&lt;/code&gt; or trailing &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Each alias is a URL path with both leading and trailing slash: &lt;code&gt;aliases: [/old-name/, /even-older/]&lt;/code&gt;. Check the rendered alias HTML at &lt;code&gt;&amp;lt;dst&amp;gt;/&amp;lt;alias&amp;gt;/index.html&lt;/code&gt; to see what redirect URL got baked in.&lt;/p&gt;
&lt;h2 id=&quot;serve-live-reload&quot;&gt;Serve / live reload&lt;/h2&gt;
&lt;h3 id=&quot;juicer-serve-fails-with-address-already-in-use&quot;&gt;&lt;code&gt;juicer serve&lt;/code&gt; fails with “address already in use”&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Another process (often a previous juicer serve you forgot to stop) holds the port.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Pass a different port: &lt;code&gt;-p 8089&lt;/code&gt;. juicer’s bind-with-retry loop also scans 20 ports upward from the default, so &lt;code&gt;-p 8088&lt;/code&gt; will find the next free one if 8088 is taken — watch for the actual port in the startup banner.&lt;/p&gt;
&lt;h3 id=&quot;live-reload-doesn-t-fire-when-i-save-a-markdown-file&quot;&gt;Live-reload doesn’t fire when I save a markdown file&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; The &lt;code&gt;-L&lt;/code&gt; (or &lt;code&gt;--live-reload&lt;/code&gt;) flag wasn’t passed, OR your browser stopped polling the live-reload endpoint, OR the file you saved is outside the watched directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Confirm the startup banner says &lt;code&gt;live reload: enabled&lt;/code&gt;. Open browser devtools → Network and reload the page; you should see a long-lived &lt;code&gt;fetch&lt;/code&gt; to &lt;code&gt;/__juicer/wait?since=N&lt;/code&gt; (the live-reload script is injected before &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; in every HTML response). Saves are debounced 150ms — don’t expect saves faster than that to coalesce, but anything slower should reload within a second. If the page hasn’t been opened with the dev server (e.g., a &lt;code&gt;file://&lt;/code&gt; URL or a stale cached tab), the script never loaded and reloads never fire — open the page through &lt;code&gt;http://localhost:&amp;lt;port&amp;gt;/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;browser-shows-old-content-even-after-a-save&quot;&gt;Browser shows old content even after a save&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Browser cache holds the page even though juicer rebuilt it. juicer’s &lt;code&gt;serve&lt;/code&gt; sends &lt;code&gt;Cache-Control: no-cache&lt;/code&gt; headers when &lt;code&gt;-L&lt;/code&gt; is on, but a stale service worker or aggressive CDN proxy can override.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Hard reload (Cmd-Shift-R / Ctrl-Shift-R). If that doesn’t fix it, devtools → Application → Service Workers → unregister.&lt;/p&gt;
&lt;h2 id=&quot;templates&quot;&gt;Templates&lt;/h2&gt;
&lt;h3 id=&quot;unknown-variable-x-at-build-time&quot;&gt;&lt;code&gt;unknown variable: X&lt;/code&gt; at build time&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; A &lt;code&gt;{{ X }}&lt;/code&gt; reference points at a variable that isn’t in scope at that point in rendering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Most variables come from one of three sources: &lt;code&gt;.page.&amp;lt;...&amp;gt;&lt;/code&gt; (per-page frontmatter + computed fields), &lt;code&gt;.site.&amp;lt;...&amp;gt;&lt;/code&gt; (site config + global indexes), or local &lt;code&gt;:=&lt;/code&gt; assignments. Check &lt;a href=&quot;/reference/template-data/&quot;&gt;Template data&lt;/a&gt; for the available shapes. A common gotcha inside &lt;code&gt;for&lt;/code&gt; loops: &lt;code&gt;.foo&lt;/code&gt; resolves against the current iterated element, not the outer scope — use &lt;code&gt;$.foo&lt;/code&gt; to escape back to the root data.&lt;/p&gt;
&lt;h3 id=&quot;not-a-number-x-java-lang-y-in-template-comparisons&quot;&gt;&lt;code&gt;not a number: &amp;lt;X&amp;gt; (java.lang.Y)&lt;/code&gt; in template comparisons&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; Squiggly’s relational ops (&lt;code&gt;&amp;lt; &amp;gt; &amp;lt;= &amp;gt;= = !=&lt;/code&gt;) need both sides to be numeric. A boxed Java type can fail to convert if it’s an unusual shape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Bumped to squiggly 0.2.4? That release added boxed-Number coercion. Earlier versions tripped on &lt;code&gt;for x, i &amp;lt;- coll&lt;/code&gt; indices. &lt;code&gt;cd &amp;lt;repo&amp;gt;; grep squiggly build.sbt&lt;/code&gt; should show 0.2.4 or newer.&lt;/p&gt;
&lt;h3 id=&quot;markdown-body-content-doesn-t-render-its-for-loops&quot;&gt;Markdown body content doesn’t render its &lt;code&gt;{{ for ... }}&lt;/code&gt; loops&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cause.&lt;/strong&gt; &lt;strong&gt;Intentional&lt;/strong&gt;, not a bug. Squiggly templates inside a markdown body are HTML-escaped before rendering — they get treated as literal text. Only files in &lt;code&gt;layouts/&lt;/code&gt; and &lt;code&gt;partials/&lt;/code&gt; execute templates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix.&lt;/strong&gt; Move the loop into a layout or partial, and have the markdown call it via shortcode or by being short enough to live inside the layout directly.&lt;/p&gt;
&lt;h2 id=&quot;when-all-else-fails&quot;&gt;When all else fails&lt;/h2&gt;
&lt;p&gt;Run with &lt;code&gt;-v&lt;/code&gt; (verbose) to see every step of the build — file walks, layout selection, what’s being written where:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run build -s &amp;lt;src&amp;gt; -v&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If something’s silently being skipped (missing layout, filtered page, etc.) the verbose output usually shows the line where it bailed. Paste the relevant slice into a &lt;a href=&quot;https://github.com/edadma/juicer/issues&quot;&gt;GitHub issue&lt;/a&gt; along with the smallest reproducer that surfaces it.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Theming</title>
    <link href="https://juicer.build/reference/theming/"/>
    <id>https://juicer.build/reference/theming/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Per-site overrides for theme colours, fonts, sizing, and layout — without forking the theme.</summary>
    <content type="html">&lt;p&gt;The bundled themes (&lt;code&gt;juicerdocs&lt;/code&gt;, &lt;code&gt;juicerblog&lt;/code&gt;, &lt;code&gt;juicerchurch&lt;/code&gt;,
&lt;code&gt;juicercafe&lt;/code&gt;, &lt;code&gt;juicerlanding&lt;/code&gt;, &lt;code&gt;juicerportfolio&lt;/code&gt;) are designed so a
site can rebrand and retune them without touching theme source. There
are three layers of override — use whichever fits the change you
want to make.&lt;/p&gt;
&lt;h2 id=&quot;layer-1-palette-and-token-overrides-via-juicerxxx&quot;&gt;Layer 1 — palette and token overrides via &lt;code&gt;[juicerXxx]&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Each theme reads a &lt;code&gt;[juicerXxx]&lt;/code&gt; table from &lt;code&gt;site.toml&lt;/code&gt; (where &lt;code&gt;Xxx&lt;/code&gt;
is the theme’s name) and emits an inline &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; block in
&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. CSS custom properties get overridden on &lt;code&gt;:root&lt;/code&gt; (light) or
&lt;code&gt;[data-theme=&amp;quot;dark&amp;quot;]&lt;/code&gt; (dark). The bundled CSS file is unchanged
across every site that uses the theme — only the small inline block
differs.&lt;/p&gt;
&lt;p&gt;This is the cheapest, fastest theming layer — use it for colour
adjustments, font swaps, prose-column widening.&lt;/p&gt;
&lt;h3 id=&quot;palette-tokens-all-four-themes&quot;&gt;Palette tokens (all four themes)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;CSS variable&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Primary brand colour. Hero accents, link underlines, focus rings.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandStrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-strong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Darker variant for emphasised text + headings on light bg.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandSoft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-soft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Tinted background for active states, badges, pull quotes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Secondary accent colour (often warm) for CTAs and highlights.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Tertiary “alive / fresh” colour — recurring-event chips, success states.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For each light token there is a dark variant: &lt;code&gt;brandDark&lt;/code&gt;,
&lt;code&gt;brandStrongDark&lt;/code&gt;, &lt;code&gt;brandSoftDark&lt;/code&gt;, &lt;code&gt;accentDark&lt;/code&gt;, &lt;code&gt;leafDark&lt;/code&gt;. Set them
to override the theme’s hardcoded dark palette without leaking into
light mode.&lt;/p&gt;
&lt;h3 id=&quot;typography-tokens&quot;&gt;Typography tokens&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;CSS variable&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-sans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Body / UI sans stack&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSerif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-serif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Serif stack (cafe / church / blog / portfolio — juicerdocs and juicerlanding are sans-only)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontMono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-mono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Code / monospace stack&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pass a full CSS font stack including fallbacks — e.g.
&lt;code&gt;fontSans = &amp;quot;&apos;Inter&apos;, system-ui, sans-serif&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;sizing-tokens&quot;&gt;Sizing tokens&lt;/h3&gt;
&lt;p&gt;The chrome-sizing surface differs by theme — each exposes the tokens
it actually uses.&lt;/p&gt;
&lt;p&gt;For &lt;code&gt;juicercafe&lt;/code&gt;, &lt;code&gt;juicerchurch&lt;/code&gt;, &lt;code&gt;juicerblog&lt;/code&gt;, &lt;code&gt;juicerlanding&lt;/code&gt;,
&lt;code&gt;juicerportfolio&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;CSS variable&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prose column max-width (default &lt;code&gt;38rem&lt;/code&gt;; juicerlanding &lt;code&gt;65ch&lt;/code&gt;; juicerportfolio &lt;code&gt;62ch&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Outer padding around content blocks&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;radiusLg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--radius-lg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Large border-radius (cards, hero panels)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For &lt;code&gt;juicerdocs&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;CSS variable&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contentMax&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--content-max&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prose column max-width (default &lt;code&gt;48rem&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sidebarW&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--sidebar-w&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Left sidebar width (default &lt;code&gt;16rem&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;railW&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--rail-w&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Right TOC rail width (default &lt;code&gt;18rem&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;radiusLg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--radius-lg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Large border-radius&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;example-quietly-retune-juicercafe-to-a-teal-palette&quot;&gt;Example — quietly retune juicercafe to a teal palette&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicercafe&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
brand           &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#0f766e&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# teal-700&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; teal-700
brandStrong     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#134e4a&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# teal-900&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; teal-900
brandSoft       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#ccfbf1&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# teal-100&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; teal-100
accent          &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#7c3aed&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# violet-600&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; violet-600
brandDark       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#5eead4&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# teal-300 — lifted for dark bg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; teal-300 — lifted for dark bg
brandStrongDark &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#99f6e4&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# teal-200&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; teal-200
brandSoftDark   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;rgba(94, 234, 212, 0.18)&amp;quot;&lt;/span&gt;
accentDark      &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#a78bfa&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# violet-400&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; violet-400
fontSerif       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Source Serif 4&apos;, Georgia, serif&amp;quot;&lt;/span&gt;
measure         &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;42rem&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;layer-2-customcss-drop-your-own-stylesheet-alongside-the-theme&quot;&gt;Layer 2 — &lt;code&gt;customCSS&lt;/code&gt;: drop your own stylesheet alongside the theme&lt;/h2&gt;
&lt;p&gt;For overrides that don’t fit a CSS variable (custom selectors, new
animations, third-party widgets), drop a stylesheet under
&lt;code&gt;static/site.css&lt;/code&gt; (or any name) and list it in &lt;code&gt;site.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;customCSS &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;site.css&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The theme’s &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; partial emits each entry as a &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;/code&gt; &lt;strong&gt;after&lt;/strong&gt; the bundled theme CSS, so anything in
your file overrides anything in the theme. Multiple entries load in
the order listed:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;customCSS &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;fonts.css&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;branding.css&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;site.css&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the right layer for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Loading a &lt;code&gt;@font-face&lt;/code&gt; block for a custom font (then point
&lt;code&gt;[juicerXxx] fontSerif&lt;/code&gt; at it).&lt;/li&gt;
&lt;li&gt;Adding entire new widgets that the theme doesn’t ship.&lt;/li&gt;
&lt;li&gt;Vendor / third-party CSS (Mermaid, KaTeX skin, etc.) that has to
load on every page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Files referenced by &lt;code&gt;customCSS&lt;/code&gt; are still site &lt;code&gt;static/&lt;/code&gt; content;
they’re copied verbatim during build.&lt;/p&gt;
&lt;h2 id=&quot;layer-3-replace-a-theme-file-outright&quot;&gt;Layer 3 — replace a theme file outright&lt;/h2&gt;
&lt;p&gt;When a site puts a file in &lt;code&gt;static/&lt;/code&gt; with the same path as one the
theme ships, the &lt;strong&gt;site copy wins&lt;/strong&gt; during the build. So a site can
ship its own &lt;code&gt;static/juicercafe.css&lt;/code&gt; to fully replace the theme’s
stylesheet (verified by the &lt;code&gt;should ship theme static/ files; site static/ overwrites on path collision&lt;/code&gt; build test).&lt;/p&gt;
&lt;p&gt;Use this layer sparingly — you lose theme updates for any file you
replace. Layers 1 and 2 cover almost every customisation need; reach
for Layer 3 only when you need to fork.&lt;/p&gt;
&lt;h2 id=&quot;site-wide-chrome-keys&quot;&gt;Site-wide chrome keys&lt;/h2&gt;
&lt;p&gt;Top-level &lt;code&gt;site.toml&lt;/code&gt; keys, distinct from the per-theme &lt;code&gt;[juicerXxx]&lt;/code&gt;
tables. Every theme reads them.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path used in &lt;code&gt;&amp;lt;link rel=&amp;quot;icon&amp;quot;&amp;gt;&lt;/code&gt;. Browser infers MIME from extension.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;true&lt;/code&gt; to omit the “Built with juicer” footer line.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;repoURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Git host URL. juicerdocs surfaces a topbar GitHub icon and a homepage “Star on GitHub” button when set; other themes ignore.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;customCSS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;List of stylesheet paths to load after the bundled theme CSS — see Layer 2 above.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;authorsPath&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/authors/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL prefix for the team listing + per-author archives. See &lt;a href=&quot;/reference/template-data/#renaming-the-url-prefix-authorspath&quot;&gt;Template data → authorsPath&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content>
  </entry>
  <entry>
    <title>Themes</title>
    <link href="https://juicer.build/concepts/themes/"/>
    <id>https://juicer.build/concepts/themes/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Drop-in skins that ship layouts, partials, shortcodes, and static assets.</summary>
    <content type="html">&lt;p&gt;A juicer theme is a directory under &lt;code&gt;themes/&amp;lt;name&amp;gt;/&lt;/code&gt; with the same shape as a site:&lt;/p&gt;
&lt;pre class=&quot;juicer-filetree&quot;&gt;
themes/juicerdocs/
├── layouts/
│   └── _default/
│       ├── baseof.html
│       ├── file.html
│       └── folder.html
├── partials/
│   └── ...
├── shortcodes/
│   └── ...
└── static/
    └── ...
&lt;/pre&gt;
&lt;p&gt;Activate it from &lt;code&gt;site.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;theme &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerdocs&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s it. Juicer scans the theme directory before the site directory and merges the two — site files &lt;strong&gt;win on key collisions&lt;/strong&gt;, so you can override any individual layout, partial, shortcode, or static asset without forking the theme.&lt;/p&gt;
&lt;h2 id=&quot;theme-chains&quot;&gt;Theme chains&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;theme&lt;/code&gt; key also accepts an array, in which case earlier entries override later ones:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;theme &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;my-overrides&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerdocs&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now &lt;code&gt;my-overrides/&lt;/code&gt; wins over &lt;code&gt;juicerdocs/&lt;/code&gt;, which wins over the site itself? No — site always wins. Order is &lt;strong&gt;site &amp;gt; my-overrides &amp;gt; juicerdocs&lt;/strong&gt;. This is useful when you want to reuse most of &lt;code&gt;juicerdocs&lt;/code&gt; but customize, say, the topbar with a tiny overlay theme of your own.&lt;/p&gt;
&lt;p&gt;A theme can also pull in other themes itself, by declaring them in its own &lt;code&gt;theme.toml&lt;/code&gt; — that’s how every bundled theme inherits &lt;code&gt;juicercommon&lt;/code&gt;. The site-level &lt;code&gt;theme&lt;/code&gt; list and each theme’s declared &lt;code&gt;inherits&lt;/code&gt; are resolved together into one lookup chain, first-wins throughout. &lt;a href=&quot;/concepts/theme-inheritance/&quot;&gt;Theme inheritance&lt;/a&gt; covers the resolution rules.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Theme directories live under &lt;code&gt;themes/&lt;/code&gt; because that’s the &lt;code&gt;themeDir&lt;/code&gt; config key’s default. Set &lt;code&gt;themeDir = &amp;quot;&amp;quot;&lt;/code&gt; if you want themes to live at the site root, or any other path that fits your repo layout.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;what-a-theme-can-ship&quot;&gt;What a theme can ship&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Subdirectory&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layouts/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Templates for the various page kinds (&lt;code&gt;_default/file.html&lt;/code&gt;, etc.)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;partials/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Reusable template fragments — called via &lt;code&gt;{{ partial &apos;name&apos; . }}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;shortcodes/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Markdown-callable templates — invoked via &lt;code&gt;[= name =]…[= /name =]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Files copied verbatim into the output tree&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Themes do &lt;strong&gt;not&lt;/strong&gt; ship content (no &lt;code&gt;content/&lt;/code&gt; directory inside a theme is ever read), nor do they get top-level “other templates” rendered (HTML templates outside of those directories are always relative to the user’s site).&lt;/p&gt;
&lt;h2 id=&quot;picking-the-right-primitive&quot;&gt;Picking the right primitive&lt;/h2&gt;
&lt;div class=&quot;juicer-tabs&quot; data-juicer-tabs&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;Partial&quot;&gt;
  &lt;p&gt;A &lt;em&gt;partial&lt;/em&gt; is a reusable HTML fragment called from another template. It receives whatever data context you pass in.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;topbar&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;topbar&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use partials for: page chrome, repeated UI elements, anything you’d factor out of HTML.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;Shortcode&quot;&gt;
  &lt;p&gt;A &lt;em&gt;shortcode&lt;/em&gt; is a partial called from &lt;strong&gt;inside markdown content&lt;/strong&gt;, via the &lt;code&gt;[= name =]&lt;/code&gt; syntax. Authors write content with shortcodes inline:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= note =]
This is a note callout.
[= /note =]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use shortcodes for: callouts, tabbed examples, embedded media, anything that’s content but needs richer HTML than markdown alone provides.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;Layout&quot;&gt;
  &lt;p&gt;A &lt;em&gt;layout&lt;/em&gt; is the top-level template for a page kind. Juicer picks the right one by name and folder lookup.&lt;/p&gt;
&lt;p&gt;Use layouts for: the actual &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; skeleton and the per-page-kind structural rules.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;bundled-themes&quot;&gt;Bundled themes&lt;/h2&gt;
&lt;p&gt;Eleven themes ship in the juicer repo, each tuned for a different shape of
site. Pick the closest match and override individual files from your own
&lt;code&gt;layouts/&lt;/code&gt; or &lt;code&gt;static/&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Theme&lt;/th&gt;&lt;th&gt;Where it lives&lt;/th&gt;&lt;th&gt;What it’s for&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicerdocs/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Documentation sites — sidebar nav, “On this page” rail, callout shortcodes. Powers this site.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerblog&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicerblog/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Blogs — post lists with pagination, tag/category/year archives, series nav, author bylines, server-side syntax highlighting.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicerstudy/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Long-form prose — essays, study notes, reading journals, lecture notes. Serif reading column, optional KaTeX math, undated by default.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerlanding&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicerlanding/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Product / SaaS landing pages — single-page section stack (hero, features, pricing, testimonials, FAQ) driven entirely from &lt;code&gt;site.toml&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerportfolio&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicerportfolio/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Designer / studio portfolios — image-first project grid, per-project hero + meta sidebar + gallery.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicergallery&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicergallery/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Photo galleries — masonry/grid albums, lightbox-ready photo cards, EXIF-light captions.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicercafe&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicercafe/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Cafés, small businesses, restaurants — hours widget, menu sections, photo albums, events list.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicercook&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicercook/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Recipe sites — Recipe JSON-LD, recipe cards, ingredient/step layout, print-friendly stylesheet.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerchurch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicerchurch/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Churches, ministries — sermon archive, recurring-event calendar grid, ministries section, photo albums.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerpodcast&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicerpodcast/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Podcasts — episode list, per-episode player + show notes, RSS subscribe links.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerwiki&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/themes/juicerwiki/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Personal wikis / digital gardens — backlinks, tag cloud, wiki-style search.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These eleven all inherit a twelfth, hidden theme: &lt;strong&gt;&lt;code&gt;juicercommon&lt;/code&gt;&lt;/strong&gt;, the
shared base that holds the partials, shortcodes, and scripts every theme
has in common (the &lt;code&gt;seo&lt;/code&gt; block, the dark-mode init/toggle scripts, and the
note/tip/warning/tabs/github/… shortcodes). You never select &lt;code&gt;juicercommon&lt;/code&gt;
directly — each theme’s &lt;code&gt;theme.toml&lt;/code&gt; lists it under &lt;code&gt;inherits&lt;/code&gt;. See
&lt;a href=&quot;/concepts/theme-inheritance/&quot;&gt;Theme inheritance&lt;/a&gt; for how that resolution
works.&lt;/p&gt;
&lt;p&gt;Each theme has its own section under &lt;a href=&quot;/themes/&quot;&gt;Themes&lt;/a&gt; (linked from the
sidebar) with a “what’s in the box” overview and a configuration page
that catalogues every &lt;code&gt;[juicerXxx]&lt;/code&gt; token, top-level chrome key, and
per-page frontmatter convention.&lt;/p&gt;
&lt;p&gt;A working demo site lives under &lt;code&gt;docs/demos/&lt;/code&gt; for every bundled theme
— for instance, &lt;code&gt;docs/demos/juicerblog/&lt;/code&gt; mirrors &lt;code&gt;juicerblog&lt;/code&gt;‘s feature
matrix, and &lt;code&gt;docs/demos/juicerlanding/&lt;/code&gt; exercises every section block in
&lt;code&gt;juicerlanding&lt;/code&gt;. The deploy pipeline builds each demo into
&lt;code&gt;/themes/&amp;lt;theme&amp;gt;/demo/&lt;/code&gt; so the sidebar’s “Demo site” leaf for each theme
serves it live. Start from the closest demo and edit downward:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerblog -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
sbt &apos;juicerJVM/run serve -s docs/demos/juicerportfolio -L&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;building-your-own&quot;&gt;Building your own&lt;/h2&gt;
&lt;p&gt;Reading through any bundled theme end-to-end is a quick tour of the
conventions. &lt;code&gt;juicerdocs&lt;/code&gt; is the most complete demo of every theme
primitive (layouts, partials, shortcodes, static); &lt;code&gt;juicerblog&lt;/code&gt; is the
smallest theme that touches the blog-specific engine features;
&lt;code&gt;juicerlanding&lt;/code&gt; is the cleanest demo of a frontmatter-driven page that
assembles itself from &lt;code&gt;site.toml&lt;/code&gt; blocks.&lt;/p&gt;
&lt;a href=&quot;https://github.com/edadma/juicer&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;juicer-github&quot;&gt;
  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M12 .5C5.65.5.5 5.65.5 12c0 5.07 3.29 9.36 7.86 10.88.58.1.79-.25.79-.56v-2c-3.2.7-3.87-1.36-3.87-1.36-.52-1.32-1.27-1.67-1.27-1.67-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.18 1.76 1.18 1.02 1.75 2.69 1.24 3.35.95.1-.74.4-1.24.72-1.52-2.55-.29-5.23-1.27-5.23-5.66 0-1.25.45-2.27 1.18-3.07-.12-.29-.51-1.46.11-3.04 0 0 .96-.31 3.15 1.18a10.95 10.95 0 0 1 5.74 0c2.19-1.49 3.15-1.18 3.15-1.18.62 1.58.23 2.75.11 3.04.74.8 1.18 1.82 1.18 3.07 0 4.4-2.69 5.36-5.25 5.65.41.36.78 1.06.78 2.13v3.16c0 .31.21.67.8.55C20.21 21.36 23.5 17.07 23.5 12 23.5 5.65 18.35.5 12 .5Z&quot;/&gt;&lt;/svg&gt;
  &lt;div class=&quot;juicer-github-body&quot;&gt;
    &lt;span class=&quot;juicer-github-name&quot;&gt;edadma/juicer&lt;/span&gt;
    &lt;span class=&quot;juicer-github-sub&quot;&gt;GitHub repository&lt;/span&gt;
  &lt;/div&gt;
&lt;/a&gt;</content>
  </entry>
  <entry>
    <title>Theme inheritance</title>
    <link href="https://juicer.build/concepts/theme-inheritance/"/>
    <id>https://juicer.build/concepts/theme-inheritance/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>How a theme pulls in other themes via theme.toml, and how the full lookup chain is resolved.</summary>
    <content type="html">&lt;p&gt;A theme can build on other themes. It declares them in a &lt;code&gt;theme.toml&lt;/code&gt; file
at its own root:&lt;/p&gt;
&lt;pre class=&quot;juicer-filetree&quot;&gt;
themes/juicerdocs/
├── theme.toml          ← inherits = [&quot;juicercommon&quot;]
├── layouts/
├── partials/
└── static/
&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# themes/juicerdocs/theme.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; themes/juicerdocs/theme.toml
inherits &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicercommon&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When a site activates &lt;code&gt;juicerdocs&lt;/code&gt;, juicer doesn’t just look in
&lt;code&gt;juicerdocs/&lt;/code&gt; — it walks the &lt;code&gt;inherits&lt;/code&gt; list too, splicing each named theme
into the lookup chain right after the theme that named it. Partials,
shortcodes, layouts, and static files all resolve against this expanded
chain.&lt;/p&gt;
&lt;p&gt;This is how the bundled themes share code: each one inherits
&lt;a href=&quot;/concepts/themes/#bundled-themes&quot;&gt;&lt;code&gt;juicercommon&lt;/code&gt;&lt;/a&gt;, the hidden base theme
that holds the &lt;code&gt;seo&lt;/code&gt; block, the dark-mode init/toggle scripts, and the
common shortcodes (&lt;code&gt;note&lt;/code&gt;, &lt;code&gt;tip&lt;/code&gt;, &lt;code&gt;warning&lt;/code&gt;, &lt;code&gt;tabs&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;, …). No theme
duplicates them.&lt;/p&gt;
&lt;h2 id=&quot;the-lookup-chain&quot;&gt;The lookup chain&lt;/h2&gt;
&lt;p&gt;Start from the site’s &lt;code&gt;theme&lt;/code&gt; setting — a single name or an array — and
walk each theme’s &lt;code&gt;inherits&lt;/code&gt; depth-first. The result is one ordered chain.
Resolution is &lt;strong&gt;first-wins&lt;/strong&gt;: the earliest place a file is found is the one
that’s used.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# site.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; site.toml
theme &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerdocs&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# themes/juicerdocs/theme.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; themes/juicerdocs/theme.toml
inherits &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicercommon&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;resolves to the chain:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;site  &amp;gt;  juicerdocs  &amp;gt;  juicercommon
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So a &lt;code&gt;partials/seo.html&lt;/code&gt; in your site beats &lt;code&gt;juicerdocs&lt;/code&gt;‘s, which beats
&lt;code&gt;juicercommon&lt;/code&gt;‘s. Drop your own &lt;code&gt;partials/note.html&lt;/code&gt; into &lt;code&gt;juicerdocs/&lt;/code&gt; and
it overrides the shared shortcode without touching &lt;code&gt;juicercommon&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Inheritance composes with the site-level theme &lt;strong&gt;array&lt;/strong&gt;. Both are resolved
into the same chain — the array first, then each entry’s &lt;code&gt;inherits&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# site.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; site.toml
theme &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;my-overrides&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerdocs&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;site  &amp;gt;  my-overrides  &amp;gt;  juicerdocs  &amp;gt;  juicercommon
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;inherits&lt;/code&gt; is transitive: if &lt;code&gt;juicercommon&lt;/code&gt; itself declared
&lt;code&gt;inherits = [&amp;quot;base&amp;quot;]&lt;/code&gt;, &lt;code&gt;base&lt;/code&gt; would land at the end of the chain.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Precedence never changes: &lt;strong&gt;site files always win&lt;/strong&gt;, then themes in chain
order. Inheritance only makes the chain longer — it never lets a theme
override the site.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;deduplication&quot;&gt;Deduplication&lt;/h2&gt;
&lt;p&gt;A theme reached more than once — a diamond, where two themes both inherit a
common base — appears in the chain &lt;strong&gt;once&lt;/strong&gt;, at its earliest position:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# site.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; site.toml
theme &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;themeA&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;themeB&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# both inherit &amp;quot;shared&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; both inherit &amp;quot;shared&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;site  &amp;gt;  themeA  &amp;gt;  shared  &amp;gt;  themeB
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;shared&lt;/code&gt; resolves once, kept at its first occurrence. A file defined in
&lt;code&gt;themeA&lt;/code&gt;, &lt;code&gt;themeB&lt;/code&gt;, and &lt;code&gt;shared&lt;/code&gt; is won by &lt;code&gt;themeA&lt;/code&gt; (earliest in the chain).&lt;/p&gt;
&lt;h2 id=&quot;errors&quot;&gt;Errors&lt;/h2&gt;
&lt;div class=&quot;juicer-callout juicer-callout-warning&quot;&gt;
  &lt;strong&gt;Warning&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;A theme that lists a non-existent theme in &lt;code&gt;inherits&lt;/code&gt; fails the build with a
clear message:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;theme &apos;juicerdocs&apos; inherits unknown theme &apos;typo&apos; — no directory at …
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;strong&gt;cycle&lt;/strong&gt; — &lt;code&gt;A&lt;/code&gt; inherits &lt;code&gt;B&lt;/code&gt; inherits &lt;code&gt;A&lt;/code&gt; — also fails, with the path
traced so you can see where it closes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;theme cycle: themeA → themeB → themeA
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A missing theme named at the &lt;strong&gt;site level&lt;/strong&gt; (in &lt;code&gt;site.toml&lt;/code&gt;‘s &lt;code&gt;theme&lt;/code&gt;) is
treated leniently — it’s simply skipped — matching juicer’s long-standing
behavior. Only &lt;code&gt;inherits&lt;/code&gt; links are validated strictly, because a theme
author controls its own dependencies.&lt;/p&gt;
&lt;h2 id=&quot;no-theme-toml&quot;&gt;No theme.toml?&lt;/h2&gt;
&lt;p&gt;A theme with no &lt;code&gt;theme.toml&lt;/code&gt; inherits nothing — it’s exactly equivalent to
&lt;code&gt;inherits = []&lt;/code&gt;. Themes written before this feature existed keep working
byte-for-byte; inheritance is purely additive.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;code&gt;theme.toml&lt;/code&gt; currently understands a single key, &lt;code&gt;inherits&lt;/code&gt;. It’s the one
place themes declare their dependencies, so a theme is self-describing — you
can read its &lt;code&gt;theme.toml&lt;/code&gt; and know the whole chain it expects.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Templates</title>
    <link href="https://juicer.build/concepts/templates/"/>
    <id>https://juicer.build/concepts/templates/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>How squiggly templates render content into HTML.</summary>
    <content type="html">&lt;p&gt;Templates live under &lt;code&gt;layouts/&lt;/code&gt; and are written in &lt;a href=&quot;https://github.com/edadma/squiggly&quot;&gt;squiggly&lt;/a&gt;, a Go-template-style language. Every template is plain HTML with &lt;code&gt;{{ ... }}&lt;/code&gt; interpolation.&lt;/p&gt;
&lt;h2 id=&quot;template-kinds&quot;&gt;Template kinds&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Kind&lt;/th&gt;&lt;th&gt;Filename pattern&lt;/th&gt;&lt;th&gt;When it’s used&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseof&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;_default/baseof.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Outer shell — wraps every page&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;_default/file.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Single-page template&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;folder&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;_default/folder.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Section-index template&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Partial&lt;/td&gt;&lt;td&gt;&lt;code&gt;partials/&amp;lt;name&amp;gt;.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Called via &lt;code&gt;{{ partial &apos;name&apos; . }}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Shortcode&lt;/td&gt;&lt;td&gt;&lt;code&gt;shortcodes/&amp;lt;name&amp;gt;.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Called from markdown via &lt;code&gt;[= name =]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;_default/&lt;/code&gt; folder name comes from the &lt;code&gt;defaultLayout&lt;/code&gt; config key. You can also place per-section overrides in &lt;code&gt;layouts/&amp;lt;section&amp;gt;/&lt;/code&gt; — juicer falls back to &lt;code&gt;_default/&lt;/code&gt; when a section-specific layout is missing.&lt;/p&gt;
&lt;h2 id=&quot;the-two-pass-render&quot;&gt;The two-pass render&lt;/h2&gt;
&lt;p&gt;When both a particular template (&lt;code&gt;file.html&lt;/code&gt; or &lt;code&gt;folder.html&lt;/code&gt;) AND a &lt;code&gt;baseof.html&lt;/code&gt; exist:&lt;/p&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;first-pass-the-particular-template-runs&quot;&gt;First pass — the particular template runs&lt;/h2&gt;
&lt;p&gt;Its output is &lt;strong&gt;discarded&lt;/strong&gt;. What matters are the &lt;code&gt;{{ define &amp;lt;name&amp;gt; }}…{{ end }}&lt;/code&gt; blocks it populates.&lt;/p&gt;
&lt;h2 id=&quot;second-pass-baseof-html-runs&quot;&gt;Second pass — &lt;code&gt;baseof.html&lt;/code&gt; runs&lt;/h2&gt;
&lt;p&gt;Its &lt;code&gt;{{ block &amp;lt;name&amp;gt; . }}…{{ end }}&lt;/code&gt; calls pull the previously-defined content into place.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This pattern lets a single &lt;code&gt;baseof.html&lt;/code&gt; provide the entire page chrome (head, header, sidebar, footer) while &lt;code&gt;file.html&lt;/code&gt; and &lt;code&gt;folder.html&lt;/code&gt; only describe what goes in the main column.&lt;/p&gt;
&lt;div class=&quot;juicer-tabs&quot; data-juicer-tabs&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;baseof.html&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;hl-keyword&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;topbar&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;block&lt;/span&gt; main &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;file.html&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;define&lt;/span&gt; main &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;prose&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;folder.html&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;define&lt;/span&gt; main &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;prose&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;p&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; p &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;“&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;“&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;the-data-context&quot;&gt;The data context&lt;/h2&gt;
&lt;p&gt;Every page renders against a fixed data context:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Variable&lt;/th&gt;&lt;th&gt;What it holds&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site config + &lt;code&gt;pages&lt;/code&gt;, &lt;code&gt;pagesByPath&lt;/code&gt;, &lt;code&gt;root&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The current page record (frontmatter + url + summary + nav fields)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.section&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Enclosing section’s pages + subsections + index&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.content&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rendered markdown body&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.toc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Heading tree&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.sub&lt;/code&gt;&lt;/td&gt;&lt;td&gt;First heading’s children, flattened&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Inside &lt;code&gt;.page&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.page.title&lt;/code&gt;, &lt;code&gt;.page.summary&lt;/code&gt; — from frontmatter (summary is auto-derived if absent)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.url&lt;/code&gt;, &lt;code&gt;.page.relPermalink&lt;/code&gt;, &lt;code&gt;.page.permalink&lt;/code&gt; — three URL flavors&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.parent&lt;/code&gt;, &lt;code&gt;.page.ancestors&lt;/code&gt; — section navigation (parent’s &lt;code&gt;_index&lt;/code&gt; record, then the root → parent chain)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.next&lt;/code&gt;, &lt;code&gt;.page.prev&lt;/code&gt; — sibling navigation (by section page order)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.isSection&lt;/code&gt; — &lt;code&gt;true&lt;/code&gt; for &lt;code&gt;_index.md&lt;/code&gt; pages&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.pages&lt;/code&gt;, &lt;code&gt;.page.subsections&lt;/code&gt; — children — populated only on &lt;code&gt;_index.md&lt;/code&gt; pages&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.date&lt;/code&gt;, &lt;code&gt;.page.dateISO&lt;/code&gt;, &lt;code&gt;.page.dateLong&lt;/code&gt;, &lt;code&gt;.page.dateShort&lt;/code&gt; — set when frontmatter &lt;code&gt;date:&lt;/code&gt; is present (or mtime fallback)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.tags&lt;/code&gt;, &lt;code&gt;.page.categories&lt;/code&gt; — always lists (a single string in frontmatter is wrapped)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.author&lt;/code&gt;, &lt;code&gt;.page.authors&lt;/code&gt; — resolved author registry records&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.wordCount&lt;/code&gt;, &lt;code&gt;.page.readingTime&lt;/code&gt; — auto-computed from the rendered body&lt;/li&gt;
&lt;li&gt;Plus any custom frontmatter key&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a href=&quot;/reference/template-data/&quot;&gt;Reference / Template data&lt;/a&gt; for the full set.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Template syntax</title>
    <link href="https://juicer.build/reference/template-syntax/"/>
    <id>https://juicer.build/reference/template-syntax/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Squiggly cheatsheet — the moves you&apos;ll use on every page.</summary>
    <content type="html">&lt;p&gt;Squiggly is the template language juicer uses. It’s Go-template-like. This page is the practical cheatsheet; the &lt;a href=&quot;https://github.com/edadma/squiggly&quot;&gt;full squiggly reference&lt;/a&gt; covers everything else.&lt;/p&gt;
&lt;h2 id=&quot;substitution&quot;&gt;Substitution&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;              value at .name in the data context
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;        nested
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;           list element by index (in shortcodes)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;built-in-functions&quot;&gt;Built-in functions&lt;/h2&gt;
&lt;p&gt;Juicer adds a few project-specific functions to squiggly’s defaults.
Call them as expressions:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Function&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ relURL &apos;/path&apos; }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-relative URL (&lt;code&gt;baseURL.path&lt;/code&gt; prefix added if non-trivial)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ absURL &apos;/path&apos; }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Absolute URL (&lt;code&gt;baseURL.base + relURL&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ relLangURL lang &apos;/path&apos; }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Like &lt;code&gt;relURL&lt;/code&gt;, but prefixed with &lt;code&gt;lang&lt;/code&gt;‘s URL segment (Hugo’s &lt;code&gt;relLangURL&lt;/code&gt;) — see &lt;a href=&quot;/concepts/i18n/&quot;&gt;i18n&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ absLangURL lang &apos;/path&apos; }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Like &lt;code&gt;absURL&lt;/code&gt;, but prefixed with &lt;code&gt;lang&lt;/code&gt;‘s URL segment&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ markdownify s }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Render a markdown string to HTML&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ emojify s }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Replace &lt;code&gt;:smile:&lt;/code&gt; etc. with Unicode emoji&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ i18n lang &apos;key&apos; }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Look up an i18n string (falls back to default lang then literal key)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ ogTags .page }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Emit OpenGraph + Twitter card &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags for a page record&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ imageDims &apos;/path&apos; }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Read pixel dimensions of an on-disk image; returns &lt;code&gt;{width, height}&lt;/code&gt; or empty map (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ imageVariants &apos;/path&apos; }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Generate resized + reformatted variants of an image; returns &lt;code&gt;{original, originalWidth, originalHeight, variants}&lt;/code&gt; (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ srcset &apos;/path&apos; &apos;fmt&apos; }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;One-liner: build the comma-separated &lt;code&gt;srcset&lt;/code&gt; body for one variant format (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;imagedims&quot;&gt;&lt;code&gt;imageDims&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Reads the header of an image on disk and returns a map with &lt;code&gt;width&lt;/code&gt; and
&lt;code&gt;height&lt;/code&gt; (pixel ints). Useful for emitting &lt;code&gt;&amp;lt;img width=... height=...&amp;gt;&lt;/code&gt;
so the browser can reserve space before the bytes arrive — eliminates
cumulative layout shift.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; d &lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;= imageDims &lt;span class=&quot;hl-string&quot;&gt;&apos;/img/hero.jpg&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; d&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/img/hero.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; d&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; d&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;height&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/img/hero.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Resolution order: the path is looked up first under the built output
directory (so theme + site &lt;code&gt;static/&lt;/code&gt; files and any generated images
work), then under the source root. Paths can be site-absolute
(&lt;code&gt;/img/x.png&lt;/code&gt;) or relative; absolute URLs (&lt;code&gt;http://…&lt;/code&gt;) are not fetched.&lt;/p&gt;
&lt;p&gt;Returns an empty map when the file is missing, unreadable, or in a
format the header parser does not understand. Recognized formats:
&lt;strong&gt;PNG, JPEG (baseline + progressive), GIF87a/89a, WebP&lt;/strong&gt; (VP8 / VP8L /
VP8X). Pure Scala — no &lt;code&gt;javax.imageio&lt;/code&gt;, no FFI, works on every target.&lt;/p&gt;
&lt;p&gt;Per-build cache: each unique path is read once even if a shortcode
fires across hundreds of pages.&lt;/p&gt;
&lt;h3 id=&quot;imagevariants-and-srcset&quot;&gt;&lt;code&gt;imageVariants&lt;/code&gt; and &lt;code&gt;srcset&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Opt-in build-time image-variant generation. With an &lt;code&gt;[images]&lt;/code&gt; block in
&lt;code&gt;site.toml&lt;/code&gt; and ImageMagick (&lt;code&gt;magick&lt;/code&gt;) on PATH, juicer will resize and
reformat source images into a &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;-ready variant set:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;images&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
enabled  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
widths   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;320&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;640&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;960&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;1280&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
formats  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;webp&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;original&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# most-modern first; original is a passthrough&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; most-modern first; original is a passthrough
quality  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;80&lt;/span&gt;
cacheDir &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;.image-cache&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;imageVariants&lt;/code&gt; returns the full structured shape — useful when a theme
emits its own &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; markup:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; v &lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;= imageVariants &lt;span class=&quot;hl-string&quot;&gt;&apos;/img/hero.jpg&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; v&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;variants&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;picture&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; src &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; v&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;variants&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
      &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; src&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;mime&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;and&lt;/span&gt; src&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;format&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;original&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
        &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;srcset&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; src&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; src&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;width&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; src&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;mime&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; v&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;original&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; v&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;originalWidth&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; v&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;originalHeight&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;picture&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; v&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;original&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Returned map:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;original&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;URL of the passthrough original (site-absolute)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;originalWidth&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;Pixel width of the source (&lt;code&gt;0&lt;/code&gt; if unknown)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;originalHeight&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;Pixel height of the source (&lt;code&gt;0&lt;/code&gt; if unknown)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;variants&lt;/code&gt;&lt;/td&gt;&lt;td&gt;list&lt;/td&gt;&lt;td&gt;One &lt;code&gt;{width, format, url, mime}&lt;/code&gt; per generated variant&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;srcset&lt;/code&gt; is a one-liner shorthand for the common case where a layout
wants to drop the variant list straight into an &lt;code&gt;&amp;lt;img srcset=...&amp;gt;&lt;/code&gt;
attribute for a single format:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/img/hero.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;
     &lt;span class=&quot;hl-function&quot;&gt;srcset&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; srcset &lt;span class=&quot;hl-string&quot;&gt;&apos;/img/hero.jpg&apos;&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;webp&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;
     &lt;span class=&quot;hl-function&quot;&gt;sizes&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;(min-width: 800px) 50vw, 100vw&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;
     &lt;span class=&quot;hl-function&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Returns &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; when the requested format isn’t in &lt;code&gt;[images].formats&lt;/code&gt;, the
source can’t be resolved, or variants weren’t generated (feature off,
encoder missing, etc.).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cache &amp;amp; encoder.&lt;/strong&gt; Every generated filename embeds a 64-bit FNV-1a
hash of the source bytes (&lt;code&gt;hero-640w.&amp;lt;hash&amp;gt;.webp&lt;/code&gt;), so re-running the
build on an unchanged image skips the encoder shell-out and editing the
image invalidates every variant in one shot. The encoder backend
(&lt;code&gt;magick&lt;/code&gt;) is probed once per build; if it’s not on PATH a single
advisory prints to stderr and the feature degrades cleanly to a
passthrough-only &lt;code&gt;VariantSet&lt;/code&gt; (&lt;code&gt;variants&lt;/code&gt; is empty). Same behaviour on
the Scala Native and Scala.js targets until process-spawn lands in
&lt;code&gt;cross_platform&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Widths above the source’s own width are dropped (no upscaling); the
source’s exact width is always included so the fallback &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; can
point at a same-size variant. The &lt;code&gt;original&lt;/code&gt; slot at the source width
is a 1:1 byte copy rather than an encoder round-trip — keeps build time
sane on photo-heavy sites and preserves source bytes exactly.&lt;/p&gt;
&lt;h2 id=&quot;conditionals&quot;&gt;Conditionals&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.summary&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;lead&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.summary&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.draft&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;badge&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Draft&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;badge&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Published&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt; is truthy on non-empty strings, non-zero numbers, non-empty lists/maps, and &lt;code&gt;true&lt;/code&gt;. &lt;code&gt;null&lt;/code&gt; / empty / &lt;code&gt;false&lt;/code&gt; / &lt;code&gt;0&lt;/code&gt; are falsy.&lt;/p&gt;
&lt;p&gt;Logical operators: &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, prefix &lt;code&gt;not&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.prev&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.next&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;nav&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;...&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;nav&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;loops&quot;&gt;Loops&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; p &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; k&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; v &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; k &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;: &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; v &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;partials&quot;&gt;Partials&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;topbar&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;              call partials/topbar.html with the current data
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;page-toc&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;        with a different data context&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;defines-blocks&quot;&gt;Defines &amp;amp; blocks&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;define&lt;/span&gt; main &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;block&lt;/span&gt; main &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;    fallback content if main isn&apos;t defined&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;define&lt;/code&gt; is statement-level (no output). &lt;code&gt;block &amp;lt;name&amp;gt; &amp;lt;data&amp;gt;&lt;/code&gt; looks up the named block, calls it with &lt;code&gt;&amp;lt;data&amp;gt;&lt;/code&gt; as the context, falls back to its inner template if the block isn’t defined.&lt;/p&gt;
&lt;h2 id=&quot;builtin-filters&quot;&gt;Builtin filters&lt;/h2&gt;
&lt;p&gt;Most squiggly builtins work as either a function or a pipe target:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; trim &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.summary&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.summary&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;|&lt;/span&gt; trim &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;|&lt;/span&gt; upper &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;|&lt;/span&gt; replace &lt;span class=&quot;hl-string&quot;&gt;&apos;foo&apos;&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;bar&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Useful ones:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Builtin&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;len&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Length of a list / string&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;head&lt;/code&gt;&lt;/td&gt;&lt;td&gt;First element of a list&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tail&lt;/code&gt;&lt;/td&gt;&lt;td&gt;All but the first&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;trim&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Trim whitespace&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;upper&lt;/code&gt; / &lt;code&gt;lower&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Case&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;replace &apos;a&apos; &apos;b&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;String substitution&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;split &apos;sep&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;String split&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;join &apos;sep&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;List join&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;comments&quot;&gt;Comments&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-comment&quot;&gt;// squiggly&apos;s not too noisy in templates }}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;scope-inside-loops&quot;&gt;Scope inside loops&lt;/h2&gt;
&lt;p&gt;Inside a &lt;code&gt;{{ for x &amp;lt;- coll }}&lt;/code&gt; block, &lt;code&gt;.foo&lt;/code&gt; resolves against the
&lt;strong&gt;current iterated element&lt;/strong&gt;, not the outer page context. Use &lt;code&gt;$.foo&lt;/code&gt;
to reach back up to the top-level data root:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; p &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; eq p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; $&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;(this page)&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A common pitfall: writing &lt;code&gt;{{ .site.title }}&lt;/code&gt; inside a loop and
getting nothing. Use &lt;code&gt;{{ $.site.title }}&lt;/code&gt; — &lt;code&gt;.site&lt;/code&gt; doesn’t exist on
the iterated element.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Template data</title>
    <link href="https://juicer.build/reference/template-data/"/>
    <id>https://juicer.build/reference/template-data/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>The full data context exposed to templates — site, page, section, content, toc.</summary>
    <content type="html">&lt;p&gt;Every template renders against a single map. The top-level keys are documented below; nested fields follow.&lt;/p&gt;
&lt;h2 id=&quot;site&quot;&gt;&lt;code&gt;.site&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The merged site config (&lt;code&gt;site.toml&lt;/code&gt; overlaid on the baseline) plus a few computed extras:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.&amp;lt;config&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;varies&lt;/td&gt;&lt;td&gt;Every key from &lt;code&gt;site.toml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.toc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[TOCItem]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-wide auto-nav (only if no &lt;code&gt;nav&lt;/code&gt; is set)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.start&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL of the conventional landing page&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.pages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every page’s enriched record&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.pagesByPath&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map[String, Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same records, keyed by &lt;code&gt;relPermalink&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.posts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Dated, non-section, non-&lt;code&gt;static&lt;/code&gt; pages, newest first (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.pagesByYear&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same posts grouped by year, year descending (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.root&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The root section’s &lt;code&gt;_index&lt;/code&gt; record (or &lt;code&gt;null&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.tags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Term]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every distinct tag used in the site (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.categories&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Term]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same shape as &lt;code&gt;.site.tags&lt;/code&gt;, for the categories axis&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.authors&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every author with at least one referencing page — registry record + &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;pages&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.authorRegistry&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The raw &lt;code&gt;[[authors]]&lt;/code&gt; table from &lt;code&gt;site.toml&lt;/code&gt; in declaration order — includes authors with zero referencing pages, useful for staff-directory layouts (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.authorsPath&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL prefix under which the team listing and per-author archives are emitted. Configured by &lt;code&gt;authorsPath&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt;; defaults to &lt;code&gt;/authors/&lt;/code&gt;. See below&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.now&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Build-time “now” timestamp in four shapes (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.events&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Pages in the configured &lt;code&gt;eventsSection&lt;/code&gt; with explicit &lt;code&gt;date:&lt;/code&gt; frontmatter, sorted ascending. Includes future-dated events (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.calendar&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Pre-computed N months of calendar grid starting at the current month, with weekly recurring events expanded onto every matching weekday (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.photos&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Aggregated &lt;code&gt;photos:&lt;/code&gt; frontmatter entries from every page, sorted by parent-page date descending (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.data&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map[String, Any]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Nested namespace of structured data loaded from &lt;code&gt;data/&lt;/code&gt; files (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.comments&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map[String, Any]?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The &lt;code&gt;[comments]&lt;/code&gt; config block from &lt;code&gt;site.toml&lt;/code&gt; (provider + provider-specific keys), or absent if no &lt;code&gt;[comments]&lt;/code&gt; table is set (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;term-shape&quot;&gt;&lt;code&gt;Term&lt;/code&gt; shape&lt;/h3&gt;
&lt;p&gt;Every entry in &lt;code&gt;.site.tags&lt;/code&gt; and &lt;code&gt;.site.categories&lt;/code&gt; (and on tag-archive
templates, the elements of &lt;code&gt;.terms&lt;/code&gt;) has these fields:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The original tag name as it appeared in frontmatter&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL-safe form (lowercased, ASCII-folded, non-alnum runs collapsed to &lt;code&gt;-&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-relative archive URL — &lt;code&gt;/tags/&amp;lt;slug&amp;gt;/&lt;/code&gt; or &lt;code&gt;/categories/&amp;lt;slug&amp;gt;/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;count&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;How many pages reference this term&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;pages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The pages themselves, each in the same shape as a &lt;code&gt;.site.pages&lt;/code&gt; entry&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;site-posts-and-site-pagesbyyear&quot;&gt;&lt;code&gt;.site.posts&lt;/code&gt; and &lt;code&gt;.site.pagesByYear&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Curated views of the post stream — the same data, sliced two ways.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.site.posts&lt;/code&gt; is the flat list, newest first. A page is included if it
has an explicit parsed &lt;code&gt;date:&lt;/code&gt; in frontmatter, is not a section index
(&lt;code&gt;_index.md&lt;/code&gt;), and is not flagged &lt;code&gt;static: true&lt;/code&gt;. Filesystem-mtime
fallback dates do &lt;strong&gt;not&lt;/strong&gt; count — only authored dates make it in. The
result is exactly the set of pages a blog or news site would call “the
posts.”&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.site.pagesByYear&lt;/code&gt; groups the same list by calendar year, with years
descending and pages within each year still newest-first:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;year&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The 4-digit year&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;count&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Posts in this year&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;pages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The posts themselves, each shaped like a &lt;code&gt;.site.pages&lt;/code&gt; entry&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Useful for chronological archive pages (&lt;code&gt;&amp;lt;h2&amp;gt;2024&amp;lt;/h2&amp;gt;&lt;/code&gt; then a list).&lt;/p&gt;
&lt;h3 id=&quot;site-authorregistry&quot;&gt;&lt;code&gt;.site.authorRegistry&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The raw &lt;code&gt;[[authors]]&lt;/code&gt; table from &lt;code&gt;site.toml&lt;/code&gt;, preserved in declaration
order. Each entry is the verbatim TOML table — &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;role&lt;/code&gt;,
&lt;code&gt;bio&lt;/code&gt;, &lt;code&gt;avatar&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, plus any custom fields you’ve added.&lt;/p&gt;
&lt;p&gt;Distinct from &lt;code&gt;.site.authors&lt;/code&gt;, which is filtered to authors who have at
least one referencing page and is augmented with &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, and
&lt;code&gt;pages&lt;/code&gt;. Use &lt;code&gt;.site.authorRegistry&lt;/code&gt; for staff-directory layouts that
should show every team member regardless of how many sermons or posts
they’ve authored; use &lt;code&gt;.site.authors&lt;/code&gt; for “browse by author” archives.&lt;/p&gt;
&lt;h4 id=&quot;when-authors-and-authors-id-get-rendered&quot;&gt;When &lt;code&gt;/authors/&lt;/code&gt; and &lt;code&gt;/authors/&amp;lt;id&amp;gt;/&lt;/code&gt; get rendered&lt;/h4&gt;
&lt;p&gt;The two layouts have different gates so themes can ship a “team page”
that shows everyone, even on a fresh site with no posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;layouts/_default/author-list.html&lt;/code&gt; → &lt;code&gt;/authors/index.html&lt;/code&gt; is
rendered whenever a registry exists at all (&lt;code&gt;[[authors]]&lt;/code&gt; non-empty
in &lt;code&gt;site.toml&lt;/code&gt;). The layout typically iterates
&lt;code&gt;.site.authorRegistry&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;layouts/_default/author-page.html&lt;/code&gt; → &lt;code&gt;/authors/&amp;lt;id&amp;gt;/index.html&lt;/code&gt; is
only rendered for authors with at least one referencing page. An
empty per-author archive page would be misleading.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Either layout is opt-in — missing the file means the corresponding
output is silently skipped.&lt;/p&gt;
&lt;h4 id=&quot;renaming-the-url-prefix-authorspath&quot;&gt;Renaming the URL prefix — &lt;code&gt;authorsPath&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;By default both the team listing and the per-author archives live under
&lt;code&gt;/authors/&lt;/code&gt;. Sites using a non-blog theme often want a different label —
a cafe wants &lt;code&gt;/team/&lt;/code&gt;, a doc site wants &lt;code&gt;/people/&lt;/code&gt;. Set &lt;code&gt;authorsPath&lt;/code&gt; in
&lt;code&gt;site.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;authorsPath &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/team/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The engine pivots three things in lockstep: the on-disk output
directory, the &lt;code&gt;url&lt;/code&gt; field on every &lt;code&gt;.site.authors&lt;/code&gt; term, and the
&lt;code&gt;.site.authorsPath&lt;/code&gt; string surfaced for templates. Themes should read
&lt;code&gt;{{ .site.authorsPath }}&lt;/code&gt; rather than hard-coding &lt;code&gt;/authors/&lt;/code&gt; so a
site-level override propagates without a layout edit.&lt;/p&gt;
&lt;p&gt;Forgiving normalization: &lt;code&gt;team&lt;/code&gt;, &lt;code&gt;/team&lt;/code&gt;, &lt;code&gt;team/&lt;/code&gt;, and &lt;code&gt;/team/&lt;/code&gt; all
become &lt;code&gt;/team/&lt;/code&gt;. Path traversal segments (&lt;code&gt;.&lt;/code&gt;, &lt;code&gt;..&lt;/code&gt;) are rejected with a
warning and the default is used.&lt;/p&gt;
&lt;h3 id=&quot;site-now&quot;&gt;&lt;code&gt;.site.now&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Build-time timestamp captured once per build, in four shapes so the
right one is always at hand:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;iso&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Full ISO offset — &lt;code&gt;2026-05-09T14:00:00Z&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;YYYY-MM-DD&lt;/code&gt;, lex-comparable with &lt;code&gt;.page.dateShort&lt;/code&gt; for past/future filters&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;long&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;May 9, 2026&lt;/code&gt;, same formatter as &lt;code&gt;.page.dateLong&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;year&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Useful for footer copyright&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The static-site model means “now” is legitimately frozen at build time.
Live-reload re-runs the build on every change, so the value stays fresh
during local preview.&lt;/p&gt;
&lt;h3 id=&quot;site-events&quot;&gt;&lt;code&gt;.site.events&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Pages in the configured events section (&lt;code&gt;eventsSection&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt;,
default &lt;code&gt;&amp;quot;events&amp;quot;&lt;/code&gt;) with an explicit &lt;code&gt;date:&lt;/code&gt; frontmatter, sorted
ascending. Each entry is shaped like a &lt;code&gt;.site.pages&lt;/code&gt; record — &lt;code&gt;title&lt;/code&gt;,
&lt;code&gt;url&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;dateShort&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt;, plus any frontmatter the event
page declares (&lt;code&gt;eventTime&lt;/code&gt;, &lt;code&gt;eventLocation&lt;/code&gt;, &lt;code&gt;recurring&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;p&gt;Includes future-dated events: events are announced &lt;em&gt;before&lt;/em&gt; they happen,
and the engine’s site-wide future-post filter is exempted for pages in
the events section so both &lt;code&gt;.site.events&lt;/code&gt; entries and the corresponding
event detail pages survive the build. Future-dated &lt;em&gt;posts&lt;/em&gt; (anything
outside the events section) continue to be future-skipped — see the
&lt;code&gt;--future&lt;/code&gt; CLI flag to override per build.&lt;/p&gt;
&lt;p&gt;Recurring events appear once each (the canonical page record); use
&lt;code&gt;.site.calendar&lt;/code&gt; for occurrence-by-occurrence expansion.&lt;/p&gt;
&lt;h3 id=&quot;site-calendar&quot;&gt;&lt;code&gt;.site.calendar&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Pre-computed N months (default 12, override via &lt;code&gt;calendarMonths&lt;/code&gt; in
&lt;code&gt;site.toml&lt;/code&gt;) starting at the current month. Each month is:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;year&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;4-digit year&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;month&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1–12&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;monthName&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;May&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;label&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;May 2026&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weeks&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[List[Cell]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Always six 7-day rows, Sunday-first&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each cell:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;day&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1–31, or &lt;code&gt;null&lt;/code&gt; for out-of-month padding cells&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;isToday&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; for the cell whose year/month/day matches &lt;code&gt;.site.now&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;events&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Basic page records for events on this day (empty list when none)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Recurring weekly events (&lt;code&gt;recurring: weekly&lt;/code&gt; + optional &lt;code&gt;recurringDay:&lt;/code&gt;)
are expanded onto every matching weekday from their start date forward.
A recurring event with no &lt;code&gt;recurringDay:&lt;/code&gt; defaults to its start-date’s
day of the week. Non-recurring events appear once on their &lt;code&gt;date&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The grid is always 6×7 = 42 cells per month so calendar templates don’t
have to special-case month boundaries; out-of-month cells render as
&lt;code&gt;day=null&lt;/code&gt; padding.&lt;/p&gt;
&lt;h3 id=&quot;site-photos&quot;&gt;&lt;code&gt;.site.photos&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Aggregated &lt;code&gt;photos:&lt;/code&gt; frontmatter entries from every page on the site,
sorted by the parent page’s date descending. Each entry:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;src&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Image URL (absolute or site-relative)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;caption&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Display caption — empty string when not provided&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;alt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Accessibility text — falls back to &lt;code&gt;caption&lt;/code&gt; when absent&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;page&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Basic page record of the parent page (lets templates link the photo back to its event/album/sermon)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Frontmatter shape — either a list of strings (URLs only) or a list of
maps with &lt;code&gt;src&lt;/code&gt; / &lt;code&gt;caption&lt;/code&gt; / &lt;code&gt;alt&lt;/code&gt; keys:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;photos&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/img/picnic-01.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/img/picnic-02.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;The pie table&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pages without a &lt;code&gt;photos:&lt;/code&gt; frontmatter contribute nothing.&lt;/p&gt;
&lt;h3 id=&quot;site-data&quot;&gt;&lt;code&gt;.site.data&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Structured data the theme or site author wants templates to reach for
without forcing it into every page’s frontmatter. juicer scans the
&lt;code&gt;dataDir&lt;/code&gt; (default &lt;code&gt;data/&lt;/code&gt;) under the site root and under each active
theme:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;data/team.toml              → .site.data.team
data/menu/lunch.yaml        → .site.data.menu.lunch
data/menu/dinner.toml       → .site.data.menu.dinner
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The file’s basename (sans extension) becomes the leaf key; each
directory under &lt;code&gt;data/&lt;/code&gt; becomes a nesting level. Both &lt;code&gt;.toml&lt;/code&gt; and
&lt;code&gt;.yaml&lt;/code&gt; / &lt;code&gt;.yml&lt;/code&gt; are accepted — pick whichever shape fits the data
better. JSON is not parsed natively, but since it’s a strict subset of
YAML you can rename &lt;code&gt;.json&lt;/code&gt; → &lt;code&gt;.yaml&lt;/code&gt; and it works.&lt;/p&gt;
&lt;p&gt;A typical use:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# data/team.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; data/team.toml
&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;members&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
name &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Alice&amp;quot;&lt;/span&gt;
role &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Lead&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;members&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
name &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;
role &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Eng&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{{ for m &amp;lt;- .site.data.team.members }}
  &amp;lt;li&amp;gt;{{ m.name }} — {{ m.role }}&amp;lt;/li&amp;gt;
{{ end }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Theme overlay.&lt;/strong&gt; Themes can ship their own &lt;code&gt;data/&lt;/code&gt; directory; site
entries win at the file-leaf granularity. If a theme provides
&lt;code&gt;data/site.toml&lt;/code&gt; and the site provides &lt;code&gt;data/site.toml&lt;/code&gt;, the site’s
file replaces the theme’s at the &lt;code&gt;.site.data.site&lt;/code&gt; key path. The site
does &lt;strong&gt;not&lt;/strong&gt; deep-merge fields — to support partial overrides as a
theme author, namespace into a subdirectory
(&lt;code&gt;data/colors/default.toml&lt;/code&gt; + &lt;code&gt;data/colors/dark.toml&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Format notes.&lt;/strong&gt; TOML at a file root always parses to a map; YAML can
parse to a list (&lt;code&gt;data/sponsors.yaml&lt;/code&gt; starting with &lt;code&gt;- name: ...&lt;/code&gt;) or a
scalar, but a map is by far the most useful shape because nested-field
access (&lt;code&gt;.site.data.sponsors[0].name&lt;/code&gt;) is more readable than positional
indexing in most templates.&lt;/p&gt;
&lt;h3 id=&quot;site-comments&quot;&gt;&lt;code&gt;.site.comments&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A pass-through of the &lt;code&gt;[comments]&lt;/code&gt; table from &lt;code&gt;site.toml&lt;/code&gt; (see
&lt;a href=&quot;/../config/#comments--comments-provider-config-slot&quot;&gt;Config → &lt;code&gt;[comments]&lt;/code&gt;&lt;/a&gt;).
juicer never ships a comments backend — the config block is opaque to
the engine, and theme partials are responsible for reading it and
emitting the embed HTML.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;provider&lt;/code&gt; is the only convention; everything else is provider-specific
and theme-defined. A theme that supports several providers typically
branches on it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.comments&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; eq &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.comments.provider&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;giscus&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;comments/giscus.html&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; eq &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.comments.provider&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;utterances&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;comments/utterances.html&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; eq &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.comments.provider&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;disqus&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;comments/disqus.html&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The outer &lt;code&gt;{{ if .site.comments }}&lt;/code&gt; is the right gate for “comments on
or off site-wide” — when no &lt;code&gt;[comments]&lt;/code&gt; table is set in &lt;code&gt;site.toml&lt;/code&gt;,
&lt;code&gt;.site.comments&lt;/code&gt; is absent and the conditional evaluates falsy. Themes
that allow per-page opt-out also check &lt;code&gt;{{ if .page.comments }}&lt;/code&gt; (or
similar) so individual posts can override the site-wide setting.&lt;/p&gt;
&lt;h2 id=&quot;alias-pages&quot;&gt;Alias pages&lt;/h2&gt;
&lt;p&gt;Frontmatter &lt;code&gt;aliases: [...]&lt;/code&gt; makes juicer emit a redirect page at each
listed URL. The alias layout (or built-in fallback) sees a separate
data context:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.target&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-relative canonical URL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.absTarget&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Absolute canonical URL (&lt;code&gt;baseURL&lt;/code&gt; + &lt;code&gt;.target&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.&amp;lt;...&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;varies&lt;/td&gt;&lt;td&gt;Every field of the canonical page’s record&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.&amp;lt;...&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;varies&lt;/td&gt;&lt;td&gt;The full site context&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If &lt;code&gt;layouts/_default/alias.html&lt;/code&gt; exists, it’s rendered with the data
above. Otherwise juicer writes a minimal built-in HTML page with a
&lt;code&gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot;&amp;gt;&lt;/code&gt; to &lt;code&gt;.target&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;page&quot;&gt;&lt;code&gt;.page&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The current page’s enriched record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Frontmatter title&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Resolved summary (frontmatter / &lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt; / fallback)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-relative URL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.relPermalink&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same as &lt;code&gt;url&lt;/code&gt;, named for Hugo parity&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.permalink&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Absolute URL (baseURL + url)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL stem (last path segment, no slashes) — useful for in-page anchors when a layout walks &lt;code&gt;.section.pages&lt;/code&gt; and wants a stable per-section HTML id. &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; for the root index.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.isSection&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; for &lt;code&gt;_index.md&lt;/code&gt; pages&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.parent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Enclosing section’s &lt;code&gt;_index&lt;/code&gt; record&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.ancestors&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Root → parent chain (excluding self)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.next&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Next page in section by &lt;code&gt;pageOrder&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.prev&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Previous page in section&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.tags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Frontmatter &lt;code&gt;tags&lt;/code&gt; (always a list, even when authored as a single string)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.categories&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Frontmatter &lt;code&gt;categories&lt;/code&gt;, normalized the same way&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;OffsetDateTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Parsed publication date (frontmatter &lt;code&gt;date&lt;/code&gt; or filesystem mtime fallback)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.dateISO&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2024-03-12T00:00:00Z&lt;/code&gt; — for &lt;code&gt;&amp;lt;time datetime=...&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.dateLong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;March 12, 2024&lt;/code&gt; — for body copy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.dateShort&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2024-03-12&lt;/code&gt; — for compact lists&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.wordCount&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Word count of the rendered HTML body&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.readingTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Estimated minutes (&lt;code&gt;ceil(wordCount / 200)&lt;/code&gt;, floor 1 for non-empty pages)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.series&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Series block — &lt;code&gt;null&lt;/code&gt; when the page is not in a series (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;First (or only) resolved author registry record, or &lt;code&gt;null&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.authors&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;All resolved author records — empty list when none&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.backlinks&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Thin &lt;code&gt;{title, url, summary}&lt;/code&gt; records for every page that links &lt;em&gt;to&lt;/em&gt; this one — empty list when nothing points here (see below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.assets&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Page-bundle assets at this page’s section level — &lt;code&gt;{name, url, ext}&lt;/code&gt; per file. Empty list when the bundle has no assets (see &lt;a href=&quot;/#page-bundles&quot;&gt;Page bundles&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.&amp;lt;custom&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;varies&lt;/td&gt;&lt;td&gt;Any frontmatter key&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;page-series-shape&quot;&gt;&lt;code&gt;.page.series&lt;/code&gt; shape&lt;/h3&gt;
&lt;p&gt;Set when the page declares &lt;code&gt;series:&lt;/code&gt; in frontmatter:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Series name as it appeared in frontmatter&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;pages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every page in the series, ordered (see ordering rules below)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;prev&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Previous page’s record, or &lt;code&gt;null&lt;/code&gt; on the first&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;next&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Next page’s record, or &lt;code&gt;null&lt;/code&gt; on the last&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;index&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1-based position of this page within the series&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;total&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Number of pages in the series&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ordering: explicit &lt;code&gt;seriesOrder&lt;/code&gt; ascending first, then &lt;code&gt;.page.date&lt;/code&gt;
ascending, then filename as a stable tiebreaker.&lt;/p&gt;
&lt;p&gt;For section index pages (where &lt;code&gt;.page.isSection&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;), additionally:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.pages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Non-&lt;code&gt;_index&lt;/code&gt; siblings, sorted&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.subsections&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Direct child sections, sorted&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;page-backlinks-shape&quot;&gt;&lt;code&gt;.page.backlinks&lt;/code&gt; shape&lt;/h3&gt;
&lt;p&gt;A list of thin records — one per page that contains an internal link
pointing at the current page’s permalink. Sorted by referrer title for
deterministic rendering.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Referrer’s frontmatter title (or URL if title absent)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Referrer’s site-relative URL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Referrer’s resolved summary&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Templates that need a richer referrer record (tags, date, author, etc.)
look it up via &lt;code&gt;.site.pagesByPath[bl.url]&lt;/code&gt; — keeping the embedded
records thin avoids cycles when two pages link each other.&lt;/p&gt;
&lt;p&gt;The inverted index is built during the markdown pass from each page’s
AST link destinations. Filtered out at collection time: absolute URLs
(&lt;code&gt;https://…&lt;/code&gt;, &lt;code&gt;mailto:&lt;/code&gt;, &lt;code&gt;tel:&lt;/code&gt;), fragment-only anchors (&lt;code&gt;#section&lt;/code&gt;),
and self-links. Query strings and fragments are stripped before
matching, so &lt;code&gt;[X](/target/#section)&lt;/code&gt; and &lt;code&gt;[X](/target/?q=1)&lt;/code&gt; both count
as a link to &lt;code&gt;/target/&lt;/code&gt;. Lists, tables, definition lists, footnote
definitions, blockquotes, and list items are all walked — anywhere an
author can drop a &lt;code&gt;[text](url)&lt;/code&gt; in markdown, it counts.&lt;/p&gt;
&lt;p&gt;Wiki-style “Linked from” footer in a layout:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.backlinks&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;aside&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;backlinks&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Linked from&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; bl &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.backlinks&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
        &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; bl&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; bl&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; bl&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;summary&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; — &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; bl&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;summary&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;aside&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;section&quot;&gt;&lt;code&gt;.section&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Always available (for non-&lt;code&gt;_index&lt;/code&gt; pages it describes the enclosing section):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.section.pages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Non-&lt;code&gt;_index&lt;/code&gt; siblings, sorted&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.section.subsections&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Direct child sections, sorted&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.section.index&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Section’s &lt;code&gt;_index&lt;/code&gt; record&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.section.assets&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Page-bundle assets for the enclosing section (see &lt;a href=&quot;/#page-bundles&quot;&gt;Page bundles&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.section.paginator&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Pagination state for the current slice (always present — see below)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;section-paginator&quot;&gt;&lt;code&gt;.section.paginator&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Section index pages render once per slice when &lt;code&gt;paginate&lt;/code&gt; is set. Non-section
pages get a paginator with &lt;code&gt;total = 1&lt;/code&gt; so the same template can read it
unconditionally.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;current&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1-based index of the current slice&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;total&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Slice count&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;pages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The pages on &lt;strong&gt;this&lt;/strong&gt; slice (already sliced — don’t slice again)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;first&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL of slice 1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;last&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL of the last slice&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;prevURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL of the previous slice; empty string on slice 1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nextURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL of the next slice; empty string on the last slice&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Slice 2+ lives at &lt;code&gt;&amp;lt;section&amp;gt;/page/&amp;lt;N&amp;gt;/index.html&lt;/code&gt; — directory-style URLs that
work on any static host without rewrite rules.&lt;/p&gt;
&lt;h2 id=&quot;page-bundles&quot;&gt;Page bundles&lt;/h2&gt;
&lt;p&gt;A &lt;em&gt;page bundle&lt;/em&gt; is a content directory whose non-markdown files
(images, attachments, anything that isn’t &lt;code&gt;.md&lt;/code&gt; / &lt;code&gt;.toml&lt;/code&gt; / &lt;code&gt;.yaml&lt;/code&gt; /
&lt;code&gt;.yml&lt;/code&gt; / &lt;code&gt;.html&lt;/code&gt; / &lt;code&gt;.sq&lt;/code&gt;) are co-located with the page and get copied
to the section’s output URL.&lt;/p&gt;
&lt;p&gt;Drop assets next to the markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;content/iceland-2024/
  _index.md
  hero.jpg
  skogafoss.jpg
  notes.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At build time juicer copies the assets to the section’s outdir and
exposes them on the page record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hero.jpg&lt;/code&gt; → &lt;code&gt;dst/html/iceland-2024/hero.jpg&lt;/code&gt; → URL
&lt;code&gt;/iceland-2024/hero.jpg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{{ .page.assets }}&lt;/code&gt; on the section index OR on &lt;code&gt;notes.md&lt;/code&gt; is the
same list — assets are per-directory, not per-page. &lt;code&gt;.section.assets&lt;/code&gt;
is an alias for templates that prefer to read them off the section.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each asset record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;On-disk filename, preserved verbatim (case, dot) — assets are NOT slugified&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-relative URL — &lt;code&gt;&amp;lt;section-permalink&amp;gt;/&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ext&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lowercase extension without the dot, or &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; for extensionless files&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Iterate in a layout to render a gallery, an attachments list, etc.:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.assets&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ul&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;bundle-files&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.assets&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
      &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; a&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; a&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;bundle-relative-image-paths&quot;&gt;Bundle-relative image paths&lt;/h3&gt;
&lt;p&gt;Inside a bundle, &lt;code&gt;imageVariants&lt;/code&gt;, &lt;code&gt;srcset&lt;/code&gt;, and &lt;code&gt;imageDims&lt;/code&gt; resolve
bare (no-leading-&lt;code&gt;/&lt;/code&gt;) paths against the page’s source bundle before
falling back to &lt;code&gt;static/&lt;/code&gt;. That means a hero image lives at the page
and the template doesn’t need to know where:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;with&lt;/span&gt; vs = imageVariants &lt;span class=&quot;hl-string&quot;&gt;&apos;hero.jpg&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;picture&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;image/webp&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;srcset&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; srcset &lt;span class=&quot;hl-string&quot;&gt;&apos;hero.jpg&apos;&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;webp&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; vs&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;original&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; vs&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;originalWidth&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; vs&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;originalHeight&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;picture&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Move the bundle to a different URL, the layout still works. Absolute
paths (&lt;code&gt;/static/hero.jpg&lt;/code&gt;) continue to resolve from the source root —
the bundle preference only kicks in for bare paths.&lt;/p&gt;
&lt;h3 id=&quot;when-not-to-use-a-bundle&quot;&gt;When NOT to use a bundle&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Site-wide chrome (logo, favicon, fonts): keep these in &lt;code&gt;static/&lt;/code&gt; so
every page can reach them via an absolute URL.&lt;/li&gt;
&lt;li&gt;Shared assets used from many pages: same — bundles are for
page-specific files. Putting a logo in every bundle would duplicate
bytes and break a logo swap.&lt;/li&gt;
&lt;li&gt;Files in a directory with &lt;strong&gt;no&lt;/strong&gt; markdown content. Bundles need a
page to anchor them; orphan assets are silently skipped.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;asset-builtin&quot;&gt;&lt;code&gt;asset&lt;/code&gt; builtin&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;asset&lt;/code&gt; template function resolves a logical name into the URL of
its compiled (and optionally fingerprinted) output. The manifest comes
from the &lt;a href=&quot;/reference/config/#assets--sass--esbuild-pipeline&quot;&gt;&lt;code&gt;[assets]&lt;/code&gt; pipeline&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-handlebars&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;{{ asset &apos;site.css&apos; }}&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;{{ asset &apos;main.js&apos; }}&amp;quot; defer&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Resolution case&lt;/th&gt;&lt;th&gt;What &lt;code&gt;asset &apos;foo.css&apos;&lt;/code&gt; returns&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[assets]&lt;/code&gt; disabled or no pipeline run&lt;/td&gt;&lt;td&gt;&lt;code&gt;foo.css&lt;/code&gt; (the input unchanged)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pipeline ran, &lt;code&gt;fingerprint = false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The configured &lt;code&gt;output&lt;/code&gt; URL (e.g. &lt;code&gt;/css/foo.css&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pipeline ran, &lt;code&gt;fingerprint = true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The fingerprinted URL (e.g. &lt;code&gt;/css/foo.&amp;lt;16-hex&amp;gt;.css&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Name not in manifest (typo / never built)&lt;/td&gt;&lt;td&gt;&lt;code&gt;foo.css&lt;/code&gt; (the input unchanged) — visible as a broken &lt;code&gt;&amp;lt;link href&amp;gt;&lt;/code&gt; in the rendered HTML&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The “input unchanged on miss” rule is deliberate: a typo’s effect
shows up in the rendered HTML rather than disappearing into an empty
string, which is faster to spot in a build output or a browser
devtools panel.&lt;/p&gt;
&lt;h2 id=&quot;site-wide-chrome-keys&quot;&gt;Site-wide chrome keys&lt;/h2&gt;
&lt;p&gt;Top-level &lt;code&gt;site.toml&lt;/code&gt; keys that the bundled themes read from &lt;code&gt;.site.*&lt;/code&gt; to
drive shared chrome — favicon, footer attribution, repo link, custom
stylesheets — are catalogued in &lt;a href=&quot;/reference/theming/&quot;&gt;Theming&lt;/a&gt; along with
the per-theme &lt;code&gt;[juicerXxx]&lt;/code&gt; palette / typography / sizing tables.&lt;/p&gt;
&lt;h2 id=&quot;other-top-level&quot;&gt;Other top-level&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.content&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rendered markdown body, HTML&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.toc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;{ headings: [TocEntry] }&lt;/code&gt; — full heading tree&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.sub&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Children of the first heading, flattened&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;page-ordering&quot;&gt;Page ordering&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pageOrder&lt;/code&gt; is &lt;strong&gt;weight ascending, then name ascending&lt;/strong&gt;. Pages with no &lt;code&gt;weight&lt;/code&gt; frontmatter sort after weighted pages but before any sentinel value.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;You’ll almost always want to set explicit &lt;code&gt;weight&lt;/code&gt; values on pages that need a particular order — installation before quickstart, etc. Anything that ships a &lt;code&gt;weight&lt;/code&gt; lower than the default (&lt;code&gt;9223372036854775807&lt;/code&gt; = &lt;code&gt;Long.MaxValue / 2&lt;/code&gt;) wins.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Shortcodes</title>
    <link href="https://juicer.build/reference/shortcodes/"/>
    <id>https://juicer.build/reference/shortcodes/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Every shortcode bundled with the juicerdocs theme, with copy-pasteable examples.</summary>
    <content type="html">&lt;p&gt;&lt;a href=&quot;/concepts/shortcodes/&quot;&gt;Shortcodes&lt;/a&gt; are templates invoked from
inside markdown using &lt;code&gt;[= name =]&lt;/code&gt; syntax. The juicerdocs theme
ships 16 of them, covering callouts, structured docs blocks,
embeds, and inline atoms. This page is the catalogue — one entry
per shortcode with the exact syntax, the rendered look, and any
arguments it accepts.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;These are juicerdocs shortcodes.&lt;/strong&gt; They live under
&lt;code&gt;docs/themes/juicerdocs/shortcodes/&lt;/code&gt;. If you’re using a different
theme, you won’t get this set — bring your own, copy individual
ones into &lt;code&gt;&amp;lt;src&amp;gt;/shortcodes/&lt;/code&gt;, or include &lt;code&gt;juicerdocs&lt;/code&gt; in your
theme chain. See &lt;a href=&quot;/concepts/shortcodes/&quot;&gt;Concepts → Shortcodes&lt;/a&gt;
for the calling conventions and how to author your own.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Escaping in this page.&lt;/strong&gt; The code-fence examples below use
&lt;code&gt;[=&lt;/code&gt; (backslash-prefixed) so the preprocessor leaves the literal
shortcode syntax in place rather than expanding it. When you
write shortcodes in your own content, drop the backslash.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;callouts&quot;&gt;Callouts&lt;/h2&gt;
&lt;p&gt;Five admonition flavours, each a paired shortcode that wraps a
markdown body. They share styling: a tinted background, a small
icon, generous padding.&lt;/p&gt;
&lt;h3 id=&quot;note&quot;&gt;&lt;code&gt;[= note =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Neutral information. Use for “by the way” asides that the reader
can skip without missing anything load-bearing.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= note =]
The frontmatter format is YAML. JSON and TOML frontmatter are
**not** supported.
[= /note =]&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The frontmatter format is YAML. JSON and TOML frontmatter are
&lt;strong&gt;not&lt;/strong&gt; supported.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;tip&quot;&gt;&lt;code&gt;[= tip =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A suggestion or shortcut. Use for “you can also …” content where
the alternative path is sometimes the better one.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= tip =]
The `juicer config` subcommand prints the merged config — it&apos;s
the fastest way to debug &amp;quot;why is this key not doing what I expect?&amp;quot;
[= /tip =]&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The &lt;code&gt;juicer config&lt;/code&gt; subcommand prints the merged config — it’s
the fastest way to debug “why is this key not doing what I expect?”&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;warning&quot;&gt;&lt;code&gt;[= warning =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Something worth slowing down for. Use when ignoring this
information will produce a confusing failure later.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= warning =]
Permalink templates change both the URL and the on-disk write
location. Juicer doesn&apos;t keep both copies.
[= /warning =]&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-warning&quot;&gt;
  &lt;strong&gt;Warning&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Permalink templates change both the URL and the on-disk write
location. Juicer doesn’t keep both copies.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;danger&quot;&gt;&lt;code&gt;[= danger =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A serious caveat. Use for “this will break things” — destructive
operations, security caveats, irreversible flags.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= danger =]
Never expose a shortcode that takes user input straight into HTML.
Run it through `markdownify` or escape it explicitly.
[= /danger =]&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-danger&quot;&gt;
  &lt;strong&gt;Danger&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Never expose a shortcode that takes user input straight into HTML.
Run it through &lt;code&gt;markdownify&lt;/code&gt; or escape it explicitly.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;picking-the-right-callout&quot;&gt;Picking the right callout&lt;/h3&gt;
&lt;p&gt;A rule of thumb: &lt;code&gt;note&lt;/code&gt; for information, &lt;code&gt;tip&lt;/code&gt; for a better path,
&lt;code&gt;warning&lt;/code&gt; for a foot-gun, &lt;code&gt;danger&lt;/code&gt; for something that will
actively break.&lt;/p&gt;
&lt;h2 id=&quot;structured-blocks&quot;&gt;Structured blocks&lt;/h2&gt;
&lt;h3 id=&quot;steps&quot;&gt;&lt;code&gt;[= steps =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Numbered, vertically-laid-out steps. Headings inside (&lt;code&gt;## Step name&lt;/code&gt;) are auto-numbered; the body of each step is regular
markdown.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= steps =]
## Install Juicer

Clone the repo and verify with `sbt &apos;juicerJVM/run --help&apos;`.

## Make a site directory

Create `site.toml`, a `content/` folder, and `layouts/_default/`.

## Build &amp;amp; serve

Run `sbt &apos;juicerJVM/run serve -s .&apos;` and open &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;http://localhost:8080&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;.
[= /steps =]&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;install-juicer&quot;&gt;Install Juicer&lt;/h2&gt;
&lt;p&gt;Clone the repo and verify with &lt;code&gt;sbt &apos;juicerJVM/run --help&apos;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;make-a-site-directory&quot;&gt;Make a site directory&lt;/h2&gt;
&lt;p&gt;Create &lt;code&gt;site.toml&lt;/code&gt;, a &lt;code&gt;content/&lt;/code&gt; folder, and &lt;code&gt;layouts/_default/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;build-serve&quot;&gt;Build &amp;amp; serve&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;sbt &apos;juicerJVM/run serve -s .&apos;&lt;/code&gt; and open &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&quot;tabs-tab-label&quot;&gt;&lt;code&gt;[= tabs =]&lt;/code&gt; / &lt;code&gt;[= tab &amp;quot;Label&amp;quot; =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Tabbed content panes. The outer &lt;code&gt;tabs&lt;/code&gt; is a container; each &lt;code&gt;tab&lt;/code&gt;
takes a label as a positional arg and a markdown body.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= tabs =]
[= tab &amp;quot;JVM&amp;quot; =]
sbt &apos;juicerJVM/run build -s docs&apos;
[= /tab =]
[= tab &amp;quot;Native&amp;quot; =]
juicer build -s docs
[= /tab =]
[= /tabs =]&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-tabs&quot; data-juicer-tabs&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;JVM&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run build -s docs&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;Native&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;juicer&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;build&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;docs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;Node&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;./juicer-cli.js&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;build&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;docs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;filetree&quot;&gt;&lt;code&gt;[= filetree =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Renders the inner content in a monospace box. Use it for tree-style
directory listings — box-drawing characters paste in as-is.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= filetree =]
my-site/
├── content/
│   ├── _index.md
│   └── about.md
└── site.toml
[= /filetree =]&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;juicer-filetree&quot;&gt;
my-site/
├── content/
│   ├── _index.md
│   └── about.md
├── layouts/
│   └── _default/
│       ├── file.html
│       └── folder.html
└── site.toml
&lt;/pre&gt;
&lt;h3 id=&quot;collapse-summary&quot;&gt;&lt;code&gt;[= collapse &amp;quot;Summary&amp;quot; =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Native &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; with juicerdocs styling. The
positional argument is the summary text; the body is the
collapsed content (markdown is rendered inside).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= collapse &amp;quot;Why no JSON frontmatter?&amp;quot; =]
YAML covers the use case fluently, and supporting three formats
triples the surface area to keep correct.
[= /collapse =]&lt;/code&gt;&lt;/pre&gt;
&lt;details class=&quot;juicer-collapse&quot;&gt;
  &lt;summary&gt;Why no JSON frontmatter?&lt;/summary&gt;
  &lt;div class=&quot;juicer-collapse-body&quot;&gt;
    &lt;p&gt;YAML covers the use case fluently, and supporting three formats
triples the surface area to keep correct.&lt;/p&gt;
  &lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&quot;inline-atoms&quot;&gt;Inline atoms&lt;/h2&gt;
&lt;p&gt;Self-closing shortcodes for short, in-line UI flourishes.&lt;/p&gt;
&lt;h3 id=&quot;kbd-ctrl-k&quot;&gt;&lt;code&gt;[= kbd &amp;quot;Ctrl+K&amp;quot; /=]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Renders a &lt;code&gt;&amp;lt;kbd&amp;gt;&lt;/code&gt; element styled to look like a keycap. One
positional argument: the key combo to display.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Press [= kbd &amp;quot;Ctrl+K&amp;quot; /=] to focus search.
Press [= kbd &amp;quot;Cmd+Shift+R&amp;quot; /=] to hard-reload.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Press &lt;kbd class=&quot;juicer-kbd&quot;&gt;Ctrl+K&lt;/kbd&gt;
to focus search.
Press &lt;kbd class=&quot;juicer-kbd&quot;&gt;Cmd+Shift+R&lt;/kbd&gt;
to hard-reload.&lt;/p&gt;
&lt;h3 id=&quot;badge-alpha&quot;&gt;&lt;code&gt;[= badge &amp;quot;alpha&amp;quot; /=]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A small pill-shaped tag. One positional argument: the text inside.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Tag your alpha pages with [= badge &amp;quot;alpha&amp;quot; /=] so readers know.
[= badge &amp;quot;v0.2&amp;quot; /=] [= badge &amp;quot;beta&amp;quot; /=] [= badge &amp;quot;experimental&amp;quot; /=]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tag your alpha pages with &lt;span class=&quot;juicer-badge&quot;&gt;alpha&lt;/span&gt;
so readers know.
&lt;span class=&quot;juicer-badge&quot;&gt;v0.2&lt;/span&gt;
&lt;span class=&quot;juicer-badge&quot;&gt;beta&lt;/span&gt;
&lt;span class=&quot;juicer-badge&quot;&gt;experimental&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;buttons-calls-to-action&quot;&gt;Buttons &amp;amp; calls-to-action&lt;/h2&gt;
&lt;h3 id=&quot;button-label-href-buttons&quot;&gt;&lt;code&gt;[= button &amp;quot;Label&amp;quot; href=&amp;quot;...&amp;quot; /=]&lt;/code&gt; / &lt;code&gt;[= buttons =]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A styled link that looks like a button. The first positional
argument is the label; &lt;code&gt;href&lt;/code&gt; is the URL; setting &lt;code&gt;primary=&amp;quot;true&amp;quot;&lt;/code&gt;
swaps to the filled primary variant. Wrap one or more in
&lt;code&gt;[= buttons =]&lt;/code&gt; for an inline group.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= buttons =]
[= button &amp;quot;Get started&amp;quot; href=&amp;quot;/getting-started/&amp;quot; primary=&amp;quot;true&amp;quot; /=]
[= button &amp;quot;Browse on GitHub&amp;quot; href=&amp;quot;https://github.com/edadma/juicer&amp;quot; /=]
[= /buttons =]&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-buttons&quot;&gt;
&lt;a href=&quot;/getting-started/&quot; class=&quot;juicer-btn juicer-btn-primary&quot;&gt;
  Get started
&lt;/a&gt;
&lt;a href=&quot;https://github.com/edadma/juicer&quot; class=&quot;juicer-btn juicer-btn-secondary&quot;&gt;
  Browse on GitHub
&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;media&quot;&gt;Media&lt;/h2&gt;
&lt;h3 id=&quot;figure-img-foo-png-alt-caption&quot;&gt;&lt;code&gt;[= figure &amp;quot;/img/foo.png&amp;quot; alt=&amp;quot;...&amp;quot; caption=&amp;quot;...&amp;quot; /=]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; with an image and optional caption. First positional
argument is the image URL. Named arguments: &lt;code&gt;alt&lt;/code&gt; (accessibility
text), &lt;code&gt;caption&lt;/code&gt; (visible caption beneath the image).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= figure &amp;quot;/img/diagram.svg&amp;quot; alt=&amp;quot;Build pipeline diagram&amp;quot; caption=&amp;quot;The juicer build pipeline&amp;quot; /=]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;github-owner-repo&quot;&gt;&lt;code&gt;[= github &amp;quot;owner/repo&amp;quot; /=]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A clickable GitHub-repo card. One positional argument: the
&lt;code&gt;owner/repo&lt;/code&gt; slug. Renders the GitHub octocat icon plus the slug
and the subtitle “GitHub repository”, linked to the repo.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= github &amp;quot;edadma/juicer&amp;quot; /=]&lt;/code&gt;&lt;/pre&gt;
&lt;a href=&quot;https://github.com/edadma/juicer&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;juicer-github&quot;&gt;
  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M12 .5C5.65.5.5 5.65.5 12c0 5.07 3.29 9.36 7.86 10.88.58.1.79-.25.79-.56v-2c-3.2.7-3.87-1.36-3.87-1.36-.52-1.32-1.27-1.67-1.27-1.67-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.18 1.76 1.18 1.02 1.75 2.69 1.24 3.35.95.1-.74.4-1.24.72-1.52-2.55-.29-5.23-1.27-5.23-5.66 0-1.25.45-2.27 1.18-3.07-.12-.29-.51-1.46.11-3.04 0 0 .96-.31 3.15 1.18a10.95 10.95 0 0 1 5.74 0c2.19-1.49 3.15-1.18 3.15-1.18.62 1.58.23 2.75.11 3.04.74.8 1.18 1.82 1.18 3.07 0 4.4-2.69 5.36-5.25 5.65.41.36.78 1.06.78 2.13v3.16c0 .31.21.67.8.55C20.21 21.36 23.5 17.07 23.5 12 23.5 5.65 18.35.5 12 .5Z&quot;/&gt;&lt;/svg&gt;
  &lt;div class=&quot;juicer-github-body&quot;&gt;
    &lt;span class=&quot;juicer-github-name&quot;&gt;edadma/juicer&lt;/span&gt;
    &lt;span class=&quot;juicer-github-sub&quot;&gt;GitHub repository&lt;/span&gt;
  &lt;/div&gt;
&lt;/a&gt;
&lt;h3 id=&quot;youtube-video-id&quot;&gt;&lt;code&gt;[= youtube &amp;quot;&amp;lt;video-id&amp;gt;&amp;quot; /=]&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A privacy-respecting iframe embed (&lt;code&gt;youtube-nocookie.com&lt;/code&gt;). One
positional argument: the YouTube video ID (the part after &lt;code&gt;?v=&lt;/code&gt; in
the URL).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= youtube &amp;quot;dQw4w9WgXcQ&amp;quot; /=]&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;reference-table&quot;&gt;Reference table&lt;/h2&gt;
&lt;p&gt;For quick lookup:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Shortcode&lt;/th&gt;&lt;th&gt;Pair / self&lt;/th&gt;&lt;th&gt;Args&lt;/th&gt;&lt;th&gt;Use for&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;note&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;body&lt;/td&gt;&lt;td&gt;Aside, non-critical info&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tip&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;body&lt;/td&gt;&lt;td&gt;Suggestion, shortcut&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;warning&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;body&lt;/td&gt;&lt;td&gt;Slow-down, foot-gun&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;danger&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;body&lt;/td&gt;&lt;td&gt;Destructive / serious caveat&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;steps&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;body w/ &lt;code&gt;## name&lt;/code&gt; headings&lt;/td&gt;&lt;td&gt;Numbered steps&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tabs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;one or more &lt;code&gt;tab&lt;/code&gt; children&lt;/td&gt;&lt;td&gt;Tabbed content groups&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tab&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;&lt;code&gt;args[0]&lt;/code&gt; = label&lt;/td&gt;&lt;td&gt;One tab inside &lt;code&gt;tabs&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;filetree&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;opaque body&lt;/td&gt;&lt;td&gt;Tree-style listings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;collapse&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;&lt;code&gt;args[0]&lt;/code&gt; = summary text, body = content&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; accordion&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;kbd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;self-close&lt;/td&gt;&lt;td&gt;&lt;code&gt;args[0]&lt;/code&gt; = key text&lt;/td&gt;&lt;td&gt;Keycap styling&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;badge&lt;/code&gt;&lt;/td&gt;&lt;td&gt;self-close&lt;/td&gt;&lt;td&gt;&lt;code&gt;args[0]&lt;/code&gt; = label text&lt;/td&gt;&lt;td&gt;Pill / tag&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;button&lt;/code&gt;&lt;/td&gt;&lt;td&gt;self-close&lt;/td&gt;&lt;td&gt;&lt;code&gt;args[0]&lt;/code&gt; = label, &lt;code&gt;href&lt;/code&gt;, &lt;code&gt;primary&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Styled link&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;buttons&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pair&lt;/td&gt;&lt;td&gt;one or more &lt;code&gt;button&lt;/code&gt; children&lt;/td&gt;&lt;td&gt;Button group&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;figure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;self-close&lt;/td&gt;&lt;td&gt;&lt;code&gt;args[0]&lt;/code&gt; = src, &lt;code&gt;alt&lt;/code&gt;, &lt;code&gt;caption&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Image with caption&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;github&lt;/code&gt;&lt;/td&gt;&lt;td&gt;self-close&lt;/td&gt;&lt;td&gt;&lt;code&gt;args[0]&lt;/code&gt; = &lt;code&gt;owner/repo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GitHub repo card&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;youtube&lt;/code&gt;&lt;/td&gt;&lt;td&gt;self-close&lt;/td&gt;&lt;td&gt;&lt;code&gt;args[0]&lt;/code&gt; = video ID&lt;/td&gt;&lt;td&gt;Privacy-friendly embed&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;writing-your-own&quot;&gt;Writing your own&lt;/h2&gt;
&lt;p&gt;Drop a template at &lt;code&gt;&amp;lt;src&amp;gt;/shortcodes/&amp;lt;name&amp;gt;.html&lt;/code&gt; (or, in a theme,
at &lt;code&gt;&amp;lt;theme&amp;gt;/shortcodes/&amp;lt;name&amp;gt;.html&lt;/code&gt;). Inside it you have access to:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Variable&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.args&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Positional arguments — a list of strings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Each named argument by its key&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.content&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The body, if the shortcode is invoked as a pair (else absent)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A minimal callout — template at &lt;code&gt;&amp;lt;src&amp;gt;/shortcodes/callout.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;aside&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;callout callout-&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;kind&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;kind&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;note&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; markdownify &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;aside&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Invoke it from markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= callout kind=&amp;quot;success&amp;quot; =]
The build passed.
[= /callout =]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See &lt;a href=&quot;/concepts/shortcodes/&quot;&gt;Concepts → Shortcodes&lt;/a&gt; for the full
syntax (quoting rules, escaping, paired vs self-closing).&lt;/p&gt;
&lt;h2 id=&quot;deferred-shortcodes-the-delimiter&quot;&gt;Deferred shortcodes — the &lt;code&gt;[~ … ~]&lt;/code&gt; delimiter&lt;/h2&gt;
&lt;p&gt;The classic &lt;code&gt;[= … =]&lt;/code&gt; syntax runs &lt;strong&gt;before&lt;/strong&gt; markdown parsing. That’s
the right phase for shortcodes that emit markdown — a &lt;code&gt;note&lt;/code&gt; callout
producing &lt;code&gt;&amp;lt;aside&amp;gt;…&amp;lt;/aside&amp;gt;&lt;/code&gt; flows through the markdown parser
correctly because the parser sees plain HTML in the input.&lt;/p&gt;
&lt;p&gt;What that phase &lt;strong&gt;can’t&lt;/strong&gt; do is reach &lt;code&gt;.page.pages&lt;/code&gt;, &lt;code&gt;.page.subsections&lt;/code&gt;,
&lt;code&gt;.section.*&lt;/code&gt;, or any field of &lt;code&gt;.site.*&lt;/code&gt; — those records don’t exist
yet during the markdown pass. Trying to render a shortcode template
that says &lt;code&gt;{{ for p &amp;lt;- .page.pages }}&lt;/code&gt; from &lt;code&gt;[= … =]&lt;/code&gt; silently produces
an empty list.&lt;/p&gt;
&lt;p&gt;Juicer provides a second shortcode delimiter pair, &lt;code&gt;[~ … ~]&lt;/code&gt;, that
runs &lt;strong&gt;after&lt;/strong&gt; the page + section + site pipeline has finished. Inside
a &lt;code&gt;[~&lt;/code&gt; shortcode the template sees:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Namespace&lt;/th&gt;&lt;th&gt;What’s available&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Full page record — title, summary, tags, &lt;strong&gt;pages&lt;/strong&gt;, &lt;strong&gt;subsections&lt;/strong&gt;, permalink, ancestors, prev / next, series, authors, …&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Full sitedata — &lt;code&gt;.site.posts&lt;/code&gt;, &lt;code&gt;.site.pages&lt;/code&gt;, &lt;code&gt;.site.tags&lt;/code&gt;, &lt;code&gt;.site.authors&lt;/code&gt;, &lt;code&gt;.site.now&lt;/code&gt;, &lt;code&gt;.site.data&lt;/code&gt;, …&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.args&lt;/code&gt; / &lt;code&gt;.&amp;lt;key&amp;gt;&lt;/code&gt; / &lt;code&gt;.content&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same as the immediate pass&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-variable&quot;&gt;\[&lt;/span&gt;~ section-list /~]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-comment&quot;&gt;// shortcodes/section-list.html — must be invoked from the deferred&lt;/span&gt;
   &lt;span class=&quot;hl-comment&quot;&gt;// pass because it depends on .page.pages and .page.subsections.   }}&lt;/span&gt;
{{ &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; p &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-warning&quot;&gt;
  &lt;strong&gt;Warning&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Deferred shortcodes emit HTML, not markdown.&lt;/strong&gt; They run on the
already-rendered HTML body. If your template wants to render markdown
output, pipe it through &lt;code&gt;\{\{ markdownify ... \}\}&lt;/code&gt; explicitly.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Same template registry.&lt;/strong&gt; Both delimiter pairs look up templates in
&lt;code&gt;shortcodes/&lt;/code&gt;; the difference is purely &lt;em&gt;when&lt;/em&gt; the shortcode runs and
&lt;em&gt;what context it sees&lt;/em&gt;. A template that uses neither &lt;code&gt;.page&lt;/code&gt; nor
&lt;code&gt;.site&lt;/code&gt; works identically from either pass.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Shortcodes</title>
    <link href="https://juicer.build/concepts/shortcodes/"/>
    <id>https://juicer.build/concepts/shortcodes/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Markdown-embeddable templates for callouts, tabs, embeds, and more.</summary>
    <content type="html">&lt;p&gt;Shortcodes let authors invoke HTML templates from inside markdown without writing raw HTML. They use a bracket-equals syntax to avoid collisions with both markdown and squiggly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= shortcode-name positional &amp;quot;another arg&amp;quot; key=&amp;quot;value&amp;quot; =]
optional body content
[= /shortcode-name =]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The body content is captured raw and exposed to the template as &lt;code&gt;.content&lt;/code&gt;; positional args become &lt;code&gt;.args&lt;/code&gt; (a list); named args become &lt;code&gt;.&amp;lt;name&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-juicerdocs-ships&quot;&gt;What juicerdocs ships&lt;/h2&gt;
&lt;p&gt;This very theme provides a useful set out of the box. Some examples:&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Note callouts&lt;/strong&gt; like this one are written with &lt;code&gt;[= note =] ... [= /note =]&lt;/code&gt;. We have &lt;code&gt;tip&lt;/code&gt;, &lt;code&gt;warning&lt;/code&gt;, and &lt;code&gt;danger&lt;/code&gt; variants for different colors and icons.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; if you author a lot of structured docs, the &lt;code&gt;steps&lt;/code&gt;, &lt;code&gt;tabs&lt;/code&gt;, and &lt;code&gt;filetree&lt;/code&gt; shortcodes save you a lot of HTML.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-callout juicer-callout-warning&quot;&gt;
  &lt;strong&gt;Warning&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Watch out:&lt;/strong&gt; shortcodes are processed &lt;em&gt;before&lt;/em&gt; markdown is parsed, so you can’t put a shortcode inside an indented code block.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-callout juicer-callout-danger&quot;&gt;
  &lt;strong&gt;Danger&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Don’t do this:&lt;/strong&gt; never expose a shortcode that takes user input straight into HTML. Run it through &lt;code&gt;markdownify&lt;/code&gt; or escape it explicitly.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;tabs&quot;&gt;Tabs&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;tabs&lt;/code&gt; / &lt;code&gt;tab&lt;/code&gt; pair gives tabbed content. Useful for showing the same operation across platforms:&lt;/p&gt;
&lt;div class=&quot;juicer-tabs&quot; data-juicer-tabs&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;JVM&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run build -s docs&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;Native&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;juicer&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;build&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;docs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-tab-panel&quot; data-tab-label=&quot;Node&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;./juicer-cli.js&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;build&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;docs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;steps&quot;&gt;Steps&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;[= steps =]&lt;/code&gt; and write &lt;code&gt;## Step name&lt;/code&gt; headings inside; they’re auto-numbered:&lt;/p&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;install-juicer&quot;&gt;Install Juicer&lt;/h2&gt;
&lt;p&gt;Clone the repo and verify with &lt;code&gt;sbt &apos;juicerJVM/run --help&apos;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;make-a-site-directory&quot;&gt;Make a site directory&lt;/h2&gt;
&lt;p&gt;Create &lt;code&gt;site.toml&lt;/code&gt;, a &lt;code&gt;content/&lt;/code&gt; folder, and &lt;code&gt;layouts/_default/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;build-serve&quot;&gt;Build &amp;amp; serve&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;sbt &apos;juicerJVM/run serve -s .&apos;&lt;/code&gt; and open &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;file-trees&quot;&gt;File trees&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;[= filetree =]&lt;/code&gt; is just monospace + indent guides — paste a tree-style listing inside:&lt;/p&gt;
&lt;pre class=&quot;juicer-filetree&quot;&gt;
my-site/
├── content/
│   ├── _index.md
│   └── about.md
├── layouts/
│   └── _default/
│       ├── file.html
│       └── folder.html
└── site.toml
&lt;/pre&gt;
&lt;h2 id=&quot;inline-pieces&quot;&gt;Inline pieces&lt;/h2&gt;
&lt;p&gt;Press &lt;kbd class=&quot;juicer-kbd&quot;&gt;Ctrl+K&lt;/kbd&gt;
to focus search. Tag your alpha pages with &lt;span class=&quot;juicer-badge&quot;&gt;alpha&lt;/span&gt;
so readers know.&lt;/p&gt;
&lt;h2 id=&quot;collapsible-sections&quot;&gt;Collapsible sections&lt;/h2&gt;
&lt;p&gt;Great for FAQs and “show me the long version”:&lt;/p&gt;
&lt;details class=&quot;juicer-collapse&quot;&gt;
  &lt;summary&gt;Why no JSON frontmatter?&lt;/summary&gt;
  &lt;div class=&quot;juicer-collapse-body&quot;&gt;
    &lt;p&gt;The frontmatter format is YAML because YAML covers the use case fluently and supporting three formats (YAML, TOML, JSON) triples the surface area to keep correct. JSON inside markdown is also visually noisy.&lt;/p&gt;
  &lt;/div&gt;
&lt;/details&gt;
&lt;details class=&quot;juicer-collapse&quot;&gt;
  &lt;summary&gt;What about TOML frontmatter?&lt;/summary&gt;
  &lt;div class=&quot;juicer-collapse-body&quot;&gt;
    &lt;p&gt;Same answer. Site config is TOML; per-page metadata is YAML; it’s two formats but they live in different files, and the line is easy to remember.&lt;/p&gt;
  &lt;/div&gt;
&lt;/details&gt;
&lt;h2 id=&quot;buttons&quot;&gt;Buttons&lt;/h2&gt;
&lt;p&gt;For landing pages and CTAs:&lt;/p&gt;
&lt;div class=&quot;juicer-buttons&quot;&gt;
&lt;a href=&quot;/getting-started/&quot; class=&quot;juicer-btn juicer-btn-primary&quot;&gt;
  Get started
&lt;/a&gt;
&lt;a href=&quot;https://github.com/edadma/juicer&quot; class=&quot;juicer-btn juicer-btn-secondary&quot;&gt;
  Browse on GitHub
&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;github-repo-cards&quot;&gt;GitHub repo cards&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;[= github &amp;quot;owner/repo&amp;quot; /=]&lt;/code&gt; renders a clickable card:&lt;/p&gt;
&lt;a href=&quot;https://github.com/edadma/juicer&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;juicer-github&quot;&gt;
  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot;&gt;&lt;path d=&quot;M12 .5C5.65.5.5 5.65.5 12c0 5.07 3.29 9.36 7.86 10.88.58.1.79-.25.79-.56v-2c-3.2.7-3.87-1.36-3.87-1.36-.52-1.32-1.27-1.67-1.27-1.67-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.18 1.76 1.18 1.02 1.75 2.69 1.24 3.35.95.1-.74.4-1.24.72-1.52-2.55-.29-5.23-1.27-5.23-5.66 0-1.25.45-2.27 1.18-3.07-.12-.29-.51-1.46.11-3.04 0 0 .96-.31 3.15 1.18a10.95 10.95 0 0 1 5.74 0c2.19-1.49 3.15-1.18 3.15-1.18.62 1.58.23 2.75.11 3.04.74.8 1.18 1.82 1.18 3.07 0 4.4-2.69 5.36-5.25 5.65.41.36.78 1.06.78 2.13v3.16c0 .31.21.67.8.55C20.21 21.36 23.5 17.07 23.5 12 23.5 5.65 18.35.5 12 .5Z&quot;/&gt;&lt;/svg&gt;
  &lt;div class=&quot;juicer-github-body&quot;&gt;
    &lt;span class=&quot;juicer-github-name&quot;&gt;edadma/juicer&lt;/span&gt;
    &lt;span class=&quot;juicer-github-sub&quot;&gt;GitHub repository&lt;/span&gt;
  &lt;/div&gt;
&lt;/a&gt;
&lt;h2 id=&quot;youtube-embeds&quot;&gt;YouTube embeds&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;[= youtube &amp;quot;&amp;lt;video-id&amp;gt;&amp;quot; /=]&lt;/code&gt; embeds a privacy-respecting iframe (&lt;code&gt;youtube-nocookie.com&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&quot;writing-your-own&quot;&gt;Writing your own&lt;/h2&gt;
&lt;p&gt;Drop a template at &lt;code&gt;&amp;lt;theme&amp;gt;/shortcodes/&amp;lt;name&amp;gt;.html&lt;/code&gt; (or &lt;code&gt;&amp;lt;site&amp;gt;/shortcodes/&amp;lt;name&amp;gt;.html&lt;/code&gt;). Inside, you have access to:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Var&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.args&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Positional arguments — a list of strings&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Each named argument by its key&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.content&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The body, if the shortcode is delimited&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Use the &lt;code&gt;markdownify&lt;/code&gt; builtin to render the body as markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;my-callout&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; markdownify &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;two-passes-immediate-vs-deferred&quot;&gt;Two passes: immediate vs. deferred&lt;/h2&gt;
&lt;p&gt;Juicer runs shortcodes in &lt;strong&gt;two passes&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Immediate&lt;/strong&gt; — the classic &lt;code&gt;[= name =]&lt;/code&gt; delimiter. Runs &lt;em&gt;before&lt;/em&gt;
markdown parsing, so the shortcode’s output flows through the
markdown parser. Best for shortcodes whose body is markdown (callouts,
tabs, collapsible sections, …). The trade-off: this pass happens
before the page + section + site pipeline assembles its data, so
the shortcode template sees only &lt;code&gt;.args&lt;/code&gt;, named keys, and
&lt;code&gt;.content&lt;/code&gt; — no &lt;code&gt;.page&lt;/code&gt; or &lt;code&gt;.site&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deferred&lt;/strong&gt; — the &lt;code&gt;[~ name ~]&lt;/code&gt; delimiter. Runs &lt;em&gt;after&lt;/em&gt; the
pipeline finishes, on the already-rendered HTML body. The
shortcode template can reach &lt;code&gt;.page.title&lt;/code&gt;, &lt;code&gt;.page.pages&lt;/code&gt;,
&lt;code&gt;.page.subsections&lt;/code&gt;, &lt;code&gt;.section.*&lt;/code&gt;, and the full &lt;code&gt;.site.*&lt;/code&gt;.
Trade-off: the shortcode emits HTML directly (the markdown parser
has already run), so pipe markdown through &lt;code&gt;markdownify&lt;/code&gt; explicitly
if you need it.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;[= note =]Immediate — emits markdown that the parser then renders.[= /note =]

&lt;span class=&quot;hl-variable&quot;&gt;\[&lt;/span&gt;~ pagebadge /~]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-comment&quot;&gt;// shortcodes/pagebadge.html — accesses .page.title, so must be&lt;/span&gt;
   &lt;span class=&quot;hl-comment&quot;&gt;//  invoked from the deferred pass.                              }}&lt;/span&gt;
&lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;&lt;/span&gt;span class=&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;badge&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-keyword&quot;&gt;&amp;gt;&lt;/span&gt;{{ &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both passes look up templates in the same &lt;code&gt;shortcodes/&lt;/code&gt; directory; the
delimiter chooses which pass runs the template. A template that
references neither &lt;code&gt;.page&lt;/code&gt; nor &lt;code&gt;.site&lt;/code&gt; can be invoked from either.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Démarrage rapide</title>
    <link href="https://juicer.build/fr/getting-started/quickstart/"/>
    <id>https://juicer.build/fr/getting-started/quickstart/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Construisez un petit site d&apos;une seule page en trois minutes.</summary>
    <content type="html">&lt;p&gt;Ce guide construit le plus petit site juicer possible — une page, un gabarit — pour que vous voyiez les rouages avant d’ajouter quoi que ce soit de sophistiqué.&lt;/p&gt;
&lt;h2 id=&quot;1-créer-un-répertoire&quot;&gt;1. Créer un répertoire&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;my-site&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;my-site&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2-écrire-site-toml&quot;&gt;2. Écrire &lt;code&gt;site.toml&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;My Site&amp;quot;&lt;/span&gt;
author  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;You&amp;quot;&lt;/span&gt;
baseURL &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;http://localhost:8080&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C’est le minimum. Juicer superpose ceci par-dessus la configuration de référence &lt;code&gt;standard&lt;/code&gt; (les thèmes vont dans &lt;code&gt;themes/&lt;/code&gt;, le contenu dans &lt;code&gt;content/&lt;/code&gt;, etc.) — voir &lt;a href=&quot;/reference/config/&quot;&gt;Configuration&lt;/a&gt; pour l’ensemble complet.&lt;/p&gt;
&lt;h2 id=&quot;3-écrire-un-gabarit&quot;&gt;3. Écrire un gabarit&lt;/h2&gt;
&lt;p&gt;Juicer a besoin d’au moins un gabarit &lt;em&gt;file&lt;/em&gt; (pour les pages individuelles) et d’un gabarit &lt;em&gt;folder&lt;/em&gt; (pour les index de section). Ils vivent sous &lt;code&gt;layouts/_default/&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;layouts/_default&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;layouts/_default/folder.html&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;hl-keyword&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; – &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;layouts/_default/file.html&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;folder&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Ce second gabarit délègue simplement à &lt;code&gt;folder.html&lt;/code&gt; — pour un site d’une seule page, les deux gabarits peuvent produire le même rendu.)&lt;/p&gt;
&lt;h2 id=&quot;4-écrire-du-contenu&quot;&gt;4. Écrire du contenu&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;content/_index.md&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Hello
---

# It works!

This is **juicer**, rendering markdown.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;5-construire-et-servir&quot;&gt;5. Construire et servir&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s . -d public&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ouvrez &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;. Vous devriez voir votre page.&lt;/p&gt;
&lt;h2 id=&quot;que-s-est-il-passé&quot;&gt;Que s’est-il passé ?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Juicer a parcouru l’arborescence &lt;code&gt;content/&lt;/code&gt;, repérant les fichiers markdown et analysant leur frontmatter YAML.&lt;/li&gt;
&lt;li&gt;Pour chaque fichier de contenu, il a choisi un gabarit (&lt;code&gt;folder.html&lt;/code&gt; pour &lt;code&gt;_index.md&lt;/code&gt;, &lt;code&gt;file.html&lt;/code&gt; pour le reste) et l’a rendu.&lt;/li&gt;
&lt;li&gt;La sortie est allée dans &lt;code&gt;public/&lt;/code&gt; — &lt;code&gt;_index.md&lt;/code&gt; est devenu &lt;code&gt;public/index.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Un &lt;code&gt;sitemap.xml&lt;/code&gt; et un &lt;code&gt;search.json&lt;/code&gt; ont aussi été produits automatiquement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Passez aux &lt;a href=&quot;/concepts/&quot;&gt;Concepts&lt;/a&gt; pour voir le rôle de chacune de ces pièces.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Quickstart</title>
    <link href="https://juicer.build/getting-started/quickstart/"/>
    <id>https://juicer.build/getting-started/quickstart/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Build a tiny site with one page in three minutes.</summary>
    <content type="html">&lt;p&gt;This walkthrough builds the smallest possible juicer site — one page, one layout — so you can see the moving parts before adding anything fancy.&lt;/p&gt;
&lt;h2 id=&quot;1-make-a-directory&quot;&gt;1. Make a directory&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;my-site&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;my-site&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2-write-site-toml&quot;&gt;2. Write &lt;code&gt;site.toml&lt;/code&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;My Site&amp;quot;&lt;/span&gt;
author  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;You&amp;quot;&lt;/span&gt;
baseURL &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;http://localhost:8080&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s the minimum. Juicer overlays this on top of the &lt;code&gt;standard&lt;/code&gt; baseline config (themes go in &lt;code&gt;themes/&lt;/code&gt;, content in &lt;code&gt;content/&lt;/code&gt;, etc.) — see &lt;a href=&quot;/reference/config/&quot;&gt;Configuration&lt;/a&gt; for the full set.&lt;/p&gt;
&lt;h2 id=&quot;3-write-a-layout&quot;&gt;3. Write a layout&lt;/h2&gt;
&lt;p&gt;Juicer needs at least a &lt;em&gt;file&lt;/em&gt; layout (for individual pages) and a &lt;em&gt;folder&lt;/em&gt; layout (for section indexes). They live under &lt;code&gt;layouts/_default/&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;layouts/_default&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;layouts/_default/folder.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;hl-keyword&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; – &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;layouts/_default/file.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;folder&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(That second template just delegates to &lt;code&gt;folder.html&lt;/code&gt; — for a one-page site, both layouts can render the same way.)&lt;/p&gt;
&lt;h2 id=&quot;4-write-content&quot;&gt;4. Write content&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;content/_index.md&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Hello
---

# It works!

This is **juicer**, rendering markdown.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;5-build-serve&quot;&gt;5. Build &amp;amp; serve&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s . -d public&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;. You should see your page.&lt;/p&gt;
&lt;h2 id=&quot;what-just-happened&quot;&gt;What just happened?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Juicer walked the &lt;code&gt;content/&lt;/code&gt; tree, finding markdown files and parsing their YAML frontmatter.&lt;/li&gt;
&lt;li&gt;For each content file it picked a template (&lt;code&gt;folder.html&lt;/code&gt; for &lt;code&gt;_index.md&lt;/code&gt;, &lt;code&gt;file.html&lt;/code&gt; for everything else) and rendered it.&lt;/li&gt;
&lt;li&gt;The output went to &lt;code&gt;public/&lt;/code&gt; — &lt;code&gt;_index.md&lt;/code&gt; became &lt;code&gt;public/index.html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;sitemap.xml&lt;/code&gt; and &lt;code&gt;search.json&lt;/code&gt; were also emitted automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Move on to &lt;a href=&quot;/concepts/&quot;&gt;Concepts&lt;/a&gt; to see what each of those pieces does.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Markdown</title>
    <link href="https://juicer.build/concepts/markdown/"/>
    <id>https://juicer.build/concepts/markdown/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Every markdown extension juicer turns on, with examples.</summary>
    <content type="html">&lt;p&gt;Juicer is built on &lt;a href=&quot;https://github.com/edadma/markdown&quot;&gt;&lt;code&gt;io.github.edadma/markdown&lt;/code&gt;&lt;/a&gt; — a full CommonMark 0.31.2 parser. Every page gets the same defaults; this section walks through what’s enabled and how each piece looks rendered.&lt;/p&gt;
&lt;h2 id=&quot;commonmark-the-basics&quot;&gt;CommonMark — the basics&lt;/h2&gt;
&lt;p&gt;The whole CommonMark spec works without any opt-in. Headings, paragraphs, lists, blockquotes, code spans, fenced code blocks, links, images.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# Heading 1
## Heading 2
### Heading 3

A *paragraph* with **strong** emphasis and `inline code`.

&amp;gt; A blockquote.
&amp;gt; Lazy continuation works too.

1. Ordered list
2. With items
   1. Nested
3. Continues

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;Link text&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;(&lt;/span&gt;https://juicer.build/&lt;span class=&quot;hl-punctuation&quot;&gt;)&lt;/span&gt; and &lt;span class=&quot;hl-punctuation&quot;&gt;![&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;(&lt;/span&gt;https://placehold.co/40x40 &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;)&lt;/span&gt;.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;gfm-extras&quot;&gt;GFM extras&lt;/h2&gt;
&lt;p&gt;The juicer config opts into every GitHub-Flavored-Markdown extension the parser supports:&lt;/p&gt;
&lt;h3 id=&quot;tables&quot;&gt;Tables&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt; Tier &lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt; What&apos;s in it &lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;--------------&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt; 1 &lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt; site.pages, page URLs, drafts, sitemap, summary &lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt; 2 &lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt; live reload, render hooks, RSS, sections, i18n, themes &lt;span class=&quot;hl-punctuation&quot;&gt;|&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;renders as&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Tier&lt;/th&gt;&lt;th&gt;What’s in it&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;site.pages, page URLs, drafts, sitemap, summary&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;live reload, render hooks, RSS, sections, i18n, themes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;strikethrough&quot;&gt;Strikethrough&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;~~old behavior~~&lt;/code&gt; renders as &lt;del&gt;old behavior&lt;/del&gt;.&lt;/p&gt;
&lt;h3 id=&quot;task-lists&quot;&gt;Task lists&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; [x] Tier 1 — done
- [x] Section list pages
- [ ] i18n
- [ ] Render hooks&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;renders as&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Tier 1 — done&lt;/li&gt;
&lt;li&gt;&lt;input checked=&quot;&quot; disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Section list pages&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; i18n&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Render hooks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;footnotes&quot;&gt;Footnotes&lt;/h3&gt;
&lt;p&gt;You can drop a footnote reference&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn-numbers&quot; id=&quot;fnref-numbers&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; mid-paragraph and define it elsewhere.&lt;/p&gt;
&lt;h3 id=&quot;auto-linking&quot;&gt;Auto-linking&lt;/h3&gt;
&lt;p&gt;Bare URLs like &lt;a href=&quot;https://juicer.build/&quot;&gt;https://juicer.build/&lt;/a&gt; are recognized and turned into clickable links without explicit &lt;code&gt;[…](…)&lt;/code&gt; syntax.&lt;/p&gt;
&lt;h3 id=&quot;smart-punctuation&quot;&gt;Smart punctuation&lt;/h3&gt;
&lt;p&gt;Straight quotes get curly: “hello” becomes “hello”, and &lt;code&gt;--&lt;/code&gt; / &lt;code&gt;---&lt;/code&gt; become en/em dashes — like that.&lt;/p&gt;
&lt;h2 id=&quot;callouts-admonitions&quot;&gt;Callouts (admonitions)&lt;/h2&gt;
&lt;p&gt;GFM-style callouts — &lt;code&gt;&amp;gt; [!NOTE]&lt;/code&gt; / &lt;code&gt;&amp;gt; [!TIP]&lt;/code&gt; / &lt;code&gt;&amp;gt; [!WARNING]&lt;/code&gt; / &lt;code&gt;&amp;gt; [!IMPORTANT]&lt;/code&gt; / &lt;code&gt;&amp;gt; [!CAUTION]&lt;/code&gt; — render as styled blocks. Markdown source:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt; [!NOTE]
&amp;gt; This is the parser&apos;s built-in callout. It produces a styled `&amp;lt;div&amp;gt;` with
&amp;gt; the type baked into a class name.&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;callout callout-note&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Note&lt;/div&gt;
  &lt;div class=&quot;callout-content&quot;&gt;
    &lt;p&gt;This is the parser’s built-in callout. It produces a styled &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with
the type baked into a class name.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;callout callout-warning&quot;&gt;
  &lt;div class=&quot;callout-title&quot;&gt;Warning&lt;/div&gt;
  &lt;div class=&quot;callout-content&quot;&gt;
    &lt;p&gt;The shortcode-based callouts (&lt;code&gt;[= note =]…[= /note =]&lt;/code&gt;) and the markdown-native
callouts above produce different HTML. The shortcodes are themed by juicerdocs
directly; the native ones are styled by Tailwind’s typography defaults.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;auto-heading-ids&quot;&gt;Auto heading IDs&lt;/h2&gt;
&lt;p&gt;Every &lt;code&gt;&amp;lt;hN&amp;gt;&lt;/code&gt; gets an &lt;code&gt;id&lt;/code&gt; derived from its plain-text content. The TOC reads this back; deep links work out of the box.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;## Hello, world!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;becomes &lt;code&gt;&amp;lt;h2 id=&amp;quot;hello-world&amp;quot;&amp;gt;Hello, world!&amp;lt;/h2&amp;gt;&lt;/code&gt; — see your URL bar’s hash if you click any heading on this page.&lt;/p&gt;
&lt;h2 id=&quot;definition-lists&quot;&gt;Definition lists&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Apple
: A round fruit, typically red or green.

Orange
: A citrus fruit. Also a color.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;renders as&lt;/p&gt;
&lt;dl&gt;
  &lt;dt&gt;Apple&lt;/dt&gt;
  &lt;dd&gt;
&lt;p&gt;A round fruit, typically red or green.&lt;/p&gt;  &lt;/dd&gt;
  &lt;dt&gt;Orange&lt;/dt&gt;
  &lt;dd&gt;
&lt;p&gt;A citrus fruit. Also a color.&lt;/p&gt;  &lt;/dd&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;emoji&quot;&gt;Emoji&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;:smile:&lt;/code&gt; becomes 😄, &lt;code&gt;:rocket:&lt;/code&gt; becomes 🚀, &lt;code&gt;:tada:&lt;/code&gt; becomes 🎉 — the unicode codepoints, not images.&lt;/p&gt;
&lt;h2 id=&quot;code-blocks-with-language&quot;&gt;Code blocks with language&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;hl-keyword&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;prose&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-scala&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;// Squiggly&apos;s Go-template-style syntax compiles down to a small AST.&lt;/span&gt;
&lt;span class=&quot;hl-keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;hl-type&quot;&gt;TemplateRenderer&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;(&lt;/span&gt;
  partials&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;hl-type&quot;&gt;TemplateLoader&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;=&lt;/span&gt; _ &lt;span class=&quot;hl-keyword&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;hl-type&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
  data&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;       &lt;span class=&quot;hl-type&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-type&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-type&quot;&gt;Any&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-type&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;empty&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
  functions&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;hl-type&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-type&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-type&quot;&gt;TemplateFunction&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-type&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;empty&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# A code block tagged `bash` gets a &amp;quot;BASH&amp;quot; badge and copy button.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; A code block tagged `bash` gets a &amp;quot;BASH&amp;quot; badge and copy button.
&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The juicerdocs theme adds a copy-to-clipboard button on every &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; — hover to see it.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol&gt;
&lt;li id=&quot;fn-numbers&quot;&gt;
&lt;p&gt;This is the footnote body. Multiple paragraphs supported. &lt;a href=&quot;#fnref-numbers&quot; class=&quot;footnote-backref&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content>
  </entry>
  <entry>
    <title>Installation</title>
    <link href="https://juicer.build/fr/getting-started/installation/"/>
    <id>https://juicer.build/fr/getting-started/installation/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Ajoutez juicer comme dépendance sbt, ou clonez le dépôt et exécutez-le depuis les sources.</summary>
    <content type="html">&lt;h2 id=&quot;depuis-les-sources-recommandé-pour-l-instant&quot;&gt;Depuis les sources (recommandé pour l’instant)&lt;/h2&gt;
&lt;p&gt;Juicer est publié depuis un dépôt unique à l’adresse &lt;a href=&quot;https://github.com/edadma/juicer&quot;&gt;https://github.com/edadma/juicer&lt;/a&gt;. En attendant la mise en place des distributions binaires, le plus simple est de cloner le dépôt et de l’exécuter avec sbt.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;clone&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;https://github.com/edadma/juicer.git&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;juicer&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run --help&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous verrez la bannière d’aide. Si sbt affiche autre chose que cette aide, consultez la page &lt;a href=&quot;/getting-started/troubleshooting/&quot;&gt;Dépannage&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;dépendance-sbt-utilisation-comme-bibliothèque&quot;&gt;Dépendance sbt (utilisation comme bibliothèque)&lt;/h2&gt;
&lt;p&gt;Juicer est surtout une &lt;em&gt;application&lt;/em&gt; — l’interface en ligne de commande couvre les besoins de la plupart des utilisateurs — mais le pipeline de construction est aussi exposé comme bibliothèque. Ajoutez-le à votre &lt;code&gt;build.sbt&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-scala&quot;&gt;libraryDependencies &lt;span class=&quot;hl-keyword&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;io.github.edadma&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;%%%&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicer&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;0.2.0&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La forme &lt;code&gt;%%%&lt;/code&gt; choisit le bon artefact selon la plateforme Scala que vous utilisez (&lt;code&gt;juicerJVM&lt;/code&gt;, &lt;code&gt;juicerJS&lt;/code&gt;, &lt;code&gt;juicerNative&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&quot;prérequis&quot;&gt;Prérequis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scala 3.8.3&lt;/strong&gt; — juicer est exclusivement en Scala 3. Aucun rétroportage vers Scala 2 n’est prévu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sbt 1.12.x&lt;/strong&gt; — les versions antérieures peuvent fonctionner ; non testées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JVM 17+&lt;/strong&gt; — pour la cible JVM. Scala.js requiert Node 20+ ; Scala Native requiert Clang.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vérifier-l-installation&quot;&gt;Vérifier l’installation&lt;/h2&gt;
&lt;p&gt;Le test de fumée consiste à lancer &lt;code&gt;juicer build&lt;/code&gt; sur le répertoire &lt;code&gt;docs/demos/minimal&lt;/code&gt; du dépôt :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run build -s docs/demos/minimal&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
ls docs/demos/minimal/public&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous devriez voir un &lt;code&gt;index.html&lt;/code&gt; et une copie de &lt;code&gt;static/&lt;/code&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Installation</title>
    <link href="https://juicer.build/getting-started/installation/"/>
    <id>https://juicer.build/getting-started/installation/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Add juicer as an sbt dependency or check out the repo and run from source.</summary>
    <content type="html">&lt;h2 id=&quot;from-source-recommended-for-now&quot;&gt;From source (recommended for now)&lt;/h2&gt;
&lt;p&gt;Juicer is published from a single repo at &lt;a href=&quot;https://github.com/edadma/juicer&quot;&gt;https://github.com/edadma/juicer&lt;/a&gt;. Until binary releases are wired up, the simplest path is to clone and run with sbt.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;clone&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;https://github.com/edadma/juicer.git&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;juicer&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run --help&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’ll see the usage banner. If sbt prints anything other than the help output, see &lt;a href=&quot;/getting-started/troubleshooting/&quot;&gt;Troubleshooting&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;sbt-dependency-library-use&quot;&gt;sbt dependency (library use)&lt;/h2&gt;
&lt;p&gt;Juicer is mostly an &lt;em&gt;application&lt;/em&gt; — the CLI does what most users need — but the build pipeline is exposed as a library too. Add it to your &lt;code&gt;build.sbt&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-scala&quot;&gt;libraryDependencies &lt;span class=&quot;hl-keyword&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;io.github.edadma&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;%%%&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicer&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;0.2.0&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;%%%&lt;/code&gt; form picks the right artifact for whichever Scala platform you’re on (&lt;code&gt;juicerJVM&lt;/code&gt;, &lt;code&gt;juicerJS&lt;/code&gt;, &lt;code&gt;juicerNative&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scala 3.8.3&lt;/strong&gt; — juicer is Scala-3 only. No Scala 2 backport planned.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sbt 1.12.x&lt;/strong&gt; — earlier versions might work; not tested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JVM 17+&lt;/strong&gt; — for the JVM target. Scala.js needs Node 20+; Scala Native needs Clang.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;verifying-the-install&quot;&gt;Verifying the install&lt;/h2&gt;
&lt;p&gt;The smoke test is &lt;code&gt;juicer build&lt;/code&gt; against the &lt;code&gt;docs/demos/minimal&lt;/code&gt; directory in the repo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run build -s docs/demos/minimal&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
ls docs/demos/minimal/public&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should see an &lt;code&gt;index.html&lt;/code&gt; and a &lt;code&gt;static/&lt;/code&gt; mirror.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Internationalization (i18n)</title>
    <link href="https://juicer.build/concepts/i18n/"/>
    <id>https://juicer.build/concepts/i18n/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Publish a site in more than one language — language-prefixed URLs, per-language navigation, translated UI strings, and automatic hreflang.</summary>
    <content type="html">&lt;p&gt;A juicer site can ship the same content in several languages. Each language
gets its own content tree, its own URL space, and its own navigation; pages
that exist in more than one language cross-link automatically, and the UI
chrome (button labels, “Previous”/”Next”, search placeholder, …) is
translated through dictionaries. Single-language sites pay nothing for any
of this — none of it activates until you declare a &lt;code&gt;languages&lt;/code&gt; list.&lt;/p&gt;
&lt;p&gt;This page documents every moving part. The juicer.build docs you’re reading
are themselves bilingual (English + French), so it’s all dogfooded.&lt;/p&gt;
&lt;h2 id=&quot;turning-it-on&quot;&gt;Turning it on&lt;/h2&gt;
&lt;p&gt;Declare the languages and the default in &lt;code&gt;site.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;languages             &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;fr&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
defaultLanguage       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;en&amp;quot;&lt;/span&gt;
defaultLanguageInRoot &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;languages&lt;/code&gt;&lt;/strong&gt; — the list of language codes you publish. An empty or
absent list means a single-language site (no behavior change at all).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;defaultLanguage&lt;/code&gt;&lt;/strong&gt; — the fallback language. A missing translation (of a
page or of a UI string) falls back to this language. Defaults to the first
entry of &lt;code&gt;languages&lt;/code&gt;; on a site with no &lt;code&gt;languages&lt;/code&gt; it defaults to &lt;code&gt;&amp;quot;en&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;defaultLanguageInRoot&lt;/code&gt;&lt;/strong&gt; — when &lt;code&gt;true&lt;/code&gt;, the default language is served
at the site root with no &lt;code&gt;/&amp;lt;code&amp;gt;/&lt;/code&gt; prefix, and only the other languages
get a prefix. When &lt;code&gt;false&lt;/code&gt; (the default), &lt;em&gt;every&lt;/em&gt; language is prefixed,
including the default.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;content-layout&quot;&gt;Content layout&lt;/h2&gt;
&lt;p&gt;Once &lt;code&gt;languages&lt;/code&gt; is set, content lives one directory deeper — under
&lt;code&gt;content/&amp;lt;lang&amp;gt;/&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;juicer-filetree&quot;&gt;
content/
├── en/
│   ├── _index.md
│   └── getting-started/
│       ├── _index.md
│       └── installation.md
└── fr/
    ├── _index.md
    └── getting-started/
        ├── _index.md
        └── installation.md
&lt;/pre&gt;
&lt;p&gt;A page’s language is the first path segment under &lt;code&gt;content/&lt;/code&gt;. Two pages that
share the same path &lt;em&gt;after&lt;/em&gt; the language segment — &lt;code&gt;en/getting-started/installation.md&lt;/code&gt;
and &lt;code&gt;fr/getting-started/installation.md&lt;/code&gt; — are &lt;strong&gt;translations of each other&lt;/strong&gt;.
You don’t have to translate everything: a page that exists in only one
language simply has no translations, and nothing links to a missing one.&lt;/p&gt;
&lt;h2 id=&quot;urls&quot;&gt;URLs&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;defaultLanguageInRoot&lt;/code&gt; decides the shape of the URL space. With the config
above (&lt;code&gt;en&lt;/code&gt; default, in root):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Page&lt;/th&gt;&lt;th&gt;URL&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/en/getting-started/installation.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/getting-started/installation/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/fr/getting-started/installation.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/fr/getting-started/installation/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The default language keeps the clean, prefix-free URLs — important when you
add a second language to an existing site and don’t want to break inbound
links. Set &lt;code&gt;defaultLanguageInRoot = false&lt;/code&gt; to prefix every language
symmetrically (&lt;code&gt;/en/…&lt;/code&gt; and &lt;code&gt;/fr/…&lt;/code&gt;).&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Building language-prefixed links by hand is error-prone. Use the
&lt;a href=&quot;/#language-aware-urls&quot;&gt;&lt;code&gt;relLangURL&lt;/code&gt; / &lt;code&gt;absLangURL&lt;/code&gt;&lt;/a&gt; helpers — they apply the
right prefix for you.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;per-page-language-data&quot;&gt;Per-page language data&lt;/h2&gt;
&lt;p&gt;Every page exposes its language and its translations on the rendering
context:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.page.lang&lt;/code&gt;&lt;/strong&gt; — the page’s language code (&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; on a single-language
site).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.page.translations&lt;/code&gt;&lt;/strong&gt; — the list of the &lt;em&gt;other-language&lt;/em&gt; versions of
this page. Each entry carries &lt;code&gt;lang&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, and &lt;code&gt;url&lt;/code&gt;. Empty when the
page has no translation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.page.languages&lt;/code&gt;&lt;/strong&gt; — &lt;em&gt;every&lt;/em&gt; configured language (in declared order),
each with &lt;code&gt;lang&lt;/code&gt;, a &lt;code&gt;url&lt;/code&gt; to switch to, and a &lt;code&gt;current&lt;/code&gt; flag. The &lt;code&gt;url&lt;/code&gt; is
the page’s own URL for the current language, its translation where one
exists, and that language’s &lt;strong&gt;home&lt;/strong&gt; otherwise — so the entry is never
missing, even on an untranslated page. Empty for single-language sites.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;.page.languages&lt;/code&gt; is what a full &lt;strong&gt;language switcher&lt;/strong&gt; iterates — it always
offers every language, the way Starlight or Docusaurus do:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.languages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;details&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; i18n &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.lang&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;aria_language&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; i18n &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.lang&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;langname&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; l &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.languages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; l&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;hreflang&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; l&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;lang&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; l&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;current&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;aria-current&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; i18n l&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;lang&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;langname&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;juicerdocs&lt;/code&gt; theme ships this as a dropdown in its topbar. (Use
&lt;code&gt;.page.translations&lt;/code&gt; instead when you want a switcher that lists &lt;em&gt;only&lt;/em&gt; the
translations that exist — handy for an inline two-language toggle.)&lt;/p&gt;
&lt;h2 id=&quot;ui-strings-the-i18n-helper&quot;&gt;UI strings: the &lt;code&gt;i18n&lt;/code&gt; helper&lt;/h2&gt;
&lt;p&gt;Chrome text — button labels, pager arrows, the search placeholder — is
looked up by key instead of hard-coded, so it can be translated:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; i18n &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.lang&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;nav_prev&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;i18n&lt;/code&gt; takes a &lt;strong&gt;language code&lt;/strong&gt; and a &lt;strong&gt;key&lt;/strong&gt;. Lookup falls back in this
order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the requested language’s dictionary,&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;defaultLanguage&lt;/code&gt;‘s dictionary,&lt;/li&gt;
&lt;li&gt;the literal key (so a missing string is visible, not blank).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because the language is the first argument, &lt;code&gt;{{ i18n t.lang &apos;langname&apos; }}&lt;/code&gt;
looks up a key in &lt;em&gt;another&lt;/em&gt; language’s table — which is how the switcher
above shows each language’s own name.&lt;/p&gt;
&lt;h3 id=&quot;dictionaries&quot;&gt;Dictionaries&lt;/h3&gt;
&lt;p&gt;Strings come from &lt;code&gt;i18n/&amp;lt;lang&amp;gt;.toml&lt;/code&gt; files — flat &lt;code&gt;key = &amp;quot;value&amp;quot;&lt;/code&gt; tables:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# i18n/fr.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; i18n/fr.toml
nav_prev &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Précédent&amp;quot;&lt;/span&gt;
nav_next &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Suivant&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dictionaries are collected from two places and merged:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;the active theme(s)&lt;/strong&gt; — &lt;code&gt;&amp;lt;theme&amp;gt;/i18n/&amp;lt;lang&amp;gt;.toml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;your site&lt;/strong&gt; — &lt;code&gt;&amp;lt;src&amp;gt;/i18n/&amp;lt;lang&amp;gt;.toml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;with the same precedence as every other themed resource: &lt;strong&gt;your site wins
over a theme&lt;/strong&gt;, and an earlier theme in the &lt;a href=&quot;/concepts/theme-inheritance/&quot;&gt;lookup chain&lt;/a&gt;
wins over a later (inherited) one. The merge is per-language and per-key, so
a theme can ship a complete English chrome dictionary while your site adds
only the handful of keys it overrides — or the extra languages it publishes.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;This is why a theme like &lt;code&gt;juicerdocs&lt;/code&gt; renders English chrome with zero
configuration: it ships its own &lt;code&gt;i18n/en.toml&lt;/code&gt;. To translate the chrome,
drop an &lt;code&gt;i18n/fr.toml&lt;/code&gt; into &lt;em&gt;your&lt;/em&gt; site (or override individual keys); you
never have to fork the theme.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;language-aware-navigation&quot;&gt;Language-aware navigation&lt;/h2&gt;
&lt;p&gt;The sidebar walks &lt;code&gt;.site.root.subsections&lt;/code&gt;. On a multilingual site,
&lt;code&gt;.site.root&lt;/code&gt; is &lt;strong&gt;scoped to the current page’s language&lt;/strong&gt; — it resolves to
that language’s &lt;code&gt;&amp;lt;lang&amp;gt;/_index.md&lt;/code&gt;. So a French page gets the French section
tree, an English page the English one, with no per-theme work. A section
that hasn’t been translated yet simply doesn’t appear in that language’s
navigation.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.page.prev&lt;/code&gt; / &lt;code&gt;.page.next&lt;/code&gt; — the sequential pager — are scoped the same
way: navigation walks the current language’s reading order only, so the last
English page never points “next” into French.&lt;/p&gt;
&lt;h2 id=&quot;language-aware-urls&quot;&gt;Language-aware URLs&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;relLangURL&lt;/code&gt; and &lt;code&gt;absLangURL&lt;/code&gt; are the language-aware companions of
&lt;code&gt;relURL&lt;/code&gt; / &lt;code&gt;absURL&lt;/code&gt;. They take the language as the first argument and prefix
the path with that language’s URL segment:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; relLangURL &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.lang&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;/getting-started/&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;…&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On an English page (default, in root) this yields &lt;code&gt;/getting-started/&lt;/code&gt;; on a
French page, &lt;code&gt;/fr/getting-started/&lt;/code&gt;. Use these for fixed links in shared
layouts — like a hero call-to-action — so they stay within the reader’s
language. (&lt;code&gt;.page.url&lt;/code&gt; and &lt;code&gt;.page.translations[].url&lt;/code&gt; are already
language-correct; you only need &lt;code&gt;relLangURL&lt;/code&gt; for paths you write by hand.)&lt;/p&gt;
&lt;h2 id=&quot;sitemap-hreflang&quot;&gt;Sitemap &amp;amp; hreflang&lt;/h2&gt;
&lt;p&gt;When a site is multilingual, &lt;code&gt;sitemap.xml&lt;/code&gt; automatically gains
&lt;code&gt;&amp;lt;xhtml:link rel=&amp;quot;alternate&amp;quot; hreflang=&amp;quot;…&amp;quot;&amp;gt;&lt;/code&gt; entries linking each page to its
translations, so search engines serve the right language. Single-language
sites get a plain sitemap with no hreflang noise. No configuration required
either way.&lt;/p&gt;
&lt;h2 id=&quot;what-stays-zero-config&quot;&gt;What stays zero-config&lt;/h2&gt;
&lt;div class=&quot;juicer-callout juicer-callout-warning&quot;&gt;
  &lt;strong&gt;Warning&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Everything on this page is dormant until &lt;code&gt;languages&lt;/code&gt; is set. A site with no
&lt;code&gt;languages&lt;/code&gt; list builds byte-for-byte as it did before i18n existed:
&lt;code&gt;.page.lang&lt;/code&gt; is &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;, &lt;code&gt;.page.translations&lt;/code&gt; is empty, the sitemap has no
hreflang, content stays at &lt;code&gt;content/&lt;/code&gt; (not &lt;code&gt;content/&amp;lt;lang&amp;gt;/&lt;/code&gt;), and the
&lt;code&gt;i18n&lt;/code&gt; helper still resolves theme dictionaries through the default-language
fallback so themed chrome renders in English.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Frontmatter</title>
    <link href="https://juicer.build/reference/frontmatter/"/>
    <id>https://juicer.build/reference/frontmatter/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Every YAML key juicer (and the bundled themes) read from a page&apos;s frontmatter.</summary>
    <content type="html">&lt;p&gt;The YAML block at the top of every content file. Juicer reads a
fixed set of keys; everything else passes through to templates as
&lt;code&gt;.page.&amp;lt;key&amp;gt;&lt;/code&gt;. This page catalogues the &lt;strong&gt;engine-level&lt;/strong&gt; keys (read
by juicer itself) and points at the theme-specific keys (read by
one bundled theme each, documented under that theme’s section).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Hello, World
date: 2024-03-12
tags: [intro, meta]
summary: A short description used in list pages and OpenGraph tags.
draft: false
---

The body of the page goes here.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;engine-level-keys&quot;&gt;Engine-level keys&lt;/h2&gt;
&lt;p&gt;These are read by juicer itself. Every bundled theme can rely on
them being present (or normalized to a sensible default) on every
page record in templates.&lt;/p&gt;
&lt;h3 id=&quot;page-identity&quot;&gt;Page identity&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Page title. Falls back to the first heading in the body, then to the filename when both are absent.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Explicit page summary. Auto-derived from a &lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt; marker or the first paragraph (capped at 30 words) when absent.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Override the default layout. For a single page, &lt;code&gt;file&lt;/code&gt; is the default; for &lt;code&gt;_index.md&lt;/code&gt;, &lt;code&gt;folder&lt;/code&gt;. Setting &lt;code&gt;layout: home&lt;/code&gt; (etc.) renders the page through &lt;code&gt;_default/home.html&lt;/code&gt; instead.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;publishing-visibility&quot;&gt;Publishing &amp;amp; visibility&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ISO-8601 string or YAML date&lt;/td&gt;&lt;td&gt;Publication date. Three input shapes recognized: &lt;code&gt;2024-03-12T10:30:00Z&lt;/code&gt; (with offset), &lt;code&gt;2024-03-12T10:30:00&lt;/code&gt; (local, assumed UTC), &lt;code&gt;2024-03-12&lt;/code&gt; (date only, midnight UTC).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When &lt;code&gt;true&lt;/code&gt;, the page is excluded from the build unless &lt;code&gt;--drafts&lt;/code&gt; is passed. Drafts are invisible to TOC, sitemap, search index, and section listings.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Mark a page as &lt;strong&gt;non-post&lt;/strong&gt; even though it lives in a posts-style section. Excluded from &lt;code&gt;.site.posts&lt;/code&gt;, &lt;code&gt;.site.pagesByYear&lt;/code&gt;, and tag/author archive listings. Used for about/colophon/contact pages on a blog.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Big announcement&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2024-12-25T09:00:00Z&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;draft&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;About this site&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;The &lt;code&gt;date&lt;/code&gt; rule:&lt;/strong&gt; only pages with &lt;strong&gt;explicit&lt;/strong&gt; &lt;code&gt;date:&lt;/code&gt;
frontmatter are included in &lt;code&gt;.site.posts&lt;/code&gt;, &lt;code&gt;.site.pagesByYear&lt;/code&gt;,
and &lt;code&gt;dateArchives&lt;/code&gt; output. When &lt;code&gt;date:&lt;/code&gt; is absent, juicer falls
back to the source file’s filesystem mtime for &lt;em&gt;sort order&lt;/em&gt; —
it’s a deliberate split: silently sorting by mtime is convenient;
silently treating every page as a dated post is not.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;taxonomy&quot;&gt;Taxonomy&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt; or &lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Tags for the post. A single string is auto-wrapped to a one-element list. Generates &lt;code&gt;/tags/&amp;lt;slug&amp;gt;/&lt;/code&gt; archive pages (gated on a &lt;code&gt;tag-page.html&lt;/code&gt; layout existing).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;categories&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt; or &lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A second taxonomy axis. Same slugification and archive pattern but at &lt;code&gt;/categories/&amp;lt;slug&amp;gt;/&lt;/code&gt;. Use one, the other, or both.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Functional programming in Scala 3&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;functional&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;categories&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;tutorials&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Slugification: lowercase → ASCII-fold (&lt;code&gt;café&lt;/code&gt; → &lt;code&gt;cafe&lt;/code&gt;) → runs of
non-alphanumerics → &lt;code&gt;-&lt;/code&gt;. So &lt;code&gt;&amp;quot;Functional Programming&amp;quot;&lt;/code&gt; becomes
&lt;code&gt;functional-programming&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;ordering&quot;&gt;Ordering&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weight&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Explicit sort position within a section. Lower weights sort first. Pages without a weight come after weighted pages.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sortBy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(on section &lt;code&gt;_index.md&lt;/code&gt;) Override the site-wide &lt;code&gt;sortBy&lt;/code&gt;. One of &lt;code&gt;&amp;quot;date&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;title&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;weight&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;paginate&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(on section &lt;code&gt;_index.md&lt;/code&gt;) Override the site-wide &lt;code&gt;paginate&lt;/code&gt; slice size.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;authors&quot;&gt;Authors&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Single author ID — references an &lt;code&gt;id&lt;/code&gt; in &lt;code&gt;[[authors]]&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt;. Singular shorthand for &lt;code&gt;authors: [&amp;lt;id&amp;gt;]&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;authors&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Multiple author IDs. When both &lt;code&gt;author:&lt;/code&gt; and &lt;code&gt;authors:&lt;/code&gt; are absent, &lt;code&gt;.page.author&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;.page.authors&lt;/code&gt; is the empty list.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A co-authored post&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;authors&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;ed&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;alice&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Author IDs that don’t match any &lt;code&gt;[[authors]].id&lt;/code&gt; fall through to a
stub &lt;code&gt;{id: &amp;quot;&amp;lt;typo&amp;gt;&amp;quot;}&lt;/code&gt; record so templates don’t fail; the per-author
archive is empty in that case.&lt;/p&gt;
&lt;h3 id=&quot;series&quot;&gt;Series&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;series&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Series name. Pages with the same &lt;code&gt;series:&lt;/code&gt; value (case-sensitive) form an ordered group.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;seriesOrder&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Position within the series. Pages without &lt;code&gt;seriesOrder&lt;/code&gt; sort by &lt;code&gt;date&lt;/code&gt; ascending after the ordered pages.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;OS Internals, Part 1&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;series&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;OS Internals&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;seriesOrder&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;aliases-redirects&quot;&gt;Aliases (redirects)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;aliases&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt; or &lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Old URLs that should redirect to this page. Each generates a static HTML stub at the old URL with a &lt;code&gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot;&amp;gt;&lt;/code&gt; to the canonical URL.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Setting up a Scala 3 project&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;aliases&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/old-blog-name/setting-up-scala/&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/2023/setting-up/&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each alias must include both leading and trailing slashes:
&lt;code&gt;/old-url/&lt;/code&gt;, not &lt;code&gt;old-url&lt;/code&gt; or &lt;code&gt;/old-url&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;events&quot;&gt;Events&lt;/h3&gt;
&lt;p&gt;These keys are read on pages in the &lt;code&gt;eventsSection&lt;/code&gt; (default
&lt;code&gt;events&lt;/code&gt;) — the section juicer treats as the source of calendar
events.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;recurring&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;weekly&amp;quot;&lt;/code&gt; for a weekly recurring event. The event expands onto every matching weekday in &lt;code&gt;.site.calendar&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;recurringDay&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Day name (&lt;code&gt;&amp;quot;Monday&amp;quot;&lt;/code&gt;, …, &lt;code&gt;&amp;quot;Sunday&amp;quot;&lt;/code&gt;) for the recurrence. Defaults to the start date’s day of week when absent.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Tuesday Coffee&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2024-03-12T09:00:00&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;recurring&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;weekly&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;recurringDay&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Tuesday&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;photos&quot;&gt;Photos&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;photos&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt; or &lt;code&gt;[{src, caption?, alt?}]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Photos for the page. Aggregated site-wide into &lt;code&gt;.site.photos&lt;/code&gt; (sorted by page date desc).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Picnic in the park&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2024-06-12&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;photos&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/img/picnic-01.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/img/picnic-02.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;caption&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;The pie table&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;A long folding table loaded with summer pies&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;opengraph-social-cards&quot;&gt;OpenGraph / social cards&lt;/h3&gt;
&lt;p&gt;These override defaults that the &lt;code&gt;ogTags&lt;/code&gt; template helper otherwise
computes from &lt;code&gt;.page.title&lt;/code&gt;, &lt;code&gt;.page.summary&lt;/code&gt;, &lt;code&gt;.page.image&lt;/code&gt;, etc.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Fallback for the OpenGraph description when &lt;code&gt;summary&lt;/code&gt; isn’t appropriate.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Default page image — used by &lt;code&gt;og:image&lt;/code&gt; and as a card thumbnail by themes that show one.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ogTitle&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Override the page title in OpenGraph and Twitter card tags.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ogDescription&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Override the description in OpenGraph and Twitter card tags.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ogImage&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Override the image in OpenGraph and Twitter card tags.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A long, descriptive, SEO-targeted post title&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A long summary tuned for the page&apos;s own list rendering.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogTitle&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A short, punchy title for social cards&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogDescription&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A different summary that fits in a card preview.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogImage&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/posts/short-title-card.png&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;computed-not-set-by-you&quot;&gt;Computed (not set by you)&lt;/h3&gt;
&lt;p&gt;These fields appear on &lt;code&gt;.page.&amp;lt;key&amp;gt;&lt;/code&gt; in templates but are not read
from frontmatter — they’re set by juicer during build:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;permalink&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Canonical site-relative URL — &lt;code&gt;/posts/the-post/&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;relPermalink&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same as &lt;code&gt;permalink&lt;/code&gt; (Hugo parity).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same as &lt;code&gt;permalink&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dateISO&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2024-03-12T00:00:00Z&lt;/code&gt; (only when &lt;code&gt;date:&lt;/code&gt; is set).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dateLong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;March 12, 2024&lt;/code&gt; (only when &lt;code&gt;date:&lt;/code&gt; is set).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dateShort&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2024-03-12&lt;/code&gt; (only when &lt;code&gt;date:&lt;/code&gt; is set).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL stem (last path segment).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;wordCount&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rendered-body word count.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;readingTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ceil(wordCount / 200)&lt;/code&gt; minutes, floor 1 for non-empty pages.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;isSection&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; for &lt;code&gt;_index.md&lt;/code&gt; pages.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;parent&lt;/code&gt;, &lt;code&gt;ancestors&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Section’s &lt;code&gt;_index&lt;/code&gt; record, then root → parent chain.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;next&lt;/code&gt;, &lt;code&gt;prev&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sibling navigation by section page order.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;pages&lt;/code&gt;, &lt;code&gt;subsections&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(&lt;code&gt;_index.md&lt;/code&gt; only) Children of the section.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;series&lt;/code&gt; (block)&lt;/td&gt;&lt;td&gt;&lt;code&gt;{name, pages, prev, next, index, total}&lt;/code&gt; — populated when the page declares a &lt;code&gt;series:&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The full &lt;code&gt;.page&lt;/code&gt; reference, including these, lives in
&lt;a href=&quot;/reference/template-data/#page&quot;&gt;Template data → &lt;code&gt;.page&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;cascade-inherited-frontmatter&quot;&gt;Cascade — inherited frontmatter&lt;/h2&gt;
&lt;p&gt;A section’s &lt;code&gt;_index.md&lt;/code&gt; may declare a &lt;code&gt;cascade:&lt;/code&gt; map; every key inside it is inherited by every descendant page that doesn’t set the same key in its own frontmatter. This lets a section establish defaults — author, layout, license, custom flags — without repeating them on every page.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; content/posts/_index.md&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;title: Posts&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;cascade:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  author: ed&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  tone: editorial&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  license: CC-BY&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every page under &lt;code&gt;/posts/&lt;/code&gt; now picks up &lt;code&gt;.page.author = &amp;quot;ed&amp;quot;&lt;/code&gt;, &lt;code&gt;.page.tone = &amp;quot;editorial&amp;quot;&lt;/code&gt;, &lt;code&gt;.page.license = &amp;quot;CC-BY&amp;quot;&lt;/code&gt; automatically. A specific post can override any of them:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; content/posts/guest-piece.md&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;title: Guest piece&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;author: alice    # overrides the cascaded &amp;quot;ed&amp;quot;&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;resolution-rules&quot;&gt;Resolution rules&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The page’s own frontmatter wins&lt;/strong&gt; over any cascade value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nearer ancestors win&lt;/strong&gt; over farther ancestors. Root &lt;code&gt;_index.md&lt;/code&gt;‘s cascade is the weakest; a deeply-nested section’s cascade overrides everything above it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A section’s cascade does NOT apply to its own &lt;code&gt;_index.md&lt;/code&gt;.&lt;/strong&gt; Cascade declares defaults for &lt;em&gt;descendants&lt;/em&gt;, not for the declaring page itself. The section’s own &lt;code&gt;_index.md&lt;/code&gt; only inherits cascades from sections above it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sections inherit cascade from ancestor sections.&lt;/strong&gt; A nested section’s &lt;code&gt;_index.md&lt;/code&gt; picks up cascades from every ancestor section, then merges its own (own wins).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing / empty cascade is a no-op.&lt;/strong&gt; Pages without any cascade in their ancestor chain see exactly the frontmatter they wrote.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-can-be-cascaded&quot;&gt;What can be cascaded&lt;/h3&gt;
&lt;p&gt;Any frontmatter key the engine or a theme reads. Useful candidates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;author&lt;/code&gt; / &lt;code&gt;authors&lt;/code&gt; — section-wide attribution.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;layout&lt;/code&gt; — force every page in a section through a specific template (e.g. &lt;code&gt;layout: project&lt;/code&gt; across a portfolio section).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt; / &lt;code&gt;categories&lt;/code&gt; — section-wide taxonomy; pages add their own and override the default list if needed.&lt;/li&gt;
&lt;li&gt;Custom keys consumed by your theme — &lt;code&gt;tone&lt;/code&gt;, &lt;code&gt;region&lt;/code&gt;, &lt;code&gt;license&lt;/code&gt;, &lt;code&gt;noindex&lt;/code&gt;, …&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Less useful (but legal) to cascade: &lt;code&gt;date&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt; — these are intrinsically per-page and rarely benefit from a default. There’s no enforcement; cascade is a blanket mechanism and the author is responsible for picking keys that make sense to inherit.&lt;/p&gt;
&lt;h2 id=&quot;theme-specific-frontmatter&quot;&gt;Theme-specific frontmatter&lt;/h2&gt;
&lt;p&gt;The bundled themes recognize their own frontmatter keys on top of
the engine surface. Those are documented per theme:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Theme&lt;/th&gt;&lt;th&gt;What it reads on top&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;/themes/juicerblog/configuration/#per-page-frontmatter&quot;&gt;juicerblog&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;static&lt;/code&gt;, &lt;code&gt;layout: home&lt;/code&gt;/&lt;code&gt;archive&lt;/code&gt;, &lt;code&gt;series&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;/themes/juicerstudy/configuration/#per-page-frontmatter&quot;&gt;juicerstudy&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;toc&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt; (as lead), &lt;code&gt;minutes&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;/themes/juicerlanding/configuration/#per-page-frontmatter&quot;&gt;juicerlanding&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;layout: home&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt; (as subtitle), &lt;code&gt;lang&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;/themes/juicerportfolio/configuration/#per-project-frontmatter&quot;&gt;juicerportfolio&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;layout: project&lt;/code&gt;, &lt;code&gt;year&lt;/code&gt;, &lt;code&gt;tagline&lt;/code&gt;, &lt;code&gt;role&lt;/code&gt;, &lt;code&gt;client&lt;/code&gt;, &lt;code&gt;tools&lt;/code&gt;, &lt;code&gt;category&lt;/code&gt;, &lt;code&gt;hero&lt;/code&gt;, &lt;code&gt;heroAlt&lt;/code&gt;, &lt;code&gt;caption&lt;/code&gt;, &lt;code&gt;gallery&lt;/code&gt;, &lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;/themes/juicerdocs/configuration/&quot;&gt;juicerdocs&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Engine-level keys only — no theme-specific frontmatter.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;any-other-key&quot;&gt;Any other key&lt;/h2&gt;
&lt;p&gt;Anything you write in frontmatter that juicer doesn’t read is
exposed on &lt;code&gt;.page.&amp;lt;key&amp;gt;&lt;/code&gt; for templates to use. So adding a custom
field is just a matter of writing it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Cherry pie&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;yield&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;8 servings&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;prepTime&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;45 min&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;cookTime&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;1 h 10 min&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dl&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Yield&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.yield&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Prep time&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.prepTime&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Cook time&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.cookTime&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;dl&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>Deploy to GitHub Pages</title>
    <link href="https://juicer.build/getting-started/deploy-gh-pages/"/>
    <id>https://juicer.build/getting-started/deploy-gh-pages/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>A copy-pasteable GitHub Actions workflow that builds your juicer site on every push to `stable` and publishes it to GitHub Pages.</summary>
    <content type="html">&lt;p&gt;This recipe is the same flow &lt;a href=&quot;https://juicer.build/&quot;&gt;juicer.build&lt;/a&gt;
itself uses (and the same flow used by &lt;a href=&quot;https://edadma.github.io/squiggly/&quot;&gt;squiggly’s
docs&lt;/a&gt;). It builds your site
with juicer inside a GitHub Actions runner and pushes the result
to GitHub Pages — no third-party build service, no separate
deploy step, no manual &lt;code&gt;gh-pages&lt;/code&gt; branch management.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;This page assumes you already have a working juicer site building
locally — that &lt;code&gt;sbt &apos;juicerJVM/run build -s docs&apos;&lt;/code&gt; produces a tree
of HTML you’re happy with. If you haven’t gotten there yet, work
through &lt;a href=&quot;/getting-started/quickstart/&quot;&gt;Quickstart&lt;/a&gt; first.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;the-shape-of-the-deploy&quot;&gt;The shape of the deploy&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;push to `stable`  ──▶  build job  ──▶  deploy job  ──▶  https://&amp;lt;owner&amp;gt;.github.io/&amp;lt;repo&amp;gt;/
                       (sbt build)     (actions/deploy-pages)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two GitHub Actions jobs, one workflow file. The &lt;code&gt;build&lt;/code&gt; job runs
&lt;code&gt;juicer build&lt;/code&gt; and uploads the rendered site as a Pages artifact;
the &lt;code&gt;deploy&lt;/code&gt; job, gated on the &lt;code&gt;stable&lt;/code&gt; branch, takes that
artifact and publishes it to the &lt;code&gt;github-pages&lt;/code&gt; environment.
Pushes to other branches still run &lt;code&gt;build&lt;/code&gt; (a sanity check), but
the artifact is uploaded as a downloadable file rather than
published.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h2&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;a-git-repo-on-github-with-your-site-source-in-it&quot;&gt;A git repo on GitHub with your site source in it&lt;/h2&gt;
&lt;p&gt;Anywhere under the repo root is fine — the workflow assumes
&lt;code&gt;docs/&lt;/code&gt; (so &lt;code&gt;sbt &apos;juicerJVM/run build -s docs&apos;&lt;/code&gt; works). Adjust
the &lt;code&gt;-s&lt;/code&gt; path if your source lives somewhere else.&lt;/p&gt;
&lt;h2 id=&quot;a-long-lived-branch-named-stable-for-production-deploys&quot;&gt;A long-lived branch named &lt;code&gt;stable&lt;/code&gt; for production deploys&lt;/h2&gt;
&lt;p&gt;The workflow only deploys on pushes to &lt;code&gt;stable&lt;/code&gt;. Use a separate
&lt;code&gt;dev&lt;/code&gt; (or &lt;code&gt;main&lt;/code&gt;) branch for in-progress work, and merge into
&lt;code&gt;stable&lt;/code&gt; when you want to publish. This stops every &lt;code&gt;git push&lt;/code&gt;
from triggering a deploy.&lt;/p&gt;
&lt;p&gt;If you’d rather deploy from &lt;code&gt;main&lt;/code&gt; directly, swap &lt;code&gt;stable&lt;/code&gt; →
&lt;code&gt;main&lt;/code&gt; in the workflow’s &lt;code&gt;on.push.branches&lt;/code&gt; and the deploy job’s
&lt;code&gt;if:&lt;/code&gt; guard.&lt;/p&gt;
&lt;h2 id=&quot;github-pages-enabled-with-github-actions-as-the-source&quot;&gt;GitHub Pages enabled with “GitHub Actions” as the source&lt;/h2&gt;
&lt;p&gt;In your repository: &lt;strong&gt;Settings → Pages → Source: “GitHub
Actions”&lt;/strong&gt;. Setting this to “Deploy from a branch” instead won’t
work — the workflow uses the Actions-based deploy path.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;the-workflow-file&quot;&gt;The workflow file&lt;/h2&gt;
&lt;p&gt;Drop this at &lt;code&gt;.github/workflows/docs.yml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; Build &amp;amp; deploy &amp;lt;https://&amp;lt;owner&amp;gt;.github.io/&amp;lt;repo&amp;gt;/&amp;gt;.&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;#   Push to `stable`       → builds and deploys to GitHub Pages.&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;#   PR targeting `stable`  → builds (sanity check), no deploy.&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;#   workflow_dispatch      → manual trigger from the Actions tab.&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;name: Docs&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;on:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  push:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    branches: [&amp;quot;stable&amp;quot;]&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  pull_request:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    branches: [&amp;quot;stable&amp;quot;]&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  workflow_dispatch:&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;permissions:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  contents: read&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;concurrency:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  group: &amp;quot;docs-${{ github.ref }}&amp;quot;&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  cancel-in-progress: false&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;jobs:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;  build:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    runs-on: ubuntu-latest&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    steps:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;      - uses: actions/checkout@v4&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;      - name: Set up JDK 17&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        uses: actions/setup-java@v4&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        with:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;          distribution: temurin&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;          java-version: &amp;quot;17&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;      # actions/setup-java does NOT ship sbt. Install it via the&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;      # official sbt-maintained action.&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;      - name: Set up sbt&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        uses: sbt/setup-sbt@v1&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;      - name: Cache sbt&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        uses: actions/cache@v4&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        with:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;          path: |&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;            ~/.sbt&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;            ~/.cache/coursier&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;          key: ${{ runner.os }}-sbt-${{ hashFiles(&apos;**/build.sbt&apos;, &apos;**/project/**&apos;) }}&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;          restore-keys: ${{ runner.os }}-sbt-&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;      - name: Build docs site&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        run: sbt &apos;juicerJVM/run build -s docs -d _site -b https://&amp;lt;owner&amp;gt;.github.io/&amp;lt;repo&amp;gt;/&apos;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;      - name: Upload site artifact&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        uses: actions/upload-artifact@v4&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        with:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;          name: docs-site&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;          path: _site&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;      - name: Upload Pages artifact&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        if: github.ref == &apos;refs/heads/stable&apos;&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        uses: actions/upload-pages-artifact@v3&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        with:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;          path: _site&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;  deploy:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    if: github.ref == &apos;refs/heads/stable&apos;&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    needs: build&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    runs-on: ubuntu-latest&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    permissions:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;      pages: write&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;      id-token: write&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    environment:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;      name: github-pages&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;      url: ${{ steps.deployment.outputs.page_url }}&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;    steps:&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;      - name: Deploy to GitHub Pages&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        id: deployment&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;        uses: actions/deploy-pages@v4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Substitute &lt;code&gt;&amp;lt;owner&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;repo&amp;gt;&lt;/code&gt; in the &lt;code&gt;Build docs site&lt;/code&gt; step’s
&lt;code&gt;-b&lt;/code&gt; flag (e.g. &lt;code&gt;-b https://edadma.github.io/juicer/&lt;/code&gt;). Getting
this wrong is the single most common deploy bug — every link
juicer emits is computed against &lt;code&gt;baseURL&lt;/code&gt;, so a stale value
sends visitors to the wrong host.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-warning&quot;&gt;
  &lt;strong&gt;Warning&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;The trailing slash matters.&lt;/strong&gt; &lt;code&gt;baseURL = &amp;quot;https://example.com/repo&amp;quot;&lt;/code&gt;
and &lt;code&gt;baseURL = &amp;quot;https://example.com/repo/&amp;quot;&lt;/code&gt; produce different
URLs in some edge cases (notably the sitemap and &lt;code&gt;og:url&lt;/code&gt; tags).
Always include the trailing slash.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;what-each-step-does&quot;&gt;What each step does&lt;/h2&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;checkout&quot;&gt;Checkout&lt;/h2&gt;
&lt;p&gt;Pulls the repo onto the runner. Default checkout depth is fine —
juicer doesn’t need git history for anything.&lt;/p&gt;
&lt;h2 id=&quot;set-up-jdk-17&quot;&gt;Set up JDK 17&lt;/h2&gt;
&lt;p&gt;Juicer is Scala 3 and runs on JVM 17+. &lt;code&gt;temurin&lt;/code&gt; is the standard
free OpenJDK distribution.&lt;/p&gt;
&lt;h2 id=&quot;set-up-sbt&quot;&gt;Set up sbt&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;actions/setup-java&lt;/code&gt; only installs the JDK. sbt is a separate tool
and ships via &lt;code&gt;sbt/setup-sbt@v1&lt;/code&gt;. This step is non-obvious; copy
it verbatim.&lt;/p&gt;
&lt;h2 id=&quot;cache-sbt&quot;&gt;Cache sbt&lt;/h2&gt;
&lt;p&gt;The slow part of a cold juicer build is sbt fetching its plugins
and dependencies from Maven Central. Caching &lt;code&gt;~/.sbt&lt;/code&gt; and
&lt;code&gt;~/.cache/coursier&lt;/code&gt; keyed on &lt;code&gt;build.sbt&lt;/code&gt; + &lt;code&gt;project/&lt;/code&gt; files cuts
a typical build from ~3 minutes to ~30 seconds.&lt;/p&gt;
&lt;h2 id=&quot;build-docs-site&quot;&gt;Build docs site&lt;/h2&gt;
&lt;p&gt;The actual juicer call. &lt;code&gt;-s docs&lt;/code&gt; points at the source directory;
&lt;code&gt;-d _site&lt;/code&gt; puts the output where the next step expects it; &lt;code&gt;-b&lt;/code&gt;
sets the absolute base URL for permalinks, sitemaps, and &lt;code&gt;og:url&lt;/code&gt;
tags.&lt;/p&gt;
&lt;h2 id=&quot;upload-site-artifact&quot;&gt;Upload site artifact&lt;/h2&gt;
&lt;p&gt;Uploads the rendered site as a regular GitHub Actions artifact
named &lt;code&gt;docs-site&lt;/code&gt;. PR builds — which don’t deploy — still produce
this, so you can download it from the Actions tab and inspect the
output before merging.&lt;/p&gt;
&lt;h2 id=&quot;upload-pages-artifact&quot;&gt;Upload Pages artifact&lt;/h2&gt;
&lt;p&gt;The Pages-specific upload, gated on &lt;code&gt;stable&lt;/code&gt;. Pages artifacts are
distinct from regular artifacts — they go through a separate
TAR-based pipeline that the &lt;code&gt;deploy-pages&lt;/code&gt; action consumes.&lt;/p&gt;
&lt;h2 id=&quot;deploy-to-github-pages&quot;&gt;Deploy to GitHub Pages&lt;/h2&gt;
&lt;p&gt;Reads the Pages artifact and publishes it to the &lt;code&gt;github-pages&lt;/code&gt;
environment, also gated on &lt;code&gt;stable&lt;/code&gt;. The deployment URL surfaces
in the Actions UI and in the Pages settings page.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;project-pages-vs-user-org-pages&quot;&gt;Project-pages vs user/org pages&lt;/h2&gt;
&lt;p&gt;There are two GitHub Pages URL shapes, and the &lt;code&gt;-b&lt;/code&gt; flag has to
match the one you’re using:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Site type&lt;/th&gt;&lt;th&gt;Repository naming&lt;/th&gt;&lt;th&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Project pages&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;any name (e.g. &lt;code&gt;juicer&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://&amp;lt;owner&amp;gt;.github.io/&amp;lt;repo&amp;gt;/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;User pages&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;owner&amp;gt;.github.io&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://&amp;lt;owner&amp;gt;.github.io/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Org pages&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;org&amp;gt;.github.io&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://&amp;lt;org&amp;gt;.github.io/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Project pages have a path prefix (&lt;code&gt;/&amp;lt;repo&amp;gt;/&lt;/code&gt;); user/org pages
don’t. Get this wrong and every internal link 404s. Run
&lt;code&gt;juicer config -s docs -b &amp;lt;your-url&amp;gt;&lt;/code&gt; locally to print the
resolved &lt;code&gt;baseURL&lt;/code&gt; and double-check before you push.&lt;/p&gt;
&lt;h2 id=&quot;custom-domain-juicer-build-style&quot;&gt;Custom domain (&lt;code&gt;juicer.build&lt;/code&gt;-style)&lt;/h2&gt;
&lt;p&gt;To deploy to a domain you own — &lt;code&gt;docs.example.com&lt;/code&gt;,
&lt;code&gt;example.com&lt;/code&gt;, or anything else — extend the workflow with two
small things:&lt;/p&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;add-a-cname-file-write-to-the-workflow&quot;&gt;Add a &lt;code&gt;CNAME&lt;/code&gt; file write to the workflow&lt;/h2&gt;
&lt;p&gt;After the build step, before the Pages upload, drop a line:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Write CNAME&lt;/span&gt;
  &lt;span class=&quot;hl-function&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;github.ref == &apos;refs/heads/stable&apos;&lt;/span&gt;
  &lt;span class=&quot;hl-function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;echo &apos;docs.example.com&apos; &amp;gt; _site/CNAME&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GitHub Pages reads &lt;code&gt;CNAME&lt;/code&gt; out of the deployed artifact and sets
the custom-domain binding from it. Without this file, GitHub
keeps serving the page at &lt;code&gt;&amp;lt;owner&amp;gt;.github.io/&amp;lt;repo&amp;gt;/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;point-dns-at-github-pages&quot;&gt;Point DNS at GitHub Pages&lt;/h2&gt;
&lt;p&gt;For a &lt;strong&gt;subdomain&lt;/strong&gt; (&lt;code&gt;docs.example.com&lt;/code&gt;), set a CNAME record:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Host&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CNAME&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;owner&amp;gt;.github.io&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For an &lt;strong&gt;apex domain&lt;/strong&gt; (&lt;code&gt;example.com&lt;/code&gt;), set four A records (and
optionally four AAAA for IPv6 — GitHub publishes the v6 set
alongside the v4):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;enable-https&quot;&gt;Enable HTTPS&lt;/h2&gt;
&lt;p&gt;In the repo: &lt;strong&gt;Settings → Pages → Custom domain&lt;/strong&gt;, fill in the
domain, wait for the DNS check to go green (a few seconds to a
few minutes depending on TTL). Then GitHub auto-issues a Let’s
Encrypt cert (another few minutes). Finally tick &lt;strong&gt;Enforce
HTTPS&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;set-baseurl-to-the-custom-domain&quot;&gt;Set &lt;code&gt;baseURL&lt;/code&gt; to the custom domain&lt;/h2&gt;
&lt;p&gt;Update the &lt;code&gt;Build docs site&lt;/code&gt; step’s &lt;code&gt;-b&lt;/code&gt; flag to
&lt;code&gt;https://docs.example.com/&lt;/code&gt; (or whatever your domain is). On
project repos with a custom domain, the path prefix is gone —
your URL no longer has &lt;code&gt;/&amp;lt;repo&amp;gt;/&lt;/code&gt; in it.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;pull-request-previews&quot;&gt;Pull-request previews&lt;/h2&gt;
&lt;p&gt;The workflow as written uploads &lt;code&gt;docs-site&lt;/code&gt; as a regular artifact
on every PR — you can download it from the Actions tab and serve
it locally:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;unzip&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;docs-site.zip&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;/tmp/preview&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;/tmp/preview&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;python3&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;http.server&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;8000&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For true per-PR preview URLs (each branch gets its own
&lt;code&gt;&amp;lt;branch&amp;gt;.&amp;lt;project&amp;gt;.pages.dev&lt;/code&gt;), swap GitHub Pages for
&lt;strong&gt;Cloudflare Pages&lt;/strong&gt;: connect the repo to a Cloudflare Pages
project, set the build command to
&lt;code&gt;sbt &apos;juicerJVM/run build -s docs -d _site -b $CF_PAGES_URL&apos;&lt;/code&gt;,
and the output directory to &lt;code&gt;_site&lt;/code&gt;. Cloudflare assigns preview
URLs automatically; production maps to your custom domain.&lt;/p&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;Troubleshooting&lt;/h2&gt;
&lt;h3 id=&quot;workflow-fails-on-upload-pages-artifact-with-pages-is-not-enabled&quot;&gt;Workflow fails on &lt;code&gt;Upload Pages artifact&lt;/code&gt; with “Pages is not enabled”&lt;/h3&gt;
&lt;p&gt;You haven’t enabled Pages yet. &lt;strong&gt;Settings → Pages → Source:
“GitHub Actions”&lt;/strong&gt;. The first deploy after enabling can take a
minute or two for the environment to register.&lt;/p&gt;
&lt;h3 id=&quot;site-builds-but-every-link-404s&quot;&gt;Site builds but every link 404s&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;baseURL&lt;/code&gt; is wrong. Run
&lt;code&gt;sbt &apos;juicerJVM/run config -s docs -b &amp;lt;your-url&amp;gt;&apos;&lt;/code&gt; locally and
inspect the &lt;code&gt;baseURL&lt;/code&gt; value — it should match what visitors type
in the browser. Common mistakes: missing trailing slash, wrong
&lt;code&gt;/&amp;lt;repo&amp;gt;/&lt;/code&gt; prefix for user-page deploys.&lt;/p&gt;
&lt;h3 id=&quot;css-and-js-load-but-images-404&quot;&gt;CSS and JS load, but images 404&lt;/h3&gt;
&lt;p&gt;The image paths in your markdown are absolute (&lt;code&gt;/img/x.png&lt;/code&gt;) but
your site is under a project path prefix (&lt;code&gt;/&amp;lt;repo&amp;gt;/&lt;/code&gt;). Two
fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;relURL&lt;/code&gt; template helper on every link/image emitted by
layouts — &lt;code&gt;&amp;lt;img src=&amp;quot;{{ relURL &apos;/img/x.png&apos; }}&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inside markdown body content, write paths &lt;em&gt;without&lt;/em&gt; the leading
slash (&lt;code&gt;img/x.png&lt;/code&gt;) and let the markdown renderer compute
them relative to the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;build-succeeds-locally-but-fails-in-ci&quot;&gt;Build succeeds locally but fails in CI&lt;/h3&gt;
&lt;p&gt;Two usual suspects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sbt version&lt;/strong&gt;: ensure your local &lt;code&gt;project/build.properties&lt;/code&gt;
pins an sbt version that the runner’s &lt;code&gt;sbt/setup-sbt@v1&lt;/code&gt; knows
about. Latest 1.x.x is always fine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JDK version&lt;/strong&gt;: CI uses &lt;code&gt;java-version: &amp;quot;17&amp;quot;&lt;/code&gt;. If you’ve been
building locally with JDK 21, check the build for any Java
21-only API usage and pin your local JDK to 17 for parity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;deploys-hang-at-deploy-to-github-pages&quot;&gt;Deploys hang at “Deploy to GitHub Pages”&lt;/h3&gt;
&lt;p&gt;Concurrent deploys queue. Check &lt;strong&gt;Actions → recent runs&lt;/strong&gt; — an
earlier run is probably still finishing. The &lt;code&gt;concurrency:&lt;/code&gt; block
prevents stacked deploys from the same ref, but cross-ref deploys
(e.g. &lt;code&gt;stable&lt;/code&gt; + a tag push at the same time) wait their turn.&lt;/p&gt;
&lt;h2 id=&quot;see-also&quot;&gt;See also&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/edadma/juicer/blob/main/DEPLOY.md&quot;&gt;DEPLOY.md&lt;/a&gt; in the
juicer repo — the file describing juicer.build’s own deploy. The shape
is identical to this page; differences are noted in DEPLOY.md.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pages&quot;&gt;GitHub Pages docs&lt;/a&gt; for the platform-side
detail (HTTPS, CNAME, custom domains, request limits).&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicerwiki/demo/"/>
    <id>https://juicer.build/themes/juicerwiki/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Field Notes — a small Zettelkasten on computing. Showcases the backlinks panel, tag cloud, and Cmd/Ctrl-K search modal.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicerwiki demo. When the docs site is built and deployed, this URL serves the actual demo rendered with the juicerwiki theme — a separate juicer build from &lt;code&gt;docs/demos/juicerwiki/&lt;/code&gt; is dropped on top of the docs render at the same path.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;“Field Notes” — a small wiki of computing notes that link to each other:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backlinks panel&lt;/strong&gt; at the bottom of every note. Open &lt;a href=&quot;https://example.com&quot;&gt;Zettelkasten&lt;/a&gt; and see who points there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag cloud&lt;/strong&gt; on the home page sized by usage count.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag archives&lt;/strong&gt; at &lt;code&gt;/tags/&amp;lt;slug&amp;gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search modal&lt;/strong&gt; — open with &lt;code&gt;Cmd/Ctrl-K&lt;/code&gt;, type any substring.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerwiki -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-L&lt;/code&gt; flag enables live reload — touch any markdown file under &lt;code&gt;docs/demos/juicerwiki/content/&lt;/code&gt; and the open browser tabs reload via SSE.&lt;/p&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicerwiki/&lt;/code&gt; into your own project as a starting point. Drop notes into &lt;code&gt;content/&lt;/code&gt; as flat markdown files; link them to each other with regular markdown &lt;code&gt;[text](/slug/)&lt;/code&gt; syntax; let the backlinks index do the rest.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicerstudy/demo/"/>
    <id>https://juicer.build/themes/juicerstudy/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Marginalia — a slow reader&apos;s notebook. Two studies (&quot;On Reading&quot;, &quot;On Time&quot;), nested sections, KaTeX math, footnotes, scholarly slate-and-amber palette.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicerstudy demo. When the
docs site is built and deployed, this URL serves the actual demo
rendered with the juicerstudy theme — a separate juicer build from
&lt;code&gt;docs/demos/juicerstudy/&lt;/code&gt; is dropped on top of the docs render at the
same path. See &lt;a href=&quot;https://github.com/edadma/juicer/blob/dev/bin/build-demos.sh&quot;&gt;&lt;code&gt;bin/build-demos.sh&lt;/code&gt;&lt;/a&gt;
for the orchestration.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;A fictional reader’s notebook (“Marginalia”) populated with two short
studies and the conventions a long-form prose site actually needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Two authored sections&lt;/strong&gt; — &lt;em&gt;On Reading&lt;/em&gt; and &lt;em&gt;On Time&lt;/em&gt; — each with
an &lt;code&gt;_index.md&lt;/code&gt; that reads as editorial introduction, not as an
auto-cataloged TOC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nested subsections&lt;/strong&gt; — &lt;code&gt;on-reading/practices/&lt;/code&gt; to exercise the
arbitrarily-deep section tree.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KaTeX math&lt;/strong&gt; — both inline (&lt;code&gt;$10^9$&lt;/code&gt;) and display (&lt;code&gt;$$ … $$&lt;/code&gt;)
forms; &lt;code&gt;juicerstudy.math = true&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt; opts in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Right-rail “On this page” TOC&lt;/strong&gt; on the pages that set
&lt;code&gt;toc: true&lt;/code&gt; in frontmatter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heading-shift = 0&lt;/strong&gt; — page &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; comes from frontmatter title,
markdown bodies start at &lt;code&gt;##&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slate-and-amber palette&lt;/strong&gt; retuned via &lt;code&gt;[juicerstudy]&lt;/code&gt; overrides —
intentionally distinct from juicerdocs’s defaults so the two themes
don’t read as the same site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read-time hints&lt;/strong&gt; — &lt;code&gt;minutes:&lt;/code&gt; frontmatter on each page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerstudy -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-L&lt;/code&gt; flag enables live reload — touch any markdown file under
&lt;code&gt;docs/demos/juicerstudy/content/&lt;/code&gt; and the open browser tabs reload
via SSE.&lt;/p&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicerstudy/&lt;/code&gt; into your own project as a starting
point. Replace the prose, retune the palette under &lt;code&gt;[juicerstudy]&lt;/code&gt;,
turn &lt;code&gt;math&lt;/code&gt; off if you don’t need it. The companion
&lt;a href=&quot;/../configuration/&quot;&gt;Configuration&lt;/a&gt; reference catalogues every
site.toml key, palette / typography / sizing token, and per-page
frontmatter knob the theme reads.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicerportfolio/demo/"/>
    <id>https://juicer.build/themes/juicerportfolio/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Atelier Hahn — a fictional industrial-design studio in Lisbon. Project grid with category filter chips, per-project pages with hero, sticky meta sidebar, gallery, and prev/next nav.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicerportfolio demo. When
the docs site is built and deployed, this URL serves the actual demo
rendered with the juicerportfolio theme — a separate juicer build from
&lt;code&gt;docs/demos/juicerportfolio/&lt;/code&gt; is dropped on top of the docs render at
the same path. See &lt;a href=&quot;https://github.com/edadma/juicer/blob/dev/bin/build-demos.sh&quot;&gt;&lt;code&gt;bin/build-demos.sh&lt;/code&gt;&lt;/a&gt;
for the orchestration.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;A fictional studio — “Atelier Hahn”, an industrial-design studio run
by Mira Hahn in Lisbon — with content exercising every juicerportfolio
layout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Project grid&lt;/strong&gt; on the home page — 2-up cards, each a hero image
&lt;ul&gt;
&lt;li&gt;title + tagline.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filter chips&lt;/strong&gt; above the grid driven by &lt;code&gt;[[workCategories]]&lt;/code&gt; in
&lt;code&gt;site.toml&lt;/code&gt;. Click a chip → JS toggles a &lt;code&gt;data-active-filter&lt;/code&gt;
attribute on the grid root. No framework, no router, no fetch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-project pages&lt;/strong&gt; with hero image, sticky right-side meta
sidebar (year / role / client / materials / external link), writeup
body, optional &lt;code&gt;[[gallery]]&lt;/code&gt; figure grid, prev/next nav, “All work”
back link.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Materials chips&lt;/strong&gt; — &lt;code&gt;tools: [...]&lt;/code&gt; in frontmatter renders as small
monospace-tabular chips in the meta sidebar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/work/_index.md&lt;/code&gt; archive&lt;/strong&gt; — &lt;code&gt;folder.html&lt;/code&gt; doubles as a full
text-list of every project, complementary to the home grid’s curated
image-led view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prose pages&lt;/strong&gt; — &lt;code&gt;/about/&lt;/code&gt;, &lt;code&gt;/contact/&lt;/code&gt;, &lt;code&gt;/cv/&lt;/code&gt;, &lt;code&gt;/press/&lt;/code&gt; — using
the generic &lt;code&gt;file.html&lt;/code&gt; layout with a constrained measure for
comfortable reading.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerportfolio -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-L&lt;/code&gt; flag enables live reload — touch any markdown file under
&lt;code&gt;docs/demos/juicerportfolio/content/&lt;/code&gt; and the open browser tabs reload
via SSE.&lt;/p&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicerportfolio/&lt;/code&gt; into your own project as a starting
point. Drop your hero images into &lt;code&gt;static/img/&lt;/code&gt;, write project pages
in &lt;code&gt;content/work/&lt;/code&gt;, retune &lt;code&gt;[[workCategories]]&lt;/code&gt; and the palette under
&lt;code&gt;[juicerportfolio]&lt;/code&gt;. The companion
&lt;a href=&quot;/../configuration/&quot;&gt;Configuration&lt;/a&gt; reference catalogues every
site.toml key, palette token, and per-project frontmatter knob the
theme reads.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicerpodcast/demo/"/>
    <id>https://juicer.build/themes/juicerpodcast/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Echo Chamber — a fictional weekly interview show with four episodes. Showcases the audio player, Atom enclosures, subscribe strip, and PodcastEpisode JSON-LD.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicerpodcast demo. When the docs site is built and deployed, this URL serves the actual demo rendered with juicerpodcast.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;“Echo Chamber” — a fictional weekly long-form interview show with four episodes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Audio player + cover artwork&lt;/strong&gt; on every episode page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio player on every home-page card&lt;/strong&gt; so listeners can sample without leaving the index.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Atom feed enclosures&lt;/strong&gt; at &lt;code&gt;/feed.xml&lt;/code&gt;. Open it in a podcast platform’s “add by URL” flow to confirm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PodcastEpisode JSON-LD&lt;/strong&gt; on every episode page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscribe strip&lt;/strong&gt; with four platforms.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerpodcast -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicerpodcast/&lt;/code&gt; into your own project, drop your audio files into &lt;code&gt;static/audio/&lt;/code&gt;, write each episode as a markdown file with the &lt;code&gt;audio:&lt;/code&gt; frontmatter, and the rest takes care of itself.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicerlanding/demo/"/>
    <id>https://juicer.build/themes/juicerlanding/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Tally — a fictional privacy-first web-analytics product. Every juicerlanding section (hero, features, pricing, testimonials, FAQ, showcase, code, trust, footerColumns) is exercised against realistic SaaS copy.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicerlanding demo. When
the docs site is built and deployed, this URL serves the actual demo
rendered with the juicerlanding theme — a separate juicer build from
&lt;code&gt;docs/demos/juicerlanding/&lt;/code&gt; is dropped on top of the docs render at
the same path. See &lt;a href=&quot;https://github.com/edadma/juicer/blob/dev/bin/build-demos.sh&quot;&gt;&lt;code&gt;bin/build-demos.sh&lt;/code&gt;&lt;/a&gt;
for the orchestration.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;A fictional SaaS product — “Tally”, privacy-first web analytics —
with &lt;code&gt;site.toml&lt;/code&gt; populated so every section in the juicerlanding
stack renders:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hero&lt;/strong&gt; — title, subtitle, primary + secondary CTAs, install
one-liner code snippet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Features grid&lt;/strong&gt; with icons.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[[pricing]]&lt;/code&gt; tiers&lt;/strong&gt; — three plans, with one row marked
&lt;code&gt;featured = true&lt;/code&gt; to get the badge + ring + scale-up treatment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[[testimonials]]&lt;/code&gt;&lt;/strong&gt; — multi-customer quotes with avatars.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[[faqs]]&lt;/code&gt;&lt;/strong&gt; — native &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; accordion, no JS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[showcase]&lt;/code&gt;&lt;/strong&gt; — featured-customer logos block.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[code]&lt;/code&gt;&lt;/strong&gt; — standalone code-snippet section.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[[trust]]&lt;/code&gt;&lt;/strong&gt; — security / compliance badges row.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[[footerColumns]]&lt;/code&gt;&lt;/strong&gt; — four-column footer with brand blurb
auto-generated from &lt;code&gt;title&lt;/code&gt; + &lt;code&gt;tagline&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secondary pages&lt;/strong&gt; — &lt;code&gt;/changelog/&lt;/code&gt;, &lt;code&gt;/privacy/&lt;/code&gt;, &lt;code&gt;/about/&lt;/code&gt; — using
the generic &lt;code&gt;file.html&lt;/code&gt; prose layout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;404 page&lt;/strong&gt; that survives even if the topbar partial errors out.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerlanding -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-L&lt;/code&gt; flag enables live reload — touch any markdown file under
&lt;code&gt;docs/demos/juicerlanding/content/&lt;/code&gt; (or change &lt;code&gt;site.toml&lt;/code&gt;) and the
open browser tabs reload via SSE.&lt;/p&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicerlanding/&lt;/code&gt; into your own project as a starting
point. The home page assembles entirely from &lt;code&gt;site.toml&lt;/code&gt; blocks, so
most of your edits land there — change the hero copy, the pricing
table, the FAQ entries. The companion
&lt;a href=&quot;/../configuration/&quot;&gt;Configuration&lt;/a&gt; reference catalogues every section
block, frontmatter knob, and palette token the theme reads.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicergallery/demo/"/>
    <id>https://juicer.build/themes/juicergallery/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Hella Studio — a fictional Reykjavík photographer with three small galleries. Showcases the image-variants pipeline, masonry detail pages, and the cover-grid home.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicergallery demo. When the docs site is built and deployed, this URL serves the actual demo rendered with the juicergallery theme — a separate juicer build from &lt;code&gt;docs/demos/juicergallery/&lt;/code&gt; is dropped on top of the docs render at the same path. See &lt;a href=&quot;https://github.com/edadma/juicer/blob/dev/bin/build-demos.sh&quot;&gt;&lt;code&gt;bin/build-demos.sh&lt;/code&gt;&lt;/a&gt; for the orchestration.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;A fictional Reykjavík photographer — “Hella Studio” — with three small galleries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Iceland 2024&lt;/strong&gt; — landscapes, varied aspect ratios to show off the masonry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Studio portraits&lt;/strong&gt; — tall portrait crops, packed into the same grid.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local sunsets&lt;/strong&gt; — wide horizontals.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every photo is rendered through the &lt;code&gt;imageVariants&lt;/code&gt; pipeline, so the build emits webp + JPG variants at three widths and the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; markup carries a full multi-width &lt;code&gt;srcset&lt;/code&gt;. View the page source on a gallery detail to see the variant URLs the browser picks from.&lt;/p&gt;
&lt;p&gt;The home page uses &lt;code&gt;layout: home&lt;/code&gt; to opt into the cover-grid; each gallery detail uses the default folder layout (no opt-in needed); the about page is a plain &lt;code&gt;file.html&lt;/code&gt; prose layout.&lt;/p&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicergallery -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-L&lt;/code&gt; flag enables live reload — touch any markdown file under &lt;code&gt;docs/demos/juicergallery/content/&lt;/code&gt; and the open browser tabs reload via SSE.&lt;/p&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicergallery/&lt;/code&gt; into your own project as a starting point. Drop your photos into &lt;code&gt;static/img/&amp;lt;gallery-name&amp;gt;/&lt;/code&gt;, declare each gallery as a top-level section with a &lt;code&gt;photos:&lt;/code&gt; list, and retune &lt;code&gt;[juicergallery]&lt;/code&gt; palette tokens. The companion &lt;a href=&quot;/../configuration/&quot;&gt;Configuration&lt;/a&gt; reference catalogues every site.toml key, palette token, and per-section frontmatter knob the theme reads.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicerdocs/demo/"/>
    <id>https://juicer.build/themes/juicerdocs/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>This site (juicer.build) IS the juicerdocs demo — every page you&apos;ve been reading is rendered with the theme.</summary>
    <content type="html">&lt;p&gt;Unlike the other six bundled themes — each of which has its own
demo site under &lt;code&gt;docs/demos/&amp;lt;theme&amp;gt;/&lt;/code&gt; that the deploy pipeline builds
into &lt;code&gt;/themes/&amp;lt;theme&amp;gt;/demo/&lt;/code&gt; — &lt;strong&gt;juicerdocs has no separate demo
source.&lt;/strong&gt; This site, &lt;a href=&quot;/&quot;&gt;juicer.build&lt;/a&gt;, is built with juicerdocs. Every
page you’ve been reading is the live theme.&lt;/p&gt;
&lt;h2 id=&quot;what-this-site-demonstrates&quot;&gt;What this site demonstrates&lt;/h2&gt;
&lt;p&gt;The juicerdocs theme rendering against real-world content — over a
hundred markdown pages, deep section trees, all 17 shortcodes in
use, search backed by &lt;code&gt;/search.json&lt;/code&gt;, the right-rail “On this page”
TOC, mobile sidebar overlay, light + dark mode driven by the topbar
toggle, server-side syntax highlighting in code blocks.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/&quot;&gt;← Back to the home page&lt;/a&gt; and read around the docs to see every
juicerdocs feature in context. Or, if you want a quick tour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/&quot;&gt;Hero treatment + feature-card grid&lt;/a&gt;&lt;/strong&gt; — the home page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/themes/&quot;&gt;Sidebar nav with arbitrary nesting depth&lt;/a&gt;&lt;/strong&gt; — the
Themes section ships three levels (Themes → juicerblog →
Configuration) and the recursive partial supports more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/concepts/blogging/&quot;&gt;Right-rail TOC&lt;/a&gt;&lt;/strong&gt; — long pages that opt
into &lt;code&gt;toc: true&lt;/code&gt; get the auto-highlighting “On this page” rail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/getting-started/quickstart/&quot;&gt;Code blocks with copy buttons + language chips&lt;/a&gt;&lt;/strong&gt; —
the “Copy” button flashes “Copied” on success.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;/reference/shortcodes/&quot;&gt;Shortcodes in use&lt;/a&gt;&lt;/strong&gt; — the catalogue
page renders every shortcode against itself, so the styling is
visible inline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;The source for juicer.build lives at &lt;code&gt;docs/&lt;/code&gt; in the &lt;a href=&quot;https://github.com/edadma/juicer&quot;&gt;juicer
repository&lt;/a&gt;. The shape:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docs/
├── site.toml             # site config
├── content/              # this entire docs tree
├── themes/juicerdocs/    # the theme itself
└── demos/                # per-theme demo sources (built separately)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Strip the existing &lt;code&gt;content/&lt;/code&gt; tree, replace it with your own, and
point &lt;code&gt;[juicerdocs] logo&lt;/code&gt; at your wordmark. The companion
&lt;a href=&quot;/../configuration/&quot;&gt;Configuration&lt;/a&gt; reference catalogues every
site.toml key, palette token, and per-page frontmatter knob the theme
reads.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicercook/demo/"/>
    <id>https://juicer.build/themes/juicercook/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Elder &amp; Ash — six recipes (sourdough, focaccia, ragù, dal, cookies, tarte tatin) showing the recipe card, hero image, step photos, and Recipe JSON-LD.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicercook demo. When the docs site is built and deployed, this URL serves the actual demo rendered with the juicercook theme.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;“Elder &amp;amp; Ash” — a small home-cooking site with six recipes split between breads, mains, and desserts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hero photo + recipe card&lt;/strong&gt; on every recipe page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Step photos&lt;/strong&gt; on the sourdough recipe (shape, score, crumb cross-section).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;schema.org Recipe JSON-LD&lt;/strong&gt; on every recipe — paste any recipe URL into the &lt;a href=&quot;https://search.google.com/test/rich-results&quot;&gt;Rich Results Test&lt;/a&gt; to see how Google parses it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Print stylesheet&lt;/strong&gt; — File → Print on any recipe page strips chrome and prints clean.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category chips&lt;/strong&gt; on the home page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicercook -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicercook/&lt;/code&gt; into your own project, drop your hero photos into &lt;code&gt;static/img/&lt;/code&gt;, write each recipe as a markdown file with the structured frontmatter shape, and the recipe pages render themselves.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicerchurch/demo/"/>
    <id>https://juicer.build/themes/juicerchurch/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Grace Community Church — a fictional parish with sermon archive, recurring-event calendar grid, ministries section, photo albums, and service-times block.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicerchurch demo. When the
docs site is built and deployed, this URL serves the actual demo
rendered with the juicerchurch theme — a separate juicer build from
&lt;code&gt;docs/demos/juicerchurch/&lt;/code&gt; is dropped on top of the docs render at the
same path. See &lt;a href=&quot;https://github.com/edadma/juicer/blob/dev/bin/build-demos.sh&quot;&gt;&lt;code&gt;bin/build-demos.sh&lt;/code&gt;&lt;/a&gt;
for the orchestration.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;A fictional parish — “Grace Community Church” — with content
populating every juicerchurch layout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sermon archive&lt;/strong&gt; + per-sermon pages with scripture reference,
preacher / leader, audio + video URLs with displayed durations,
transcript body.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;12-month calendar grid&lt;/strong&gt; rendering &lt;code&gt;.site.calendar&lt;/code&gt; with recurring
weekly events expanded onto every matching weekday.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Events list + per-event pages&lt;/strong&gt; sharing the calendar’s underlying
data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ministries&lt;/strong&gt; — each ministry has its own &lt;code&gt;layout: ministry&lt;/code&gt; page:
leader, meeting time, contact info, narrative.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Photo albums&lt;/strong&gt; — per-event and site-wide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service-times block&lt;/strong&gt; in the header driven by &lt;code&gt;[[services]]&lt;/code&gt; in
&lt;code&gt;site.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/visit/&lt;/code&gt; block&lt;/strong&gt; — address, mapURL — surfaced in the footer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-clergy bylines&lt;/strong&gt; via the author registry (sermons by
different preachers).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beliefs page&lt;/strong&gt; — a static page that opts out of the post chrome.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerchurch -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-L&lt;/code&gt; flag enables live reload — touch any markdown file under
&lt;code&gt;docs/demos/juicerchurch/content/&lt;/code&gt; and the open browser tabs reload
via SSE.&lt;/p&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicerchurch/&lt;/code&gt; into your own project as a starting
point. Replace the service times, the sermon content, the ministries —
the layouts handle the rest. The companion
&lt;a href=&quot;/../configuration/&quot;&gt;Configuration&lt;/a&gt; reference catalogues every
site.toml key, palette token, and per-page frontmatter knob the theme
reads.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicercafe/demo/"/>
    <id>https://juicer.build/themes/juicercafe/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Stratus Coffee — a fictional café with hours widget, menu sections, events list with weekly recurrences, photo album, and the working-from-here pitch.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicercafe demo. When the
docs site is built and deployed, this URL serves the actual demo
rendered with the juicercafe theme — a separate juicer build from
&lt;code&gt;docs/demos/juicercafe/&lt;/code&gt; is dropped on top of the docs render at the
same path. See &lt;a href=&quot;https://github.com/edadma/juicer/blob/dev/bin/build-demos.sh&quot;&gt;&lt;code&gt;bin/build-demos.sh&lt;/code&gt;&lt;/a&gt;
for the orchestration.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;A fictional neighborhood café — “Stratus Coffee” — with content
populating every juicercafe layout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hours widget&lt;/strong&gt; — &lt;code&gt;[[hours]]&lt;/code&gt; rows for each day, with “Open
now”/”Closed” pill in the topbar driven by current time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menu sections&lt;/strong&gt; — multiple &lt;code&gt;layout: menu-section&lt;/code&gt; pages
composed under a &lt;code&gt;layout: menu&lt;/code&gt; index.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Events list + per-event pages&lt;/strong&gt; — including weekly recurring
events (&lt;code&gt;recurring: weekly&lt;/code&gt; + &lt;code&gt;recurringDay:&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Photo album&lt;/strong&gt; — site-wide grid pulling from every page’s
&lt;code&gt;photos:&lt;/code&gt; frontmatter, sorted by date desc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/visit/&lt;/code&gt; block&lt;/strong&gt; — address, city, state, zip, optional map URL
surfaced in the footer on every page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“We’re working on it”&lt;/strong&gt; card layout for the pending-projects page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom authors path&lt;/strong&gt; — &lt;code&gt;authorsPath = &amp;quot;/team/&amp;quot;&lt;/code&gt; so per-author
archives live under &lt;code&gt;/team/&lt;/code&gt; instead of &lt;code&gt;/authors/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-baker bylines&lt;/strong&gt; via the author registry.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicercafe -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-L&lt;/code&gt; flag enables live reload — touch any markdown file under
&lt;code&gt;docs/demos/juicercafe/content/&lt;/code&gt; and the open browser tabs reload via
SSE.&lt;/p&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicercafe/&lt;/code&gt; into your own project as a starting
point. Replace the hours table, the menu items, the photo URLs, the
address — the layouts handle the rest. The companion
&lt;a href=&quot;/../configuration/&quot;&gt;Configuration&lt;/a&gt; reference catalogues every site.toml
key, palette token, and per-page frontmatter knob the theme reads.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Demo site</title>
    <link href="https://juicer.build/themes/juicerblog/demo/"/>
    <id>https://juicer.build/themes/juicerblog/demo/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>The juicerblog demo — 9 dated posts, 3 authors, a 3-post series, dateArchives, permalinks, syntax highlighting. Rendered live with the juicerblog theme.</summary>
    <content type="html">&lt;p&gt;This page is the placeholder for the live juicerblog demo. When the
docs site is built and deployed, this URL serves the actual demo
rendered with the juicerblog theme — a separate juicer build from
&lt;code&gt;docs/demos/juicerblog/&lt;/code&gt; is dropped on top of the docs render at the
same path. See &lt;a href=&quot;https://github.com/edadma/juicer/blob/dev/bin/build-demos.sh&quot;&gt;&lt;code&gt;bin/build-demos.sh&lt;/code&gt;&lt;/a&gt;
for the orchestration.&lt;/p&gt;
&lt;h2 id=&quot;what-the-demo-exercises&quot;&gt;What the demo exercises&lt;/h2&gt;
&lt;p&gt;A short fictional engineering blog populated with realistic content
covering both Phase 1 and Phase 2 blog features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;9 dated posts&lt;/strong&gt; spanning Jul–Dec 2024 (most recent first).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3 authors&lt;/strong&gt; (&lt;code&gt;ed&lt;/code&gt;, &lt;code&gt;alice&lt;/code&gt;, &lt;code&gt;ben&lt;/code&gt;) with full author-registry
records — avatars, bios, external links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-author co-byline&lt;/strong&gt; on one post (Ed + Alice).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A 3-post series&lt;/strong&gt; (“Reading on screens · Part N of 3”) with the
series-progress badge above the body and the “In this series”
sidebar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pagination&lt;/strong&gt; at 4 posts/page on the home + archive listings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[permalinks]&lt;/code&gt; with &lt;code&gt;posts = &amp;quot;:year/:month/:slug/&amp;quot;&lt;/code&gt;&lt;/strong&gt; — every
post lives at &lt;code&gt;/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;slug&amp;gt;/&lt;/code&gt; regardless of its source
filename.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Year + month archives&lt;/strong&gt; via &lt;code&gt;dateArchives = true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aliases&lt;/strong&gt; on one post (old URL redirects to new).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server-side syntax highlighting&lt;/strong&gt; (Scala, JS, TOML, Bash) via
bundled &lt;code&gt;grammars/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Atom + RSS feeds&lt;/strong&gt; at &lt;code&gt;/feed.xml&lt;/code&gt; and &lt;code&gt;/feed.rss&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenGraph + Twitter card meta&lt;/strong&gt; in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; on every post.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;preview-locally&quot;&gt;Preview locally&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerblog -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-L&lt;/code&gt; flag enables live reload — touch any markdown file under
&lt;code&gt;docs/demos/juicerblog/content/&lt;/code&gt; and the open browser tabs reload via
SSE.&lt;/p&gt;
&lt;h2 id=&quot;use-it-as-a-template&quot;&gt;Use it as a template&lt;/h2&gt;
&lt;p&gt;Copy &lt;code&gt;docs/demos/juicerblog/&lt;/code&gt; into your own project as a starting
point. Strip the example posts, replace the &lt;code&gt;[[authors]]&lt;/code&gt; table, drop
your favicon + author avatars into &lt;code&gt;static/img/&lt;/code&gt;, and you’re shipping.
The companion &lt;a href=&quot;/../configuration/&quot;&gt;Configuration&lt;/a&gt; reference catalogues
every site.toml key and palette token the theme reads.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Content files</title>
    <link href="https://juicer.build/concepts/content-files/"/>
    <id>https://juicer.build/concepts/content-files/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Markdown files with YAML frontmatter — the source of truth for every page.</summary>
    <content type="html">&lt;p&gt;Every page on a juicer site comes from a markdown file under &lt;code&gt;content/&lt;/code&gt;. There are two flavors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Section index&lt;/strong&gt; — a file named &lt;code&gt;_index.md&lt;/code&gt; (configurable via &lt;code&gt;folderContent&lt;/code&gt;). Renders to &lt;code&gt;index.html&lt;/code&gt; at the section directory. Carries the section’s title, summary, and any list-page customizations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single page&lt;/strong&gt; — every other markdown file (&lt;code&gt;foo.md&lt;/code&gt;). Renders to its own &lt;code&gt;foo/index.html&lt;/code&gt; for clean URLs.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;juicer-filetree&quot;&gt;
content/
├── _index.md                 → /index.html
├── about.md                  → /about/index.html
└── docs/
    ├── _index.md             → /docs/index.html
    ├── installation.md       → /docs/installation/index.html
    └── api/
        ├── _index.md         → /docs/api/index.html
        └── spec.md           → /docs/api/spec/index.html
&lt;/pre&gt;
&lt;h2 id=&quot;frontmatter&quot;&gt;Frontmatter&lt;/h2&gt;
&lt;p&gt;Every content file may begin with a YAML frontmatter block, delimited by &lt;code&gt;---&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: My page
summary: One-line description shown in lists and meta tags.
weight: 30
draft: false
---

# Welcome

The body is plain markdown.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Recognized frontmatter keys:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;Page title; used by templates and search index&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;Explicit summary; overrides auto-derived&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weight&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;Sort key inside the section (lower = first)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;Skip the page unless &lt;code&gt;--drafts&lt;/code&gt; is passed&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;anything&lt;/td&gt;&lt;td&gt;any&lt;/td&gt;&lt;td&gt;Available to templates as &lt;code&gt;.page.&amp;lt;key&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The frontmatter format is YAML. JSON and TOML frontmatter are &lt;strong&gt;not&lt;/strong&gt; supported — partly because YAML covers the use case fluently, partly because supporting three formats triples the surface area to keep correct.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;pretty-urls&quot;&gt;Pretty URLs&lt;/h2&gt;
&lt;p&gt;Both flavors of content render to &lt;code&gt;index.html&lt;/code&gt; so that URLs don’t carry file extensions. &lt;code&gt;about.md&lt;/code&gt; becomes &lt;code&gt;/about/&lt;/code&gt;, not &lt;code&gt;/about.html&lt;/code&gt;. The &lt;code&gt;_index.md&lt;/code&gt; for a section becomes &lt;code&gt;/docs/&lt;/code&gt;, not &lt;code&gt;/docs.html&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-htmldir-quirk&quot;&gt;The &lt;code&gt;htmlDir&lt;/code&gt; quirk&lt;/h2&gt;
&lt;p&gt;By default (the &lt;code&gt;standard&lt;/code&gt; baseline config) juicer writes nested sections to &lt;code&gt;dst/html/&amp;lt;section&amp;gt;/...&lt;/code&gt; rather than &lt;code&gt;dst/&amp;lt;section&amp;gt;/...&lt;/code&gt;. That &lt;code&gt;html/&lt;/code&gt; segment is &lt;strong&gt;filesystem-only&lt;/strong&gt; — every URL juicer emits has it stripped. The convention exists so that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The site root &lt;code&gt;index.html&lt;/code&gt; lives at the top of &lt;code&gt;dst/&lt;/code&gt;, alongside &lt;code&gt;static/&lt;/code&gt; files (&lt;code&gt;favicon.ico&lt;/code&gt;, &lt;code&gt;robots.txt&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Nested content stays under a single subtree, so a webserver root pointing at &lt;code&gt;dst/&lt;/code&gt; doesn’t conflate static assets with rendered pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If this surprises you, set &lt;code&gt;htmlDir = &amp;quot;&amp;quot;&lt;/code&gt; in your &lt;code&gt;site.toml&lt;/code&gt; to disable. Most users don’t need to touch it.&lt;/p&gt;
&lt;h2 id=&quot;page-bundles&quot;&gt;Page bundles&lt;/h2&gt;
&lt;p&gt;Drop non-markdown files (images, attachments, anything that isn’t &lt;code&gt;.md&lt;/code&gt;/&lt;code&gt;.toml&lt;/code&gt;/&lt;code&gt;.yaml&lt;/code&gt;/&lt;code&gt;.html&lt;/code&gt;) next to a page’s markdown and they ride along as &lt;strong&gt;bundle assets&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;content/iceland-2024/
  _index.md
  hero.jpg
  skogafoss.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;hero.jpg&lt;/code&gt; is copied to the section’s output directory and served from &lt;code&gt;/iceland-2024/hero.jpg&lt;/code&gt;. Templates iterate &lt;code&gt;.page.assets&lt;/code&gt; to render a gallery or attachments list, and &lt;code&gt;imageVariants &apos;hero.jpg&apos;&lt;/code&gt; (no leading slash) resolves bundle-relative — move the bundle, the markup follows.&lt;/p&gt;
&lt;p&gt;Full reference (record shape, resolution rules, when NOT to use a bundle) in &lt;a href=&quot;/reference/template-data/#page-bundles&quot;&gt;Template data → Page bundles&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;drafts&quot;&gt;Drafts&lt;/h2&gt;
&lt;p&gt;A page with &lt;code&gt;draft: true&lt;/code&gt; is &lt;strong&gt;skipped entirely&lt;/strong&gt; during a normal build — invisible to the TOC, sitemap, search index, and section listings. To preview drafts locally, pass &lt;code&gt;--drafts&lt;/code&gt; (or &lt;code&gt;-D&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs -D&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;scheduling-future-posts&quot;&gt;Scheduling future posts&lt;/h2&gt;
&lt;p&gt;A page whose parsed &lt;code&gt;date:&lt;/code&gt; frontmatter is in the future is &lt;strong&gt;skipped&lt;/strong&gt; during a normal build, the same way &lt;code&gt;draft: true&lt;/code&gt; is — invisible to every downstream consumer. The intended workflow is:&lt;/p&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;set-the-publication-date-in-frontmatter&quot;&gt;Set the publication date in frontmatter&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Big announcement&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2024-12-25T09:00:00Z&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;push-the-post-to-your-repo-whenever-it-s-done&quot;&gt;Push the post to your repo whenever it’s done&lt;/h2&gt;
&lt;p&gt;The post is invisible to a normal &lt;code&gt;juicer build&lt;/code&gt; until the system clock catches up.&lt;/p&gt;
&lt;h2 id=&quot;re-build-or-re-deploy-on-or-after-the-publication-date&quot;&gt;Re-build (or re-deploy) on or after the publication date&lt;/h2&gt;
&lt;p&gt;The post starts appearing in section listings, taxonomy archives, feeds, and the sitemap automatically. Most people set up a daily build cron or use a CI scheduler.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;To preview future-dated posts locally, pass &lt;code&gt;--future&lt;/code&gt; (or &lt;code&gt;-F&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs -F&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;--future&lt;/code&gt; and &lt;code&gt;--drafts&lt;/code&gt; are independent flags. A post with &lt;code&gt;draft: true&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; a future &lt;code&gt;date&lt;/code&gt; requires both flags to render.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The future-skip rule only applies to pages with &lt;strong&gt;explicit&lt;/strong&gt; &lt;code&gt;date:&lt;/code&gt; frontmatter. Pages relying on the filesystem-mtime fallback are never future-skipped — &lt;code&gt;mtime&lt;/code&gt; can’t be in the future under any normal workflow, but the safer rule is “only authored future-dating counts”.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;summaries&quot;&gt;Summaries&lt;/h2&gt;
&lt;p&gt;Every page exposes a &lt;code&gt;.page.summary&lt;/code&gt;. Three sources are tried, in order:&lt;/p&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;explicit-frontmatter&quot;&gt;Explicit frontmatter&lt;/h2&gt;
&lt;p&gt;If &lt;code&gt;summary: ...&lt;/code&gt; is set in frontmatter, it’s used verbatim. Stop.&lt;/p&gt;
&lt;h2 id=&quot;more-marker&quot;&gt;&lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt; marker&lt;/h2&gt;
&lt;p&gt;The body up to (but not including) &lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt; is rendered as HTML and used as the summary. Useful when the natural summary is the first paragraph or two but you don’t want to repeat yourself.&lt;/p&gt;
&lt;h2 id=&quot;first-paragraph-fallback&quot;&gt;First paragraph (fallback)&lt;/h2&gt;
&lt;p&gt;The first paragraph’s plain text, capped at 30 words and ellipsised. Hugo defaults to 70 words; juicer trims tighter for compact list pages.&lt;/p&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicerwiki/configuration/"/>
    <id>https://juicer.build/themes/juicerwiki/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicerwiki reads, per-note frontmatter, and the [juicerwiki] palette table.</summary>
    <content type="html">&lt;p&gt;juicerwiki reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer theme uses, plus &lt;code&gt;topnav&lt;/code&gt; and &lt;code&gt;links&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicerwiki]&lt;/code&gt; table&lt;/strong&gt; for palette + typography overrides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-note frontmatter&lt;/strong&gt; — flat content tree, one note per file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Field Notes&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;A reading wiki on computing&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;ed&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://fieldnotes.example&amp;quot;&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerwiki&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;topnav&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Tags&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/tags/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;topnav&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;About&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/about/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A minimal note (&lt;code&gt;content/zettelkasten.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Zettelkasten
date: 2024-02-10
tags: [method, history]
summary: A note-taking method built around small atomic notes that link to each other.
---

Body in markdown. Link other notes liberally — `[Atomic Notes](/atomic-notes/)`
shows up in the linked note&apos;s backlinks panel automatically.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And a root index that opts into the home layout (&lt;code&gt;content/_index.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Field Notes
layout: home
---

Optional intro paragraph shown above the tag cloud.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Brand text in topbar + footer; &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Italic subtitle next to the brand in the topbar.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Default &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer copyright line. Falls back to &lt;code&gt;title&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Standard juicer key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;juicerwiki&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a favicon.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;true&lt;/code&gt; to remove the “Built with juicer” line.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;topnav&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[[topnav]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Array of &lt;code&gt;{label, url}&lt;/code&gt; entries shown in the topbar.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[[links]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Array of &lt;code&gt;{label, url}&lt;/code&gt; entries shown in the footer.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-note-frontmatter&quot;&gt;Per-note frontmatter&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Required — the note’s display name.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Controls home-page recency ordering. Also drives the Article JSON-LD &lt;code&gt;datePublished&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Single string or list. Each tag generates a &lt;code&gt;/tags/&amp;lt;slug&amp;gt;/&lt;/code&gt; archive page.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Shown on the home list, in &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;, and in &lt;em&gt;other&lt;/em&gt; notes’ backlinks panels.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;juicerwiki-palette-typography-overrides&quot;&gt;&lt;code&gt;[juicerwiki]&lt;/code&gt; palette + typography overrides&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicerwiki&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
brand        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#3b2c1e&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# walnut ink&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; walnut ink
brandStrong  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#1f150c&amp;quot;&lt;/span&gt;
accent       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#7a4a1c&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# umber accent&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; umber accent
fontSans     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Inter&apos;, system-ui, sans-serif&amp;quot;&lt;/span&gt;
fontSerif    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Crimson Pro&apos;, Georgia, serif&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Dark-mode overrides&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Dark-mode overrides
brandDark    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#f1e7d6&amp;quot;&lt;/span&gt;
accentDark   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#d99a52&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See &lt;a href=&quot;/reference/theming/&quot;&gt;Reference → Theming&lt;/a&gt; for the shared theming model.&lt;/p&gt;
&lt;h2 id=&quot;client-side-search&quot;&gt;Client-side search&lt;/h2&gt;
&lt;p&gt;juicer auto-generates &lt;code&gt;/search.json&lt;/code&gt; for every site — see &lt;a href=&quot;/reference/search/&quot;&gt;Reference → Search&lt;/a&gt; for the field shape. juicerwiki ships a &lt;code&gt;search&lt;/code&gt; partial that fetches it lazily on first modal open and runs an in-memory substring match. No backend, no API, no third-party service.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicerstudy/configuration/"/>
    <id>https://juicer.build/themes/juicerstudy/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Every site-config key juicerstudy reads, every palette / typography / sizing token, and the per-page frontmatter conventions.</summary>
    <content type="html">&lt;p&gt;juicerstudy reads its configuration from three places in &lt;code&gt;site.toml&lt;/code&gt;
plus per-page frontmatter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer
theme uses — &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;author&lt;/code&gt;, &lt;code&gt;baseURL&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicerstudy]&lt;/code&gt; table&lt;/strong&gt; for theme-specific
knobs — palette, typography, sizing, the &lt;code&gt;math&lt;/code&gt; opt-in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-page frontmatter&lt;/strong&gt; for opt-ins like the right-rail TOC and
the page’s own summary lead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anything you don’t set keeps the theme’s defaults. juicerstudy uses
&lt;code&gt;[juicerstudy]&lt;/code&gt; so it doesn’t collide with the keys other themes
might want.&lt;/p&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;p&gt;A complete &lt;code&gt;site.toml&lt;/code&gt; exercising every juicerstudy-aware feature:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Marginalia&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;notes from the margins of books&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;a slow reader&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://example.com&amp;quot;&lt;/span&gt;

theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerstudy&amp;quot;&lt;/span&gt;
headingShift &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicerstudy&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;# Optional KaTeX rendering. Off by default — sites without math&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Optional KaTeX rendering. Off by default — sites without math
&lt;span class=&quot;hl-comment&quot;&gt;# don&apos;t pay the script + stylesheet cost.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; don&apos;t pay the script + stylesheet cost.
math &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Logo for the topbar wordmark + the &amp;lt;link rel=icon&amp;gt; fallback.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Logo for the topbar wordmark + the &amp;lt;link rel=icon&amp;gt; fallback.
&lt;span class=&quot;hl-comment&quot;&gt;# Top-level `favicon` wins over this for the icon tag.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Top-level `favicon` wins over this for the icon tag.
logo &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/site-logo.png&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Palette — a quiet scholarly grey with amber accent.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Palette — a quiet scholarly grey with amber accent.
brand           &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#475569&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# slate-600 — primary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; slate-600 — primary
brandStrong     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#334155&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# slate-700 — hover&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; slate-700 — hover
brandSoft       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#f1f5f9&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# slate-100 — backgrounds&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; slate-100 — backgrounds
accent          &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#b45309&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# amber-700 — secondary, link-like&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; amber-700 — secondary, link-like
leaf            &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#65a30d&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# lime-600  — success / leaf&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; lime-600  — success / leaf

brandDark       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#94a3b8&amp;quot;&lt;/span&gt;
brandStrongDark &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#cbd5e1&amp;quot;&lt;/span&gt;
brandSoftDark   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;rgb(148 163 184 / .12)&amp;quot;&lt;/span&gt;
accentDark      &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#fbbf24&amp;quot;&lt;/span&gt;
leafDark        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#a3e635&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;top-level-keys-read-by-juicerstudy&quot;&gt;Top-level keys (read by juicerstudy)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Untitled&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Wordmark in the topbar; appears in &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tags&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Unnamed&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Footer copyright line (only when &lt;code&gt;showCopyright = true&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(required)&lt;/td&gt;&lt;td&gt;Used for absolute permalinks, sitemap, atom feed&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(required)&lt;/td&gt;&lt;td&gt;Set this to &lt;code&gt;&amp;quot;juicerstudy&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;headingShift&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The juicerstudy layout already provides an outer &lt;code&gt;&amp;lt;h1&amp;gt;{{ .page.title }}&amp;lt;/h1&amp;gt;&lt;/code&gt;, so set this to &lt;code&gt;0&lt;/code&gt; if your markdown bodies start at &lt;code&gt;##&lt;/code&gt; (the natural prose convention)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Path (relative to your site root) of the &lt;code&gt;&amp;lt;link rel=icon&amp;gt;&lt;/code&gt;. When unset, &lt;code&gt;[juicerstudy].logo&lt;/code&gt; is used as fallback.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;customCSS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array&lt;/td&gt;&lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-supplied stylesheets, loaded after &lt;code&gt;juicerstudy.css&lt;/code&gt; so they can override anything. See &lt;a href=&quot;/reference/theming/&quot;&gt;Theming&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;showCopyright&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When true, the footer renders a &lt;code&gt;© {{ .site.author }}&lt;/code&gt; line beside the “Built with Juicer” attribution&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When true, suppresses the “Built with Juicer · Theme: juicerstudy” line in the footer&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;juicerstudy-keys&quot;&gt;&lt;code&gt;[juicerstudy]&lt;/code&gt; keys&lt;/h2&gt;
&lt;h3 id=&quot;optional-features&quot;&gt;Optional features&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.math&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When true, loads KaTeX (CSS + JS + auto-render) from CDN and renders &lt;code&gt;$…$&lt;/code&gt;, &lt;code&gt;$$…$$&lt;/code&gt;, &lt;code&gt;\( … \)&lt;/code&gt;, &lt;code&gt;\[ … \]&lt;/code&gt; math in the body. Pinned to a recent KaTeX major. Sites that don’t need math leave it off so the page stays zero-asset.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.logo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Path of the logo image used in the topbar wordmark and (when no top-level &lt;code&gt;favicon&lt;/code&gt; is set) as the &lt;code&gt;&amp;lt;link rel=icon&amp;gt;&lt;/code&gt; fallback&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;palette-light-mode&quot;&gt;Palette — light mode&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#1e3a8a&lt;/code&gt; (ink blue)&lt;/td&gt;&lt;td&gt;Primary brand color — body link color, sidebar active border, code-highlight underlines&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.brandStrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#1e40af&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hover state for primary links and buttons&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.brandSoft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;rgba(30,58,138,.10)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Soft brand tint — sidebar hover, callout backgrounds, selection highlight&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#92400e&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Secondary accent — decorative highlights, secondary links&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#166534&lt;/code&gt;&lt;/td&gt;&lt;td&gt;“Confirmation green” — copy-button “copied” state, success indicators&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Any CSS color expression works: hex (&lt;code&gt;#...&lt;/code&gt;), &lt;code&gt;rgb(...)&lt;/code&gt;, &lt;code&gt;hsl(...)&lt;/code&gt;, &lt;code&gt;oklch(...)&lt;/code&gt;, &lt;code&gt;color-mix(...)&lt;/code&gt;, named colors. The values land in a &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; block emitted after &lt;code&gt;juicerstudy.css&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;palette-dark-mode-overrides&quot;&gt;Palette — dark mode overrides&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.brandDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#93c5fd&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.brandStrongDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#bfdbfe&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.brandSoftDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;rgba(147, 197, 253, 0.14)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.accentDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#fdba74&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.leafDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#86efac&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Set just the ones you want to differ — anything you leave out keeps its light-mode value, which is almost certainly wrong in dark mode, so it’s worth setting all five.&lt;/p&gt;
&lt;h3 id=&quot;typography&quot;&gt;Typography&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.fontSans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;Inter&apos;, system-sans-stack&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sans-serif face. Chrome (topbar, sidebar, footer) and headings are sans by default.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.fontSerif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;Source Serif Pro&apos;, &apos;Iowan Old Style&apos;, Charter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Serif face. The reading column inside &lt;code&gt;.juicerstudy-content&lt;/code&gt; is serif by default.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.fontMono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;JetBrains Mono&apos;, ui-monospace, Menlo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Monospace face for code blocks + the &lt;code&gt;kbd&lt;/code&gt; shortcode.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To swap in a different font, set its &lt;code&gt;@font-face&lt;/code&gt; declarations in your own &lt;code&gt;static/site.css&lt;/code&gt;, add the file path to &lt;code&gt;customCSS&lt;/code&gt;, and set the matching token here.&lt;/p&gt;
&lt;h3 id=&quot;sizing&quot;&gt;Sizing&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.contentMax&lt;/code&gt;&lt;/td&gt;&lt;td&gt;length&lt;/td&gt;&lt;td&gt;&lt;code&gt;38rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Max width of the reading column. Tuned for ~65ch of serif body.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.sidebarW&lt;/code&gt;&lt;/td&gt;&lt;td&gt;length&lt;/td&gt;&lt;td&gt;&lt;code&gt;16rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Width of the left sidebar nav.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.railW&lt;/code&gt;&lt;/td&gt;&lt;td&gt;length&lt;/td&gt;&lt;td&gt;&lt;code&gt;18rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Width of the right “On this page” rail (only emitted when a page sets &lt;code&gt;toc: true&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.radiusLg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;length&lt;/td&gt;&lt;td&gt;&lt;code&gt;0.5rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Border-radius for “large” surfaces — code-block frames, modal, callouts.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h2&gt;
&lt;p&gt;Keys juicerstudy reads from each page’s frontmatter:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;filename-derived&lt;/td&gt;&lt;td&gt;Rendered as the page’s &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; and the &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Rendered as the &lt;code&gt;juicerstudy-lead&lt;/code&gt; line under the title (an italic dropcap-ish subtitle) and used as &lt;code&gt;&amp;lt;meta name=description&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;toc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When true, the right-side “On this page” rail is emitted for the page (heading IDs are auto-generated from the markdown body). Off by default — most prose doesn’t want it, but reference-style notes do.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Surfaces in the topbar metadata block (when present) and the atom feed&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;minutes&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Read-time hint, surfaced by the &lt;code&gt;section-list&lt;/code&gt; shortcode for landing pages that list children&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;root-landing-index-md-extras&quot;&gt;Root landing (&lt;code&gt;_index.md&lt;/code&gt;) extras&lt;/h3&gt;
&lt;p&gt;Keys juicerstudy reads on the &lt;strong&gt;root&lt;/strong&gt; &lt;code&gt;_index.md&lt;/code&gt; to drive the
landing-page hero:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;heroTitle&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Big hero headline. When set, the title text replaces the plain &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; and you can highlight one word via &lt;code&gt;heroHighlight&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;heroHighlight&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;One word from the hero rendered with the brand-gradient &lt;code&gt;juicerstudy-grad&lt;/code&gt; treatment.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;heroSuffix&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Appended after the highlight word — typically a period or exclamation point.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;heroImage&lt;/code&gt;&lt;/td&gt;&lt;td&gt;path&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Optional hero image, rendered through &lt;code&gt;imageVariants&lt;/code&gt; for responsive &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; markup.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;heroImageAlt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Alt text for the hero image.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;heroImageCaption&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Caption shown under the hero image.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These are &lt;em&gt;root-only&lt;/em&gt; — nested section landings render with a simpler
header + subsection-card grid (and ignore the hero keys).&lt;/p&gt;
&lt;h3 id=&quot;site-level-landing-tokens&quot;&gt;Site-level landing tokens&lt;/h3&gt;
&lt;p&gt;The root landing also reads two &lt;code&gt;[juicerstudy]&lt;/code&gt; keys that control the
hero’s CTAs:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.startReading&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool or string&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When &lt;code&gt;true&lt;/code&gt;, emits a “Start reading” CTA pointing at &lt;code&gt;/start/&lt;/code&gt;. Set to a path string (e.g. &lt;code&gt;&amp;quot;/intro/&amp;quot;&lt;/code&gt;) to point elsewhere.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.repoCTA&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When &lt;code&gt;true&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; a top-level &lt;code&gt;repoURL&lt;/code&gt; is set, emits a “View on GitHub” CTA. The two-flag pattern is intentional: &lt;code&gt;repoURL&lt;/code&gt; is commonly set just to drive the topbar GitHub icon, and personal / editorial sites usually don’t want a hero CTA tagging along.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.logo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;path&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Logo image shown in the hero’s meta row above the title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerstudy.version&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Optional version chip shown next to the logo.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;image-variants&quot;&gt;Image variants&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;[images] enabled = true&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt; turns on responsive image
delivery for both the &lt;code&gt;heroImage&lt;/code&gt; and any use of the &lt;code&gt;figure&lt;/code&gt;
shortcode. The build runs &lt;code&gt;magick&lt;/code&gt; (ImageMagick 7) once per source,
caches by content hash, and reuses across builds. See &lt;a href=&quot;/reference/image-variants/&quot;&gt;Reference →
Image variants&lt;/a&gt; for the full configuration
surface.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;images&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
enabled &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
widths  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;960&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;1600&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
formats &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;webp&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;original&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
quality &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;78&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All other juicer engine frontmatter (&lt;code&gt;date&lt;/code&gt;, &lt;code&gt;weight&lt;/code&gt;, &lt;code&gt;aliases&lt;/code&gt;, &lt;code&gt;permalinks&lt;/code&gt;, etc.) works as documented in &lt;a href=&quot;/reference/frontmatter/&quot;&gt;Reference → Frontmatter&lt;/a&gt; — juicerstudy doesn’t override or hide any of it.&lt;/p&gt;
&lt;h2 id=&quot;shortcodes&quot;&gt;Shortcodes&lt;/h2&gt;
&lt;p&gt;juicerstudy ships the standard juicer shortcode set plus one
study-specific one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Callouts&lt;/strong&gt; — &lt;code&gt;note&lt;/code&gt;, &lt;code&gt;tip&lt;/code&gt;, &lt;code&gt;warning&lt;/code&gt;, &lt;code&gt;danger&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layout helpers&lt;/strong&gt; — &lt;code&gt;figure&lt;/code&gt;, &lt;code&gt;collapse&lt;/code&gt;, &lt;code&gt;tabs&lt;/code&gt; / &lt;code&gt;tab&lt;/code&gt;, &lt;code&gt;steps&lt;/code&gt;,
&lt;code&gt;buttons&lt;/code&gt; / &lt;code&gt;button&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inline&lt;/strong&gt; — &lt;code&gt;kbd&lt;/code&gt;, &lt;code&gt;badge&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embeds&lt;/strong&gt; — &lt;code&gt;youtube&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reference&lt;/strong&gt; — &lt;code&gt;filetree&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;juicerstudy-specific&lt;/strong&gt; — &lt;code&gt;section-list&lt;/code&gt; (renders a section’s
direct children as a titled list with summaries; useful on
authored section landings that want an explicit catalog beside
the editorial prose). See the &lt;a href=&quot;/reference/shortcodes/&quot;&gt;shortcodes reference&lt;/a&gt; for the
generic shortcode usage and call-site conventions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The &lt;code&gt;section-list&lt;/code&gt; shortcode is wired up but currently silently
renders nothing — see the comment in
&lt;code&gt;docs/themes/juicerstudy/shortcodes/section-list.html&lt;/code&gt; for the
engine-side gap. It will start working when juicer threads page
context into shortcode rendering; the template and CSS are ready.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;where-the-values-land&quot;&gt;Where the values land&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; partial emits a &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; block immediately after
&lt;code&gt;juicerstudy.css&lt;/code&gt;, redefining only the variables you’ve set:&lt;/p&gt;
&lt;dl&gt;
  &lt;dt&gt;```css&lt;/dt&gt;
  &lt;dd&gt;
&lt;p&gt;root {&lt;/p&gt;  &lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;–brand:        #475569;   /* from juicerstudy.brand &lt;em&gt;/
–brand-strong: #334155;   /&lt;/em&gt; from juicerstudy.brandStrong &lt;em&gt;/
/&lt;/em&gt; … &lt;em&gt;/
}
[data-theme=”dark”] {
–brand:        #94a3b8;   /&lt;/em&gt; from juicerstudy.brandDark &lt;em&gt;/
/&lt;/em&gt; … */
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Anything not set falls through to the defaults declared at the top
of `juicerstudy.css`. The theme always toggles between light and
dark via the `data-theme` attribute on `&amp;lt;html&amp;gt;`, set by the
pre-paint script in `&amp;lt;head&amp;gt;`.

## Going beyond config

Drop a file with the same path under your own site to override
anything in the theme — the ordinary
[theme overlay](/concepts/themes/) pattern:

| You want to change… | Override at… |
|---------------------|--------------|
| The topbar          | `&amp;lt;src&amp;gt;/partials/topbar.html` |
| The footer markup   | `&amp;lt;src&amp;gt;/partials/footer.html` |
| The 404 page        | `&amp;lt;src&amp;gt;/layouts/_default/404.html` |
| The section landing | `&amp;lt;src&amp;gt;/layouts/_default/folder.html` |
| Custom CSS          | `&amp;lt;src&amp;gt;/static/site.css` (and add `&amp;quot;site.css&amp;quot;` to `customCSS` in `site.toml`) |

Site files always win over theme files, so overrides are a
one-file-at-a-time operation — no forking the theme.

## SEO

Every juicer theme ships a shared SEO partial (`partials/seo.html`) that emits the standard meta block: description (with site-level fallback), canonical link, author meta, robots `noindex`, OpenGraph + Twitter cards (via the `ogTags` builtin), Atom feed discovery, and theme-specific JSON-LD. The engine separately writes `sitemap.xml` and `robots.txt`.

### Site-wide keys

```toml
description = &amp;quot;Notes and short courses on linear algebra, written for the curious.&amp;quot;
ogImage     = &amp;quot;/og/default.png&amp;quot;

robots   = true
noindex  = false                  # set true for staging/preview domains
disallow = [&amp;quot;/scratch/&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Eigenvalues, intuitively&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A one-sentence dek for search results and OG cards.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2026-04-12&lt;/span&gt;                  &lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; surfaces in Article JSON-LD&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;author: ed&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;image: /img/eigenvalues-card.png&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;ogTitle: A snappier social headline&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;ogDescription: Tightened for socials&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;noindex: true   # excluded from sitemap, JSON-LD suppressed, &amp;lt;meta robots&amp;gt; emitted&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;structured-data-emitted&quot;&gt;Structured data emitted&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Page&lt;/th&gt;&lt;th&gt;Schema&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Root section&lt;/td&gt;&lt;td&gt;&lt;code&gt;WebSite&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Every other page&lt;/td&gt;&lt;td&gt;&lt;code&gt;Article&lt;/code&gt; (with author / image / dateISO when present)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Any page with ancestors&lt;/td&gt;&lt;td&gt;&lt;code&gt;BreadcrumbList&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;noindex: true&lt;/code&gt; suppresses ALL JSON-LD on that page.&lt;/p&gt;
&lt;h3 id=&quot;overriding-the-seo-partial&quot;&gt;Overriding the SEO partial&lt;/h3&gt;
&lt;p&gt;Drop a file at &lt;code&gt;&amp;lt;src&amp;gt;/partials/seo.html&lt;/code&gt; (or &lt;code&gt;seo-jsonld.html&lt;/code&gt; for just the structured-data part). Site overrides win over the theme’s copy.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicerportfolio/configuration/"/>
    <id>https://juicer.build/themes/juicerportfolio/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicerportfolio reads, per-page project frontmatter, and the [juicerportfolio] palette table.</summary>
    <content type="html">&lt;p&gt;juicerportfolio reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer theme uses, plus a few portfolio-specific ones for the topbar / footer / filter chips).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicerportfolio]&lt;/code&gt; table&lt;/strong&gt; for theme-specific palette + sizing overrides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-project frontmatter&lt;/strong&gt; — projects opt into the project layout with &lt;code&gt;layout: project&lt;/code&gt;, then set hero / meta / gallery fields the layout knows about.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;p&gt;A minimal &lt;code&gt;site.toml&lt;/code&gt; that produces a credible portfolio:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Studio Name&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Industrial design, Lisbon&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Studio Name&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://example.com&amp;quot;&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerportfolio&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;topnav&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Work&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;topnav&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;About&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/about/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;contact&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
email    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;studio@example.com&amp;quot;&lt;/span&gt;
location &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Lisbon, Portugal&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;links&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Instagram&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://instagram.com/example&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A minimal project page (&lt;code&gt;content/work/my-project.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Tobias Lounge
layout: project
year: &amp;quot;2024&amp;quot;
tagline: Bent-ash lounge chair
summary: A short subtitle about the piece.
role: Design + production drawings
client: Private commission
tools:
  - European ash
  - 12 oz canvas
  - Brass
hero: /img/work/tobias-lounge.jpg
heroAlt: Tobias lounge chair, three-quarter view
---

The body of the writeup goes here, in regular markdown.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s enough to render the home grid, the project page with its
meta sidebar, and the project body. Add &lt;code&gt;category&lt;/code&gt;, &lt;code&gt;gallery&lt;/code&gt;, &lt;code&gt;link&lt;/code&gt;
to unlock the rest.&lt;/p&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;p&gt;Standard juicer keys plus a few portfolio-specific ones.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Brand text in topbar + footer; &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Italic subtitle next to the brand in the topbar; appended to &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; when the page title equals the site title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Default &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt; for pages that don’t set their own &lt;code&gt;summary&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer name + copyright line. Falls back to &lt;code&gt;title&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Standard juicer key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;juicerportfolio&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a favicon.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;true&lt;/code&gt; to remove the “Built with juicer” line in the footer.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;customCSS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Site stylesheets loaded &lt;em&gt;after&lt;/em&gt; the theme CSS. See &lt;a href=&quot;/reference/theming/&quot;&gt;Theming → Layer 2&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;topnav&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Topbar nav links: &lt;code&gt;[[topnav]]&lt;/code&gt; rows of &lt;code&gt;{label, url}&lt;/code&gt;. &lt;strong&gt;Note:&lt;/strong&gt; keyed &lt;code&gt;topnav&lt;/code&gt; because top-level &lt;code&gt;nav&lt;/code&gt; is reserved by juicer for table-of-contents config.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;workCategories&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Filter chips above the work grid: &lt;code&gt;[[workCategories]]&lt;/code&gt; rows of &lt;code&gt;{label, value}&lt;/code&gt;. Projects with &lt;code&gt;category = &amp;quot;&amp;lt;value&amp;gt;&amp;quot;&lt;/code&gt; match the chip.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contact&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Object&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;&lt;code&gt;{email, location}&lt;/code&gt; — surfaced in the footer brand block.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer external-link list: &lt;code&gt;[[links]]&lt;/code&gt; rows of &lt;code&gt;{label, url}&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;palette-token-overrides-juicerportfolio&quot;&gt;Palette + token overrides — &lt;code&gt;[juicerportfolio]&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;All optional. Anything you don’t set keeps the warm-paper / rust defaults. The full mapping (which token drives which CSS variable) is documented in &lt;a href=&quot;/reference/theming/&quot;&gt;Theming&lt;/a&gt; — juicerportfolio follows the same pattern as the other themes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;CSS variable&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#c4633b&lt;/code&gt; (warm rust)&lt;/td&gt;&lt;td&gt;The single accent — link hover, active filter chip, project meta link, blockquote rule.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandStrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-strong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#8a3f22&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hover-emphasis on brand-coloured elements.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandSoft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-soft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#f4e6dc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Subtle paper-tinted backgrounds.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#2b2620&lt;/code&gt; (near-black)&lt;/td&gt;&lt;td&gt;Reserved; not used by Stage-1/2 sections.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#d6845f&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lifted rust for dark backgrounds.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandStrongDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-strong&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#f0a982&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandSoftDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-soft&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;rgba(214,132,95,0.16)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accentDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--accent&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#ede7d9&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-sans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;system-ui stack&lt;/td&gt;&lt;td&gt;Body / UI / nav face.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSerif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-serif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Iowan Old Style stack&lt;/td&gt;&lt;td&gt;Project titles, brand, page titles.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontMono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-mono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;system mono stack&lt;/td&gt;&lt;td&gt;Materials chips, code in writeups.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;62ch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prose column max-width on &lt;code&gt;file.html&lt;/code&gt; / &lt;code&gt;folder.html&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1.5rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Outer padding around content blocks.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;radiusLg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--radius-lg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0.375rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Large border-radius (cards, hero images).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;logo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a small image; rendered next to the brand name in the topbar.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-project-frontmatter&quot;&gt;Per-project frontmatter&lt;/h2&gt;
&lt;p&gt;Projects opt into the project layout by setting &lt;code&gt;layout: project&lt;/code&gt;. The home grid filters by exactly that flag, so anything else (about, contact, CV) is hidden from the project listing automatically.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;project&lt;/code&gt; to opt in. Required for the home grid + project layout.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The project name. Required.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Drives &lt;code&gt;sortBy = &amp;quot;date&amp;quot;&lt;/code&gt; ordering across the grid + the prev/next reading order.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;year&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Display-only year (e.g. &lt;code&gt;&amp;quot;2024&amp;quot;&lt;/code&gt; or &lt;code&gt;&amp;quot;2023–2024&amp;quot;&lt;/code&gt;). Appears on the home card byline and in the meta sidebar. Quote it; TOML reads bare &lt;code&gt;2024&lt;/code&gt; as an integer.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;One-line subtitle on the home card under the title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Italic subtitle directly under the title on the project page; also &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Matches a &lt;code&gt;value&lt;/code&gt; in one of the &lt;code&gt;[[workCategories]]&lt;/code&gt; rows. Drives the home-page filter chips.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;role&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;What you did on the project. Renders as a meta-sidebar row. Optional.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;client&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Who the project was for. Omit for self-initiated work.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Materials / techniques / software list. Renders as small chips in the meta sidebar under “Materials”.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Object&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;{label, url}&lt;/code&gt; — external link in the meta sidebar (live site, shop, github, etc.).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hero&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URL of the hero image at the top of the project page. Also used as the home-card thumbnail.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;heroAlt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Alt text for the hero image. Falls back to the title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;caption&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Italic caption under the hero image.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gallery&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[Object]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;List of &lt;code&gt;{src, alt, caption}&lt;/code&gt; images rendered as a 2-up figure grid below the body. Section silently omits if absent.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-page-frontmatter-non-project&quot;&gt;Per-page frontmatter (non-project)&lt;/h2&gt;
&lt;p&gt;Most other pages on a portfolio site use the default &lt;code&gt;file.html&lt;/code&gt;
layout (about, contact, CV, press) or &lt;code&gt;folder.html&lt;/code&gt; for section
indexes (&lt;code&gt;/work/_index.md&lt;/code&gt;, &lt;code&gt;/press/_index.md&lt;/code&gt;).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Page heading + &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Italic subtitle under the page title; also &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sort key for &lt;code&gt;folder.html&lt;/code&gt; listings. Optional on prose pages.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;lang&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sets &lt;code&gt;&amp;lt;html lang&amp;gt;&lt;/code&gt; for the page. Defaults to &lt;code&gt;en&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;prev-next-reading-order&quot;&gt;Prev / next reading order&lt;/h2&gt;
&lt;p&gt;Project pages get &lt;code&gt;← Previous&lt;/code&gt; / &lt;code&gt;Next →&lt;/code&gt; nav at the bottom, sourced from the engine’s &lt;code&gt;.page.prev&lt;/code&gt; / &lt;code&gt;.page.next&lt;/code&gt; fields. The reading order is a depth-first traversal anchored at the root section, so the project series only links across siblings if &lt;code&gt;/work/&lt;/code&gt; itself has an &lt;code&gt;_index.md&lt;/code&gt; to anchor it. Without that anchor, every project’s &lt;code&gt;.page.prev&lt;/code&gt; and &lt;code&gt;.page.next&lt;/code&gt; are null and the nav block silently omits.&lt;/p&gt;
&lt;p&gt;The demo’s &lt;code&gt;content/work/_index.md&lt;/code&gt; is intentionally minimal — it doubles as a text-list archive of all projects via &lt;code&gt;folder.html&lt;/code&gt;. If you don’t want a &lt;code&gt;/work/&lt;/code&gt; archive page rendered, set &lt;code&gt;static: true&lt;/code&gt; in the &lt;code&gt;_index.md&lt;/code&gt; frontmatter (excluded from &lt;code&gt;.site.posts&lt;/code&gt;) — it still anchors the section for the prev/next math.&lt;/p&gt;
&lt;h2 id=&quot;seo&quot;&gt;SEO&lt;/h2&gt;
&lt;p&gt;Every juicer theme ships a shared SEO partial (&lt;code&gt;partials/seo.html&lt;/code&gt;) that emits the standard meta block: description (with site-level fallback), canonical link, author meta, robots &lt;code&gt;noindex&lt;/code&gt;, OpenGraph + Twitter cards (via the &lt;code&gt;ogTags&lt;/code&gt; builtin), Atom feed discovery, and theme-specific JSON-LD. The engine separately writes &lt;code&gt;sitemap.xml&lt;/code&gt; and &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;site-wide-keys&quot;&gt;Site-wide keys&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;description &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Independent designer in Halifax, working in print + the screen.&amp;quot;&lt;/span&gt;
ogImage     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/og/portrait.jpg&amp;quot;&lt;/span&gt;

robots   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
noindex  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;false&lt;/span&gt;
disallow &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/scratch/&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Optional: Person JSON-LD on the homepage. Drives Google&apos;s Knowledge&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Optional: Person JSON-LD on the homepage. Drives Google&apos;s Knowledge
&lt;span class=&quot;hl-comment&quot;&gt;# Panel for an individual.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Panel for an individual.
&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;person&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
name     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Ada Hopper&amp;quot;&lt;/span&gt;           &lt;span class=&quot;hl-comment&quot;&gt;# defaults to .site.title when omitted&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; defaults to .site.title when omitted
jobTitle &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Graphic designer &amp;amp; illustrator&amp;quot;&lt;/span&gt;
image    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/portrait.jpg&amp;quot;&lt;/span&gt;
email    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;hello@adahopper.com&amp;quot;&lt;/span&gt;
sameAs   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://github.com/adahopper&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://dribbble.com/adahopper&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Field guide cover series&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A one-sentence dek for search results and OG cards.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/projects/field-guide.jpg&lt;/span&gt;   &lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; used by ogTags AND CreativeWork JSON-LD&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;ogTitle: A snappier social headline&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;ogDescription: Tightened for socials&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;noindex: true   # excluded from sitemap, JSON-LD suppressed, &amp;lt;meta robots&amp;gt; emitted&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;structured-data-emitted&quot;&gt;Structured data emitted&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Page&lt;/th&gt;&lt;th&gt;Schema&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Root section&lt;/td&gt;&lt;td&gt;&lt;code&gt;WebSite&lt;/code&gt; (+ &lt;code&gt;Person&lt;/code&gt; when &lt;code&gt;[person]&lt;/code&gt; is set in &lt;code&gt;site.toml&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Project page with &lt;code&gt;image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;CreativeWork&lt;/code&gt; (name, url, image, description, dateCreated)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Any page with ancestors&lt;/td&gt;&lt;td&gt;&lt;code&gt;BreadcrumbList&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;noindex: true&lt;/code&gt; suppresses ALL JSON-LD on that page.&lt;/p&gt;
&lt;h3 id=&quot;overriding-the-seo-partial&quot;&gt;Overriding the SEO partial&lt;/h3&gt;
&lt;p&gt;Drop a file at &lt;code&gt;&amp;lt;src&amp;gt;/partials/seo.html&lt;/code&gt; (or &lt;code&gt;seo-jsonld.html&lt;/code&gt; for just the structured-data part). Site overrides win over the theme’s copy.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicerpodcast/configuration/"/>
    <id>https://juicer.build/themes/juicerpodcast/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicerpodcast reads, per-episode frontmatter, the [juicerpodcast] palette table, and the subscribe-strip.</summary>
    <content type="html">&lt;p&gt;juicerpodcast reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicerpodcast]&lt;/code&gt; table&lt;/strong&gt; for palette + show artwork + the subscribe strip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-episode frontmatter&lt;/strong&gt; — &lt;code&gt;audio:&lt;/code&gt;, &lt;code&gt;duration:&lt;/code&gt;, &lt;code&gt;image:&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Echo Chamber&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;A weekly conversation with one interesting person&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Sara Lindholm&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://echochamber.example&amp;quot;&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerpodcast&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;topnav&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Episodes&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Show artwork — used on the home hero and in the PodcastSeries JSON-LD.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Show artwork — used on the home hero and in the PodcastSeries JSON-LD.
&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicerpodcast&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
cover &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/show-cover.jpg&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;juicerpodcast.subscribe&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Apple Podcasts&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://podcasts.apple.com/...&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;juicerpodcast.subscribe&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;RSS&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/feed.xml&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An episode (&lt;code&gt;content/ep01.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: &amp;quot;Ep 01 — Pilot&amp;quot;
date: 2024-03-25
audio: /audio/ep01.mp3
audioType: audio/mpeg
audioLength: 9821330
duration: PT24M02S
image: /img/ep01.jpg
summary: The pilot episode.
tags: [meta]
---

Show notes go here.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Show name.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Show tagline (under the hero title).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Default &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;. Also feeds &lt;code&gt;PodcastSeries.description&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Host name.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Standard juicer key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;juicerpodcast&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a favicon.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Remove “Built with juicer” footer line.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;topnav&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[[topnav]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Topbar nav.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[[links]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer links.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;feeds&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;false&lt;/code&gt; to disable the Atom feed entirely (you almost never want this for a podcast).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-episode-frontmatter&quot;&gt;Per-episode frontmatter&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Required.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Drives the feed &lt;code&gt;&amp;lt;updated&amp;gt;&lt;/code&gt; and home-page ordering.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;audio&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Required for the audio player + Atom enclosure + JSON-LD. Absolute URL or site-relative path.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;audioType&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;MIME type — &lt;code&gt;audio/mpeg&lt;/code&gt; (mp3), &lt;code&gt;audio/aac&lt;/code&gt; (m4a), &lt;code&gt;audio/ogg&lt;/code&gt;. Feeds the enclosure &lt;code&gt;type=&lt;/code&gt; attribute.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;audioLength&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Bytes — feeds the enclosure &lt;code&gt;length=&lt;/code&gt; attribute. Run &lt;code&gt;ls -l audio.mp3&lt;/code&gt; to find it. Apple Podcasts validates this.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;duration&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ISO 8601 — &lt;code&gt;PT42M30S&lt;/code&gt;. Displayed in the meta line + JSON-LD.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;guest&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Shown in the meta line as “with &lt;guest&gt;“.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Episode artwork. Falls back to the show cover if absent.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;imageAlt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Alt text for the artwork.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Card summary + &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt; + JSON-LD description.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;{label, url}&lt;/code&gt; entries shown as “Mentioned in this episode”.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;transcript&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Markdown string — rendered inside a &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; collapsible at the bottom.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Drives &lt;code&gt;/tags/&amp;lt;slug&amp;gt;/&lt;/code&gt; archives.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;atom-feed-enclosures&quot;&gt;Atom feed enclosures&lt;/h2&gt;
&lt;p&gt;juicer’s feed generator emits &lt;code&gt;&amp;lt;link rel=&amp;quot;enclosure&amp;quot;&amp;gt;&lt;/code&gt; per entry that has frontmatter &lt;code&gt;audio:&lt;/code&gt; (or &lt;code&gt;enclosure:&lt;/code&gt;). The element follows RFC 4287 §4.2.7.2 and is picked up by podcast platforms the same way they’d read RSS 2.0 &lt;code&gt;&amp;lt;enclosure&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;link rel=&amp;quot;enclosure&amp;quot;
      href=&amp;quot;https://echochamber.example/audio/ep04.mp3&amp;quot;
      type=&amp;quot;audio/mpeg&amp;quot;
      length=&amp;quot;18347281&amp;quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;audioType&lt;/code&gt; and &lt;code&gt;audioLength&lt;/code&gt; are optional but recommended — without them the link still emits, but Apple may flag the episode. Frontmatter &lt;code&gt;enclosureType&lt;/code&gt; and &lt;code&gt;enclosureLength&lt;/code&gt; are accepted as aliases.&lt;/p&gt;
&lt;h2 id=&quot;juicerpodcast-palette-subscribe-overrides&quot;&gt;&lt;code&gt;[juicerpodcast]&lt;/code&gt; palette + subscribe overrides&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicerpodcast&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
brand        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#2b1f4a&amp;quot;&lt;/span&gt;
brandStrong  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#160d2d&amp;quot;&lt;/span&gt;
accent       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#e36e5b&amp;quot;&lt;/span&gt;
cover        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/show-cover.jpg&amp;quot;&lt;/span&gt;
fontSans     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Inter&apos;, system-ui, sans-serif&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Subscribe-strip buttons on the home page&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Subscribe-strip buttons on the home page
&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;juicerpodcast.subscribe&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Apple Podcasts&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://podcasts.apple.com/...&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicerlanding/configuration/"/>
    <id>https://juicer.build/themes/juicerlanding/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicerlanding reads — top-level chrome keys, the [juicerlanding] palette table, and the nine section blocks that build the home page.</summary>
    <content type="html">&lt;p&gt;juicerlanding reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer theme uses, plus a few landing-specific ones for the topbar / footer).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicerlanding]&lt;/code&gt; table&lt;/strong&gt; for theme-specific palette + sizing overrides.&lt;/li&gt;
&lt;li&gt;A stack of &lt;strong&gt;section blocks&lt;/strong&gt; (&lt;code&gt;[hero]&lt;/code&gt;, &lt;code&gt;[[features]]&lt;/code&gt;, &lt;code&gt;[[pricing]]&lt;/code&gt;, etc.) that drive the home page. Each block is independently gated; missing block silently omits the section.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The home layout calls nine section partials in a fixed order: &lt;strong&gt;hero → trust → features → code → showcase → pricing → testimonials → faq → final-cta&lt;/strong&gt;. You don’t need to think about the order; you just include the blocks for the sections you want.&lt;/p&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;p&gt;A minimal &lt;code&gt;site.toml&lt;/code&gt; that produces a credible landing page:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;My product&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;What it does, in eight words or less.&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://example.com&amp;quot;&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerlanding&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;hero&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
headline    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;The headline.&amp;quot;&lt;/span&gt;
subheadline &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;The subheadline that makes the headline land.&amp;quot;&lt;/span&gt;
primaryCta   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Start free&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; url &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/signup/&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;
secondaryCta &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;View on GitHub&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; url &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://github.com/me/it&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;features&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
icon  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;⚡&amp;quot;&lt;/span&gt;
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Fast&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Less than a kilobyte.&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;features&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
icon  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;🔒&amp;quot;&lt;/span&gt;
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Private&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;No cookies, no fingerprinting, no consent banners.&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;features&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
icon  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;💰&amp;quot;&lt;/span&gt;
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Free&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Self-hosted is free forever, MIT-licensed.&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;finalCta&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Ready to ship?&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Two minutes to install.&amp;quot;&lt;/span&gt;
primaryCta &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Start free&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; url &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/signup/&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding &lt;code&gt;[[pricing]]&lt;/code&gt;, &lt;code&gt;[[testimonials]]&lt;/code&gt;, &lt;code&gt;[[faqs]]&lt;/code&gt;, &lt;code&gt;[showcase]&lt;/code&gt;, &lt;code&gt;[code]&lt;/code&gt;, and &lt;code&gt;[[trust]]&lt;/code&gt; blocks fills in the rest of the page. The full demo at &lt;code&gt;docs/demos/juicerlanding/&lt;/code&gt; exercises every section — see &lt;a href=&quot;/../demo/&quot;&gt;Demo site&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;p&gt;Standard juicer keys plus a few landing-specific ones. juicerlanding-specific keys are flagged in the right-most column.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Brand text in topbar + footer; used as &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Appears under the brand in the footer; appended to &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; when the page title equals the site title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Default &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt; for pages that don’t set their own &lt;code&gt;summary&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer copyright line. Falls back to &lt;code&gt;title&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Standard juicer key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;juicerlanding&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;repoURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;When set, juicerlanding shows a GitHub icon link in the topbar.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a favicon; emitted as &lt;code&gt;&amp;lt;link rel=&amp;quot;icon&amp;quot;&amp;gt;&lt;/code&gt; in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;true&lt;/code&gt; to remove the “Built with juicer” line in the footer.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;customCSS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Site stylesheets loaded &lt;em&gt;after&lt;/em&gt; the theme CSS. See &lt;a href=&quot;/reference/theming/#layer-2-customcss-drop-your-own-stylesheet-alongside-the-theme&quot;&gt;Theming → Layer 2&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;topbarCta&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Object&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;&lt;code&gt;{label, url}&lt;/code&gt; — adds a CTA button to the topbar. Surfaced on every page so the conversion path is one click from anywhere.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;topnav&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Topbar nav links: &lt;code&gt;[[topnav]]&lt;/code&gt; rows of &lt;code&gt;{label, url}&lt;/code&gt;. &lt;strong&gt;Note:&lt;/strong&gt; keyed &lt;code&gt;topnav&lt;/code&gt; because top-level &lt;code&gt;nav&lt;/code&gt; is reserved by juicer for table-of-contents config.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;footerColumns&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer link columns: &lt;code&gt;[[footerColumns]]&lt;/code&gt; rows of &lt;code&gt;{title, links: [{label, url}]}&lt;/code&gt;. The brand-blurb column is auto-generated.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;trustLabel&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Trusted by teams at&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Header line above the trust-bar logos.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;palette-token-overrides-juicerlanding&quot;&gt;Palette + token overrides — &lt;code&gt;[juicerlanding]&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;All optional. Anything you don’t set keeps the slate / indigo / amber defaults. The full mapping (which token drives which CSS variable) is documented in &lt;a href=&quot;/reference/theming/&quot;&gt;Theming&lt;/a&gt; — juicerlanding follows the same pattern as the other themes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;CSS variable&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#4f46e5&lt;/code&gt; (indigo-600)&lt;/td&gt;&lt;td&gt;Primary brand colour — primary buttons, focus rings, link hover.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandStrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-strong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#3730a3&lt;/code&gt; (indigo-800)&lt;/td&gt;&lt;td&gt;Heading emphasis on light backgrounds; primary-button hover.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandSoft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-soft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#eef2ff&lt;/code&gt; (indigo-50)&lt;/td&gt;&lt;td&gt;Eyebrow chip background, hero gradient, feature-card icon background.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#f59e0b&lt;/code&gt; (amber-500)&lt;/td&gt;&lt;td&gt;Reserved for “warm” highlights; not used by Stage-1 sections.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#10b981&lt;/code&gt; (emerald-500)&lt;/td&gt;&lt;td&gt;Checkmark colour in the pricing + code-section bullet lists.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#818cf8&lt;/code&gt; (indigo-400)&lt;/td&gt;&lt;td&gt;Lifted indigo for dark-mode backgrounds.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandStrongDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-strong&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#c7d2fe&lt;/code&gt; (indigo-200)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandSoftDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-soft&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;rgba(129,140,248,0.12)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accentDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--accent&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#fbbf24&lt;/code&gt; (amber-400)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;leafDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--leaf&lt;/code&gt; &lt;em&gt;(dark)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#34d399&lt;/code&gt; (emerald-400)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-sans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Inter stack&lt;/td&gt;&lt;td&gt;Body / UI / heading face.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontMono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-mono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;JetBrains Mono stack&lt;/td&gt;&lt;td&gt;Code blocks.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;65ch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prose column max-width on &lt;code&gt;file.html&lt;/code&gt; / &lt;code&gt;folder.html&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1.5rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Outer padding around content blocks.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;radiusLg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--radius-lg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Large border-radius (cards, hero panels, code frame).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;logo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a small image; rendered next to the brand name in the topbar + footer.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;section-blocks&quot;&gt;Section blocks&lt;/h2&gt;
&lt;p&gt;Each section partial reads its own block. &lt;strong&gt;Missing block = silently omitted&lt;/strong&gt;, so an early-stage site can ship with just &lt;code&gt;[hero]&lt;/code&gt; + &lt;code&gt;[[features]]&lt;/code&gt; + &lt;code&gt;[finalCta]&lt;/code&gt;, and add the rest later without changing the layout.&lt;/p&gt;
&lt;h3 id=&quot;hero-the-main-pitch&quot;&gt;&lt;code&gt;[hero]&lt;/code&gt; — the main pitch&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;hero&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
eyebrow      &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;v1.0 · privacy-first&amp;quot;&lt;/span&gt;
headline     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;The headline.&amp;quot;&lt;/span&gt;
subheadline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Subheadline.&amp;quot;&lt;/span&gt;
codeLang     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;html&amp;quot;&lt;/span&gt;
codeSnippet  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&amp;lt;script src=...&amp;gt;&amp;lt;/script&amp;gt;&amp;quot;&lt;/span&gt;
screenshot   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/screenshots/hero.png&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# alternative to codeSnippet&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; alternative to codeSnippet
screenshotAlt &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Dashboard screenshot&amp;quot;&lt;/span&gt;

primaryCta   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Start free&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; url &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/signup/&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;
secondaryCta &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;View on GitHub&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; url &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://github.com/...&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;codeSnippet&lt;/code&gt; and &lt;code&gt;screenshot&lt;/code&gt; are mutually exclusive — &lt;code&gt;codeSnippet&lt;/code&gt; wins if both are set. If neither is set, the hero renders as a single-column copy block.&lt;/p&gt;
&lt;h3 id=&quot;trust-the-social-proof-strip&quot;&gt;&lt;code&gt;[[trust]]&lt;/code&gt; — the social-proof strip&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;trustLabel &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Trusted by teams at&amp;quot;&lt;/span&gt;     &lt;span class=&quot;hl-comment&quot;&gt;# optional; default shown&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; optional; default shown

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;trust&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
logo &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/logos/acme.svg&amp;quot;&lt;/span&gt;
alt  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Acme Corp&amp;quot;&lt;/span&gt;
url  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://acme.example/&amp;quot;&lt;/span&gt;          &lt;span class=&quot;hl-comment&quot;&gt;# optional — wraps the logo in &amp;lt;a&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; optional — wraps the logo in &amp;lt;a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Logos are rendered greyscale with a hover that lifts the saturation back. Aim for monochrome wordmarks at ~120×40.&lt;/p&gt;
&lt;h3 id=&quot;featureshead-features-the-feature-grid&quot;&gt;&lt;code&gt;[featuresHead]&lt;/code&gt; + &lt;code&gt;[[features]]&lt;/code&gt; — the feature grid&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;featuresHead&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Everything you need, nothing you don&apos;t&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Optional intro paragraph.&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;features&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
icon  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;⚡&amp;quot;&lt;/span&gt;            &lt;span class=&quot;hl-comment&quot;&gt;# any emoji, OR a path to an SVG&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; any emoji, OR a path to an SVG
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Body copy.&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3-up at desktop, 2-up at tablet, 1-up at mobile. The icon is rendered inline; emoji-as-icon is the recommended path because it ships zero asset weight.&lt;/p&gt;
&lt;h3 id=&quot;code-code-showcase-with-bullet-list&quot;&gt;&lt;code&gt;[code]&lt;/code&gt; — code showcase with bullet list&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;code&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
title   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Track what matters&amp;quot;&lt;/span&gt;
body    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Optional intro paragraph above the bullets.&amp;quot;&lt;/span&gt;
lang    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;javascript&amp;quot;&lt;/span&gt;
snippet &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;tally(&apos;signup&apos;, { plan: &apos;pro&apos; })&amp;quot;&lt;/span&gt;
bullets &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;First-party only&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Properties aggregated server-side&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Same API everywhere&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two-column layout — code on one side, copy + checklist on the other.&lt;/p&gt;
&lt;h3 id=&quot;showcase-the-screenshot-section&quot;&gt;&lt;code&gt;[showcase]&lt;/code&gt; — the screenshot section&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;showcase&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
title   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;A dashboard you can read at a glance&amp;quot;&lt;/span&gt;
body    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Body copy.&amp;quot;&lt;/span&gt;
image   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/screenshots/dashboard.svg&amp;quot;&lt;/span&gt;
alt     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Tally dashboard&amp;quot;&lt;/span&gt;
caption &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Optional figcaption under the image.&amp;quot;&lt;/span&gt;
reverse &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;     &lt;span class=&quot;hl-comment&quot;&gt;# flip image to the left, copy to the right&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; flip image to the left, copy to the right&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;reverse = false&lt;/code&gt; (default) puts copy on the left and image on the right. Set &lt;code&gt;true&lt;/code&gt; when you’ve already used the same orientation in &lt;code&gt;[code]&lt;/code&gt; immediately above and want visual variety.&lt;/p&gt;
&lt;h3 id=&quot;pricinghead-pricing-pricing-tiers&quot;&gt;&lt;code&gt;[pricingHead]&lt;/code&gt; + &lt;code&gt;[[pricing]]&lt;/code&gt; — pricing tiers&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;pricingHead&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Simple pricing&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Optional intro.&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;pricing&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
tier     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Free&amp;quot;&lt;/span&gt;
price    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;$0&amp;quot;&lt;/span&gt;
cadence  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;self-hosted&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;One-line subtitle.&amp;quot;&lt;/span&gt;
features &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Feature one&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Feature two&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Feature three&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
featured &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;false&lt;/span&gt;
cta      &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Get the source&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; url &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/docs/install/&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The row marked &lt;code&gt;featured = true&lt;/code&gt; gets the highlighted column treatment (border, glow, scale-up, “Most popular” badge). Order in the file is left-to-right on the page.&lt;/p&gt;
&lt;h3 id=&quot;testimonialshead-testimonials-quote-cards&quot;&gt;&lt;code&gt;[testimonialsHead]&lt;/code&gt; + &lt;code&gt;[[testimonials]]&lt;/code&gt; — quote cards&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;testimonialsHead&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;What devs are saying&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Optional intro.&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;testimonials&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
quote   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
name    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
role    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
company &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;         &lt;span class=&quot;hl-comment&quot;&gt;# optional&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; optional
avatar  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/avatars/jane.svg&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# optional&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; optional&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3-up at desktop, 1-up at mobile. The avatar is rendered as a 2.5rem circle; SVG initial-badges work well as placeholders before you have real photos.&lt;/p&gt;
&lt;h3 id=&quot;faqhead-faqs-accordion&quot;&gt;&lt;code&gt;[faqHead]&lt;/code&gt; + &lt;code&gt;[[faqs]]&lt;/code&gt; — accordion&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;faqHead&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
title &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Frequently asked&amp;quot;&lt;/span&gt;
body  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Optional intro.&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;faqs&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
q    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Question?&amp;quot;&lt;/span&gt;
a    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Answer.&amp;quot;&lt;/span&gt;
open &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# optional — render this item open by default&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; optional — render this item open by default&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Native &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;. No JS. The &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag inside the answer string works as expected (it’s emitted into the page as plain HTML).&lt;/p&gt;
&lt;h3 id=&quot;finalcta-the-close&quot;&gt;&lt;code&gt;[finalCta]&lt;/code&gt; — the close&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;finalCta&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
title        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Ready to ship?&amp;quot;&lt;/span&gt;
body         &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Two minutes to install.&amp;quot;&lt;/span&gt;
primaryCta   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Start free&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; url &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/signup/&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;
secondaryCta &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Read the docs&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; url &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/docs/&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Indigo-gradient panel with white copy and a primary + ghost button pair. Always render this if you can — it’s the last conversion surface before the footer.&lt;/p&gt;
&lt;h2 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h2&gt;
&lt;p&gt;Most pages on a juicerlanding site are the home page (&lt;code&gt;layout: home&lt;/code&gt;) and a handful of secondary pages (&lt;code&gt;layout: file&lt;/code&gt; is the default). The frontmatter knobs:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;home&lt;/code&gt; for the section-driven landing page, omitted (or &lt;code&gt;file&lt;/code&gt;) for prose pages, &lt;code&gt;folder&lt;/code&gt; for section indexes (e.g. &lt;code&gt;/blog/_index.md&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Heading at the top of the page; also &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;. The home &lt;code&gt;_index.md&lt;/code&gt; should omit this so the page title falls through to &lt;code&gt;.site.title&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Subtitle under the page title; also &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt; for that page.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sort key for &lt;code&gt;folder.html&lt;/code&gt; listings. Optional.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;lang&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sets &lt;code&gt;&amp;lt;html lang&amp;gt;&lt;/code&gt; for the page. Defaults to &lt;code&gt;en&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;seo&quot;&gt;SEO&lt;/h2&gt;
&lt;p&gt;Every juicer theme ships a shared SEO partial (&lt;code&gt;partials/seo.html&lt;/code&gt;) that emits the standard meta block: description (with site-level fallback), canonical link, author meta, robots &lt;code&gt;noindex&lt;/code&gt;, OpenGraph + Twitter cards (via the &lt;code&gt;ogTags&lt;/code&gt; builtin), Atom feed discovery, and theme-specific JSON-LD. The engine separately writes &lt;code&gt;sitemap.xml&lt;/code&gt; and &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;site-wide-keys&quot;&gt;Site-wide keys&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;description &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;The fastest way to ship docs that look like you wrote them yourself.&amp;quot;&lt;/span&gt;
ogImage     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/og/hero.png&amp;quot;&lt;/span&gt;

robots   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
noindex  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;false&lt;/span&gt;                  &lt;span class=&quot;hl-comment&quot;&gt;# set true for staging/preview domains&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; set true for staging/preview domains
disallow &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/private/&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Optional: Organization JSON-LD on the homepage. Drives Google&apos;s&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Optional: Organization JSON-LD on the homepage. Drives Google&apos;s
&lt;span class=&quot;hl-comment&quot;&gt;# Knowledge Panel for the brand.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Knowledge Panel for the brand.
&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;organization&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
name   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Juicer Labs&amp;quot;&lt;/span&gt;            &lt;span class=&quot;hl-comment&quot;&gt;# defaults to .site.title when omitted&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; defaults to .site.title when omitted
logo   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/logo-square.png&amp;quot;&lt;/span&gt;
email  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;hello@juicerlabs.io&amp;quot;&lt;/span&gt;
sameAs &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://github.com/edadma/juicer&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://twitter.com/juicerlabs&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Pricing&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A one-sentence dek for search results and OG cards.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/og/pricing.png&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogTitle&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Snappier headline for socials&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogDescription&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Tightened for socials&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;   &lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; excluded from sitemap, JSON-LD suppressed, &amp;lt;meta robots&amp;gt; emitted&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;structured-data-emitted&quot;&gt;Structured data emitted&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Page&lt;/th&gt;&lt;th&gt;Schema&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Root section&lt;/td&gt;&lt;td&gt;&lt;code&gt;WebSite&lt;/code&gt; (+ &lt;code&gt;Organization&lt;/code&gt; when &lt;code&gt;[organization]&lt;/code&gt; is set in &lt;code&gt;site.toml&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Any page with ancestors&lt;/td&gt;&lt;td&gt;&lt;code&gt;BreadcrumbList&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Landing-page sites usually don’t have a “post” surface, so juicerlanding doesn’t emit &lt;code&gt;Article&lt;/code&gt; JSON-LD by default. Add your own via a &lt;code&gt;&amp;lt;src&amp;gt;/partials/seo-jsonld.html&lt;/code&gt; override if you need it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;noindex: true&lt;/code&gt; suppresses ALL JSON-LD on that page.&lt;/p&gt;
&lt;h3 id=&quot;overriding-the-seo-partial&quot;&gt;Overriding the SEO partial&lt;/h3&gt;
&lt;p&gt;Drop a file at &lt;code&gt;&amp;lt;src&amp;gt;/partials/seo.html&lt;/code&gt; (or &lt;code&gt;seo-jsonld.html&lt;/code&gt; for just the structured-data part). Site overrides win over the theme’s copy.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicergallery/configuration/"/>
    <id>https://juicer.build/themes/juicergallery/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicergallery reads, per-page gallery frontmatter, and the [juicergallery] palette table.</summary>
    <content type="html">&lt;p&gt;juicergallery reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer theme uses, plus a few gallery-specific ones for the topbar / footer).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicergallery]&lt;/code&gt; table&lt;/strong&gt; for theme-specific palette + sizing overrides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-section frontmatter&lt;/strong&gt; — galleries are top-level sections whose &lt;code&gt;_index.md&lt;/code&gt; carries &lt;code&gt;cover&lt;/code&gt;, &lt;code&gt;summary&lt;/code&gt;, and &lt;code&gt;photos:&lt;/code&gt; lists.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Hella Studio&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Photography, Reykjavík&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Hella Carlsen&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://hellastudio.example&amp;quot;&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicergallery&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;images&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
enabled &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
widths  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;960&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;1600&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
formats &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;webp&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;original&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
quality &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;78&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;topnav&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Work&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;topnav&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;About&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/about/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;contact&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
email    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;studio@hellastudio.example&amp;quot;&lt;/span&gt;
location &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Reykjavík, Iceland&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A minimal gallery (&lt;code&gt;content/iceland-2024/_index.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Iceland 2024
date: 2024-09-15
cover: /img/iceland/cover.jpg
summary: A two-week loop around the ring road.
photos:
  - src: /img/iceland/skogafoss.jpg
    alt: Skógafoss at golden hour
    caption: Skógafoss, day one
  - /img/iceland/diamond-beach.jpg
---

Optional prose body — context, equipment notes, trip narrative.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And a root index that opts into the home cover-grid (&lt;code&gt;content/_index.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Hella Studio
layout: home
---

Optional intro paragraph shown above the cover grid.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s enough to render the home grid, each gallery detail, and a static prose page or two.&lt;/p&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;p&gt;Standard juicer keys plus a few gallery-specific ones.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Brand text in topbar + footer; &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Italic subtitle next to the brand in the topbar; appended to &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; when the page title equals the site title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Default &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt; for pages that don’t set their own &lt;code&gt;summary&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer name + copyright line. Falls back to &lt;code&gt;title&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Standard juicer key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;juicergallery&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a favicon.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;true&lt;/code&gt; to remove the “Built with juicer” line in the footer.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;topnav&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[[topnav]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Array of &lt;code&gt;{label, url}&lt;/code&gt; entries shown in the topbar.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contact&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Table&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;&lt;code&gt;{email, location}&lt;/code&gt; — shown in the footer brand block.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[[links]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Array of &lt;code&gt;{label, url}&lt;/code&gt; entries shown in the footer.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[images]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Table&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Enables the image-variants pipeline. See the &lt;a href=&quot;/reference/image-variants/&quot;&gt;reference&lt;/a&gt; for the full surface — required for responsive &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; markup.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-page-frontmatter-gallery-sections&quot;&gt;Per-page frontmatter (gallery sections)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Required — the gallery’s display name.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Used for sort order on the home cover-grid (newest first).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cover&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Path to the cover image. Required for the gallery to appear on the home grid.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;coverAlt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Alt text for the cover image. Falls back to the title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Short description shown on the cover card and as &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;photos&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;List of photos. Each entry is either a string (path) or a &lt;code&gt;{src, alt, caption}&lt;/code&gt; map.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;juicergallery-palette-typography-overrides&quot;&gt;&lt;code&gt;[juicergallery]&lt;/code&gt; palette + typography overrides&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicergallery&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
brand        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#1f2937&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# ink near-black&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; ink near-black
brandStrong  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#0b1220&amp;quot;&lt;/span&gt;
accent       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#b45309&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# amber hover accent&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; amber hover accent
fontSans     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Inter&apos;, system-ui, sans-serif&amp;quot;&lt;/span&gt;
fontSerif    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Cormorant Garamond&apos;, Georgia, serif&amp;quot;&lt;/span&gt;
gutter       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;0.6rem&amp;quot;&lt;/span&gt;    &lt;span class=&quot;hl-comment&quot;&gt;# tighter gutter → denser masonry&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; tighter gutter → denser masonry

&lt;span class=&quot;hl-comment&quot;&gt;# Dark-mode overrides (applied under [data-theme=&amp;quot;dark&amp;quot;])&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Dark-mode overrides (applied under [data-theme=&amp;quot;dark&amp;quot;])
brandDark        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#f3f1ec&amp;quot;&lt;/span&gt;
brandStrongDark  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#ffffff&amp;quot;&lt;/span&gt;
accentDark       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#f59e0b&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Token&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#1f2937&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Primary ink color.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandStrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#0b1220&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hover / emphasis ink.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandSoft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#e5e7eb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Soft surface tint.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#b45309&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hover / focus accent (amber).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;system stack&lt;/td&gt;&lt;td&gt;Body + UI font.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSerif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;system serif&lt;/td&gt;&lt;td&gt;Headings + brand.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1rem&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Masonry column gap. Drop to &lt;code&gt;0.5rem&lt;/code&gt; for a denser feel.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;See &lt;a href=&quot;/reference/theming/&quot;&gt;Reference → Theming&lt;/a&gt; for the shared theming model — the &lt;code&gt;[&amp;lt;theme&amp;gt;]&lt;/code&gt; table contract, the &lt;code&gt;customCSS&lt;/code&gt; chain, file-replacement override pattern.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicerdocs/configuration/"/>
    <id>https://juicer.build/themes/juicerdocs/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Every site-config key the juicerdocs theme reads, with defaults.</summary>
    <content type="html">&lt;p&gt;juicerdocs reads its configuration from two places in &lt;code&gt;site.toml&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones juicer itself uses for things like the page title and the &lt;code&gt;showCopyright&lt;/code&gt; flag).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicerdocs]&lt;/code&gt; table&lt;/strong&gt; for theme-specific knobs — logo, brand colors, dark-mode overrides.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anything you don’t set keeps the theme’s defaults. Themes can read from any TOML namespace; juicerdocs uses &lt;code&gt;[juicerdocs]&lt;/code&gt; so it doesn’t collide with the keys other themes might want.&lt;/p&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title           &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;My Project&amp;quot;&lt;/span&gt;
author          &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Acme Inc.&amp;quot;&lt;/span&gt;
baseURL         &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://docs.acme.example/&amp;quot;&lt;/span&gt;

theme           &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerdocs&amp;quot;&lt;/span&gt;
headingShift    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;
showCopyright   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicerdocs&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
logo            &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/acme-logo.png&amp;quot;&lt;/span&gt;
brand           &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#3b82f6&amp;quot;&lt;/span&gt;        &lt;span class=&quot;hl-comment&quot;&gt;# blue-500&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; blue-500
brandStrong     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#2563eb&amp;quot;&lt;/span&gt;        &lt;span class=&quot;hl-comment&quot;&gt;# blue-600&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; blue-600
brandSoft       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#dbeafe&amp;quot;&lt;/span&gt;        &lt;span class=&quot;hl-comment&quot;&gt;# blue-100&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; blue-100
accent          &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#0891b2&amp;quot;&lt;/span&gt;        &lt;span class=&quot;hl-comment&quot;&gt;# cyan-600&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; cyan-600
leaf            &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#10b981&amp;quot;&lt;/span&gt;        &lt;span class=&quot;hl-comment&quot;&gt;# emerald-500&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; emerald-500

&lt;span class=&quot;hl-comment&quot;&gt;# Dark-mode overrides (optional; sensible defaults derived from the lights)&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Dark-mode overrides (optional; sensible defaults derived from the lights)
brandDark       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#60a5fa&amp;quot;&lt;/span&gt;
brandStrongDark &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#93c5fd&amp;quot;&lt;/span&gt;
brandSoftDark   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;rgb(59 130 246 / .12)&amp;quot;&lt;/span&gt;
accentDark      &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#22d3ee&amp;quot;&lt;/span&gt;
leafDark        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#34d399&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;top-level-keys-read-by-juicerdocs&quot;&gt;Top-level keys (read by juicerdocs)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Untitled&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Wordmark in the topbar; appears in &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tags and the footer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Unnamed&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Footer copyright (only when &lt;code&gt;showCopyright = true&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(required)&lt;/td&gt;&lt;td&gt;Used for absolute permalinks, sitemap, OpenGraph&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(required)&lt;/td&gt;&lt;td&gt;Set this to &lt;code&gt;&amp;quot;juicerdocs&amp;quot;&lt;/code&gt; to activate the theme&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;headingShift&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The juicerdocs layout already provides an outer &lt;code&gt;&amp;lt;h1&amp;gt;{{ .page.title }}&amp;lt;/h1&amp;gt;&lt;/code&gt;, so set this to &lt;code&gt;0&lt;/code&gt; for &lt;code&gt;## Foo&lt;/code&gt; markdown to render as &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; (the natural docs-author convention)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;showCopyright&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When true, the footer renders a &lt;code&gt;© {{ .site.author }}&lt;/code&gt; line beside the “Built with Juicer” attribution&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;juicerdocs-keys&quot;&gt;&lt;code&gt;[juicerdocs]&lt;/code&gt; keys&lt;/h2&gt;
&lt;h3 id=&quot;logo&quot;&gt;Logo&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.logo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;/juicer-logo.png&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Path (relative to your site root) of the logo image. Drop your file into &lt;code&gt;&amp;lt;src&amp;gt;/static/&lt;/code&gt; and point this at it. Used in the topbar, the hero on the home page, the 404 page, and as the favicon.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The default value points at the bundled &lt;code&gt;juicer-logo.png&lt;/code&gt; shipped with the theme — fine if you’re previewing juicerdocs on its own, but you’ll want your own logo for any real deployment.&lt;/p&gt;
&lt;h3 id=&quot;hero-call-to-action&quot;&gt;Hero call-to-action&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.getStarted&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When true, the homepage hero shows a primary “Get started” button linking to &lt;code&gt;/getting-started/&lt;/code&gt;. Leave unset for sites that don’t have a getting-started section.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The hero also shows a secondary “Star on GitHub” button when the top-level &lt;code&gt;repoURL&lt;/code&gt; is set (see &lt;a href=&quot;/reference/theming/#site-wide-chrome-keys&quot;&gt;Theming reference → Site-wide chrome keys&lt;/a&gt;). When &lt;strong&gt;both&lt;/strong&gt; are off — &lt;code&gt;getStarted&lt;/code&gt; unset and no &lt;code&gt;repoURL&lt;/code&gt; — the action row collapses entirely and the hero ends at its summary paragraph (no reserved empty space).&lt;/p&gt;
&lt;h3 id=&quot;brand-colors-light-mode&quot;&gt;Brand colors (light mode)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#d61472&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Primary brand color — links, button fills, sidebar active borders, hero gradient start&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.brandStrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#a30d57&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hover state for primary buttons + emphasized links&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.brandSoft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#fce7f3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Soft brand tint — sidebar hover, brand-soft callout backgrounds, badges&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#6f1f9e&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Secondary accent — hero gradient end, decorative highlights&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#65a30d&lt;/code&gt;&lt;/td&gt;&lt;td&gt;“Confirmation green” — copy-button “copied” state, success indicators&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Any CSS color expression works: hex (&lt;code&gt;#...&lt;/code&gt;), &lt;code&gt;rgb(...)&lt;/code&gt;, &lt;code&gt;hsl(...)&lt;/code&gt;, &lt;code&gt;oklch(...)&lt;/code&gt;, &lt;code&gt;color-mix(...)&lt;/code&gt;, named colors. The values are dropped into &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; declarations, so anything CSS would accept here works.&lt;/p&gt;
&lt;h3 id=&quot;brand-colors-dark-mode-overrides&quot;&gt;Brand colors (dark mode overrides)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.brandDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#ec4899&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.brandStrongDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#f472b6&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.brandSoftDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;rgb(236 72 153 / .12)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.accentDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#c084fc&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerdocs.leafDark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#84cc16&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These override the light-mode values when the user toggles dark mode (or the page loads with the &lt;code&gt;prefers-color-scheme: dark&lt;/code&gt; system preference). Set just the ones you want to differ — anything you leave out keeps its light-mode value, which is &lt;em&gt;almost certainly wrong&lt;/em&gt; in dark mode for the brand pinks/blues, so it’s worth setting all five.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Picking a palette.&lt;/strong&gt; A handy starting point: pick a brand hue, then derive &lt;code&gt;brandStrong&lt;/code&gt; (≈10% darker), &lt;code&gt;brandSoft&lt;/code&gt; (very light tint at ~10% lightness), &lt;code&gt;brandDark&lt;/code&gt; (≈10% lighter — dark mode wants more luminance), &lt;code&gt;brandStrongDark&lt;/code&gt; (slightly lighter still), &lt;code&gt;brandSoftDark&lt;/code&gt; (transparent overlay at ~12% alpha). Tools like &lt;a href=&quot;https://oklch.com/&quot;&gt;oklch.com&lt;/a&gt; and &lt;a href=&quot;https://coolors.co/&quot;&gt;coolors.co&lt;/a&gt; make this fast.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;where-the-values-land&quot;&gt;Where the values land&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; partial emits a &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; block immediately after &lt;code&gt;juicerdocs.css&lt;/code&gt;, redefining only the variables you’ve set:&lt;/p&gt;
&lt;dl&gt;
  &lt;dt&gt;```css&lt;/dt&gt;
  &lt;dd&gt;
&lt;p&gt;root {&lt;/p&gt;  &lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;–jd-brand:        #3b82f6;   /* from juicerdocs.brand &lt;em&gt;/
–jd-brand-strong: #2563eb;   /&lt;/em&gt; from juicerdocs.brandStrong &lt;em&gt;/
/&lt;/em&gt; … &lt;em&gt;/
}
[data-theme=”dark”] {
–jd-brand:        #60a5fa;   /&lt;/em&gt; from juicerdocs.brandDark &lt;em&gt;/
/&lt;/em&gt; … */
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Anything not set falls through to the defaults declared at the top of `juicerdocs.css`. The theme always toggles between light and dark via the `data-theme` attribute on `&amp;lt;html&amp;gt;`, set by the pre-paint script in `&amp;lt;head&amp;gt;`.

## Going beyond config

Drop a file with the same path under your own site to override anything in the theme — this is the ordinary [theme overlay](/concepts/themes/) pattern:

| You want to change… | Override at… |
|---------------------|--------------|
| The topbar          | `&amp;lt;src&amp;gt;/partials/topbar.html` |
| The footer markup   | `&amp;lt;src&amp;gt;/partials/footer.html` |
| The &amp;quot;Note&amp;quot; callout  | `&amp;lt;src&amp;gt;/shortcodes/note.html` |
| The 404 page        | `&amp;lt;src&amp;gt;/layouts/_default/404.html` |
| Custom CSS          | `&amp;lt;src&amp;gt;/static/site.css` (and link it from your overridden `head.html`) |

Site files **always** win over theme files, so overrides are a one-file-at-a-time operation — no forking the theme.

## SEO

Every juicer theme ships a shared SEO partial (`partials/seo.html`) that emits the standard meta block: description (with site-level fallback), canonical link, author meta, robots `noindex`, OpenGraph + Twitter cards (via the `ogTags` builtin), Atom feed discovery, and theme-specific JSON-LD. The engine separately writes `sitemap.xml` and `robots.txt`.

### Site-wide keys

```toml
description = &amp;quot;Reference and how-to docs for the juicer static site generator.&amp;quot;
ogImage     = &amp;quot;/og/default.png&amp;quot;

robots   = true
noindex  = false                  # set true for staging/preview domains
disallow = [&amp;quot;/internal/&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Configuration reference&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A one-sentence dek for search results and OG cards.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/og/configuration.png&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogTitle&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A snappier social headline&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogDescription&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Tightened for socials&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;   &lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; excluded from sitemap, JSON-LD suppressed, &amp;lt;meta robots&amp;gt; emitted&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;structured-data-emitted&quot;&gt;Structured data emitted&lt;/h3&gt;
&lt;p&gt;juicerdocs emits &lt;code&gt;TechArticle&lt;/code&gt; on every page (more specific than &lt;code&gt;Article&lt;/code&gt;; surfaces in Google’s developer-doc carousel and on Stack Overflow’s right-rail panel for tagged terms):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Page&lt;/th&gt;&lt;th&gt;Schema&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Root section&lt;/td&gt;&lt;td&gt;&lt;code&gt;WebSite&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Every other page&lt;/td&gt;&lt;td&gt;&lt;code&gt;TechArticle&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Any page with ancestors&lt;/td&gt;&lt;td&gt;&lt;code&gt;BreadcrumbList&lt;/code&gt; (especially valuable for docs — Google often uses it for the per-result hierarchy)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;noindex: true&lt;/code&gt; suppresses ALL JSON-LD on that page.&lt;/p&gt;
&lt;h3 id=&quot;overriding-the-seo-partial&quot;&gt;Overriding the SEO partial&lt;/h3&gt;
&lt;p&gt;Drop a file at &lt;code&gt;&amp;lt;src&amp;gt;/partials/seo.html&lt;/code&gt; (or &lt;code&gt;seo-jsonld.html&lt;/code&gt; for just the structured-data part). Site overrides win over the theme’s copy.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicercook/configuration/"/>
    <id>https://juicer.build/themes/juicercook/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicercook reads, recipe frontmatter, the [juicercook] palette table, and the categories strip.</summary>
    <content type="html">&lt;p&gt;juicercook reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer theme uses).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicercook]&lt;/code&gt; table&lt;/strong&gt; for palette overrides and the home-page category strip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-recipe frontmatter&lt;/strong&gt; — structured fields that drive both the rendered card and the Recipe JSON-LD.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Elder &amp;amp; Ash&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;A small home cooking website&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Hanna Petrescu&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://elderandash.example&amp;quot;&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicercook&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Image variants — responsive &amp;lt;picture&amp;gt; markup on every recipe hero&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Image variants — responsive &amp;lt;picture&amp;gt; markup on every recipe hero
&lt;span class=&quot;hl-comment&quot;&gt;# and card.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; and card.
&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;images&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
enabled &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
widths  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;960&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;1600&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
formats &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;webp&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;original&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
quality &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;78&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;topnav&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Recipes&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;juicercook.categories&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;All&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;juicercook.categories&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Breads&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/breads/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;juicercook.categories&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Desserts&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/desserts/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A recipe (&lt;code&gt;content/breads/sourdough.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Sourdough loaf
date: 2024-03-12
servings: 1 loaf
prepTime: PT30M
cookTime: PT45M
image: /img/sourdough.jpg
imageAlt: Crusty boule with an open crumb
summary: A reliable everyday loaf — 25 % whole wheat, 70 % hydration.
ingredients:
  - 500 g bread flour
  - 350 g water
  - 100 g active starter
  - 10 g sea salt
instructions:
  - Mix flour and water; rest 30 minutes (autolyse).
  - Add starter and salt; mix.
  - Bulk ferment 4–6 hours.
tags: [bread, sourdough]
---

Optional body content goes here.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Brand text in topbar + footer; &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Italic subtitle in the topbar.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Default &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer + JSON-LD author.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Standard juicer key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;juicercook&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a favicon.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;true&lt;/code&gt; to remove the “Built with juicer” line.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;topnav&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[[topnav]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Topbar nav entries.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[[links]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer link entries.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[images]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Table&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Image-variants pipeline. Strongly recommended — the hero and recipe-card images use it.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-recipe-frontmatter&quot;&gt;Per-recipe frontmatter&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Required.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Home-page recency ordering. Also &lt;code&gt;datePublished&lt;/code&gt; in JSON-LD.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;servings&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;“1 loaf”, “4–6”, etc. Maps to &lt;code&gt;recipeYield&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;prepTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;ISO 8601 duration&lt;/strong&gt; — &lt;code&gt;PT30M&lt;/code&gt;, &lt;code&gt;PT2H&lt;/code&gt;, &lt;code&gt;P1D&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cookTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ISO 8601 duration.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;totalTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ISO 8601 duration. Optional.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hero photo path.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;imageAlt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Alt text. Falls back to the title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Card summary, &lt;code&gt;&amp;lt;meta name=&amp;quot;description&amp;quot;&amp;gt;&lt;/code&gt;, JSON-LD description.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;recipeCategory&lt;/code&gt; — &lt;code&gt;Dessert&lt;/code&gt;, &lt;code&gt;Main&lt;/code&gt;, &lt;code&gt;Side&lt;/code&gt;, etc.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cuisine&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;recipeCuisine&lt;/code&gt; — &lt;code&gt;Italian&lt;/code&gt;, &lt;code&gt;Indian&lt;/code&gt;, etc.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ingredients&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;One string per ingredient line.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;instructions&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;One string per numbered step.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;photos&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Optional process photos. Each entry is a string (path) or &lt;code&gt;{src, alt, caption}&lt;/code&gt; map. Renders below the recipe card.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Drives &lt;code&gt;/tags/&amp;lt;slug&amp;gt;/&lt;/code&gt; archives.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;juicercook-palette-overrides&quot;&gt;&lt;code&gt;[juicercook]&lt;/code&gt; palette overrides&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicercook&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
brand        &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#7a2e10&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# terracotta&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; terracotta
brandStrong  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#4a1908&amp;quot;&lt;/span&gt;
accent       &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#c0571d&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# paprika&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; paprika
fontSans     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Inter&apos;, system-ui, sans-serif&amp;quot;&lt;/span&gt;
fontSerif    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Playfair Display&apos;, Georgia, serif&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Home-page category chips&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Home-page category chips
&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;juicercook.categories&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;All&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;juicercook.categories&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Breads&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/breads/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicerchurch/configuration/"/>
    <id>https://juicer.build/themes/juicerchurch/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicerchurch reads, per-page frontmatter for sermons / events / ministries, and the [juicerchurch] palette table.</summary>
    <content type="html">&lt;p&gt;juicerchurch reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer theme uses, plus a few church-specific ones for services / visit info).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicerchurch]&lt;/code&gt; table&lt;/strong&gt; for theme-specific palette + sizing overrides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-page frontmatter&lt;/strong&gt; for sermons, events, ministries, and photo albums.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;p&gt;A minimal &lt;code&gt;site.toml&lt;/code&gt; that produces a credible parish site:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;St. Stephen&apos;s Parish&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Anglican community, Riverdale.&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;St. Stephen&apos;s Parish&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://example.com&amp;quot;&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerchurch&amp;quot;&lt;/span&gt;

calendarMonths &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;6&lt;/span&gt;
eventsSection  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;events&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;visit&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
address &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;120 River St&amp;quot;&lt;/span&gt;
city    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Toronto&amp;quot;&lt;/span&gt;
state   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;ON&amp;quot;&lt;/span&gt;
zip     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;M4M 2P3&amp;quot;&lt;/span&gt;
mapURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://maps.example.com/ststephens&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;services&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
day   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Sun&amp;quot;&lt;/span&gt;
time  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;8:00 AM&amp;quot;&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Said Eucharist (BCP)&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;services&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
day   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Sun&amp;quot;&lt;/span&gt;
time  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;10:30 AM&amp;quot;&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Sung Eucharist&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;services&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
day   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Wed&amp;quot;&lt;/span&gt;
time  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;7:00 PM&amp;quot;&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Evening Prayer&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicerchurch&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
brand     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#2c5282&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# muted blue&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; muted blue
fontSerif &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Source Serif 4&apos;, Georgia, serif&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A typical sermon page (&lt;code&gt;content/sermons/2024-12-24-christmas-eve.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: &amp;quot;On Comfort, and Why It Comes from a Manger&amp;quot;
date: 2024-12-24
author: ann
scripture: &amp;quot;Isaiah 9:2–7; Luke 2:1–14&amp;quot;
audioURL: &amp;quot;/audio/2024-12-24.mp3&amp;quot;
audioDuration: &amp;quot;23:14&amp;quot;
videoURL: &amp;quot;https://youtube.com/watch?v=...&amp;quot;
videoDuration: &amp;quot;24:02&amp;quot;
summary: A meditation on Christmas Eve, on what comfort means and where it comes from.
---

The transcript or summary body goes here.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A typical ministry page (&lt;code&gt;content/ministries/food-bank.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Riverdale Food Bank
layout: ministry
leader: Mara Sanderson
meets: &amp;quot;Saturdays, 10am–noon&amp;quot;
contact: &amp;quot;foodbank@ststephens.example&amp;quot;
---

The ministry&apos;s narrative — who, what, why, how to get involved.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Brand text in topbar + footer; &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Italic subtitle next to the brand.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer copyright. Falls back to &lt;code&gt;title&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Standard juicer key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;juicerchurch&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a favicon.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;true&lt;/code&gt; to remove the “Built with juicer” line.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;customCSS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Site stylesheets loaded &lt;em&gt;after&lt;/em&gt; the theme CSS.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;eventsSection&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;events&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Section name juicer treats as events; populates &lt;code&gt;.site.events&lt;/code&gt; and &lt;code&gt;.site.calendar&lt;/code&gt;. See &lt;a href=&quot;/reference/config/#calendar--events-features&quot;&gt;Configuration → Calendar / events features&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;calendarMonths&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Months of calendar grid &lt;code&gt;.site.calendar&lt;/code&gt; pre-computes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;visit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Object&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;&lt;code&gt;{address, city, state, zip, mapURL}&lt;/code&gt; — surfaced in the footer on every page.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;services&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Regular weekly services: &lt;code&gt;[[services]]&lt;/code&gt; rows of &lt;code&gt;{day, time, label}&lt;/code&gt;. Surfaced in the home page hero and the footer.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;palette-token-overrides-juicerchurch&quot;&gt;Palette + token overrides — &lt;code&gt;[juicerchurch]&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;All optional. Anything you don’t set keeps the muted-blue defaults.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;CSS variable&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Primary brand accent.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandStrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-strong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hover-emphasis.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandSoft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-soft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Subtle paper-tinted backgrounds.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Warm secondary.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;“Today” indicator on the calendar grid.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandDark&lt;/code&gt; …&lt;/td&gt;&lt;td&gt;dark counterparts&lt;/td&gt;&lt;td&gt;One per light token.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-sans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Body / UI / nav face.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSerif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-serif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Headings, sermon titles.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontMono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-mono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Scripture references, calendar cells.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prose column max-width. Default &lt;code&gt;38rem&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Outer padding around content blocks.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;radiusLg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--radius-lg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Large border-radius.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h2&gt;
&lt;h3 id=&quot;sermon-pages&quot;&gt;Sermon pages&lt;/h3&gt;
&lt;p&gt;Sermons are dated, single-author posts that opt into the sermon
layout. They live under &lt;code&gt;content/sermons/&lt;/code&gt; and surface on the
sermon archive page.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;sermon&lt;/code&gt;. The sermon-archive page uses &lt;code&gt;layout: sermon-archive&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sermon title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ISO&lt;/td&gt;&lt;td&gt;Required. Drives sort order and archive grouping.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Single preacher ID — references &lt;code&gt;[[authors]]&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripture&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Scripture reference text (&lt;code&gt;&amp;quot;Isaiah 9:2–7; Luke 2:1–14&amp;quot;&lt;/code&gt;). Rendered in a tagged block above the body.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;audioURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Path or absolute URL to an audio file (mp3/m4a). Theme injects an &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;audioDuration&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Display duration (&lt;code&gt;&amp;quot;23:14&amp;quot;&lt;/code&gt;). Shown next to the audio control.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;videoURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Path or absolute URL to a video (YouTube / Vimeo / mp4).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;videoDuration&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Display duration.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;series&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(Engine feature.) Sermons share series support with &lt;code&gt;juicerblog&lt;/code&gt; — Advent series, Lent series, etc.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Short blurb on the archive page.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;event-pages&quot;&gt;Event pages&lt;/h3&gt;
&lt;p&gt;Event pages live in the &lt;code&gt;eventsSection&lt;/code&gt; (default &lt;code&gt;events&lt;/code&gt;).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ISO string&lt;/td&gt;&lt;td&gt;Required for an event to surface in &lt;code&gt;.site.events&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;eventTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Display time (&lt;code&gt;&amp;quot;7 PM&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;6:30–8 PM&amp;quot;&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;eventLocation&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Address or named location.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;recurring&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;weekly&amp;quot;&lt;/code&gt; for weekly recurrence. Expands onto every matching weekday in &lt;code&gt;.site.calendar&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;recurringDay&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Day name for recurrence. Defaults to the start date’s day of week.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;photos&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt; or &lt;code&gt;[Object]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Photos.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;ministry-pages&quot;&gt;Ministry pages&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ministry&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Ministry name.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;leader&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Person’s name (free text, not a registry ID — ministries often have non-clergy leaders).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;meets&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Display string for meeting cadence (&lt;code&gt;&amp;quot;Saturdays, 10am–noon&amp;quot;&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contact&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Email / phone / freeform contact info.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;photo-albums&quot;&gt;Photo albums&lt;/h3&gt;
&lt;p&gt;Same as juicercafe — &lt;code&gt;layout: album&lt;/code&gt; for one event’s gallery,
&lt;code&gt;layout: photo-album&lt;/code&gt; for the site-wide aggregate.&lt;/p&gt;
&lt;h2 id=&quot;going-beyond-config&quot;&gt;Going beyond config&lt;/h2&gt;
&lt;p&gt;Drop a file with the same path under your own site to override anything in the theme — this is the ordinary &lt;a href=&quot;/concepts/themes/&quot;&gt;theme overlay&lt;/a&gt; pattern:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;You want to change…&lt;/th&gt;&lt;th&gt;Override at…&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;The topbar&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/topbar.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The footer&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/footer.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The calendar grid&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/month-grid.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The photo grid&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/photo-grid.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The 404 page&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/layouts/_default/404.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Custom CSS&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/static/site.css&lt;/code&gt; (and list it under &lt;code&gt;customCSS&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Site files &lt;strong&gt;always&lt;/strong&gt; win over theme files, so overrides are a one-file-at-a-time operation — no forking the theme.&lt;/p&gt;
&lt;h2 id=&quot;seo&quot;&gt;SEO&lt;/h2&gt;
&lt;p&gt;Every juicer theme ships a shared SEO partial (&lt;code&gt;partials/seo.html&lt;/code&gt;) that emits the standard meta block: description (with site-level fallback), canonical link, author meta, robots &lt;code&gt;noindex&lt;/code&gt;, OpenGraph + Twitter cards (via the &lt;code&gt;ogTags&lt;/code&gt; builtin), Atom feed discovery, and theme-specific JSON-LD. The engine separately writes &lt;code&gt;sitemap.xml&lt;/code&gt; and &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;site-wide-keys&quot;&gt;Site-wide keys&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;description &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Trinity Community Church — Sunday services at 9 and 11, Wednesday Bible study at 7.&amp;quot;&lt;/span&gt;
ogImage     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/og/sanctuary.jpg&amp;quot;&lt;/span&gt;

robots   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
noindex  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;false&lt;/span&gt;
disallow &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/admin/&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Optional: Church JSON-LD on the homepage. Subtype of PlaceOfWorship —&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Optional: Church JSON-LD on the homepage. Subtype of PlaceOfWorship —
&lt;span class=&quot;hl-comment&quot;&gt;# helpful for Google Maps Knowledge Panel.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; helpful for Google Maps Knowledge Panel.
&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;church&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
phone   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;+1-555-0100&amp;quot;&lt;/span&gt;
address &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;412 Maple Street, Springfield IL 62701&amp;quot;&lt;/span&gt;
image   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/sanctuary.jpg&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;The Sermon on the Mount&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A one-sentence dek for search results and OG cards.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2026-04-12&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;pastor-rob&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/sermons/sermon-on-mount.jpg&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogTitle&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A snappier social headline&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogDescription&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Tightened for socials&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;   &lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; excluded from sitemap, JSON-LD suppressed, &amp;lt;meta robots&amp;gt; emitted&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;structured-data-emitted&quot;&gt;Structured data emitted&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Page&lt;/th&gt;&lt;th&gt;Schema&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Root section&lt;/td&gt;&lt;td&gt;&lt;code&gt;WebSite&lt;/code&gt; (+ &lt;code&gt;Church&lt;/code&gt; when &lt;code&gt;[church]&lt;/code&gt; is set in &lt;code&gt;site.toml&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Dated non-section page&lt;/td&gt;&lt;td&gt;&lt;code&gt;Article&lt;/code&gt; (with author / image / dateISO)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Any page with ancestors&lt;/td&gt;&lt;td&gt;&lt;code&gt;BreadcrumbList&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;noindex: true&lt;/code&gt; suppresses ALL JSON-LD on that page.&lt;/p&gt;
&lt;h3 id=&quot;overriding-the-seo-partial&quot;&gt;Overriding the SEO partial&lt;/h3&gt;
&lt;p&gt;Drop a file at &lt;code&gt;&amp;lt;src&amp;gt;/partials/seo.html&lt;/code&gt; (or &lt;code&gt;seo-jsonld.html&lt;/code&gt; for just the structured-data part). Site overrides win over the theme’s copy.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicercafe/configuration/"/>
    <id>https://juicer.build/themes/juicercafe/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicercafe reads, per-page frontmatter for menus / events / albums, and the [juicercafe] palette table.</summary>
    <content type="html">&lt;p&gt;juicercafe reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer theme uses, plus a few café-specific ones for hours / visit info).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicercafe]&lt;/code&gt; table&lt;/strong&gt; for theme-specific palette + sizing overrides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-page frontmatter&lt;/strong&gt; for menus, events, photo albums, and the “working on it” page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;p&gt;A minimal &lt;code&gt;site.toml&lt;/code&gt; that produces a credible café page:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Magpie &amp;amp; Pearl&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Coffee, pastry, books — Lawrence Park.&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Magpie &amp;amp; Pearl&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://example.com&amp;quot;&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicercafe&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;visit&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
address &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;240 King St E&amp;quot;&lt;/span&gt;
city    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Lawrence Park&amp;quot;&lt;/span&gt;
state   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;ON&amp;quot;&lt;/span&gt;
zip     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;M4S 1A1&amp;quot;&lt;/span&gt;
mapURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://maps.example.com/magpie&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;hours&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
day  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Mon&amp;quot;&lt;/span&gt;
open &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;07:00&amp;quot;&lt;/span&gt;
close &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;16:00&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;hours&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
day  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Tue&amp;quot;&lt;/span&gt;
open &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;07:00&amp;quot;&lt;/span&gt;
close &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;16:00&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# ... (Wed–Fri similar)&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; ... (Wed–Fri similar)

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;hours&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
day    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Sat&amp;quot;&lt;/span&gt;
open   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;08:00&amp;quot;&lt;/span&gt;
close  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;17:00&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;hours&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
day    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Sun&amp;quot;&lt;/span&gt;
closed &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicercafe&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
brand     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#9c3022&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# brick red&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; brick red
fontSerif &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;&apos;Source Serif 4&apos;, Georgia, serif&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A typical menu section page (&lt;code&gt;content/menu/coffee.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Coffee
layout: menu-section
weight: 10
items:
  - { name: &amp;quot;Pour-over&amp;quot;, price: &amp;quot;5.00&amp;quot;, description: &amp;quot;Single-origin, brewed to order.&amp;quot; }
  - { name: &amp;quot;Espresso&amp;quot;, price: &amp;quot;3.50&amp;quot;, description: &amp;quot;Double shot, in a small cup.&amp;quot; }
  - { name: &amp;quot;Cortado&amp;quot;, price: &amp;quot;4.50&amp;quot; }
---&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A typical event page (&lt;code&gt;content/events/picnic-may.md&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Spring Picnic
date: 2025-05-15T12:00:00
eventTime: &amp;quot;noon–4pm&amp;quot;
eventLocation: &amp;quot;Lawrence Park bandshell&amp;quot;
summary: Annual neighborhood picnic. Bring a side.
---

The full event writeup goes here.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;p&gt;Standard juicer keys plus a few café-specific ones.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Brand text in topbar + footer; &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Italic subtitle next to the brand in the topbar; appended to &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; when the page title equals the site title.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Footer copyright. Falls back to &lt;code&gt;title&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Standard juicer key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;juicercafe&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Path to a favicon.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hideJuicerCredit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set &lt;code&gt;true&lt;/code&gt; to remove the “Built with juicer” line in the footer.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;customCSS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Site stylesheets loaded &lt;em&gt;after&lt;/em&gt; the theme CSS. See &lt;a href=&quot;/reference/theming/&quot;&gt;Theming → Layer 2&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;visit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Object&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;&lt;code&gt;{address, city, state, zip, mapURL}&lt;/code&gt; — the place’s physical address, surfaced in the footer on every page.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hours&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Array&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Day-of-week hours: &lt;code&gt;[[hours]]&lt;/code&gt; rows of &lt;code&gt;{day, open?, close?, closed?, note?}&lt;/code&gt;. Drives the topbar “Open now” badge and the footer hours block.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;hours-row-shape&quot;&gt;Hours-row shape&lt;/h3&gt;
&lt;p&gt;Each &lt;code&gt;[[hours]]&lt;/code&gt; row describes one day of the week:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;day&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Mon&lt;/code&gt;, &lt;code&gt;Tue&lt;/code&gt;, …, &lt;code&gt;Sun&lt;/code&gt;. Used both for display and for the “Open now” computation.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;open&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;HH:MM&amp;quot;&lt;/code&gt; 24-hour. Required when not &lt;code&gt;closed&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;close&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;HH:MM&amp;quot;&lt;/code&gt; 24-hour. Required when not &lt;code&gt;closed&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;closed&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When &lt;code&gt;true&lt;/code&gt;, the day shows as “closed” and the hours fields are ignored.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;note&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Optional small note, e.g. &lt;code&gt;&amp;quot;holiday hours&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;breakfast only&amp;quot;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;palette-token-overrides-juicercafe&quot;&gt;Palette + token overrides — &lt;code&gt;[juicercafe]&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;All optional. Anything you don’t set keeps the warm-paper / brick-red defaults. The full mapping (which token drives which CSS variable) is documented in &lt;a href=&quot;/reference/theming/&quot;&gt;Theming&lt;/a&gt; — juicercafe follows the same pattern as the other themes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;CSS variable&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Primary brand accent — link hover, “Open now” pill, active topbar entries.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandStrong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-strong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hover-emphasis on brand-coloured elements.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandSoft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--brand-soft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Subtle paper-tinted backgrounds.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Warm secondary — used sparingly on CTAs.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;“Open now” green; success states.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brandDark&lt;/code&gt; …&lt;/td&gt;&lt;td&gt;dark counterparts&lt;/td&gt;&lt;td&gt;One per light token.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-sans&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Body / UI / nav face.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontSerif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-serif&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Headings, brand.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fontMono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--font-mono&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prices on menu pages.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--measure&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Prose column max-width. Default &lt;code&gt;38rem&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--gutter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Outer padding around content blocks.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;radiusLg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--radius-lg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Large border-radius (cards, hero images).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h2&gt;
&lt;h3 id=&quot;menu-pages&quot;&gt;Menu pages&lt;/h3&gt;
&lt;p&gt;The menu has a two-level structure: a &lt;code&gt;[layout: menu]&lt;/code&gt; page on
&lt;code&gt;/menu/_index.md&lt;/code&gt; and one &lt;code&gt;[layout: menu-section]&lt;/code&gt; page per menu
section (&lt;code&gt;/menu/coffee.md&lt;/code&gt;, &lt;code&gt;/menu/pastry.md&lt;/code&gt;, …). Each
menu-section page lists its items inline.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;menu&lt;/code&gt; for the menu landing; &lt;code&gt;menu-section&lt;/code&gt; for each section.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Section heading on the menu page.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weight&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sort order of the section within the full menu. Lower first.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;items&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[Object]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Items in this section. Each &lt;code&gt;{name, price, description?, vegan?, gf?}&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;event-pages&quot;&gt;Event pages&lt;/h3&gt;
&lt;p&gt;Event pages live in the &lt;code&gt;eventsSection&lt;/code&gt; (default &lt;code&gt;events&lt;/code&gt;).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ISO string&lt;/td&gt;&lt;td&gt;Required for an event to surface in &lt;code&gt;.site.events&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;eventTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Display time (&lt;code&gt;&amp;quot;noon–4pm&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;7pm–10pm&amp;quot;&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;eventLocation&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Address or named location.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;recurring&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;weekly&amp;quot;&lt;/code&gt; for weekly recurrence. Expands the event onto every matching weekday in &lt;code&gt;.site.calendar&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;recurringDay&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Day name for recurrence. Defaults to the start date’s day of week.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;photos&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[String]&lt;/code&gt; or &lt;code&gt;[Object]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Photos for the event — surface on &lt;code&gt;.site.photos&lt;/code&gt; and on the event page itself.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;photo-album-pages&quot;&gt;Photo album pages&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;[layout: album]&lt;/code&gt; page renders a 3-up image grid; a
&lt;code&gt;[layout: photo-album]&lt;/code&gt; page renders the site-wide aggregated
&lt;code&gt;.site.photos&lt;/code&gt; list. Use the first for one event’s gallery, the
second for “every photo on the site, sorted by date.”&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;album&lt;/code&gt; (one event’s photos) or &lt;code&gt;photo-album&lt;/code&gt; (the site-wide grid).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;photos&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[Object]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The album’s photos. Each &lt;code&gt;{src, caption?, alt?}&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;working-on-it-pages&quot;&gt;“Working on it” pages&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;[layout: working]&lt;/code&gt; page lists pending projects — lease
applications, renovations, hiring. Each page’s &lt;code&gt;working:&lt;/code&gt;
frontmatter is a list.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;working&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;working&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[Object]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Projects. Each &lt;code&gt;{title, status, body}&lt;/code&gt; — &lt;code&gt;status&lt;/code&gt; is a short label (&lt;code&gt;&amp;quot;in review&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;q2 2025&amp;quot;&lt;/code&gt;, etc.).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;going-beyond-config&quot;&gt;Going beyond config&lt;/h2&gt;
&lt;p&gt;Drop a file with the same path under your own site to override anything in the theme — this is the ordinary &lt;a href=&quot;/concepts/themes/&quot;&gt;theme overlay&lt;/a&gt; pattern:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;You want to change…&lt;/th&gt;&lt;th&gt;Override at…&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;The topbar&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/topbar.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The footer&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/footer.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The hours widget&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/hours-widget.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The photo grid&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/photo-grid.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The 404 page&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/layouts/_default/404.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Custom CSS&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/static/site.css&lt;/code&gt; (and list it under &lt;code&gt;customCSS&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Site files &lt;strong&gt;always&lt;/strong&gt; win over theme files, so overrides are a one-file-at-a-time operation — no forking the theme.&lt;/p&gt;
&lt;h2 id=&quot;seo&quot;&gt;SEO&lt;/h2&gt;
&lt;p&gt;Every juicer theme ships a shared SEO partial (&lt;code&gt;partials/seo.html&lt;/code&gt;) that emits the standard meta block: description (with site-level fallback), canonical link, author meta, robots &lt;code&gt;noindex&lt;/code&gt;, OpenGraph + Twitter cards (via the &lt;code&gt;ogTags&lt;/code&gt; builtin), Atom feed discovery, and theme-specific JSON-LD. The engine separately writes &lt;code&gt;sitemap.xml&lt;/code&gt; and &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;site-wide-keys&quot;&gt;Site-wide keys&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;description &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Hand-pulled espresso and tiny-batch pastries on Elgin Street.&amp;quot;&lt;/span&gt;
ogImage     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/og/default.jpg&amp;quot;&lt;/span&gt;

robots   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
noindex  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;false&lt;/span&gt;
disallow &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/private/&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Optional: LocalBusiness JSON-LD on the homepage. Any subtype works&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Optional: LocalBusiness JSON-LD on the homepage. Any subtype works
&lt;span class=&quot;hl-comment&quot;&gt;# (CafeOrCoffeeShop, Restaurant, Bakery — see schema.org/LocalBusiness).&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; (CafeOrCoffeeShop, Restaurant, Bakery — see schema.org/LocalBusiness).
&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;business&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
type    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;CafeOrCoffeeShop&amp;quot;&lt;/span&gt;
phone   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;+1-555-0100&amp;quot;&lt;/span&gt;
address &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;123 Elgin Street, Ottawa, ON K2P 1L4&amp;quot;&lt;/span&gt;
image   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/storefront.jpg&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Espresso 101&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A one-sentence dek for search results and OG cards.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/menu/espresso.jpg&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogImage&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/menu/espresso-social.jpg&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogTitle&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Espresso, explained&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogDescription&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Tightened for socials&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;   &lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; excluded from sitemap, JSON-LD suppressed, &amp;lt;meta robots&amp;gt; emitted&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;structured-data-emitted&quot;&gt;Structured data emitted&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Page&lt;/th&gt;&lt;th&gt;Schema&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Root section&lt;/td&gt;&lt;td&gt;&lt;code&gt;WebSite&lt;/code&gt; (+ &lt;code&gt;LocalBusiness&lt;/code&gt; when &lt;code&gt;[business]&lt;/code&gt; is set in &lt;code&gt;site.toml&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Non-section page with &lt;code&gt;date:&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Article&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Any page with ancestors&lt;/td&gt;&lt;td&gt;&lt;code&gt;BreadcrumbList&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;noindex: true&lt;/code&gt; suppresses ALL JSON-LD on that page.&lt;/p&gt;
&lt;h3 id=&quot;overriding-the-seo-partial&quot;&gt;Overriding the SEO partial&lt;/h3&gt;
&lt;p&gt;Drop a file at &lt;code&gt;&amp;lt;src&amp;gt;/partials/seo.html&lt;/code&gt; (or &lt;code&gt;seo-jsonld.html&lt;/code&gt; for just the structured-data part). Site overrides win over the theme’s copy.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/themes/juicerblog/configuration/"/>
    <id>https://juicer.build/themes/juicerblog/configuration/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>site.toml keys juicerblog reads, the per-page frontmatter conventions, and the directories that turn engine features on.</summary>
    <content type="html">&lt;p&gt;juicerblog reads its configuration from three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A small set of &lt;strong&gt;top-level site keys&lt;/strong&gt; (the same ones every juicer theme uses).&lt;/li&gt;
&lt;li&gt;A namespaced &lt;strong&gt;&lt;code&gt;[juicerblog]&lt;/code&gt; table&lt;/strong&gt; for theme-specific palette overrides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-page frontmatter&lt;/strong&gt; for opt-in conventions like the static-page flag and the homepage layout selector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anything you don’t set keeps the theme’s defaults. juicerblog uses &lt;code&gt;[juicerblog]&lt;/code&gt; so it doesn’t collide with keys other themes might want.&lt;/p&gt;
&lt;h2 id=&quot;quick-example&quot;&gt;Quick example&lt;/h2&gt;
&lt;p&gt;A complete &lt;code&gt;site.toml&lt;/code&gt; exercising every juicerblog-aware feature:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;title    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;My blog&amp;quot;&lt;/span&gt;
tagline  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;a place for prose&amp;quot;&lt;/span&gt;
author   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Ed Maxedon&amp;quot;&lt;/span&gt;
baseURL  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://example.com&amp;quot;&lt;/span&gt;

theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;juicerblog&amp;quot;&lt;/span&gt;
paginate &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;5&lt;/span&gt;
sortBy   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;date&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Every post lives at /&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;slug&amp;gt;/.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Every post lives at /&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;slug&amp;gt;/.
&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;permalinks&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
posts &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:year/:month/:slug/&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Year + month archive pages.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Year + month archive pages.
dateArchives &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Author registry — see [Blogging features → Author registry] for the&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Author registry — see [Blogging features → Author registry] for the
&lt;span class=&quot;hl-comment&quot;&gt;# full data shape. Each id is referenced from per-post `author:` /&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; full data shape. Each id is referenced from per-post `author:` /
&lt;span class=&quot;hl-comment&quot;&gt;# `authors:` frontmatter.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; `authors:` frontmatter.
&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;authors&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
id     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;ed&amp;quot;&lt;/span&gt;
name   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Ed Maxedon&amp;quot;&lt;/span&gt;
bio    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Writes about Scala, languages, and the craft of small tools.&amp;quot;&lt;/span&gt;
avatar &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/avatar-ed.png&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;authors.links&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;GitHub&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://github.com/edadma&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-comment&quot;&gt;# Optional palette overrides. Defaults are warm-neutral (amber + indigo).&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; Optional palette overrides. Defaults are warm-neutral (amber + indigo).
&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;juicerblog&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
brand  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#0f766e&amp;quot;&lt;/span&gt;  &lt;span class=&quot;hl-comment&quot;&gt;# teal-700&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; teal-700
accent &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;#7c3aed&amp;quot;&lt;/span&gt;  &lt;span class=&quot;hl-comment&quot;&gt;# violet-600&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; violet-600&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;top-level-keys&quot;&gt;Top-level keys&lt;/h2&gt;
&lt;p&gt;Standard juicer keys, with a note on how juicerblog uses each:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Untitled&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Wordmark in the topbar; appears in &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tags and the footer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tagline&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Italic line beside the wordmark; rendered as the hero subtitle on the homepage&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Unnamed&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Footer copyright line; also drives the site-wide Atom feed &lt;code&gt;&amp;lt;author&amp;gt;&lt;/code&gt; element&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(required)&lt;/td&gt;&lt;td&gt;Used for absolute permalinks, sitemap, OpenGraph, atom feeds&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(required)&lt;/td&gt;&lt;td&gt;Set this to &lt;code&gt;&amp;quot;juicerblog&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;paginate&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Posts per page on the home + archive listings. juicerblog renders 4–5 well; 10+ starts feeling long&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sortBy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;weight&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Set to &lt;code&gt;&amp;quot;date&amp;quot;&lt;/code&gt; for a blog. juicerblog’s home + archive listings respect this&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;[permalinks]&lt;/code&gt;, &lt;code&gt;dateArchives&lt;/code&gt;, and &lt;code&gt;[[authors]]&lt;/code&gt; tables are engine-level features documented at &lt;a href=&quot;/concepts/blogging/&quot;&gt;Blogging features&lt;/a&gt;. juicerblog renders the layouts that surface them; the engine’s job is unchanged.&lt;/p&gt;
&lt;h2 id=&quot;juicerblog-keys&quot;&gt;&lt;code&gt;[juicerblog]&lt;/code&gt; keys&lt;/h2&gt;
&lt;p&gt;A small table for palette overrides. Defaults are:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerblog.brand&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#c2410c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Primary brand color — links on hover, brand pill backgrounds, reading-progress bar&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerblog.accent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#4338ca&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Default link color in prose (indigo-700 — readable against cream paper)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;juicerblog.leaf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;color&lt;/td&gt;&lt;td&gt;&lt;code&gt;#16a34a&lt;/code&gt;&lt;/td&gt;&lt;td&gt;“Confirmation green” — the copy-button “Copied” flash, success badges&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Any CSS color expression works: hex, &lt;code&gt;rgb(...)&lt;/code&gt;, &lt;code&gt;hsl(...)&lt;/code&gt;, &lt;code&gt;oklch(...)&lt;/code&gt;, named colors. Values are dropped into a &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; block in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; immediately after &lt;code&gt;juicerblog.css&lt;/code&gt;, redefining the named CSS variables.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Dark-mode variants of these tokens are derived automatically by the theme — the dark palette tunes the same hues lighter and slightly cooler so they don’t burn against the dark background. The current build doesn’t expose dark-mode overrides as separate config keys; if you need radically different colors per theme, override &lt;code&gt;static/juicerblog.css&lt;/code&gt; from your site’s &lt;code&gt;static/&lt;/code&gt; directory.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h2&gt;
&lt;p&gt;Three frontmatter conventions are juicerblog-specific (the engine doesn’t read them; the theme branches on them):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;When &lt;code&gt;true&lt;/code&gt;, the page renders without post chrome — no date/reading-time line, no series badge, no prev/next nav. Use it for about / colophon / contact pages so they look like clean essays, not posts. Pages with &lt;code&gt;static: true&lt;/code&gt; are also filtered out of the home post list, the per-tag archives, the per-author archives, and &lt;code&gt;.site.posts&lt;/code&gt; / &lt;code&gt;.site.pagesByYear&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;When set, juicer renders the page through &lt;code&gt;_default/&amp;lt;layout&amp;gt;.html&lt;/code&gt; instead of the default &lt;code&gt;file.html&lt;/code&gt; / &lt;code&gt;folder.html&lt;/code&gt;. juicerblog ships two non-default layouts: &lt;code&gt;home&lt;/code&gt; and &lt;code&gt;archive&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;series&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;(Engine feature.) When set, the post is part of a series — juicerblog adds a progress badge (“Reading on screens · Part 2 of 3”) above the body and an “In this series” sidebar after the body. See &lt;a href=&quot;/concepts/blogging/#series--multi-part-posts&quot;&gt;Blogging features → Series&lt;/a&gt; for the full data shape.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A typical post:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: A whirlwind tour of Scala 3
date: 2024-11-18
author: ed
tags: [scala, language]
summary: Five things Scala 3 gets right.
---

Scala 3 cleans up a decade of accreted complexity…&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A static page:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: About this site
author: ed
static: true
summary: Who runs this place and why.
---

This blog exists for one reason…&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A homepage:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: My blog
layout: home
---

A short paragraph that renders inside the hero, under the title and tagline.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An archive landing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Archive
layout: archive
static: true
summary: Every post on this site, grouped by year.
---

A short intro paragraph that renders above the year-grouped list.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;directory-layout&quot;&gt;Directory layout&lt;/h2&gt;
&lt;p&gt;The directories juicerblog cares about under your site root:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my-blog/
├── site.toml
├── content/
│   ├── _index.md            # the homepage (often layout: home)
│   ├── archive.md           # the archive page (layout: archive, static: true)
│   ├── about.md             # static: true
│   └── *.md                 # posts (with date, author, tags, etc.)
├── grammars/
│   ├── scala.tmLanguage.json
│   ├── javascript.tmLanguage.json
│   └── ...
└── static/                  # site-side asset overrides (avatars, og images)
    ├── img/avatar-ed.png
    └── og-default.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;grammars/&lt;/code&gt; is the opt-in for syntax highlighting — covered in its own section below.&lt;/p&gt;
&lt;h2 id=&quot;syntax-highlighting&quot;&gt;Syntax highlighting&lt;/h2&gt;
&lt;p&gt;juicerblog renders code blocks through juicer’s &lt;a href=&quot;/concepts/blogging/&quot;&gt;highlighter integration&lt;/a&gt; — TextMate grammars at build time, no JavaScript runtime, no FOUC. The integration is engine-level (any juicer theme benefits); juicerblog ships the &lt;code&gt;.hl-*&lt;/code&gt; CSS palette that turns the spans into colors.&lt;/p&gt;
&lt;p&gt;To enable highlighting, drop a &lt;code&gt;&amp;lt;lang&amp;gt;.tmLanguage.json&lt;/code&gt; file into &lt;code&gt;&amp;lt;src&amp;gt;/grammars/&lt;/code&gt; for each language you want colored:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my-blog/grammars/
├── scala.tmLanguage.json
├── javascript.tmLanguage.json
├── python.tmLanguage.json
└── rust.tmLanguage.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;lang&amp;gt;&lt;/code&gt; part of the filename matches the fence’s language tag — a fenced block opened with &lt;code&gt;```scala&lt;/code&gt; looks for &lt;code&gt;grammars/scala.tmLanguage.json&lt;/code&gt;. Languages with no matching grammar render as plain &lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;/code&gt; (no error).&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Where to get grammars.&lt;/strong&gt; Almost every VS Code language extension ships a TextMate grammar file. Grab them from the language’s official VS Code extension repository — for example, &lt;a href=&quot;https://github.com/scala/vscode-scala-syntax&quot;&gt;scala-lang/vscode-scala-syntax&lt;/a&gt; for Scala. Drop the &lt;code&gt;.tmLanguage.json&lt;/code&gt; file directly into your &lt;code&gt;grammars/&lt;/code&gt; directory.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;Sites with no &lt;code&gt;grammars/&lt;/code&gt; directory pay zero cost.&lt;/strong&gt; The build doesn’t try to load any highlighter at all. Code blocks render as plain &lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;/code&gt;. The theme’s CSS for the &lt;code&gt;.hl-*&lt;/code&gt; classes is inert in that case (no &lt;code&gt;.hl-*&lt;/code&gt; spans get emitted), so there’s no wasted bytes either.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The classes the theme styles, with their default light-mode colors:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Class&lt;/th&gt;&lt;th&gt;Color (light)&lt;/th&gt;&lt;th&gt;Color (dark)&lt;/th&gt;&lt;th&gt;What kinds of tokens&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-keyword&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#9a3412&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#fb923c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;class&lt;/code&gt;, &lt;code&gt;def&lt;/code&gt;, &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;match&lt;/code&gt;, &lt;code&gt;import&lt;/code&gt;, etc.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#166534&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#86efac&lt;/code&gt;&lt;/td&gt;&lt;td&gt;String literals (single, double, triple)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-comment&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#78716c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#a8a29e&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Line + block comments (italic)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-number&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#b45309&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#fdba74&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Numeric literals&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-type&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#1d4ed8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#93c5fd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Type names (capitalized identifiers in most grammars)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-function&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#6d28d9&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#c4b5fd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Function / method names — when the grammar tags them&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-variable&lt;/code&gt;&lt;/td&gt;&lt;td&gt;inherit&lt;/td&gt;&lt;td&gt;inherit&lt;/td&gt;&lt;td&gt;Variable references&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-operator&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#44403c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#d6d3d1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;=&amp;gt;&lt;/code&gt;, &lt;code&gt;::&lt;/code&gt;, etc. — when the grammar tags them&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.hl-punctuation&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#78716c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#a8a29e&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Brackets, commas, semicolons, dots&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Override any of these from your site’s &lt;code&gt;static/site.css&lt;/code&gt; (loaded after the theme’s stylesheet) if the defaults don’t match your site’s palette.&lt;/p&gt;
&lt;h2 id=&quot;going-beyond-config&quot;&gt;Going beyond config&lt;/h2&gt;
&lt;p&gt;Drop a file with the same path under your own site to override anything in the theme — this is the ordinary &lt;a href=&quot;/concepts/themes/&quot;&gt;theme overlay&lt;/a&gt; pattern:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;You want to change…&lt;/th&gt;&lt;th&gt;Override at…&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;The topbar nav&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/topbar.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The footer markup&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/footer.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The byline&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/post-byline.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The series sidebar&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/partials/series-nav.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The 404 page&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/layouts/_default/404.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Custom CSS&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/static/site.css&lt;/code&gt; (and link it from your overridden &lt;code&gt;head.html&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Site files &lt;strong&gt;always&lt;/strong&gt; win over theme files, so overrides are a one-file-at-a-time operation — no forking the theme.&lt;/p&gt;
&lt;h2 id=&quot;seo&quot;&gt;SEO&lt;/h2&gt;
&lt;p&gt;Every juicer theme ships a shared SEO partial (&lt;code&gt;partials/seo.html&lt;/code&gt;) that emits the standard meta block: description (with site-level fallback), canonical link, author meta, robots &lt;code&gt;noindex&lt;/code&gt;, OpenGraph + Twitter cards (via the &lt;code&gt;ogTags&lt;/code&gt; builtin), Atom feed discovery, and theme-specific JSON-LD structured data. The engine separately writes &lt;code&gt;sitemap.xml&lt;/code&gt; and &lt;code&gt;robots.txt&lt;/code&gt;. This section documents the knobs.&lt;/p&gt;
&lt;h3 id=&quot;site-wide-keys&quot;&gt;Site-wide keys&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;description &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;A monthly journal of small tools and small wins.&amp;quot;&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# used as default meta description and JSON-LD site description&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; used as default meta description and JSON-LD site description
ogImage     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/og/default.png&amp;quot;&lt;/span&gt;                                    &lt;span class=&quot;hl-comment&quot;&gt;# fallback OpenGraph image (absolute URL or site-relative path)&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; fallback OpenGraph image (absolute URL or site-relative path)

&lt;span class=&quot;hl-comment&quot;&gt;# robots.txt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; robots.txt
robots   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;                                                    &lt;span class=&quot;hl-comment&quot;&gt;# default; set false to suppress robots.txt entirely (ship your own in static/)&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; default; set false to suppress robots.txt entirely (ship your own in static/)
noindex  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;false&lt;/span&gt;                                                   &lt;span class=&quot;hl-comment&quot;&gt;# default; set true for staging/preview domains — emits Disallow: / for the whole site&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; default; set true for staging/preview domains — emits Disallow: / for the whole site
disallow &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/drafts/&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/staging/&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;                               &lt;span class=&quot;hl-comment&quot;&gt;# additional Disallow lines (string or array of strings)&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; additional Disallow lines (string or array of strings)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;per-page-frontmatter&quot;&gt;Per-page frontmatter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A short post about something&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A one-sentence dek for search results and OG cards.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/post-hero.jpg&lt;/span&gt;          &lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;hl-comment&quot;&gt; used by ogTags + JSON-LD BlogPosting&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;ogImage: /img/post-social.jpg      # explicit OG image, wins over `image`&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;ogTitle: A snappier social headline # explicit OG title, wins over `title`&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;ogDescription: Tightened for socials # explicit OG description, wins over `summary`&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;noindex: true                       # excluded from sitemap.xml, JSON-LD suppressed, &amp;lt;meta robots&amp;gt; emitted&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;structured-data-emitted&quot;&gt;Structured data emitted&lt;/h3&gt;
&lt;p&gt;juicerblog emits these JSON-LD &lt;code&gt;@type&lt;/code&gt;s:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Page&lt;/th&gt;&lt;th&gt;Schema&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Root section (&lt;code&gt;content/_index.md&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;&lt;code&gt;WebSite&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Non-section page with &lt;code&gt;date:&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;BlogPosting&lt;/code&gt; (with author / image / dateISO)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Any page with ancestors&lt;/td&gt;&lt;td&gt;&lt;code&gt;BreadcrumbList&lt;/code&gt; (built from &lt;code&gt;.page.ancestors&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;noindex: true&lt;/code&gt; suppresses ALL JSON-LD on that page — a deliberately-hidden page should not advertise itself to crawlers in any form.&lt;/p&gt;
&lt;h3 id=&quot;overriding-the-seo-partial&quot;&gt;Overriding the SEO partial&lt;/h3&gt;
&lt;p&gt;To customize, drop a file at &lt;code&gt;&amp;lt;src&amp;gt;/partials/seo.html&lt;/code&gt; (or &lt;code&gt;seo-jsonld.html&lt;/code&gt; for just the structured-data part). The site override wins over the theme’s copy with no forking.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.build/reference/config/"/>
    <id>https://juicer.build/reference/config/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Every config key juicer understands, what it defaults to, and what it controls.</summary>
    <content type="html">&lt;p&gt;Site config lives in &lt;code&gt;site.toml&lt;/code&gt; at the source root. Juicer overlays your file on top of one of three baselines (&lt;code&gt;simple&lt;/code&gt;, &lt;code&gt;standard&lt;/code&gt;, &lt;code&gt;norme&lt;/code&gt;) selected by the &lt;code&gt;-c &amp;lt;name&amp;gt;&lt;/code&gt; CLI flag.&lt;/p&gt;
&lt;h2 id=&quot;baselines&quot;&gt;Baselines&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;simple&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Flat layout — content, layouts, partials, static all at the source root&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;standard&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hugo-like nested layout (the default)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;norme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;French (Charter-of-the-French-Language compliant) — same as &lt;code&gt;standard&lt;/code&gt; but with French directory names&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The &lt;code&gt;norme&lt;/code&gt; baseline is here because Quebec’s Charter of the French Language requires that public-facing software present primarily in French. Same code, French file names. If your content is bilingual, use this baseline alongside the upcoming i18n feature (Tier 2).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;keys&quot;&gt;Keys&lt;/h2&gt;
&lt;h3 id=&quot;identity&quot;&gt;Identity&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Untitled&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site title; available as &lt;code&gt;.site.title&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;Unnamed&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site author; available as &lt;code&gt;.site.author&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;http://localhost:8080&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Absolute base URL — used for permalinks, sitemap, OpenGraph&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;theme&quot;&gt;Theme&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Theme name (string) or chain (array of strings). Resolved under &lt;code&gt;themeDir&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;themeDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;themes&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Directory holding theme subfolders&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;directory-layout&quot;&gt;Directory layout&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;&lt;code&gt;standard&lt;/code&gt; default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contentDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;content&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Markdown source root&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;htmlDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;html&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Filesystem-only prefix for nested sections; stripped from URLs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;publicDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;public&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Default output directory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;staticDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;static&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Verbatim-copied assets&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;layoutDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;layouts&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Templates root&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;partialDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;partials&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Partials root&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;shortcodeDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;shortcodes&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Shortcodes root&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dataDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;data&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Structured data root — &lt;code&gt;*.toml&lt;/code&gt; / &lt;code&gt;*.yaml&lt;/code&gt; / &lt;code&gt;*.yml&lt;/code&gt; files here are exposed to templates as &lt;code&gt;.site.data&lt;/code&gt; (see &lt;a href=&quot;/../template-data/#sitedata&quot;&gt;Template data → &lt;code&gt;.site.data&lt;/code&gt;&lt;/a&gt;). Themes can also ship a &lt;code&gt;data/&lt;/code&gt; directory; site keys win at the file-leaf granularity.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;excludeDirs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset&lt;/td&gt;&lt;td&gt;Extra directories to skip during the site walk. String or array of strings; each entry is a path relative to the source root (&lt;code&gt;&amp;quot;node_modules&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;assets/raw&amp;quot;&lt;/code&gt;). Match is exact-directory only — not a glob pattern.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The walk already skips the active &lt;code&gt;themeDir&lt;/code&gt; subfolders, the &lt;code&gt;themeDir&lt;/code&gt; parent (so inactive themes vendored alongside don’t render), the configured &lt;code&gt;publicDir&lt;/code&gt;, and the build’s output &lt;code&gt;dst&lt;/code&gt;. Use &lt;code&gt;excludeDirs&lt;/code&gt; for anything else under the source root that isn’t part of the site — vendored tooling, scratch folders, generated assets you produce out-of-band, drafts kept outside &lt;code&gt;content/&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;excludeDirs &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;node_modules&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;scratch&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;assets/raw&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;layout-names&quot;&gt;Layout names&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;defaultLayout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;_default&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Fallback layout subfolder under &lt;code&gt;layoutDir&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;baseofLayout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;baseof&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Outer-shell layout filename (without extension)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fileLayout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;file&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Single-page layout filename&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;folderLayout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;folder&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Section-index layout filename&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;folderContent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;_index&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Filename (without extension) recognized as the section index&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;behavior&quot;&gt;Behavior&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;stripPrefix&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Strip leading numeric prefixes from filenames in URLs (&lt;code&gt;01-foo.md&lt;/code&gt; → &lt;code&gt;foo&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;headingShift&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Add this much to every markdown heading level. The default &lt;code&gt;2&lt;/code&gt; exists because layouts typically emit an outer &lt;code&gt;&amp;lt;h1&amp;gt;{{ .page.title }}&amp;lt;/h1&amp;gt;&lt;/code&gt; and most theme CSS expects body markdown to start at &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;. Set to &lt;code&gt;0&lt;/code&gt; when a theme renders the page heading from the markdown body itself.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;feeds&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Emit Atom and RSS feed files alongside the rendered HTML. Set &lt;code&gt;false&lt;/code&gt; for sites that don’t want feeds (single-page landings, internal wikis).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;navigation-nav&quot;&gt;Navigation — &lt;code&gt;nav&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Top-level array that drives &lt;code&gt;.site.toc&lt;/code&gt; (the sidebar / topbar nav).
When &lt;code&gt;nav&lt;/code&gt; is &lt;strong&gt;absent&lt;/strong&gt;, juicer auto-builds the nav by walking the
content tree. When &lt;code&gt;nav&lt;/code&gt; is set, juicer walks the array entries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;string&lt;/strong&gt; ending in a markdown extension (&lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.markdown&lt;/code&gt;,
&lt;code&gt;.mkd&lt;/code&gt;, &lt;code&gt;.mkdn&lt;/code&gt;, &lt;code&gt;.mdown&lt;/code&gt;) is a reference to a content file
(path relative to &lt;code&gt;contentDir&lt;/code&gt;). The page record at that path is
pulled into the nav at the array’s position.&lt;/li&gt;
&lt;li&gt;Any other &lt;strong&gt;string&lt;/strong&gt; is a section &lt;strong&gt;label&lt;/strong&gt; — a non-clickable
group heading.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;single-key table&lt;/strong&gt; maps an explicit label to a content path —
useful when the file’s frontmatter title isn’t the right label
for the nav.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;nav &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Getting Started&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;                       &lt;span class=&quot;hl-comment&quot;&gt;# label&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; label
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;getting-started/_index.md&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;             &lt;span class=&quot;hl-comment&quot;&gt;# link, title from frontmatter&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; link, title from frontmatter
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;getting-started/installation.md&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{&lt;/span&gt; &amp;quot;Get help&amp;quot; &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;getting-started/troubleshooting.md&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# link, explicit label&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; link, explicit label
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Reference&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;                             &lt;span class=&quot;hl-comment&quot;&gt;# label&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; label
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;reference/cli.md&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;reference/config.md&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The same array is also walked by themes’ “previous / next” partials
when &lt;code&gt;nav&lt;/code&gt; is set, so the order you write here is the order readers
flip through.&lt;/p&gt;
&lt;h3 id=&quot;i18n-languages-defaultlanguage&quot;&gt;i18n — &lt;code&gt;languages&lt;/code&gt;, &lt;code&gt;defaultLanguage&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Two opt-in keys that turn on multi-language mode. The engine doesn’t
duplicate content for you (one markdown file per language is still
the convention) — it surfaces the active language to templates so
themes can render language-aware chrome and pull strings from a
translation table.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;languages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;unset (single-language)&lt;/td&gt;&lt;td&gt;Array of language codes the site supports — &lt;code&gt;[&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;ja&amp;quot;]&lt;/code&gt;. When unset, juicer is in single-language mode and &lt;code&gt;.page.lang&lt;/code&gt; is the empty string.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;defaultLanguage&lt;/code&gt;&lt;/td&gt;&lt;td&gt;first entry / &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Language used when a page’s URL prefix doesn’t match any of &lt;code&gt;languages&lt;/code&gt;. Falls back to the first entry of &lt;code&gt;languages&lt;/code&gt; when not set.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Translation strings live in &lt;code&gt;&amp;lt;src&amp;gt;/i18n/&amp;lt;lang&amp;gt;.toml&lt;/code&gt;, one file per
declared language, as flat &lt;code&gt;key = &amp;quot;value&amp;quot;&lt;/code&gt; tables:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# i18n/en.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; i18n/en.toml
home          &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;
browse_docs   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Browse the docs&amp;quot;&lt;/span&gt;
read_more     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Read more&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-comment&quot;&gt;# i18n/fr.toml&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; i18n/fr.toml
home          &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Accueil&amp;quot;&lt;/span&gt;
browse_docs   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Parcourir la documentation&amp;quot;&lt;/span&gt;
read_more     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Lire la suite&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Templates look strings up with the &lt;code&gt;i18n&lt;/code&gt; helper, passing the page’s
language:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; i18n &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.lang&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;home&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/docs/&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; i18n &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.lang&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&apos;browse_docs&apos;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lookups fall back to &lt;code&gt;defaultLanguage&lt;/code&gt; when a key is missing in the
requested language; if the key is missing in both, the literal key
is returned (so a missing translation is visible during authoring
without crashing the build).&lt;/p&gt;
&lt;h3 id=&quot;blog-features&quot;&gt;Blog features&lt;/h3&gt;
&lt;p&gt;These keys turn on the blogging features documented under
&lt;a href=&quot;/../../concepts/blogging/&quot;&gt;Concepts → Blogging features&lt;/a&gt;. All four are opt-in;
a docs site that doesn’t set them renders unchanged.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;paginate&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Default slice size for section index pages. When unset, sections render in a single page no matter how many children they have.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sortBy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;weight&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Order section pages: &lt;code&gt;&amp;quot;date&amp;quot;&lt;/code&gt; (newest first), &lt;code&gt;&amp;quot;title&amp;quot;&lt;/code&gt; (alphabetical), or &lt;code&gt;&amp;quot;weight&amp;quot;&lt;/code&gt; (juicer’s default — &lt;code&gt;weight&lt;/code&gt; ascending)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dateArchives&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Emit &lt;code&gt;/&amp;lt;year&amp;gt;/&lt;/code&gt; and &lt;code&gt;/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&lt;/code&gt; archive pages from posts’ parsed dates. Requires matching &lt;code&gt;date-year.html&lt;/code&gt; / &lt;code&gt;date-month.html&lt;/code&gt; layouts; missing layouts are silent skips. Only pages with &lt;strong&gt;explicit&lt;/strong&gt; &lt;code&gt;date:&lt;/code&gt; frontmatter are included — mtime-fallback dates don’t pollute the archive.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dateFormat&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(none)&lt;/td&gt;&lt;td&gt;Reserved for future per-site date-format overrides. Not yet wired up; templates use the built-in &lt;code&gt;dateLong&lt;/code&gt; / &lt;code&gt;dateShort&lt;/code&gt; / &lt;code&gt;dateISO&lt;/code&gt; helpers for now.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Both &lt;code&gt;paginate&lt;/code&gt; and &lt;code&gt;sortBy&lt;/code&gt; can be overridden per-section by setting the same
key on the section’s &lt;code&gt;_index.md&lt;/code&gt; frontmatter. So a site that wants 10 posts
per page on &lt;code&gt;/posts/&lt;/code&gt; but 30 short notes per page on &lt;code&gt;/notes/&lt;/code&gt; puts
&lt;code&gt;paginate = 30&lt;/code&gt; in &lt;code&gt;content/notes/_index.md&lt;/code&gt; and leaves the site-wide value at
10.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;calendar-events-features&quot;&gt;Calendar / events features&lt;/h3&gt;
&lt;p&gt;Juicer surfaces a curated events list (&lt;code&gt;.site.events&lt;/code&gt;) and a 12-month
calendar grid (&lt;code&gt;.site.calendar&lt;/code&gt;) for any site that has a section of
event pages. See
&lt;a href=&quot;/../template-data/#siteevents&quot;&gt;Template data → &lt;code&gt;.site.events&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&quot;/../template-data/#sitecalendar&quot;&gt;&lt;code&gt;.site.calendar&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;eventsSection&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;events&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Name of the content section juicer treats as events. Pages in this section with explicit &lt;code&gt;date:&lt;/code&gt; frontmatter populate &lt;code&gt;.site.events&lt;/code&gt; and &lt;code&gt;.site.calendar&lt;/code&gt;. The site-wide future-post filter is also exempted for pages in this section so future-dated event detail pages still render to disk.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;calendarMonths&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;How many months &lt;code&gt;.site.calendar&lt;/code&gt; pre-computes, starting at the current month. Higher values cost build time and HTML size; lower values mean the calendar runs out sooner.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Recurring events are theme-and-template territory — the engine
recognizes &lt;code&gt;recurring: weekly&lt;/code&gt; plus an optional &lt;code&gt;recurringDay:&lt;/code&gt;
frontmatter on event pages and expands the event onto every matching
weekday in &lt;code&gt;.site.calendar&lt;/code&gt;. Without &lt;code&gt;recurringDay:&lt;/code&gt;, the recurrence
defaults to the start date’s day of the week.&lt;/p&gt;
&lt;h2 id=&quot;permalinks-url-templates-per-section&quot;&gt;&lt;code&gt;[permalinks]&lt;/code&gt; — URL templates per section&lt;/h2&gt;
&lt;p&gt;A TOML sub-table that overrides a section’s URL pattern. Each key is a
section name (the first path segment after &lt;code&gt;htmlDir&lt;/code&gt; is stripped); each
value is a template string with substitution tokens. Tokens are resolved
against the page’s frontmatter and parsed date.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;permalinks&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
posts &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:year/:month/:slug/&amp;quot;&lt;/span&gt;
notes &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:slug/&amp;quot;&lt;/span&gt;
articles &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:year/:section/:title/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Recognized tokens:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Token&lt;/th&gt;&lt;th&gt;Resolves to&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The cleaned filename (&lt;code&gt;01-foo.md&lt;/code&gt; → &lt;code&gt;foo&lt;/code&gt; when &lt;code&gt;stripPrefix = true&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;slugify(.page.title)&lt;/code&gt; — frontmatter title, lowercased and ASCII-folded&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:year&lt;/code&gt;&lt;/td&gt;&lt;td&gt;4-digit year from &lt;code&gt;.page.date&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:month&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2-digit month from &lt;code&gt;.page.date&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:day&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2-digit day from &lt;code&gt;.page.date&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:section&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The section name itself&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Sections &lt;strong&gt;without&lt;/strong&gt; a &lt;code&gt;[permalinks]&lt;/code&gt; entry keep juicer’s default
physical-path-derived URL (the file tree determines the URL one-to-one).
Section index pages (&lt;code&gt;_index.md&lt;/code&gt;) are never routed through permalink
templates — they always live at the section root.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Permalink templates change both the URL and the on-disk write location of
each affected page. Juicer doesn’t keep both copies — only the
permalinked path exists in the output tree. So a &lt;code&gt;posts/foo.md&lt;/code&gt; with
&lt;code&gt;posts = &amp;quot;:year/:slug/&amp;quot;&lt;/code&gt; writes only to &lt;code&gt;&amp;lt;dst&amp;gt;/2024/foo/index.html&lt;/code&gt;,
never to &lt;code&gt;&amp;lt;dst&amp;gt;/posts/foo/index.html&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;See &lt;a href=&quot;/../../concepts/blogging/#permalinks&quot;&gt;Concepts → Blogging features → Permalinks&lt;/a&gt;
for the narrative version.&lt;/p&gt;
&lt;h2 id=&quot;comments-comments-provider-config-slot&quot;&gt;&lt;code&gt;[comments]&lt;/code&gt; — comments-provider config slot&lt;/h2&gt;
&lt;p&gt;juicer never ships a comments backend. Sites that want comments declare
the provider and provider-specific keys under &lt;code&gt;[comments]&lt;/code&gt; in
&lt;code&gt;site.toml&lt;/code&gt;; theme partials read the config back as &lt;code&gt;.site.comments.*&lt;/code&gt;
and emit the right embed HTML.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;comments&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
provider &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;giscus&amp;quot;&lt;/span&gt;
repo     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;edadma/juicer&amp;quot;&lt;/span&gt;
repoId   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;R_kgDOXXXXXX&amp;quot;&lt;/span&gt;
category &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Announcements&amp;quot;&lt;/span&gt;
categoryId &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;DIC_kwDOXXXXXX&amp;quot;&lt;/span&gt;
mapping  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;pathname&amp;quot;&lt;/span&gt;
reactions &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
theme    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;preferred_color_scheme&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The only convention the engine cares about is the table name itself —
everything inside is opaque to juicer. Conventional keys for the common
providers:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Provider&lt;/th&gt;&lt;th&gt;Conventional keys&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;giscus&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;repo&lt;/code&gt;, &lt;code&gt;repoId&lt;/code&gt;, &lt;code&gt;category&lt;/code&gt;, &lt;code&gt;categoryId&lt;/code&gt;, &lt;code&gt;mapping&lt;/code&gt;, &lt;code&gt;reactions&lt;/code&gt;, &lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;utterances&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;repo&lt;/code&gt;, &lt;code&gt;issueTerm&lt;/code&gt;, &lt;code&gt;label&lt;/code&gt;, &lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;disqus&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;shortname&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Themes typically gate the embed on &lt;code&gt;{{ if .site.comments }}&lt;/code&gt; and on a
per-page &lt;code&gt;comments: false&lt;/code&gt; frontmatter override (so individual posts can
opt out of comments without unsetting the site-wide config). See
&lt;a href=&quot;/../template-data/#sitecomments&quot;&gt;Template data → &lt;code&gt;.site.comments&lt;/code&gt;&lt;/a&gt; for
the template-side contract.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;juicer is static-output-only — it doesn’t proxy comments, store
moderation state, or call the provider’s API. The block above is a
config slot only. If a provider needs server-side state, that belongs in
the provider’s own infrastructure, not in juicer.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;images-image-variant-generation&quot;&gt;&lt;code&gt;[images]&lt;/code&gt; — image variant generation&lt;/h2&gt;
&lt;p&gt;Opt-in build-time generation of resized + reformatted image variants
(&lt;code&gt;webp&lt;/code&gt;, &lt;code&gt;avif&lt;/code&gt;, etc.) for responsive &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;img srcset&amp;gt;&lt;/code&gt;
markup. The feature is &lt;strong&gt;disabled by default&lt;/strong&gt; — sites that don’t set
this table build byte-identically to pre-&lt;code&gt;[images]&lt;/code&gt; juicer.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;images&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
enabled  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
widths   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;320&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;640&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;960&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;1280&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
formats  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;&amp;quot;webp&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;original&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;   &lt;span class=&quot;hl-comment&quot;&gt;# most-modern first; &amp;quot;original&amp;quot; passes through&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; most-modern first; &amp;quot;original&amp;quot; passes through
quality  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;80&lt;/span&gt;
cacheDir &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;.image-cache&amp;quot;&lt;/span&gt;          &lt;span class=&quot;hl-comment&quot;&gt;# under dst; variants land here&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; under dst; variants land here&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;enabled&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Master switch. &lt;code&gt;false&lt;/code&gt; → templates that call &lt;code&gt;imageVariants&lt;/code&gt; get a passthrough-only set with no &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; rows.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;widths&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[320, 640, 960, 1280]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Target widths in pixels. Widths ≥ the source’s own width are dropped (no upscaling); the source’s exact width is always included.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;formats&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[&amp;quot;webp&amp;quot;, &amp;quot;original&amp;quot;]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Output formats in priority order. Known: &lt;code&gt;webp&lt;/code&gt;, &lt;code&gt;avif&lt;/code&gt;, &lt;code&gt;jpeg&lt;/code&gt;, &lt;code&gt;png&lt;/code&gt;, &lt;code&gt;original&lt;/code&gt;. Unknown names are dropped.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;quality&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;80&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Encoder quality (1–100). Used for lossy formats; &lt;code&gt;png&lt;/code&gt; ignores it.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cacheDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;quot;.image-cache&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Directory under &lt;code&gt;dst&lt;/code&gt; where generated variants live. Content-hashed filenames mean re-runs on unchanged sources skip the encoder shell-out.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Encoder.&lt;/strong&gt; Juicer shells out to ImageMagick (&lt;code&gt;magick&lt;/code&gt;) — install with
&lt;code&gt;brew install imagemagick&lt;/code&gt; / &lt;code&gt;apt install imagemagick&lt;/code&gt; /
&lt;code&gt;dnf install ImageMagick&lt;/code&gt;. When &lt;code&gt;magick&lt;/code&gt; is not on PATH the build still
succeeds, but &lt;code&gt;imageVariants&lt;/code&gt; returns a passthrough-only set (a single
advisory line prints to stderr). The Scala Native and Scala.js targets
ship a stub backend; full variant generation is JVM-only today.&lt;/p&gt;
&lt;p&gt;Template side: see
&lt;a href=&quot;/../template-syntax/#imagevariants-and-srcset&quot;&gt;Template syntax → &lt;code&gt;imageVariants&lt;/code&gt; and &lt;code&gt;srcset&lt;/code&gt;&lt;/a&gt;
for the helpers themes call.&lt;/p&gt;
&lt;h2 id=&quot;assets-sass-esbuild-pipeline&quot;&gt;&lt;code&gt;[assets]&lt;/code&gt; — Sass / esbuild pipeline&lt;/h2&gt;
&lt;p&gt;Opt-in build-time compilation of theme assets via two widely-available
CLIs: &lt;code&gt;sass&lt;/code&gt; for SCSS → CSS and &lt;code&gt;esbuild&lt;/code&gt; for JS bundling and
minification. Plus an optional fingerprinting flag that appends a
content-hash to output filenames so deploys can ship cache-busting URLs
without giving up long-lived &lt;code&gt;Cache-Control&lt;/code&gt; headers. &lt;strong&gt;Disabled by
default&lt;/strong&gt; — sites that don’t set this table build byte-identically to
pre-&lt;code&gt;[assets]&lt;/code&gt; juicer.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;assets&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
enabled     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;
fingerprint &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;assets.sass&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
input  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;src/site.scss&amp;quot;&lt;/span&gt;
output &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/css/site.css&amp;quot;&lt;/span&gt;
minify &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;assets.esbuild&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
input  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;src/main.js&amp;quot;&lt;/span&gt;
output &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/js/main.js&amp;quot;&lt;/span&gt;
minify &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;assets.copy&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
input  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;src/robots.txt&amp;quot;&lt;/span&gt;
output &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/robots.txt&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Top-level key&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;enabled&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Master switch. &lt;code&gt;false&lt;/code&gt; → no pipeline runs, the &lt;code&gt;asset&lt;/code&gt; builtin returns its input unchanged.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fingerprint&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;When &lt;code&gt;true&lt;/code&gt;, juicer inserts the output bytes’ content-hash before the extension: &lt;code&gt;/css/site.css&lt;/code&gt; → &lt;code&gt;/css/site.&amp;lt;16-hex&amp;gt;.css&lt;/code&gt;. The &lt;code&gt;asset&lt;/code&gt; builtin resolves to the fingerprinted URL automatically.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Entry tables (any number of each; use either inline-table shorthand or
&lt;code&gt;[[assets.kind]]&lt;/code&gt; array form):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Entry kind&lt;/th&gt;&lt;th&gt;Required keys&lt;/th&gt;&lt;th&gt;Optional keys&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[[assets.sass]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;input&lt;/code&gt;, &lt;code&gt;output&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;minify&lt;/code&gt;, &lt;code&gt;logical&lt;/code&gt;&lt;/td&gt;&lt;td&gt;SCSS / Sass → CSS via `sass –no-source-map [–style=expanded&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[[assets.esbuild]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;input&lt;/code&gt;, &lt;code&gt;output&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;minify&lt;/code&gt;, &lt;code&gt;logical&lt;/code&gt;&lt;/td&gt;&lt;td&gt;JS bundle via &lt;code&gt;esbuild &amp;lt;in&amp;gt; --bundle [--minify] --outfile=&amp;lt;out&amp;gt;&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[[assets.copy]]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;input&lt;/code&gt;, &lt;code&gt;output&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;logical&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Byte-for-byte copy (no tool involved). Useful when fingerprinting a file no compiler needs to touch.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;input&lt;/code&gt; is resolved under the source root; &lt;code&gt;output&lt;/code&gt; is a site-rooted
URL path (leading slash optional). &lt;code&gt;logical&lt;/code&gt; defaults to the basename
of &lt;code&gt;output&lt;/code&gt; — &lt;code&gt;/css/site.css&lt;/code&gt; becomes the manifest key &lt;code&gt;site.css&lt;/code&gt;,
which templates look up as &lt;code&gt;{{ asset &apos;site.css&apos; }}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool installation.&lt;/strong&gt; Juicer shells out to &lt;code&gt;sass&lt;/code&gt; (the dart-sass /
npm package; the Ruby &lt;code&gt;sass&lt;/code&gt; gem also works for the small flag subset
juicer uses) and &lt;code&gt;esbuild&lt;/code&gt;. Install with &lt;code&gt;brew install sass esbuild&lt;/code&gt; /
&lt;code&gt;npm install -g sass esbuild&lt;/code&gt; / your platform’s equivalent. When a
tool isn’t on PATH the build still succeeds: that entry degrades to a
verbatim copy of its source, the URL still resolves so templates
don’t break, and a single advisory line goes to stderr. Native and JS
targets ship stub backends; full pipeline execution is JVM-only today.&lt;/p&gt;
&lt;p&gt;Template side: see &lt;a href=&quot;/../template-data/#asset-builtin&quot;&gt;Template data → &lt;code&gt;asset&lt;/code&gt; builtin&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;authors-author-registry&quot;&gt;&lt;code&gt;[[authors]]&lt;/code&gt; — author registry&lt;/h2&gt;
&lt;p&gt;An array of tables describing the people who write posts on the site.
Each entry needs at least an &lt;code&gt;id&lt;/code&gt;; everything else is optional and
flows directly into &lt;code&gt;.page.author&lt;/code&gt; / &lt;code&gt;.page.authors&lt;/code&gt; records.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;authors&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
id     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;ed&amp;quot;&lt;/span&gt;
name   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Edward A Maxedon&amp;quot;&lt;/span&gt;
email  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;ed@example.com&amp;quot;&lt;/span&gt;
bio    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Writes a lot of code.&amp;quot;&lt;/span&gt;
avatar &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/ed.jpg&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;authors.links&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;GitHub&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://github.com/edadma&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Required&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;Stable url-safe identifier; archive lives at &lt;code&gt;/authors/&amp;lt;id&amp;gt;/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;td&gt;Display name&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;email&lt;/code&gt;&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;td&gt;Author email; useful in feed templates&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;bio&lt;/code&gt;&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;td&gt;Short bio used in bylines and author archive headers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;avatar&lt;/code&gt;&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;td&gt;URL of avatar image — site-relative or absolute&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;links[]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;td&gt;Each entry has &lt;code&gt;label&lt;/code&gt; and &lt;code&gt;url&lt;/code&gt;; renders as a list of external links&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pages reference an author via &lt;code&gt;author: &amp;lt;id&amp;gt;&lt;/code&gt; or &lt;code&gt;authors: [&amp;lt;id&amp;gt;, ...]&lt;/code&gt;
in their frontmatter. See
&lt;a href=&quot;/../../concepts/blogging/#author-registry&quot;&gt;Concepts → Blogging features → Author registry&lt;/a&gt;
for the full narrative.&lt;/p&gt;
&lt;h2 id=&quot;custom-keys&quot;&gt;Custom keys&lt;/h2&gt;
&lt;p&gt;Any key you set in &lt;code&gt;site.toml&lt;/code&gt; is available as &lt;code&gt;.site.&amp;lt;key&amp;gt;&lt;/code&gt; in templates. Use this for site-wide settings the theme exposes — e.g., &lt;code&gt;editURL&lt;/code&gt;, &lt;code&gt;discussionURL&lt;/code&gt;, &lt;code&gt;social.twitter&lt;/code&gt;. Themes typically document the keys they recognize in their README.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>CLI</title>
    <link href="https://juicer.build/reference/cli/"/>
    <id>https://juicer.build/reference/cli/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>The juicer command-line tool — build, serve, config, theme.</summary>
    <content type="html">&lt;p&gt;Juicer’s CLI has four subcommands: &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;serve&lt;/code&gt;, &lt;code&gt;config&lt;/code&gt;, and
&lt;code&gt;theme&lt;/code&gt; (with &lt;code&gt;add&lt;/code&gt; / &lt;code&gt;upgrade&lt;/code&gt; sub-subcommands). Every command runs
on JVM, Scala.js (Node), and Scala Native — &lt;code&gt;serve&lt;/code&gt; and its
live-reload watcher use &lt;a href=&quot;https://github.com/edadma/microserve&quot;&gt;microserve&lt;/a&gt;
for cross-platform HTTP and file-watching.&lt;/p&gt;
&lt;h2 id=&quot;global-options&quot;&gt;Global options&lt;/h2&gt;
&lt;p&gt;These apply to &lt;strong&gt;every&lt;/strong&gt; subcommand. Place them before the subcommand
name on the command line:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Flag&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-b&lt;/code&gt;, &lt;code&gt;--baseurl &amp;lt;URL&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Override &lt;code&gt;baseURL&lt;/code&gt; from the config — typically used in CI for environment-specific URLs (&lt;code&gt;https://staging.example.com/&lt;/code&gt; vs &lt;code&gt;https://example.com/&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-c&lt;/code&gt;, &lt;code&gt;--config &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Pick a baseline config: &lt;code&gt;simple&lt;/code&gt;, &lt;code&gt;standard&lt;/code&gt; (default), or &lt;code&gt;norme&lt;/code&gt;. Your &lt;code&gt;site.toml&lt;/code&gt; overlays on top of the chosen baseline.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-h&lt;/code&gt;, &lt;code&gt;--help&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Print usage and exit.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-v&lt;/code&gt;, &lt;code&gt;--verbose&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Print step-by-step build progress — layout selection, file walks, what’s being written where. Indispensable when a page is being silently skipped.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--version&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Print the version and exit.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run --baseurl https://staging.example.com/ build -s docs&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
sbt &apos;juicerJVM/run --config simple build -s notes&apos;
sbt &apos;juicerJVM/run -v build -s docs&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;build&quot;&gt;&lt;code&gt;build&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Render the site to disk. Output goes to &lt;code&gt;&amp;lt;src&amp;gt;/&amp;lt;publicDir&amp;gt;&lt;/code&gt; (default
&lt;code&gt;&amp;lt;src&amp;gt;/public/&lt;/code&gt;) unless &lt;code&gt;-d&lt;/code&gt; overrides.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run build -s docs&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
sbt &apos;juicerJVM/run build -s docs -d _site -b https://juicer.build/&apos;
sbt &apos;juicerJVM/run build -s blog -D -F&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Flag&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-s&lt;/code&gt;, &lt;code&gt;--source &amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site source directory.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;, &lt;code&gt;--dest &amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/&amp;lt;publicDir&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Output directory. Overrides the &lt;code&gt;publicDir&lt;/code&gt; config key.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-D&lt;/code&gt;, &lt;code&gt;--drafts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;off&lt;/td&gt;&lt;td&gt;Include pages with &lt;code&gt;draft: true&lt;/code&gt; frontmatter. Drafts are normally invisible to every downstream consumer — TOC, sitemap, search index, section listings.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-F&lt;/code&gt;, &lt;code&gt;--future&lt;/code&gt;&lt;/td&gt;&lt;td&gt;off&lt;/td&gt;&lt;td&gt;Include pages whose parsed &lt;code&gt;date:&lt;/code&gt; is past the current build time. Future-skip applies only to pages with &lt;strong&gt;explicit&lt;/strong&gt; &lt;code&gt;date:&lt;/code&gt; frontmatter — mtime-fallback dates are never future-skipped. Pages in the &lt;code&gt;eventsSection&lt;/code&gt; (default &lt;code&gt;events&lt;/code&gt;) are also exempt from future-skip.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The classic CI build, e.g. for a GitHub Pages workflow:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run build -s docs -d _site -b https://example.github.io/repo/&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;serve&quot;&gt;&lt;code&gt;serve&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Build the site once, then serve it on &lt;code&gt;localhost&lt;/code&gt;. Optionally watch
the source and rebuild on every change.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
sbt &apos;juicerJVM/run serve -s docs -L&apos;
sbt &apos;juicerJVM/run serve -s docs --host 0.0.0.0 -p 4000&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Flag&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-s&lt;/code&gt;, &lt;code&gt;--source &amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site source directory.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;, &lt;code&gt;--dest &amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;src&amp;gt;/&amp;lt;publicDir&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Output directory. Excluded from the live-reload watch loop so builds don’t trigger themselves.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--host &amp;lt;h&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;localhost&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Bind host. Use &lt;code&gt;0.0.0.0&lt;/code&gt; to expose the dev server on the LAN.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;, &lt;code&gt;--port &amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;8080&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Listen port. If the port is already bound, juicer scans up to 20 ports upward (&lt;code&gt;:8081&lt;/code&gt;, &lt;code&gt;:8082&lt;/code&gt;, …) and prints the actual port it landed on.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-D&lt;/code&gt;, &lt;code&gt;--drafts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;off&lt;/td&gt;&lt;td&gt;Include drafts (same semantics as &lt;code&gt;build -D&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-F&lt;/code&gt;, &lt;code&gt;--future&lt;/code&gt;&lt;/td&gt;&lt;td&gt;off&lt;/td&gt;&lt;td&gt;Include future-dated pages (same semantics as &lt;code&gt;build -F&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-L&lt;/code&gt;, &lt;code&gt;--live-reload&lt;/code&gt;&lt;/td&gt;&lt;td&gt;off&lt;/td&gt;&lt;td&gt;Watch the source recursively, rebuild on change, and live-reload connected browser tabs.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;live-reload-how-it-works&quot;&gt;Live reload — how it works&lt;/h3&gt;
&lt;p&gt;When &lt;code&gt;-L&lt;/code&gt; is on, every HTML response gets a tiny long-polling client
script injected before &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;. The script calls
&lt;code&gt;GET /__juicer/wait?since=&amp;lt;version&amp;gt;&lt;/code&gt;; the server holds each poll open
until the next rebuild (or 30s, whichever comes first) and responds
with &lt;code&gt;{reload, version}&lt;/code&gt;. The client calls &lt;code&gt;location.reload()&lt;/code&gt; on
&lt;code&gt;reload: true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Long-polling — not SSE — was chosen because SSE leaks a connection
during page-unload across browsers, and HTTP/1.1 connection-limit
pooling makes the failure mode look like “live-reload silently
stopped working.” A fresh &lt;code&gt;fetch&lt;/code&gt; per cycle has neither problem.&lt;/p&gt;
&lt;p&gt;The watcher is debounced at 150ms, so saving five files in rapid
succession results in one rebuild and one reload. Saves to the
output directory (&lt;code&gt;-d&lt;/code&gt;) are ignored to prevent build-triggers-itself
loops.&lt;/p&gt;
&lt;h2 id=&quot;config&quot;&gt;&lt;code&gt;config&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Print the resolved configuration after the chosen baseline,
&lt;code&gt;site.toml&lt;/code&gt; overlay, and CLI overrides are merged. Useful for
debugging “why is &lt;code&gt;htmlDir&lt;/code&gt; doing that?” — the answer is right
there in the printed config.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run config -s .&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
sbt &apos;juicerJVM/run --config simple config -s notes&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Flag&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-s&lt;/code&gt;, &lt;code&gt;--source &amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site source directory.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;theme-add&quot;&gt;&lt;code&gt;theme add&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Install a theme from a git repository into &lt;code&gt;&amp;lt;src&amp;gt;/&amp;lt;themeDir&amp;gt;/&lt;/code&gt;. After
running it, set &lt;code&gt;theme = &amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/code&gt; in your &lt;code&gt;site.toml&lt;/code&gt; to activate.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run theme add https://github.com/edadma/juicer.git -n juicerdocs&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
sbt &apos;juicerJVM/run theme add https://github.com/me/my-theme.git -r v1.2.0&apos;
sbt &apos;juicerJVM/run theme add https://github.com/edadma/juicer.git -n juicerblog --subdir docs/themes/juicerblog&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Flag&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;git-url&amp;gt;&lt;/code&gt; (positional)&lt;/td&gt;&lt;td&gt;required&lt;/td&gt;&lt;td&gt;HTTPS or SSH URL of the theme repository.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-s&lt;/code&gt;, &lt;code&gt;--source &amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site source directory. The theme is installed under &lt;code&gt;&amp;lt;src&amp;gt;/&amp;lt;themeDir&amp;gt;/&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-n&lt;/code&gt;, &lt;code&gt;--name &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;derived from URL/subdir&lt;/td&gt;&lt;td&gt;Directory name to install under. Required when juicer can’t infer a sensible name from the URL.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-r&lt;/code&gt;, &lt;code&gt;--ref &amp;lt;ref&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;repo HEAD&lt;/td&gt;&lt;td&gt;Branch, tag, or commit SHA to check out. Lock to a tag for reproducible builds.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--subdir &amp;lt;path&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;repo root&lt;/td&gt;&lt;td&gt;Install only this subdirectory of the cloned repo. Useful when one repo ships several themes (e.g. juicer ships all six under &lt;code&gt;docs/themes/&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--force&lt;/code&gt;&lt;/td&gt;&lt;td&gt;off&lt;/td&gt;&lt;td&gt;Overwrite an existing theme directory. Without this, an existing &lt;code&gt;&amp;lt;themeDir&amp;gt;/&amp;lt;name&amp;gt;/&lt;/code&gt; aborts the install.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The metadata for an &lt;code&gt;upgrade&lt;/code&gt; later (URL, ref, subdir) is recorded in
&lt;code&gt;&amp;lt;themeDir&amp;gt;/&amp;lt;name&amp;gt;/.juicer-theme.toml&lt;/code&gt;. Don’t commit that file is up
to you — it’s small, it’s plain TOML, and committing it means
collaborators get the same theme version after &lt;code&gt;git pull&lt;/code&gt; without
re-running &lt;code&gt;theme add&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;theme add&lt;/code&gt; only installs the theme directory.&lt;/strong&gt; You still have to
set &lt;code&gt;theme = &amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt; to activate it — juicer doesn’t
guess which of your installed themes you want active. Run
&lt;code&gt;juicer config -s .&lt;/code&gt; after editing &lt;code&gt;site.toml&lt;/code&gt; to verify the resolved
&lt;code&gt;theme&lt;/code&gt; value.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;theme-upgrade&quot;&gt;&lt;code&gt;theme upgrade&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Re-fetch one or every installed theme from the URL+ref recorded in
its &lt;code&gt;.juicer-theme.toml&lt;/code&gt;. Use this after the upstream theme has
shipped a fix and you want to pull it in.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run theme upgrade&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;
sbt &apos;juicerJVM/run theme upgrade juicerblog&apos;
sbt &apos;juicerJVM/run theme upgrade juicerblog -r v1.3.0&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Flag&lt;/th&gt;&lt;th&gt;Default&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; (positional)&lt;/td&gt;&lt;td&gt;every theme&lt;/td&gt;&lt;td&gt;Which theme to upgrade. Omitted = upgrade every theme that has a &lt;code&gt;.juicer-theme.toml&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-s&lt;/code&gt;, &lt;code&gt;--source &amp;lt;p&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site source directory.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;-r&lt;/code&gt;, &lt;code&gt;--ref &amp;lt;ref&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;recorded ref&lt;/td&gt;&lt;td&gt;Override the recorded ref for this upgrade only. Doesn’t rewrite &lt;code&gt;.juicer-theme.toml&lt;/code&gt; — the next bare &lt;code&gt;theme upgrade&lt;/code&gt; returns to the previously-recorded value unless you also re-run &lt;code&gt;theme add&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;exit-codes&quot;&gt;Exit codes&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Code&lt;/th&gt;&lt;th&gt;Meaning&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Success.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Any failure — bad source path, missing required config, parse error in &lt;code&gt;site.toml&lt;/code&gt;, template render error, git failure in &lt;code&gt;theme add&lt;/code&gt;/&lt;code&gt;upgrade&lt;/code&gt;. Run with &lt;code&gt;-v&lt;/code&gt; for the verbose stack trace.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content>
  </entry>
  <entry>
    <title>Blogging features</title>
    <link href="https://juicer.build/concepts/blogging/"/>
    <id>https://juicer.build/concepts/blogging/</id>
    <updated>2026-05-27T20:59:11.669095985Z</updated>
    <summary>Tags, categories, pagination, dates, reading time — the cluster of features that turn a juicer site into a blog.</summary>
    <content type="html">&lt;p&gt;Juicer’s docs-site features (sections, &lt;code&gt;_index.md&lt;/code&gt;, partials, themes) work fine for a blog as-is, but a real blog usually wants four extra things: a way to tag posts, archive pages that group posts by tag, paginated list pages so the front page doesn’t drag, and parsed publication dates so list pages can sort by recency. This page covers all of those, plus reading-time estimates and the bundled &lt;code&gt;juicerblog&lt;/code&gt; theme that exercises every feature.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Every feature on this page is &lt;strong&gt;opt-in&lt;/strong&gt;. A docs site that doesn’t set &lt;code&gt;tags&lt;/code&gt; frontmatter, doesn’t configure &lt;code&gt;paginate&lt;/code&gt;, and doesn’t supply &lt;code&gt;date&lt;/code&gt; frontmatter will render exactly the same after these features as before — same files, same URLs, byte-identical output.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;tags-and-categories&quot;&gt;Tags and categories&lt;/h2&gt;
&lt;p&gt;Add a &lt;code&gt;tags&lt;/code&gt; field to a post’s frontmatter to mark it. Either a list or a single string is accepted:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Whirlwind tour of Scala 3 enums&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2024-03-12&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A short note&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;meta&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two archive pages are emitted for each tag the site uses:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;URL pattern&lt;/th&gt;&lt;th&gt;What it lists&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/tags/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every tag the site uses, with post counts&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/tags/&amp;lt;slug&amp;gt;/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every post tagged with that one tag&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Tag names are slugified for URLs — lowercased, ASCII-folded (&lt;code&gt;café&lt;/code&gt; → &lt;code&gt;cafe&lt;/code&gt;), and any run of non-alphanumeric characters is collapsed into a single &lt;code&gt;-&lt;/code&gt;. So a tag named &lt;code&gt;&amp;quot;Functional Programming&amp;quot;&lt;/code&gt; becomes &lt;code&gt;/tags/functional-programming/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;categories&lt;/code&gt; is parsed identically and treated as a &lt;strong&gt;separate axis&lt;/strong&gt;. You can use both or neither — sites that want a single way to group posts pick one and ignore the other:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Setting up the studio&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2024-03-12&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;categories&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;behind-the-scenes&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;design&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That post would be reachable at &lt;code&gt;/categories/behind-the-scenes/&lt;/code&gt; and at both &lt;code&gt;/tags/meta/&lt;/code&gt; and &lt;code&gt;/tags/design/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;templates&quot;&gt;Templates&lt;/h3&gt;
&lt;p&gt;Tag and category archives need their own layouts. The &lt;code&gt;juicerblog&lt;/code&gt; theme ships a default pair; if you’re rolling your own theme, drop these two layouts under &lt;code&gt;layouts/_default/&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Layout file&lt;/th&gt;&lt;th&gt;What it renders&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tag-list.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The &lt;code&gt;/tags/&lt;/code&gt; index — full directory of every tag&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tag-page.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A single tag’s archive, e.g. &lt;code&gt;/tags/scala/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The same names with &lt;code&gt;category-list.html&lt;/code&gt; / &lt;code&gt;category-page.html&lt;/code&gt; cover the categories axis.&lt;/p&gt;
&lt;p&gt;The data your tag layouts see:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;terms&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;                 // List of every term — for tag-list.html
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;terms&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;         // &amp;quot;scala&amp;quot;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;terms&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;slug&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;         // &amp;quot;scala&amp;quot;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;terms&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;          // &amp;quot;/tags/scala/&amp;quot;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;terms&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;        // 7

&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;term&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;                  // The current term — for tag-page.html
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;term.name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;             // &amp;quot;scala&amp;quot;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;term.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;            // List of pages tagged with this term
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;term.pages&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;   // &amp;quot;Whirlwind tour of Scala 3 enums&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;If a layout is missing, the corresponding archive is silently skipped. So a docs site that ships no &lt;code&gt;tag-list.html&lt;/code&gt; and no &lt;code&gt;tag-page.html&lt;/code&gt; won’t get tag URLs even if you accidentally write &lt;code&gt;tags: [foo]&lt;/code&gt; somewhere.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;site-wide-template-access&quot;&gt;Site-wide template access&lt;/h3&gt;
&lt;p&gt;Templates that aren’t tag archives — say, your &lt;code&gt;topbar.html&lt;/code&gt; — can still iterate over every tag the site uses:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.tags&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;            // List of every tag, sorted by count desc
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.categories&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;      // Same shape, for categories&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each entry has &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;slug&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;pages&lt;/code&gt; — same shape as &lt;code&gt;.terms&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;pagination&quot;&gt;Pagination&lt;/h2&gt;
&lt;p&gt;A blog with thirty posts shouldn’t render every post on the front page. Set &lt;code&gt;paginate&lt;/code&gt; in &lt;code&gt;site.toml&lt;/code&gt; to chunk section index pages into multiple pages:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;paginate &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;10&lt;/span&gt;
sortBy &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That tells juicer:&lt;/p&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;slice-section-pages&quot;&gt;Slice section pages&lt;/h2&gt;
&lt;p&gt;For each section index page (every &lt;code&gt;_index.md&lt;/code&gt;), take the section’s child pages and split them into chunks of 10.&lt;/p&gt;
&lt;h2 id=&quot;render-slice-1-to-index-html&quot;&gt;Render slice 1 to &lt;code&gt;index.html&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The first chunk lands at the section’s natural URL — &lt;code&gt;/posts/index.html&lt;/code&gt;, &lt;code&gt;/index.html&lt;/code&gt; for the site root, etc.&lt;/p&gt;
&lt;h2 id=&quot;render-slices-2-n-to-page-n-index-html&quot;&gt;Render slices 2..N to &lt;code&gt;page/N/index.html&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The second chunk lands at &lt;code&gt;/posts/page/2/index.html&lt;/code&gt;, the third at &lt;code&gt;/posts/page/3/&lt;/code&gt;, and so on. Static-host friendly: every URL is a real directory with a real file.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If a section has fewer pages than &lt;code&gt;paginate&lt;/code&gt;, only the first slice is emitted and &lt;code&gt;total&lt;/code&gt; reads &lt;code&gt;1&lt;/code&gt; — your template doesn’t need to special-case that.&lt;/p&gt;
&lt;h3 id=&quot;sortby&quot;&gt;&lt;code&gt;sortBy&lt;/code&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Value&lt;/th&gt;&lt;th&gt;Order&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;quot;date&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.page.date&lt;/code&gt; descending (newest first); the blog default&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;quot;title&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.page.title&lt;/code&gt; ascending (alphabetical)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;quot;weight&amp;quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;weight&lt;/code&gt; frontmatter ascending — same as juicer’s default&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A page with &lt;code&gt;weight&lt;/code&gt; frontmatter overrides whichever sort the section uses, so you can pin a “Welcome” post above date-sorted listings.&lt;/p&gt;
&lt;h3 id=&quot;per-section-overrides&quot;&gt;Per-section overrides&lt;/h3&gt;
&lt;p&gt;Set &lt;code&gt;paginate&lt;/code&gt; or &lt;code&gt;sortBy&lt;/code&gt; on a section’s &lt;code&gt;_index.md&lt;/code&gt; frontmatter to override site-wide:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;---&lt;/span&gt;
title: Notes
paginate: 20
sortBy: title
---

A handful of short, alphabetised notes.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;templates&quot;&gt;Templates&lt;/h3&gt;
&lt;p&gt;The data layouts see — both &lt;code&gt;_index&lt;/code&gt; layouts and tag archives:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.current&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;     // 1-based index of THIS slice
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.total&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;       // total slice count
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;       // pages on THIS slice (already sliced)
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.first&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;       // URL of slice 1
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.last&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;        // URL of last slice
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.prevURL&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;     // empty string on slice 1
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.nextURL&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;     // empty string on the last slice&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A typical pagination footer:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.prevURL&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.prevURL&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;← Newer&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Page &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.current&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; of &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.total&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.nextURL&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;section.paginator.nextURL&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Older →&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dates&quot;&gt;Dates&lt;/h2&gt;
&lt;p&gt;Frontmatter &lt;code&gt;date&lt;/code&gt; is parsed into a real timestamp, not a passthrough string. Three input shapes are recognized:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Shape&lt;/th&gt;&lt;th&gt;Treated as&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2024-03-12T10:30:00Z&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Full ISO-8601 with offset&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2024-03-12T10:30:00&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Local datetime — assumed UTC&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2024-03-12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Plain date — midnight UTC&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If &lt;code&gt;date&lt;/code&gt; is absent, juicer falls back to the source markdown file’s filesystem mtime. That means a freshly-written post sorts correctly without you having to set &lt;code&gt;date&lt;/code&gt; explicitly.&lt;/p&gt;
&lt;h3 id=&quot;rendering&quot;&gt;Rendering&lt;/h3&gt;
&lt;p&gt;Three pre-formatted helpers ride alongside the parsed value, so templates don’t have to call format functions:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Example&lt;/th&gt;&lt;th&gt;Use for&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;OffsetDateTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Sorting, math&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.dateISO&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2024-03-12T00:00:00Z&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;time datetime=...&amp;gt;&lt;/code&gt; attributes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.dateLong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;March 12, 2024&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Body copy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.dateShort&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2024-03-12&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Compact list pages&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A standard post-meta line:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.dateISO&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.dateLong&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The long-form English month names (&lt;code&gt;January&lt;/code&gt;, &lt;code&gt;February&lt;/code&gt;, …) are hand-baked into juicer rather than driven by a locale-aware &lt;code&gt;DateTimeFormatter&lt;/code&gt;. The reason is purely practical: juicer’s Native build ships a minimal locale database and &lt;code&gt;MMMM&lt;/code&gt; falls back to &lt;code&gt;M01&lt;/code&gt;/&lt;code&gt;M02&lt;/code&gt; there. Hand-rolled month names render identically across the JVM, JS, and Native targets. If you need a non-English long format right now, write your own helper using &lt;code&gt;.page.dateShort&lt;/code&gt; plus your own month table.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;reading-time-and-word-count&quot;&gt;Reading time and word count&lt;/h2&gt;
&lt;p&gt;Two more fields automatically computed for every page:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.wordCount&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;Word count of the rendered HTML body (after shortcodes, before stripping)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.readingTime&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;Minutes — &lt;code&gt;ceil(wordCount / 200)&lt;/code&gt;, with a floor of 1 for non-empty pages&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The 200-words-per-minute figure is the Medium-popularized average. If you want a different cadence, render &lt;code&gt;wordCount&lt;/code&gt; directly and divide it yourself in the template:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.readingTime&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; min read&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;about &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.wordCount&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; words&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Empty pages get &lt;code&gt;wordCount = 0&lt;/code&gt; and &lt;code&gt;readingTime = 0&lt;/code&gt; so a stub &lt;code&gt;_index.md&lt;/code&gt; doesn’t say “1 min read” misleadingly.&lt;/p&gt;
&lt;h2 id=&quot;permalinks&quot;&gt;Permalinks&lt;/h2&gt;
&lt;p&gt;By default, the URL juicer emits for a page is one-to-one with its location
in the &lt;code&gt;content/&lt;/code&gt; tree: &lt;code&gt;content/posts/hello.md&lt;/code&gt; becomes &lt;code&gt;/posts/hello/&lt;/code&gt;.
That’s the right behaviour for docs sites where the file layout &lt;em&gt;is&lt;/em&gt; the
information architecture. For a blog, you usually want something different
— most blogs route every post through &lt;code&gt;/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;slug&amp;gt;/&lt;/code&gt;,
regardless of whether the post lives in &lt;code&gt;content/posts/&lt;/code&gt; or
&lt;code&gt;content/posts/scala/&lt;/code&gt; or &lt;code&gt;content/drafts/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Configure that with the &lt;code&gt;[permalinks]&lt;/code&gt; table in &lt;code&gt;site.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;permalinks&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
posts &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:year/:month/:slug/&amp;quot;&lt;/span&gt;
notes &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:slug/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each key is the &lt;strong&gt;section name&lt;/strong&gt; (the first path segment after &lt;code&gt;htmlDir&lt;/code&gt;
is stripped). Each value is a URL template with substitution tokens.
A post under &lt;code&gt;content/posts/2024-03-12-hello.md&lt;/code&gt; with
&lt;code&gt;date: 2024-03-12&lt;/code&gt; in its frontmatter renders to:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Default URL&lt;/th&gt;&lt;th&gt;With &lt;code&gt;posts = &amp;quot;:year/:month/:slug/&amp;quot;&lt;/code&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/posts/2024-03-12-hello/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/2024/03/2024-03-12-hello/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;(Tip: when you’re using date-prefixed permalinks, drop the date prefix
from the filename and let &lt;code&gt;stripPrefix&lt;/code&gt; do its job — keep the URL clean.)&lt;/p&gt;
&lt;h3 id=&quot;the-available-tokens&quot;&gt;The available tokens&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Token&lt;/th&gt;&lt;th&gt;Resolves to&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The cleaned filename (numeric prefixes stripped, non-alnum runs collapsed)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;slugify(.page.title)&lt;/code&gt; — frontmatter &lt;code&gt;title&lt;/code&gt; lowercased and ASCII-folded&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:year&lt;/code&gt;&lt;/td&gt;&lt;td&gt;4-digit year from &lt;code&gt;.page.date&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:month&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2-digit month from &lt;code&gt;.page.date&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:day&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2-digit day from &lt;code&gt;.page.date&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;:section&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The section name itself — useful in nested patterns like &lt;code&gt;:year/:section/:slug/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;:title&lt;/code&gt; and &lt;code&gt;:slug&lt;/code&gt; are usually different — the slug comes from the
filename (so &lt;code&gt;01-getting-started.md&lt;/code&gt; becomes &lt;code&gt;getting-started&lt;/code&gt;), the
title comes from the &lt;code&gt;title:&lt;/code&gt; frontmatter (so &lt;code&gt;&amp;quot;Getting Started&amp;quot;&lt;/code&gt; becomes
&lt;code&gt;getting-started&lt;/code&gt; too, but &lt;code&gt;&amp;quot;Café au Lait&amp;quot;&lt;/code&gt; becomes &lt;code&gt;cafe-au-lait&lt;/code&gt;).
Use &lt;code&gt;:title&lt;/code&gt; when filenames are opaque or numbered and you want
human-readable URLs anyway:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;permalinks&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
posts &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:year/:title/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;section-index-pages-stay-put&quot;&gt;Section index pages stay put&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;_index.md&lt;/code&gt; files are &lt;strong&gt;never&lt;/strong&gt; routed through a permalink template. Even
when &lt;code&gt;posts = &amp;quot;:year/:slug/&amp;quot;&lt;/code&gt; is set, the &lt;code&gt;posts/_index.md&lt;/code&gt; page still
lives at &lt;code&gt;/posts/&lt;/code&gt;, not at &lt;code&gt;/2024/posts/&lt;/code&gt;. The reason is structural: the
&lt;code&gt;_index.md&lt;/code&gt; describes a section, not a piece of content, and a section’s
URL has to be predictable so links in your nav and breadcrumbs keep
working.&lt;/p&gt;
&lt;h3 id=&quot;sections-you-don-t-list-keep-their-default-url&quot;&gt;Sections you don’t list keep their default URL&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;[permalinks]&lt;/code&gt; is a &lt;strong&gt;map of overrides&lt;/strong&gt;, not an all-or-nothing switch.
Sections that aren’t keys in the table render at their default
physical-path URL. So a site with both blog posts (under permalinked
&lt;code&gt;/posts/&lt;/code&gt;) and prose pages (&lt;code&gt;about.md&lt;/code&gt;, &lt;code&gt;contact.md&lt;/code&gt; at the root) just
lists &lt;code&gt;posts&lt;/code&gt; in &lt;code&gt;[permalinks]&lt;/code&gt; and leaves the rest alone:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;permalinks&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
posts &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:year/:month/:slug/&amp;quot;&lt;/span&gt;
&lt;span class=&quot;hl-comment&quot;&gt;# `about.md` is still at /about/, `contact.md` still at /contact/.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;#&lt;/span&gt; `about.md` is still at /about/, `contact.md` still at /contact/.&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-tip&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;If a permalink template uses &lt;code&gt;:year&lt;/code&gt; / &lt;code&gt;:month&lt;/code&gt; / &lt;code&gt;:day&lt;/code&gt; for a post that
has no &lt;code&gt;date:&lt;/code&gt; frontmatter, juicer falls back to the source markdown
file’s filesystem mtime. That means a freshly written post gets the
current date even when you forgot to set frontmatter — convenient for
drafts, but worth being aware of when you &lt;code&gt;git mv&lt;/code&gt; files and find the URL
shifted.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;what-happens-on-disk&quot;&gt;What happens on disk&lt;/h3&gt;
&lt;p&gt;Permalink templates change both the URL and the on-disk write location:
juicer doesn’t keep two copies of the page. So with
&lt;code&gt;posts = &amp;quot;:year/:month/:slug/&amp;quot;&lt;/code&gt;, a post writes only to
&lt;code&gt;&amp;lt;dst&amp;gt;/2024/03/hello/index.html&lt;/code&gt;; the legacy &lt;code&gt;&amp;lt;dst&amp;gt;/posts/hello/&lt;/code&gt;
directory is never created. (If you set &lt;code&gt;htmlDir = &amp;quot;html&amp;quot;&lt;/code&gt; in
&lt;code&gt;site.toml&lt;/code&gt;, the path is &lt;code&gt;&amp;lt;dst&amp;gt;/html/2024/03/hello/index.html&lt;/code&gt;, since
&lt;code&gt;htmlDir&lt;/code&gt; is the filesystem prefix that gets stripped from URLs.)&lt;/p&gt;
&lt;h2 id=&quot;date-archives&quot;&gt;Date archives&lt;/h2&gt;
&lt;p&gt;Most blogs eventually want a “browse posts by date” navigation: an archive
page for each year, optionally with a sub-archive for each month. Turn it
on with one line in &lt;code&gt;site.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;dateArchives &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Juicer then emits two kinds of pages, gated independently by the
presence of their layouts:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Layout&lt;/th&gt;&lt;th&gt;URL pattern&lt;/th&gt;&lt;th&gt;What it lists&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;_default/date-year.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/&amp;lt;year&amp;gt;/index.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every dated post in that year, plus a per-month roll-up&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;_default/date-month.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/index.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every dated post in that year + month&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Both layouts are optional. Ship the year layout to get year-only
archives; ship both for full month granularity; ship neither and
&lt;code&gt;dateArchives = true&lt;/code&gt; does nothing visible.&lt;/p&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Only pages with &lt;strong&gt;explicit&lt;/strong&gt; &lt;code&gt;date:&lt;/code&gt; frontmatter make it into the
archives. Pages whose &lt;code&gt;.page.date&lt;/code&gt; came from the filesystem mtime
fallback are excluded — otherwise a docs site that turns the feature
on would suddenly find every reference page in the current year’s
archive. The rule is “if you set a date, you’re in; if you didn’t,
you’re not.”&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;year-archive-data&quot;&gt;Year-archive data&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;date-year.html&lt;/code&gt; layout sees:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;year&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;                // 2024 (BigDecimal)
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;               // every dated post in 2024, newest first
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;pages&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;      // most recent post&apos;s title
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;months&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;              // per-month roll-up, ascending by month number
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;month&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;     // 1 (BigDecimal)
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;monthName&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; // &amp;quot;January&amp;quot;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;       // &amp;quot;/2024/01/&amp;quot;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;     // 4 (BigDecimal)
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;months&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;     // pages in that month, newest first&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A typical year-archive layout:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;year&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ol&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; m &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;months&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; m&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; m&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;monthName&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;(&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; m&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; posts)&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ol&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;month-archive-data&quot;&gt;Month-archive data&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;date-month.html&lt;/code&gt; layout sees:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;year&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;        // 2024
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;month&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;       // 3 (BigDecimal)
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;monthName&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;   // &amp;quot;March&amp;quot;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;       // posts in March 2024, newest first&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;monthName&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;year&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ol&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; p &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;dateISO&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;dateShort&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; p&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ol&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;combining-with-permalinks&quot;&gt;Combining with permalinks&lt;/h3&gt;
&lt;p&gt;Date archives compose cleanly with permalink templates: the URL space
remains hierarchical and unique. With:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;dateArchives &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-variable&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;permalinks&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
posts &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;:year/:month/:slug/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;a single post with &lt;code&gt;date: 2024-03-15&lt;/code&gt; lives at &lt;code&gt;/2024/03/hello/&lt;/code&gt;, and
archive pages cover that same prefix:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;URL&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/2024/03/hello/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The single post&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/2024/03/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;March 2024 archive&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/2024/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2024 year archive&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;There’s no collision because permalink output paths and archive paths
land in different places — a permalinked post writes to
&lt;code&gt;/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;slug&amp;gt;/index.html&lt;/code&gt;, while the year archive writes to
&lt;code&gt;/&amp;lt;year&amp;gt;/index.html&lt;/code&gt; and the month archive to
&lt;code&gt;/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/index.html&lt;/code&gt;. The directory structure interleaves
cleanly.&lt;/p&gt;
&lt;h2 id=&quot;series-multi-part-posts&quot;&gt;Series / multi-part posts&lt;/h2&gt;
&lt;p&gt;Some posts read better as a series — three parts on debugging, four on
setting up a project, twelve on writing your own OS. Juicer joins
related posts into a navigable series via two frontmatter fields:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;OS Internals, Part 1 — The Boot Process&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;series&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;OS Internals&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;seriesOrder&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;OS Internals, Part 2 — The Memory Subsystem&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;series&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;OS Internals&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;seriesOrder&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pages with the same &lt;code&gt;series&lt;/code&gt; value (case-sensitive, exact match) are
linked. Each one sees a &lt;code&gt;.page.series&lt;/code&gt; block:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.series.name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The series name as it appears in frontmatter&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.series.pages&lt;/code&gt;&lt;/td&gt;&lt;td&gt;List of every page in the series, ordered&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.series.prev&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Previous page’s record, or &lt;code&gt;null&lt;/code&gt; on the first&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.series.next&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Next page’s record, or &lt;code&gt;null&lt;/code&gt; on the last&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.series.index&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1-based position of the current page&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.series.total&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Number of pages in the series&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A typical “in this series” sidebar:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.series&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;aside&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;In this series&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.series.name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Part &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.series.index&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; of &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.series.total&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;.&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ol&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; s &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.series.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; s&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; s&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;ol&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;aside&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;juicerblog&lt;/code&gt; theme ships exactly this widget as the
&lt;code&gt;partials/series-nav.html&lt;/code&gt; partial; &lt;code&gt;_default/file.html&lt;/code&gt; calls it after
the post body. Override it from your site’s &lt;code&gt;partials/&lt;/code&gt; if you want
custom copy.&lt;/p&gt;
&lt;h3 id=&quot;ordering-rules&quot;&gt;Ordering rules&lt;/h3&gt;
&lt;p&gt;Within a series, pages sort by:&lt;/p&gt;
&lt;div class=&quot;juicer-steps&quot;&gt;
  &lt;h2 id=&quot;seriesorder-ascending&quot;&gt;&lt;code&gt;seriesOrder&lt;/code&gt; ascending&lt;/h2&gt;
&lt;p&gt;Pages with explicit &lt;code&gt;seriesOrder&lt;/code&gt; come first in the order they declare.
A page with &lt;code&gt;seriesOrder: 2&lt;/code&gt; sorts before one with &lt;code&gt;seriesOrder: 5&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;date-ascending-oldest-first&quot;&gt;Date ascending (oldest first)&lt;/h2&gt;
&lt;p&gt;Pages WITHOUT a &lt;code&gt;seriesOrder&lt;/code&gt; sort by &lt;code&gt;.page.date&lt;/code&gt; ascending. Series
usually read chronologically — older posts before newer ones — and the
ascending direction matches that.&lt;/p&gt;
&lt;h2 id=&quot;filename-as-a-stable-tiebreaker&quot;&gt;Filename, as a stable tiebreaker&lt;/h2&gt;
&lt;p&gt;Two unordered same-day posts fall back to filename order, so the result
is deterministic regardless of filesystem walk order.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;A page can be in &lt;strong&gt;at most one&lt;/strong&gt; series — &lt;code&gt;series:&lt;/code&gt; is a string, not a
list. If you need a multi-membership relationship, that’s exactly what
&lt;code&gt;tags&lt;/code&gt; is for. Series is for narratively-linked posts that share a
single arc.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;author-registry&quot;&gt;Author registry&lt;/h2&gt;
&lt;p&gt;A single-author blog can lean on &lt;code&gt;.site.author&lt;/code&gt; from &lt;code&gt;site.toml&lt;/code&gt; and
call it a day. A multi-author site needs more: per-author bio, avatar,
external links, and an archive page that lists each author’s posts.&lt;/p&gt;
&lt;p&gt;Declare authors as an array of tables:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;authors&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
id     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;ed&amp;quot;&lt;/span&gt;
name   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Edward A Maxedon&amp;quot;&lt;/span&gt;
email  &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;ed@example.com&amp;quot;&lt;/span&gt;
bio    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Writes a lot of code.&amp;quot;&lt;/span&gt;
avatar &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/ed.jpg&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;authors.links&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;GitHub&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://github.com/edadma&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;authors.links&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
label &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Mastodon&amp;quot;&lt;/span&gt;
url   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;https://hachyderm.io/@edadma&amp;quot;&lt;/span&gt;

&lt;span class=&quot;hl-punctuation&quot;&gt;[[&lt;/span&gt;authors&lt;span class=&quot;hl-punctuation&quot;&gt;]]&lt;/span&gt;
id     &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;alice&amp;quot;&lt;/span&gt;
name   &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Alice Smith&amp;quot;&lt;/span&gt;
bio    &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;Does a lot of design.&amp;quot;&lt;/span&gt;
avatar &lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;&amp;quot;/img/alice.jpg&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then point a post at one (or more) of the registered ids:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A solo post&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;ed&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A co-authored post&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;authors&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;ed&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;alice&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;author:&lt;/code&gt; is the singular shorthand; &lt;code&gt;authors:&lt;/code&gt; is the multi-author
form. Either works. Templates see both fields, normalised:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.author&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Map?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;First (or only) resolved author record, or &lt;code&gt;null&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.authors&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;List[Map]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;All resolved author records — empty list when none&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each record carries every key from the registry — &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;bio&lt;/code&gt;,
&lt;code&gt;avatar&lt;/code&gt;, &lt;code&gt;links[]&lt;/code&gt; — so a per-post byline can render the avatar, name,
and external links directly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.author&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;byline&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.author.avatar&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.author.avatar&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.author.name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.author.bio&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;bio&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.author.bio&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;A frontmatter &lt;code&gt;author:&lt;/code&gt; value that doesn’t match any registry id falls
back to a stub record &lt;code&gt;{id: &amp;quot;&amp;lt;typo&amp;gt;&amp;quot;}&lt;/code&gt;. Templates that read
&lt;code&gt;.page.author.name&lt;/code&gt; get an empty string rather than a hard failure —
the build doesn’t break on a typo, but the author archive is empty.
Audit &lt;code&gt;.site.authors&lt;/code&gt; if a name disappears unexpectedly.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;author-archives&quot;&gt;Author archives&lt;/h3&gt;
&lt;p&gt;Two archive pages per author registry are emitted, each gated by an
optional layout:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Layout&lt;/th&gt;&lt;th&gt;URL pattern&lt;/th&gt;&lt;th&gt;What it lists&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;_default/author-list.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/authors/index.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every author with at least one referencing post&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;_default/author-page.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/authors/&amp;lt;id&amp;gt;/index.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;One author’s posts, newest first&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The &lt;code&gt;author-list.html&lt;/code&gt; layout sees:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;authors&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;                  // List of records, in registry order
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;authors&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;authors&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;           // &amp;quot;/authors/ed/&amp;quot;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;authors&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;         // 12
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;authors&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl-number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;         // their posts (already date-desc)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;author-page.html&lt;/code&gt; layout sees:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;                   // single record
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;author.name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;author.bio&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;author.count&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;author.pages&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;             // posts, newest first&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Authors with &lt;strong&gt;zero&lt;/strong&gt; referencing posts are omitted from both archives —
keeps a partially-populated &lt;code&gt;[[authors]]&lt;/code&gt; registry from emitting empty
“see all posts by Bob” pages.&lt;/p&gt;
&lt;h3 id=&quot;site-authors&quot;&gt;&lt;code&gt;.site.authors&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Like &lt;code&gt;.site.tags&lt;/code&gt; and &lt;code&gt;.site.categories&lt;/code&gt;, the same author records are
exposed site-wide for use in any template:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;for&lt;/span&gt; a &lt;span class=&quot;hl-keyword&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;site.authors&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; a&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; a&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; (&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; a&lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;)&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Useful for a “contributors” list in a footer or about page.&lt;/p&gt;
&lt;h2 id=&quot;aliases-redirects&quot;&gt;Aliases / redirects&lt;/h2&gt;
&lt;p&gt;When you change a post’s URL — by editing its filename, adding a
&lt;code&gt;[permalinks]&lt;/code&gt; template, or renaming a section — every link to the old
URL breaks. Aliases stop the bleeding without server-side rewrites.&lt;/p&gt;
&lt;p&gt;Add the old URL(s) to the new page’s frontmatter:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;Setting up a Scala 3 project&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;2024-03-12&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;aliases&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/old-blog-name/setting-up-scala/&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/2023/setting-up/&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Juicer emits a small static HTML page at each listed URL. The page sets
a &lt;code&gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot;&amp;gt;&lt;/code&gt; to the canonical URL, plus a visible
fallback link in case the meta refresh is blocked:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;en&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;UTF-8&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;http-equiv&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;refresh&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;0; url=/posts/setting-up-scala-3/&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;canonical&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;https://example.com/posts/setting-up-scala-3/&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Redirecting…&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;This page has moved. Redirecting to &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;/posts/setting-up-scala-3/&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;/posts/setting-up-scala-3/&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;.&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’s the &lt;strong&gt;built-in default&lt;/strong&gt;. It works without any theme. If you
want different markup — branded styling, custom copy, JavaScript
fallback — drop a layout at &lt;code&gt;layouts/_default/alias.html&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;hl-keyword&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;en&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;UTF-8&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;http-equiv&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;refresh&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;0; url=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;canonical&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;absTarget&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt; — moved&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;This page has moved&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;target&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;Continue to &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page.title&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The custom layout has access to:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;What&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.target&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-relative canonical URL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.absTarget&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Absolute canonical URL (&lt;code&gt;baseURL&lt;/code&gt; + &lt;code&gt;.target&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.page.&amp;lt;...&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Every field of the canonical page’s record&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.site.&amp;lt;...&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The full site context&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Aliases accept a single string or a list:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;aliases: /old-url/&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;aliases:
  - /old-url/
  - /even-older-url/&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;Aliases are not the same as URL rewriting. Each alias is a real static
HTML file in the output tree — &lt;code&gt;&amp;lt;dst&amp;gt;/old-url/index.html&lt;/code&gt;,
&lt;code&gt;&amp;lt;dst&amp;gt;/even-older-url/index.html&lt;/code&gt;, etc. That’s the point: it works on
any static host (GitHub Pages, Cloudflare Pages, S3, Netlify…) without
edge-rule configuration. Cost is one tiny HTML file per alias.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;opengraph-twitter-cards&quot;&gt;OpenGraph / Twitter cards&lt;/h2&gt;
&lt;p&gt;When a post is shared on social media, the platform renders a “card”
preview built from a small block of &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags in the page’s
&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. Juicer ships a &lt;code&gt;{{ ogTags .page }}&lt;/code&gt; template builtin that
emits the canonical block in one line:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-squiggly&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;
  ...
  &lt;span class=&quot;hl-punctuation&quot;&gt;{{&lt;/span&gt; ogTags &lt;span class=&quot;hl-punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;hl-variable&quot;&gt;page&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That call expands to:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;og:type&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;og:title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;The post title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;og:url&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;https://example.com/posts/the-post/&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;og:description&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;The post summary.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;og:image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;https://example.com/img/hero.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;og:site_name&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;My blog&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;twitter:card&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;summary_large_image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;twitter:title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;The post title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;twitter:description&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;The post summary.&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;hl-function&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;twitter:image&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-function&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl-string&quot;&gt;https://example.com/img/hero.jpg&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl-punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tags whose source field is empty are omitted (you don’t get an empty
&lt;code&gt;&amp;lt;meta property=&amp;quot;og:image&amp;quot; content=&amp;quot;&amp;quot; /&amp;gt;&lt;/code&gt; cluttering the output).&lt;/p&gt;
&lt;h3 id=&quot;resolution-rules&quot;&gt;Resolution rules&lt;/h3&gt;
&lt;p&gt;For each value the builtin needs, it tries fields in priority order:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Tag&lt;/th&gt;&lt;th&gt;Resolution chain&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;og:title&lt;/code&gt;, &lt;code&gt;twitter:title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.page.ogTitle&lt;/code&gt; → &lt;code&gt;.page.title&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;og:description&lt;/code&gt;, &lt;code&gt;twitter:description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.page.ogDescription&lt;/code&gt; → &lt;code&gt;.page.description&lt;/code&gt; → &lt;code&gt;.page.summary&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;og:image&lt;/code&gt;, &lt;code&gt;twitter:image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.page.ogImage&lt;/code&gt; → &lt;code&gt;.page.image&lt;/code&gt; → &lt;code&gt;.site.ogImage&lt;/code&gt; → &lt;code&gt;.site.image&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;og:url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.page.permalink&lt;/code&gt; (always present — the absolute URL juicer computed)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;og:site_name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.site.title&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;twitter:card&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;summary_large_image&lt;/code&gt; if an image was resolved, otherwise &lt;code&gt;summary&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Image URLs are promoted to absolute via the configured &lt;code&gt;baseURL&lt;/code&gt; — a
site-relative &lt;code&gt;/img/hero.jpg&lt;/code&gt; becomes
&lt;code&gt;https://example.com/img/hero.jpg&lt;/code&gt;. Crawlers typically reject relative
URLs in &lt;code&gt;og:image&lt;/code&gt;, so this matters.&lt;/p&gt;
&lt;h3 id=&quot;per-page-overrides&quot;&gt;Per-page overrides&lt;/h3&gt;
&lt;p&gt;To set a different card title or summary than the page’s own title and
summary, add &lt;code&gt;ogTitle&lt;/code&gt; / &lt;code&gt;ogDescription&lt;/code&gt; / &lt;code&gt;ogImage&lt;/code&gt; to the post’s
frontmatter:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A long, descriptive, SEO-targeted post title&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A long summary that&apos;s good for the page&apos;s own list-page meta…&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogTitle&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A short, punchy title for social cards&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogDescription&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;A different summary that fits in a card preview.&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;ogImage&lt;/span&gt;&lt;span class=&quot;hl-punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;hl-string&quot;&gt;/img/posts/short-title-card.png&lt;/span&gt;
&lt;span class=&quot;hl-function&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;juicer-callout juicer-callout-note&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;juicer-callout-body&quot;&gt;&lt;p&gt;The &lt;code&gt;juicerblog&lt;/code&gt; theme calls &lt;code&gt;{{ ogTags .page }}&lt;/code&gt; from its
&lt;code&gt;partials/head.html&lt;/code&gt;, so every page gets the meta block automatically
without you doing anything in the post itself. Sites that want to
control the call site (or skip it for some pages) can override the
partial.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;the-juicerblog-theme&quot;&gt;The &lt;code&gt;juicerblog&lt;/code&gt; theme&lt;/h2&gt;
&lt;p&gt;Juicer ships a default blog theme under &lt;code&gt;themes/juicerblog/&lt;/code&gt; that exercises every feature on this page — plus server-side syntax highlighting, author bylines, series progress badges, a reading-progress hairline, code-block copy buttons, and a homepage / archive layout pair. The full theme reference lives in its own section: see &lt;a href=&quot;/themes/juicerblog/&quot;&gt;juicerblog&lt;/a&gt; for the overview and &lt;a href=&quot;/themes/juicerblog/configuration/&quot;&gt;juicerblog · Configuration&lt;/a&gt; for the full config knobs, frontmatter conventions, syntax-highlighting setup, and override patterns.&lt;/p&gt;
&lt;p&gt;The fastest way to see every blog feature working together is the bundled demo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;hl-function&quot;&gt;sbt&lt;/span&gt; &apos;juicerJVM/run serve -s docs/demos/juicerblog -L&lt;span class=&quot;hl-string&quot;&gt;&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That spins up a live preview of &lt;code&gt;docs/demos/juicerblog/&lt;/code&gt; — 9 dated posts spanning Jul–Dec 2024, three authors with a multi-author co-byline, a 3-post series, dateArchives + permalinks + aliases, syntax highlighting, the works. Touch any markdown file in the source and the page reloads in under a second.&lt;/p&gt;
&lt;h2 id=&quot;where-each-feature-lives&quot;&gt;Where each feature lives&lt;/h2&gt;
&lt;p&gt;When a feature breaks, here’s where to start looking:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Engine&lt;/th&gt;&lt;th&gt;Theme&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Tags / categories&lt;/td&gt;&lt;td&gt;&lt;code&gt;App.scala&lt;/code&gt; &lt;code&gt;collectTaxonomy&lt;/code&gt;, &lt;code&gt;renderTaxonomyArchives&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;tag-list.html&lt;/code&gt;, &lt;code&gt;tag-page.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pagination&lt;/td&gt;&lt;td&gt;&lt;code&gt;paginate.scala&lt;/code&gt;, render-loop slicing in &lt;code&gt;App.scala&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;partials/pagination.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Dates&lt;/td&gt;&lt;td&gt;&lt;code&gt;App.scala&lt;/code&gt; &lt;code&gt;parseDateString&lt;/code&gt;, &lt;code&gt;formatDateLong&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;partials/post-meta.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Reading time&lt;/td&gt;&lt;td&gt;&lt;code&gt;App.scala&lt;/code&gt; &lt;code&gt;wordsOf&lt;/code&gt;, &lt;code&gt;readingTimeOf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Anywhere &lt;code&gt;.page.readingTime&lt;/code&gt; is used&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Slug helper&lt;/td&gt;&lt;td&gt;&lt;code&gt;package.scala&lt;/code&gt; &lt;code&gt;slugify&lt;/code&gt;, &lt;code&gt;asciiFold&lt;/code&gt;&lt;/td&gt;&lt;td&gt;(used internally for tag URLs)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content>
  </entry>
</feed>
