Juicer
English

Configuration

site.toml keys juicerportfolio reads, per-page project frontmatter, and the [juicerportfolio] palette table.

juicerportfolio reads its configuration from three places:

  • A small set of top-level site keys (the same ones every juicer theme uses, plus a few portfolio-specific ones for the topbar / footer / filter chips).
  • A namespaced [juicerportfolio] table for theme-specific palette + sizing overrides.
  • Per-project frontmatter — projects opt into the project layout with layout: project, then set hero / meta / gallery fields the layout knows about.

Quick example

A minimal site.toml that produces a credible portfolio:

title    = "Studio Name"
tagline  = "Industrial design, Lisbon"
author   = "Studio Name"
baseURL  = "https://example.com"
theme    = "juicerportfolio"

[[topnav]]
label = "Work"
url   = "/"

[[topnav]]
label = "About"
url   = "/about/"

[contact]
email    = "studio@example.com"
location = "Lisbon, Portugal"

[[links]]
label = "Instagram"
url   = "https://instagram.com/example"

A minimal project page (content/work/my-project.md):

---
title: Tobias Lounge
layout: project
year: "2024"
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.

That’s enough to render the home grid, the project page with its meta sidebar, and the project body. Add category, gallery, link to unlock the rest.

Top-level keys

Standard juicer keys plus a few portfolio-specific ones.

KeyTypeDefaultNotes
titleStringrequiredBrand text in topbar + footer; <title> element.
taglineStringunsetItalic subtitle next to the brand in the topbar; appended to <title> when the page title equals the site title.
descriptionStringunsetDefault <meta name="description"> for pages that don’t set their own summary.
authorStringunsetFooter name + copyright line. Falls back to title.
baseURLStringrequiredStandard juicer key.
themeStringrequiredSet to "juicerportfolio".
faviconStringunsetPath to a favicon.
hideJuicerCreditBooleanfalseSet true to remove the “Built with juicer” line in the footer.
customCSS[String]unsetSite stylesheets loaded after the theme CSS. See Theming → Layer 2.
topnavArrayunsetTopbar nav links: [[topnav]] rows of {label, url}. Note: keyed topnav because top-level nav is reserved by juicer for table-of-contents config.
workCategoriesArrayunsetFilter chips above the work grid: [[workCategories]] rows of {label, value}. Projects with category = "<value>" match the chip.
contactObjectunset{email, location} — surfaced in the footer brand block.
linksArrayunsetFooter external-link list: [[links]] rows of {label, url}.

Palette + token overrides — [juicerportfolio]

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 Theming — juicerportfolio follows the same pattern as the other themes.

KeyCSS variableDefaultNotes
brand--brand#c4633b (warm rust)The single accent — link hover, active filter chip, project meta link, blockquote rule.
brandStrong--brand-strong#8a3f22Hover-emphasis on brand-coloured elements.
brandSoft--brand-soft#f4e6dcSubtle paper-tinted backgrounds.
accent--accent#2b2620 (near-black)Reserved; not used by Stage-1/2 sections.
brandDark--brand (dark)#d6845fLifted rust for dark backgrounds.
brandStrongDark--brand-strong (dark)#f0a982
brandSoftDark--brand-soft (dark)rgba(214,132,95,0.16)
accentDark--accent (dark)#ede7d9
fontSans--font-sanssystem-ui stackBody / UI / nav face.
fontSerif--font-serifIowan Old Style stackProject titles, brand, page titles.
fontMono--font-monosystem mono stackMaterials chips, code in writeups.
measure--measure62chProse column max-width on file.html / folder.html.
gutter--gutter1.5remOuter padding around content blocks.
radiusLg--radius-lg0.375remLarge border-radius (cards, hero images).
logo(none)unsetPath to a small image; rendered next to the brand name in the topbar.

Per-project frontmatter

Projects opt into the project layout by setting layout: project. The home grid filters by exactly that flag, so anything else (about, contact, CV) is hidden from the project listing automatically.

