HugoBlog

cyberlavandatea — Hugo Blog Template

By fundor333

CyberLavandaTea is a dark-only Hugo blog theme for development and code blogs, built with Tailwind CSS v4, with built-in IndieWeb/POSSE features, multiple feeds, and client-side search.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-07View source

What stands out

A quick read of the recorded project description.

01

Dark-only mode; theme.js locks the dark class before first paint, with no light toggle

02

Layouts use plain CSS and render correctly even without Tailwind content detection enabled; utility classes are retained for customization

03

The palette is defined in Tailwind @theme with six roles (primary green, content, link blue, visited, background, inactive), with surface and border derived from opacity

04

Provides RSS, Atom, JSON Feed 1.1, humans.txt, and a dynamic robots.txt; search is based on the SearchIndex output and a client-side Lunr index

05

Built-in IndieWeb/POSSE templates and scripts for Webmention, IndieAuth, Mastodon comments, Brid.gy Publish, and syndication

06

Content types include micro, photos, weeknote, event, now, and series, with Microformats2 and multiple response types

Template Details

CyberLavandaTea is a Hugo theme published by fundor333, positioned for development/code blogs. It provides only a dark appearance with no light toggle: assets/js/theme.js locks class="dark" before first paint. Layouts are written in plain CSS and render correctly even without Tailwind content detection enabled; Tailwind utility classes are retained for customization.

The theme requires Hugo 0.146 or later extended (using the new _partials/, _shortcodes/, _markup/ template system) and processes styles via @tailwindcss/cli together with Hugo's css.TailwindCSS, so a Node environment is required. Installation supports Hugo Module (recommended) or Git submodule.

For site configuration, Hugo merges the theme's params, related, services, mediaTypes, and build, but does not merge outputs, outputFormats, taxonomies, security, or markup; these blocks from the example configuration must be copied into the site's own hugo.toml. The theme includes an exampleSite for running a local demo.

Features cover common blog structures: baseof/main blocks, home, list grouped by year, single, 404, taxonomy, and term templates; the head includes meta, OG, Twitter, JSON-LD BlogPosting, canonical, hreflang, and rel=first/last/prev/next. Content types include micro, photos, weeknote, event, now, and series, with Microformats2 markup and reply/repost/like/bookmark/rsvp response types.

For syndication and discovery, it provides RSS, Atom, JSON Feed 1.1, humans.txt, and a dynamic robots.txt; search is generated via the SearchIndex output to /search.json and performed client-side with Lunr. IndieWeb capabilities include Webmention (client-rendered reactions and comments via webmention.io), optional IndieAuth endpoints, Mastodon comments and toot embeds, Brid.gy Publish, syndication display, and small-web elements such as 88×31 badges, webring, quote boxes, backlinks, and related.

The theme bundles Lunr, DOMPurify, and webmention.js locally in assets/js/vendor/ with fingerprinting; Font Awesome, KaTeX, and Google Fonts are optional external dependencies. The palette is defined in the Tailwind @theme in assets/css/main.css, with six roles: primary (green), content, link (blue), visited, background, and inactive, plus surface and border derived from opacity; Chroma syntax highlighting is limited to green and blue plus two tones, with an optional red error color. Fonts load from Google Fonts by default (Audiowide for display, Rajdhani for body) and can be self-hosted.

HugoBlog

Is it right for your project?

Use Cases

  • Building a personal blog focused on code and development notes, with a default dark, restrained reading interface
  • Publishing multiple content types such as short posts, photos, weeknotes, events, and now pages, each with its own template
  • Wanting the blog to support IndieWeb practices such as Webmention, IndieAuth, Mastodon comments, and POSSE distribution
  • Needing RSS, Atom, JSON Feed, and client-side search so readers can subscribe and find content in multiple ways
  • Adding small-web elements such as 88×31 badges, webring, quote boxes, and backlinks to the site

