<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Juicer</title>
  <link href="https://juicer.run/feed.xml" rel="self"/>
  <link href="https://juicer.run/"/>
  <id>https://juicer.run/feed.xml</id>
  <updated>2026-05-07T23:55:58.03149558Z</updated>
  <author><name>Ed Maxedon</name></author>
  <entry>
    <title>Themes</title>
    <link href="https://juicer.run/concepts/themes/"/>
    <id>https://juicer.run/concepts/themes/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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;juicerdocs-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 = &amp;quot;juicerdocs&amp;quot;
&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 = [&amp;quot;my-overrides&amp;quot;, &amp;quot;juicerdocs&amp;quot;]
&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;div class=&quot;jd-callout jd-callout-tip not-prose&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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;juicerdocs-tabs not-prose&quot; data-juicerdocs-tabs&gt;
&lt;div class=&quot;juicerdocs-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-html&quot;&gt;{{ partial &apos;topbar&apos; . }}
{{ partial &apos;topbar&apos; .page }}
&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;juicerdocs-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;juicerdocs-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;building-your-own&quot;&gt;Building your own&lt;/h2&gt;
&lt;p&gt;The juicerdocs source is a good reference. It uses every theme primitive, so reading through &lt;code&gt;themes/juicerdocs/&lt;/code&gt; end-to-end is a quick tour of the conventions.&lt;/p&gt;
&lt;a href=&quot;https://github.com/edadma/juicer&quot; class=&quot;juicerdocs-github not-prose&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;w-6 h-6 shrink-0&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;flex flex-col min-w-0&quot;&gt;
    &lt;span class=&quot;font-semibold text-zinc-900 dark:text-zinc-100 truncate&quot;&gt;edadma/juicer&lt;/span&gt;
    &lt;span class=&quot;text-xs text-zinc-500 dark:text-zinc-500&quot;&gt;GitHub repository&lt;/span&gt;
  &lt;/div&gt;
&lt;/a&gt;</content>
  </entry>
  <entry>
    <title>Templates</title>
    <link href="https://juicer.run/concepts/templates/"/>
    <id>https://juicer.run/concepts/templates/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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;juicerdocs-steps my-8&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;juicerdocs-tabs not-prose&quot; data-juicerdocs-tabs&gt;
&lt;div class=&quot;juicerdocs-tab-panel&quot; data-tab-label=&quot;baseof.html&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;{{ .page.title }}&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  {{ partial &apos;topbar&apos; . }}
  &amp;lt;main&amp;gt;
    {{ block main . }}{{ .content }}{{ end }}
  &amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicerdocs-tab-panel&quot; data-tab-label=&quot;file.html&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;{{ define main }}
  &amp;lt;article class=&amp;quot;prose&amp;quot;&amp;gt;
    &amp;lt;h1&amp;gt;{{ .page.title }}&amp;lt;/h1&amp;gt;
    {{ .content }}
  &amp;lt;/article&amp;gt;
{{ end }}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicerdocs-tab-panel&quot; data-tab-label=&quot;folder.html&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;{{ define main }}
  &amp;lt;article class=&amp;quot;prose&amp;quot;&amp;gt;
    &amp;lt;h1&amp;gt;{{ .page.title }}&amp;lt;/h1&amp;gt;
    {{ .content }}
  &amp;lt;/article&amp;gt;