KeyTypeWhat
layoutStringproject to opt in. Required for the home grid + project layout.
titleStringThe project name. Required.
dateDateDrives sortBy = "date" ordering across the grid + the prev/next reading order.
yearStringDisplay-only year (e.g. "2024" or "2023–2024"). Appears on the home card byline and in the meta sidebar. Quote it; TOML reads bare 2024 as an integer.
taglineStringOne-line subtitle on the home card under the title.
summaryStringItalic subtitle directly under the title on the project page; also <meta name="description">.
categoryStringMatches a value in one of the [[workCategories]] rows. Drives the home-page filter chips.
roleStringWhat you did on the project. Renders as a meta-sidebar row. Optional.
clientStringWho the project was for. Omit for self-initiated work.
tools[String]Materials / techniques / software list. Renders as small chips in the meta sidebar under “Materials”.
linkObject{label, url} — external link in the meta sidebar (live site, shop, github, etc.).
heroStringURL of the hero image at the top of the project page. Also used as the home-card thumbnail.
heroAltStringAlt text for the hero image. Falls back to the title.
captionStringItalic caption under the hero image.
gallery[Object]List of {src, alt, caption} images rendered as a 2-up figure grid below the body. Section silently omits if absent.

Per-page frontmatter (non-project)

Most other pages on a portfolio site use the default file.html layout (about, contact, CV, press) or folder.html for section indexes (/work/_index.md, /press/_index.md).

KeyTypeWhat
titleStringPage heading + <title>.
summaryStringItalic subtitle under the page title; also <meta name="description">.
dateDateSort key for folder.html listings. Optional on prose pages.
langStringSets <html lang> for the page. Defaults to en.

Prev / next reading order

Project pages get ← Previous / Next → nav at the bottom, sourced from the engine’s .page.prev / .page.next fields. The reading order is a depth-first traversal anchored at the root section, so the project series only links across siblings if /work/ itself has an _index.md to anchor it. Without that anchor, every project’s .page.prev and .page.next are null and the nav block silently omits.

The demo’s content/work/_index.md is intentionally minimal — it doubles as a text-list archive of all projects via folder.html. If you don’t want a /work/ archive page rendered, set static: true in the _index.md frontmatter (excluded from .site.posts) — it still anchors the section for the prev/next math.

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

description = "Independent designer in Halifax, working in print + the screen."
ogImage     = "/og/portrait.jpg"

robots   = true
noindex  = false
disallow = ["/scratch/"]

# Optional: Person JSON-LD on the homepage. Drives Google's Knowledge# Optional: Person JSON-LD on the homepage. Drives Google's Knowledge
# Panel for an individual.# Panel for an individual.
[person]
name     = "Ada Hopper"           # defaults to .site.title when omitted# defaults to .site.title when omitted
jobTitle = "Graphic designer & illustrator"
image    = "/img/portrait.jpg"
email    = "hello@adahopper.com"
sameAs   = ["https://github.com/adahopper", "https://dribbble.com/adahopper"]

Per-page frontmatter

---
title: Field guide cover series
summary: A one-sentence dek for search results and OG cards.
image: /img/projects/field-guide.jpg   # used by ogTags AND CreativeWork JSON-LD
ogTitle: A snappier social headline
ogDescription: Tightened for socials
noindex: true   # excluded from sitemap, JSON-LD suppressed, <meta robots> emitted
---

Structured data emitted

PageSchema
Root sectionWebSite (+ Person when [person] is set in site.toml)
Project page with imageCreativeWork (name, url, image, description, dateCreated)
Any page with ancestorsBreadcrumbList

noindex: true suppresses ALL JSON-LD on that page.

Overriding the SEO partial

Drop a file at <src>/partials/seo.html (or seo-jsonld.html for just the structured-data part). Site overrides win over the theme’s copy.

Search

Esc
to navigate to open Esc to close