Suitable For

  • Developer blogs using Hugo 0.146+ extended and accepting a Node build for Tailwind styles
  • Sites that prefer a single dark appearance and do not need a light theme toggle
  • Personal site authors interested in IndieWeb, POSSE, and Microformats2
  • Blogs that need multiple feed formats and in-site client-side search
  • Sites with many content types (short posts, photos, weeknotes, events, etc.) that want them rendered separately

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Requires Hugo 0.146 or later extended and @tailwindcss/cli installed at the site root

  2. 2

    Recommended to add the theme as a Hugo Module; it can also be installed via Git submodule into themes/cyberlavandatea

  3. 3

    outputs, outputFormats, taxonomies, security, and markup are not merged from the theme configuration; copy the example configuration into the site's hugo.toml

  4. 4

    Using css.TailwindCSS requires allowing node, npx, tailwindcss, and similar commands in security.exec.allow

  5. 5

    To have Tailwind generate utility classes for custom content, enable hugo_stats.json and reference it via @source in main.css; otherwise add extra classes to safelist.txt

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version in the public repository under the MIT license; the free scope is the code of that version and does not mean external services or third-party assets are free.

Must comply with when using

  • Free use, modification, commercial use, and distribution of this version's code are permitted.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked against their own licenses; the code's MIT license alone is not sufficient.
  • External services such as domains, hosting, databases, payments, or AI may incur separate charges.
  • The theme provides only a dark appearance with no light mode toggle and cannot be configured as a light theme.
  • Must be built with Hugo 0.146 or later extended; the standard version cannot be used.
  • Building styles requires a Node environment and @tailwindcss/cli installed, otherwise Tailwind cannot be processed via css.TailwindCSS.
  • The theme configuration does not merge outputs, outputFormats, taxonomies, security, or markup; these must be manually copied into the site configuration.
  • Font Awesome, KaTeX, and Google Fonts are optional external dependencies; when enabled, resources load from external services.
  • Fonts load from Google Fonts by default, making requests to an external service; this can be changed to self-hosting.
  • Webmention functionality relies on the external webmention.io service to render reactions and comments.
  • Mastodon comments require accessing the Mastodon instance's /context endpoint to fetch data.
  • Brid.gy Publish relies on the external Brid.gy service for content distribution.
  • IndieAuth uses indieauth.com as the authorization and token endpoint by default, which is an external service.
  • The pride corner feature relies on external pride.codes resources and is disabled by default.
  • Bundled third-party scripts such as Lunr, DOMPurify, and webmention.js have separate LICENSES.md files; verify their licenses yourself.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

Dark only, by design — there is no light toggle.

Original README

Hugo | **≥ 0.146** *extended* (new template system: `_partials/`, `_shortcodes/`, `_markup/`)

Original README

Node | for `@tailwindcss/cli`, used by `css.TailwindCSS`

Original README

It does **not** merge `outputs`, `outputFormats`, `taxonomies`, `security`, `markup` — copy this block into your own site config

Original README

**External, and optional:** **Font Awesome** (content-type icons — a Kit or the free CDN, or `disable`), **KaTeX** (only when `math` is set), **Google Fonts** (configurable via `params.fonts`).

Original README

Fonts are loaded from Google Fonts in `_partials/head.html` from `params.fonts`

Original README

**Webmention**: `rel=webmention`/`pingback` + the webmention.io client rendering a reactions facepile and inline comments into `#webmentions` (styled)

Original README

**Mastodon comments** (fetch `/context` + DOMPurify) + build-time toot embed

Original README

**Brid.gy Publish** with configurable targets + UTM

Original README

**IndieAuth**: `rel=authorization_endpoint`/`token_endpoint`, opt-in via `params.indieauth` (unset = no tags, clients discover via `rel=me`), defaults to indieauth.com

Original README

**LGBTQ+ corner** (pride.codes, top-right), opt-in `params.prideCorner` (default `false`)

Original README

**Vendored in the theme** (`assets/js/vendor/`, served locally, fingerprinted — see `LICENSES.md` there)