&lt;p&gt;&amp;lt;ul&amp;gt;
{{ for p &amp;lt;- .section.pages }}
&amp;lt;li&amp;gt;&amp;lt;a href=”{{ p.url }}”&amp;gt;{{ p.title }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
{{ end }}
&amp;lt;/ul&amp;gt;
{{ end }}
&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&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.page.next&lt;/code&gt;, &lt;code&gt;.page.prev&lt;/code&gt; — sibling navigation&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;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.run/reference/template-syntax/"/>
    <id>https://juicer.run/reference/template-syntax/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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&gt;{{ .name }}              value at .name in the data context
{{ .page.title }}        nested
{{ .args[0] }}           list element by index (in shortcodes)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;conditionals&quot;&gt;Conditionals&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{{ if .page.summary }}
  &amp;lt;p class=&amp;quot;lead&amp;quot;&amp;gt;{{ .page.summary }}&amp;lt;/p&amp;gt;
{{ end }}

{{ if .page.draft }}
  &amp;lt;span class=&amp;quot;badge&amp;quot;&amp;gt;Draft&amp;lt;/span&amp;gt;
{{ else }}
  &amp;lt;span class=&amp;quot;badge&amp;quot;&amp;gt;Published&amp;lt;/span&amp;gt;
{{ end }}
&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&gt;{{ if .page.prev or .page.next }}
  &amp;lt;nav&amp;gt;...&amp;lt;/nav&amp;gt;
{{ end }}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;loops&quot;&gt;Loops&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{{ for p &amp;lt;- .section.pages }}
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;{{ p.url }}&amp;quot;&amp;gt;{{ p.title }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
{{ end }}

{{ for k, v &amp;lt;- .page }}
  {{ k }}: {{ v }}
{{ end }}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;partials&quot;&gt;Partials&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{{ partial &apos;topbar&apos; . }}              call partials/topbar.html with the current data
{{ partial &apos;page-toc&apos; .page }}        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&gt;{{ define main }}
  &amp;lt;article&amp;gt;{{ .content }}&amp;lt;/article&amp;gt;
{{ end }}

{{ block main . }}{{ .content }}{{ end }}    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&gt;{{ trim .page.summary }}
{{ .page.summary | trim }}
{{ .name | upper }}
{{ .x | replace &apos;foo&apos; &apos;bar&apos; }}
&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;juicer-specific-helpers&quot;&gt;Juicer-specific helpers&lt;/h2&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;relURL &apos;...&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Site-relative URL (prepends &lt;code&gt;baseURL.path&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;absURL &apos;...&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Absolute URL (prepends &lt;code&gt;baseURL.base + baseURL.path&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;markdownify &apos;...&apos;&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 &apos;...&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;:smile:&lt;/code&gt; → 😄 substitution&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&gt;{{ // squiggly&apos;s not too noisy in templates }}
&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>Template data</title>
    <link href="https://juicer.run/reference/template-data/"/>
    <id>https://juicer.run/reference/template-data/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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.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;/tbody&gt;
&lt;/table&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.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.&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;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;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;/tbody&gt;
&lt;/table&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;jd-callout jd-callout-note not-prose&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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.run/concepts/shortcodes/"/>
    <id>https://juicer.run/concepts/shortcodes/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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;jd-callout jd-callout-note not-prose&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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;jd-callout jd-callout-tip not-prose&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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;jd-callout jd-callout-warning not-prose&quot;&gt;
  &lt;strong&gt;Warning&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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;jd-callout jd-callout-danger not-prose&quot;&gt;
  &lt;strong&gt;Danger&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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;juicerdocs-tabs not-prose&quot; data-juicerdocs-tabs&gt;
&lt;div class=&quot;juicerdocs-tab-panel&quot; data-tab-label=&quot;JVM&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sbt &apos;juicerJVM/run build -s docs&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicerdocs-tab-panel&quot; data-tab-label=&quot;Native&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;juicer build -s docs
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;juicerdocs-tab-panel&quot; data-tab-label=&quot;Node&quot;&gt;
  &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;node ./juicer-cli.js build -s docs
&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;juicerdocs-steps my-8&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;juicerdocs-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;px-1.5 py-0.5 rounded border jd-border jd-surface text-xs font-mono&quot;&gt;Ctrl+K&lt;/kbd&gt;
to focus search. Tag your alpha pages with &lt;span class=&quot;inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium jd-brand-soft&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;not-prose my-4 rounded-lg border jd-border jd-surface-2 [&amp;[open]&gt;summary]:border-b [&amp;[open]&gt;summary]:jd-border&quot;&gt;
  &lt;summary class=&quot;cursor-pointer px-4 py-2 font-medium jd-fg select-none hover:jd-surface&quot;&gt;
    Why no JSON frontmatter?
  &lt;/summary&gt;
  &lt;div class=&quot;px-4 py-3 prose prose-sm max-w-none&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;not-prose my-4 rounded-lg border jd-border jd-surface-2 [&amp;[open]&gt;summary]:border-b [&amp;[open]&gt;summary]:jd-border&quot;&gt;
  &lt;summary class=&quot;cursor-pointer px-4 py-2 font-medium jd-fg select-none hover:jd-surface&quot;&gt;
    What about TOML frontmatter?
  &lt;/summary&gt;
  &lt;div class=&quot;px-4 py-3 prose prose-sm max-w-none&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;not-prose flex flex-wrap gap-3 my-6&quot;&gt;
&lt;a href=&quot;/getting-started/&quot; class=&quot;jd-btn jd-btn-primary&quot;&gt;
  Get started
&lt;/a&gt;
&lt;a href=&quot;https://github.com/edadma/juicer&quot; class=&quot;jd-btn jd-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; class=&quot;juicerdocs-github not-prose&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
  &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;w-6 h-6 shrink-0&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;flex flex-col min-w-0&quot;&gt;
    &lt;span class=&quot;font-semibold text-zinc-900 dark:text-zinc-100 truncate&quot;&gt;edadma/juicer&lt;/span&gt;
    &lt;span class=&quot;text-xs text-zinc-500 dark:text-zinc-500&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-html&quot;&gt;&amp;lt;div class=&amp;quot;my-callout&amp;quot;&amp;gt;
  {{ markdownify .content }}
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>Quickstart</title>
    <link href="https://juicer.run/getting-started/quickstart/"/>
    <id>https://juicer.run/getting-started/quickstart/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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;mkdir my-site
cd my-site
&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   = &amp;quot;My Site&amp;quot;
author  = &amp;quot;You&amp;quot;
baseURL = &amp;quot;http://localhost:8080&amp;quot;
&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;mkdir -p layouts/_default
&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-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;{{ .page.title }} – {{ .site.title }}&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1&amp;gt;{{ .page.title }}&amp;lt;/h1&amp;gt;
  {{ .content }}
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;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-html&quot;&gt;{{ partial &apos;folder&apos; . }}
&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;mkdir content
&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;---
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;sbt &apos;juicerJVM/run serve -s . -d public&apos;
&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.run/concepts/markdown/"/>
    <id>https://juicer.run/concepts/markdown/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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

[Link text](https://juicer.run/) and ![alt](https://placehold.co/40x40 &amp;quot;title&amp;quot;).
&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;| Tier | What&apos;s in it |
|------|--------------|
| 1 | site.pages, page URLs, drafts, sitemap, summary |
| 2 | live reload, render hooks, RSS, sections, i18n, themes |
&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;- [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.run/&quot;&gt;https://juicer.run/&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;&amp;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-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;{{ .page.title }}&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;main class=&amp;quot;prose&amp;quot;&amp;gt;{{ .content }}&amp;lt;/main&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-scala&quot;&gt;// Squiggly&apos;s Go-template-style syntax compiles down to a small AST.
case class TemplateRenderer(
  partials:   TemplateLoader = _ =&amp;gt; None,
  data:       Map[String, Any] = Map.empty,
  functions:  Map[String, TemplateFunction] = Map.empty,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# A code block tagged `bash` gets a &amp;quot;BASH&amp;quot; badge and copy button.
sbt &apos;juicerJVM/run serve -s docs -L&apos;
&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;/p&gt; &lt;a href=&quot;#fnref-numbers&quot; class=&quot;footnote-backref&quot;&gt;&amp;#8617;&lt;/a&gt;&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content>
  </entry>
  <entry>
    <title>Installation</title>
    <link href="https://juicer.run/getting-started/installation/"/>
    <id>https://juicer.run/getting-started/installation/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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;git clone https://github.com/edadma/juicer.git
cd juicer
sbt &apos;juicerJVM/run --help&apos;
&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; (TODO).&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 += &amp;quot;io.github.edadma&amp;quot; %%% &amp;quot;juicer&amp;quot; % &amp;quot;0.1.0&amp;quot;
&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;examples/minimal&lt;/code&gt; directory in the repo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sbt &apos;juicerJVM/run build -s examples/minimal&apos;
ls examples/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>Content files</title>
    <link href="https://juicer.run/concepts/content-files/"/>
    <id>https://juicer.run/concepts/content-files/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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;juicerdocs-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;---
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;jd-callout jd-callout-note not-prose&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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;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;sbt &apos;juicerJVM/run serve -s docs -D&apos;
&lt;/code&gt;&lt;/pre&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;juicerdocs-steps my-8&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.run/juicerdocs/configuration/"/>
    <id>https://juicer.run/juicerdocs/configuration/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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           = &amp;quot;My Project&amp;quot;
author          = &amp;quot;Acme Inc.&amp;quot;
baseURL         = &amp;quot;https://docs.acme.example/&amp;quot;

theme           = &amp;quot;juicerdocs&amp;quot;
headingShift    = 0
showCopyright   = true

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

# Dark-mode overrides (optional; sensible defaults derived from the lights)
brandDark       = &amp;quot;#60a5fa&amp;quot;
brandStrongDark = &amp;quot;#93c5fd&amp;quot;
brandSoftDark   = &amp;quot;rgb(59 130 246 / .12)&amp;quot;
accentDark      = &amp;quot;#22d3ee&amp;quot;
leafDark        = &amp;quot;#34d399&amp;quot;
&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;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;jd-callout jd-callout-tip not-prose&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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.
&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>Configuration</title>
    <link href="https://juicer.run/reference/config/"/>
    <id>https://juicer.run/reference/config/</id>
    <updated>2026-05-07T23:55:58.03149558Z</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;jd-callout jd-callout-tip not-prose&quot;&gt;
  &lt;strong&gt;Tip&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&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;/tbody&gt;
&lt;/table&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 (1-clamped)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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.run/reference/cli/"/>
    <id>https://juicer.run/reference/cli/</id>
    <updated>2026-05-07T23:55:58.03149558Z</updated>
    <summary>The juicer command-line tool — build, serve, config.</summary>
    <content type="html">&lt;p&gt;Juicer’s CLI has three subcommands: &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;serve&lt;/code&gt;, and &lt;code&gt;config&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;global-options&quot;&gt;Global options&lt;/h2&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&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; / &lt;code&gt;norme&lt;/code&gt;); default is &lt;code&gt;standard&lt;/code&gt;&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&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;h2 id=&quot;build&quot;&gt;&lt;code&gt;build&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Build the site to &lt;code&gt;&amp;lt;src&amp;gt;/public/&lt;/code&gt; (or &lt;code&gt;-d &amp;lt;dst&amp;gt;&lt;/code&gt; to override).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sbt &apos;juicerJVM/run build -s . -d public&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;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;Site source directory (default: &lt;code&gt;.&lt;/code&gt;)&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;Output directory (default: &lt;code&gt;&amp;lt;src&amp;gt;/&amp;lt;publicDir&amp;gt;&lt;/code&gt;)&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;Include &lt;code&gt;draft: true&lt;/code&gt; pages&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;serve&quot;&gt;&lt;code&gt;serve&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Build, then start a local HTTP server.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sbt &apos;juicerJVM/run serve -s . -p 8080&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;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;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;Output directory&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;Bind host (default: &lt;code&gt;localhost&lt;/code&gt;)&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;Listen port (default: &lt;code&gt;8080&lt;/code&gt;)&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;Include drafts&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;jd-callout jd-callout-note not-prose&quot;&gt;
  &lt;strong&gt;Note&lt;/strong&gt;
  &lt;div class=&quot;jd-callout-body prose prose-sm max-w-none&quot;&gt;&lt;p&gt;&lt;code&gt;serve&lt;/code&gt; is currently JVM-only — &lt;code&gt;com.sun.net.httpserver&lt;/code&gt; doesn’t exist on Scala.js or Native. The build itself works on all three platforms; serving is the lone JVM exception.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;config&quot;&gt;&lt;code&gt;config&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Print the merged site config (after baseline + overlay + CLI overrides).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sbt &apos;juicerJVM/run config -s .&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Useful for debugging “why is my &lt;code&gt;htmlDir&lt;/code&gt; doing that?” — the answer is right there in the printed config.&lt;/p&gt;</content>
  </entry>
</feed>