Original README
https://github.com/fundor333/cyberlavandatea/blob/main/LICENSEhttps://github.com/fundor333/cyberlavandatea/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-07. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 80 / 100
Technologies
Hugo
Website type
Blog
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-09-27
Screenshot last checked
2026-10-07

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Hugo as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: [email protected] · 2026-10-07

Inspect the recorded source material

SHA-256: 030a8d47c42ca37983c66ce63b8971c91c0d5095c2c3b5a52c563d74ea0aceab

2026-10-07T11:07:27.057Z

Source file / repository
# CyberLavandaTea

A **dark-only Hugo theme** for dev / code blogs.
**Tailwind CSS v4**, a **6-role palette** (one blue, one green), an
**IndieWeb / POSSE** stack, multiple feeds, client-side search.

- Dark only, by design — there is no light toggle. `assets/js/theme.js` locks
  `class="dark"` before first paint.
- The full layout is written in plain CSS, so the theme renders correctly even
  without Tailwind's content detection; utilities stay available for
  customisation.

## Requirements

| | |
|---|---|
| Hugo | **≥ 0.146** *extended* (new template system: `_partials/`, `_shortcodes/`, `_markup/`) |
| Node | for `@tailwindcss/cli`, used by `css.TailwindCSS` |

```bash
# in your site root
npm install -D @tailwindcss/cli
```

## Install

### As a Hugo Module (recommended)

```bash
hugo mod init github.com/you/your-site      # if you don't have a module yet
```

```toml
# hugo.toml
[module]
  [[module.imports]]
    path = "github.com/fundor333/cyberlavandatea"
```

```bash
hugo mod get -u github.com/fundor333/cyberlavandatea
```

### As a Git submodule

```bash
git submodule add https://github.com/fundor333/cyberlavandatea themes/cyberlavandatea
```

```toml
# hugo.toml
theme = "cyberlavandatea"
```

## Minimal site configuration

Hugo merges `params`, `related`, `services`, `mediaTypes`, `build` from a theme
config. It does **not** merge `outputs`, `outputFormats`, `taxonomies`,
`security`, `markup` — copy this block into your own site config (it is
identical to `exampleSite/hugo.toml`):

```toml
[taxonomies]
  series = "series"
  category = "categories"
  tag = "tags"
  theme = "themes"
  group = "group"

[mediaTypes."application/atom+xml"]
  suffixes = ["xml"]

[outputFormats.SearchIndex]
  baseName = "search"
  mediaType = "application/json"
  isPlainText = true
[outputFormats.Atom]
  baseName = "atom"
  mediaType = "application/atom+xml"
[outputFormats.humanstxt]
  baseName = "humans"
  mediaType = "text/plain"
  isPlainText = true

[outputs]
  home = ["html", "rss", "json", "SearchIndex", "Atom", "humanstxt"]
  section = ["html", "rss", "json", "Atom"]

# Required for css.TailwindCSS (Hugo's exec security policy).
[security]
  [security.exec]
    allow = ['^(dart-)?sass$', '^git$', '^go$', '^node$', '^npx$', '^postcss$', '^tailwindcss$']

# Class-based highlighting (theme palette) and lone images as <figure> + caption.
[markup]
  [markup.highlight]
    noClasses = false
  [markup.goldmark.parser]
    wrapStandAloneImageWithinParagraph = false
```

### Tailwind — class detection (optional)

The theme's layout is plain CSS: **it works with no extra setup**. The Tailwind
utilities used in the templates have a fallback in `main.css`. If you want
Tailwind to generate *every* utility you use in your own content / shortcodes,
enable `hugo_stats.json`:

```toml
[build.buildStats]
  enable = true
[[module.mounts]]
  source = "assets"
  target = "assets"
[[module.mounts]]
  source = "hugo_stats.json"
  target = "assets/notwatching/hugo_stats.json"
  disableWatch = true
```

(`main.css` already does `@source "hugo_stats.json"`.) Otherwise add the extra
classes to `assets/css/safelist.txt`, or to an `assets/css/*.css` of your own
that imports `main.css` with your own `@source`.

## Run the demo

```bash
cd themes/cyberlavandatea      # or wherever the theme lives
npm install
npm --prefix exampleSite install
hugo server -s exampleSite --themesDir ../..
```

## Palette

Defined once in [`assets/css/main.css`](assets/css/main.css) inside the Tailwind
`@theme` block, so it is available as utilities (`text-content`, `bg-surface`,
`border-border`, …) **and** as `--color-*` for the partials.

| Role | Tailwind token | Hex | Use |
|---|---|---|---|
| Primary *(green)* | `--color-primary` | `#5FD88F` | accent, `:hover`/`:focus`, active nav, focus ring, `blockquote` border, keyword |
| Content | `--color-content` | `#E6E6EC` | body text, headings, `strong`, code text |
| Links *(blue)* | `--color-link` | `#4D9FFF` | unvisited links, strings, added diff |
| Visited | `--color-visited` | `#7EA88E` | `a:visited` |
| Background | `--color-background` | `#14151A` | `body`, navbar, footer |
| Inactive | `--color-inactive` | `#8B8F9A` | meta, dates, borders, placeholders, comments |
| *(derived)* Surface | `--color-surface` | `#25262B` | `code`/`pre`/`.toc`/`blockquote`/`tr:nth-child(even)` |
| *(derived)* Border | `--color-border` | `#313237` | `hr`, separators, borders |

Chroma syntax highlighting stays within green + blue plus two tints
(`--color-code-fn` `#A8C9FF`, `--color-code-num` `#8FE0AF`) plus one optional red
for errors (`--color-code-err` `#FF6F6F`), inside `<pre>` only.

Fonts are loaded from Google Fonts in `_partials/head.html` from `params.fonts`
(`display` = Audiowide, `body` = Rajdhani; optional `signature` font-file URL for
the "written by a human" line). A site can self-host them instead.

## Runtime dependencies

**Vendored in the theme** (`assets/js/vendor/`, served locally, fingerprinted —
see `LICENSES.md` there): **Lunr** (search), **DOMPurify** (Mastodon comments),
**webmention.js** (the webmention.io client).

**External, and optional:** **Font Awesome** (content-type icons — a Kit or the
free CDN, or `disable`), **KaTeX** (only when `math` is set), **Google Fonts**
(configurable via `params.fonts`). Nothing else phones home at runtime.

## Features

| Area | Where |
|---|---|
| `baseof` + `main` block, `home`, `list` (by year), `single`, `404`, `taxonomy`, `term` | `layouts/*.html` |
| `<head>`: meta, OG, Twitter, JSON-LD `BlogPosting`, `canonical`, `hreflang`, `rel=first/last/prev/next` | `_partials/head.html`, `_partials/meta/*` |
| Asset pipeline: **Tailwind v4** → `minify` → `fingerprint`+`integrity`; `theme.js` in the head, `main.js`+`goToTop` at the end, `additionalScripts` | `_partials/head.html`, `_partials/scripts-*.html` |
| Nav: `Site.Menus.main` with children and `active` state, CSS-only hamburger, language switcher, "back to top" | `_partials/header.html`, `_partials/footer.html`, `assets/js/goToTop.js` |
| `postCard` with a per-type icon, starred, speaker, `<time datetime>` | `_partials/postCard.html`, `_partials/type-icon.html` |
| Bio + **h-card** — footer identity line: name, pronouns, nickname, location, status; each of pronouns / location / status toggled from config | `_partials/bio.html`, `_partials/hcard.html` |
| Social icons (`params.socialIcons`) rendered on the home page (below the bio) and in the footer | `_partials/socialIcons.html`, `layouts/home.html`, `_partials/footer.html` |
| i18n | `i18n/en.yaml`, `i18n/it.yaml` |
| Feeds: RSS (`exclude_from_rss`, `summary`/`full`, `media` namespace), **Atom** (`feedUUID`, `webfeeds`), **JSON Feed 1.1**, **humans.txt**, dynamic **robots.txt** | `layouts/rss.xml`, `list.atom.xml`, `list.json.json`, `index.humanstxt.txt`, `robots.txt` |
| Search: `SearchIndex` output → `/search.json`, `/search` section, `?q=` form, **Lunr** index, `<template>` rendering | `layouts/index.searchindex.json`, `layouts/search/list.html`, `_partials/search-*.html`, `assets/js/search.js` |
| Content types: `micro`, `photos` (EXIF from `exif.json` or `.Exif`), `weeknote`, `event` (`start`/`end`/`location`), `now`, `series` | `layouts/<type>/…` |
| Microformats2: `h-entry` / `e-content` / `u-photo` / `p-category` / `dt-published`; response types reply/repost/like/bookmark/rsvp | `layouts/single.html`, `_partials/micro.html` |
| Favicons entirely from config (`favicon`, `faviconSvg`, `appleTouchIcon`, `icon96`, `webmanifest`, `maskIcon`) | `_partials/favicons.html` |
| **Webmention**: `rel=webmention`/`pingback` + the webmention.io client rendering a reactions facepile and inline comments into `#webmentions` (styled) | `_partials/webmention.html`, `_partials/custom-head.html`, `assets/css/main.css` |
| **IndieAuth**: `rel=authorization_endpoint`/`token_endpoint`, opt-in via `params.indieauth` (unset = no tags, clients discover via `rel=me`), defaults to indieauth.com | `_partials/head.html` |
| **Mastodon comments** (fetch `/context` + DOMPurify) + build-time toot embed | `_partials/mastodon.html`, `_partials/toot.html` |
| **Brid.gy Publish** with configurable targets + UTM | `_partials/bridgy.html` |
| **Syndication** ("also posted on") | `_partials/syndication.html` |
| Render hooks: link (UTM + `target=_blank` + `↗`), image (`figure` + `u-photo`), heading (anchor), codeblock (`HighlightCodeBlock`) | `layouts/_markup/render-*.html` |
| Shortcodes: `toc`, `embed`, `toot`, `xkcd`, `allpages`, `88x31`, `buzzword`, `heart` | `layouts/_shortcodes/*` |
| Content-type icons ("category") with Font Awesome (Kit or free CDN), `params.postIcons` override | `_partials/fontawesome.html`, `_partials/type-icon.html`, `_partials/postCard.html` |
| **LGBTQ+ corner** (pride.codes, top-right), opt-in `params.prideCorner` (default `false`) | `_partials/pride-corner.html` |
| Small-web extras: **88×31** badges (folder + JSON, shuffled), **webring** (`webring.html`: icon / prev-next / web component), **"reference this post"** box (configurable preferred name / pronouns / "learn more" link + copy-URL), a collapsible panel styled like the TOC/series menu, "written by a human", **backlinks** (`findRE`), **related** ("See Also") | `_partials/88x31.html`, `_partials/webring.html`, `_partials/cite.html`, `_partials/inbound-links.html`, `_partials/comments.html`, `footer.html` |
| Palette / theming: 6 roles + surfaces derived by opacity, Chroma within green/blue | `assets/css/main.css` |

KaTeX (conditional, `_partials/helpers/katex.html`) and Google Analytics
(`hugo.IsProduction` + `site.GoogleAnalytics`) are wired up too.

## Params

```toml
[params]
  description       = "…"           # fallback meta description
  dateFormat        = "2 January 2006"
  homeRecentCount   = 20            # posts on the home page
  mainSections      = ["post"]
  secondarysections = ["micro"]     # "Recent updates" list on the home page
  feedSections      = ["post", "micro", "photos", "weeknote"]
  commentSections   = ["post", "micro", "photos", "weeknote"]
  suggestionSections= ["post"]      # "See Also" block (Related)
  toc = true
  tocOpen = false
  goToTop = true
  linkUTM = false                   # UTM on external links (render hook)
  writtenByHuman = true
  shareButtons = true
  cite = true                       # bool, or a [params.cite] table (below)
  badges88x31 = true
  additionalScripts = []            # extra JS assets, bundled + minified
  themeColor = "#14151a"
  feedUUID = ""                     # urn:uuid for the Atom feed
  images = ["/img/og.png"]          # fallback og:image
  prideCorner = false               # pride.codes corner top-right (opt-in)

  # Favicons — used verbatim as URLs (relURL). Nothing set -> the theme's
  # bundled /favicon.svg only.
  favicon        = "/favicon.ico"
  faviconSvg     = "/favicon.svg"
  appleTouchIcon = "/apple-touch-icon.png"
  icon96         = "/favicon-96x96.png"
  webmanifest    = "/site.webmanifest"
  maskIcon       = ""               # Safari pinned-tab mono SVG (optional)
  icon           = "/favicon-196x196.png"   # generic icon, also used by the feeds

  [params.fontawesome]              # content-type icons
    kit = ""                         # a Kit URL (Pro too); empty = free CDN
    version = "6.7.2"                # free CDN version
    disable = false                  # true = no Font Awesome

  # FA icon per "category" (= section type). Sensible defaults included;
  # override only the entries you want to change.
  [params.postIcons]
    post     = "fa-solid fa-newspaper"
    micro    = "fa-solid fa-thumbtack"
    photos   = "fa-solid fa-camera"
    weeknote = "fa-solid fa-mug-hot"
    event    = "fa-solid fa-calendar-days"
    now      = "fa-solid fa-hourglass-half"
    series   = "fa-solid fa-layer-group"

  [params.fonts]
    display = "Audiowide"
    body = "Rajdhani:wght@400;500;600;700"
    signature = ""                   # optional font-file URL for .written-by-human

  [params.cite]                     # "Reference this post" box
    enable       = true
    body         = ""               # intro sentence (default: i18n cite.body)
    name         = ""               # -> "I prefer to be called <name>"
    pronouns     = ""               # e.g. "he/him" (default: from params.hcard.pronouns)
    nameAlt      = ""               # -> "… or <nameAlt>"
    learnMoreUrl = ""               # adds a "Learn more" line

  [params.author]
    name = "" ; intro = "" ; description = "" ; url = "" ; email = ""
    fediverseAccount = "@user@instance"

  [params.hcard]                    # the footer h-card
    fullName = "" ; nickname = "" ; avatar = "img/logo.png" ; biography = ""
    showPronouns = true             # hide the pronouns with `false`
    showLocation = true             # opt-in; shows city/region/country
    city = "" ; region = "" ; country = ""
    status = ""                     # short status line, e.g. "open to freelance"
    statusUrl = ""                  # optional link for the status
    showStatus = true               # hide the status with `false`
    [params.hcard.pronouns]
      nominative = "" ; oblique = "" ; possessive = ""

  [params.webmention]
    targetDomain    = "example.com"  # canonical prod domain: data-page-url becomes
                                     # https://<targetDomain><path> (works on `hugo server`)
    scheme          = "https"        # scheme for that canonical URL
    script          = ""             # override client URL (default: bundled webmention.js)
    wordcount       = 40             # data-wordcount for inline replies
    maxWebmentions  = 30
    preventSpoofing = false
    # endpoint / pingback also read by _partials/custom-head.html
    # Renders <h2>Responses</h2> + <h2>Reactions</h2> into #webmentions, and emits
    # <link rel="webmention"> / <link rel="pingback">.

  # Opt-in: omit [params.indieauth] entirely to emit no
  # authorization_endpoint/token_endpoint tags and let IndieAuth clients
  # discover via rel="me" instead. When enabled, defaults to indieauth.com,
  # which is designed to be declared as a site's own endpoint this way (no
  # client_id registration needed). Don't point these at indielogin.com:
  # it requires apps to pre-register their client_id and is meant to be
  # called directly by app developers, not discovered as a site's endpoint
  # — doing so causes "client_id is not registered" errors for IndieAuth
  # clients. Override the endpoints below for a different provider.
  [params.indieauth]                # <link rel=authorization_endpoint/token_endpoint>
    enable                = true    # opt out with `false` (or omit the table)
    authorizationEndpoint = "https://indieauth.com/auth"
    tokenEndpoint         = "https://tokens.indieauth.com/token"

  bridgy = ["mastodon", "bluesky"]

  # Rendered on the home page (below the bio) and in the footer.
  [[params.socialIcons]]
    name = "github" ; url = "https://github.com/user"
  [[params.socialIcons]]
    name = "mastodon" ; url = "https://mastodon.social/@user"

  # Footer webring(s) (partial webring.html). Each entry:
  #   name, url            plain link
  #   + icon               icon link (30x30 img)
  #   + prev / next        renders  <- name ->
  #   + html [+ script]    raw markup (web component) and a defer script
  [[params.webrings]]
    name = "XXIIVV webring" ; url = "https://webring.xxiivv.com/#86"
    icon = "https://webring.xxiivv.com/icon.white.svg"
```

### Recognised front matter

`description`, `image`, `tags`, `categories`, `series`, `themes`, `group`,
`isStarred`, `speaker`, `math`, `toc`, `tocOpen`, `exclude_from_rss`,
`exclude_from_search`, `robotsdisallow`, `allpage`, `feature_link`/`feature_text`,
`syndication` (list of URLs), `comments` (`{host, user, id}` for Mastodon
comments), `reply`/`repost`/`like`/`bookmark`/`rsvp`/`preview_text_from_reply`,
`mastodon_instance`+`mastodon_id`, `start`/`end`/`location` (event).

### Site-side extension

Create these in your own `layouts/_partials/`:

- `custom-head.html` — adds to `<head>` (the theme ships one that emits
  `rel=webmention`/`pingback`; override to extend);
- `custom-scripts.html` — end-of-`<body>` scripts (self-hosted analytics, extra
  widgets, …).

## Structure

```
themes/cyberlavandatea/
├── theme.toml · go.mod · package.json · hugo.toml · LICENSE · README.md
│   CHANGELOG.md · CONTRIBUTING.md · .editorconfig · .gitattributes
├── .github/workflows/    ci.yml (PR build) · pages.yml (deploy demo)
├── archetypes/            default, post, micro, now, photos, event, weeknote
├── assets/
│   ├── css/main.css       Tailwind v4 + @theme (palette) + base + .chroma
│   │   safelist.txt
│   └── js/                theme.js · main.js · goToTop.js · search.js
│       vendor/            lunr · DOMPurify · webmention.js (+ LICENSES.md)
├── data/cyberlavandatea/palette.yaml   palette reference
├── i18n/                  en.yaml · it.yaml
├── exampleSite/           minimal demo (its own hugo.toml + go.mod)
└── layouts/
    ├── baseof · home · list · single · 404 · taxonomy · term
    ├── rss.xml · list.atom.xml · list.json.json
    ├── index.searchindex.json · index.humanstxt.txt · robots.txt
    ├── micro/ photos/ weeknote/ event/ now/ series/ search/
    ├── _markup/            render-link · render-image · render-heading · render-codeblock
    ├── _shortcodes/        toc · embed · toot · xkcd · allpages · 88x31 · buzzword · heart
    └── _partials/          head · header · footer · scripts-* · meta/* · svgs/*
                            postCard · type-icon · fontawesome · bio · toc · tags
                            series · micro · comments · mastodon · toot · webmention
                            syndication · bridgy · hcard · socialIcons · webring
                            search-form · search-index · cite · share-buttons
                            inbound-links · 88x31 · pride-corner · custom-head
                            helpers/katex
```

## Contributing

See [`CONTRIBUTING.md`](CONTRIBUTING.md). Changes are tracked in
[`CHANGELOG.md`](CHANGELOG.md).

## License

MIT — see [`LICENSE`](LICENSE).
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.