This page is a living reference for everything the revinder-blog theme can render. Copy any block here as a starting point for a new post. It is deliberately back-dated so it sinks to the bottom of the blog index.

H1 — The Main Heading

H2 — Section Heading

H3 — Subsection

H4 — Deeper

H5 — Deeper Still
H6 — The Bottom

Footnotes

Zola supports standard Markdown footnotes1 and inline footnotes are not supported. 2

Text Formatting

Bold, italic, bold italic, strikethrough, inline code, and a hyperlink. You can also use autolinks: https://example.com or https://example.com.

This is a standard Markdown blockquote. It can span multiple lines and even contain inline code.

Lists

Unordered

  • First item
  • Second item
    • Nested item
    • Another nested item
      • Deeper still
  • Third item

Ordered

  1. Step one
  2. Step two
    1. Sub-step
    2. Another sub-step
  3. Step three

Task Lists

  • Todo item
  • Done item
  • Another todo

Horizontal Rule

Text above.


Text below.

Tables

FeatureSupportedNotes
HeadersAll six levels
TablesGFM pipe syntax
Code highlightingGiallo (VSCode grammars)
Alerts7 types + AI notice
ChartsApexCharts via JSON

Aligned columns: :---, :---:, ---: give left / center / right.

LeftCenterRight
abc
longmedx

Code Blocks

Plain (no language)

No language hint — rendered as plain text.
Arbitrary monospace content here.

Single language

def greet(name: str) -> None:
    print(f"Hello, {name}!")

greet("Revinder")

With the copy=true marker (Zola 0.21+)

Adding copy=true to the fence emits a data-copy="true" attribute on the <code> element. By itself this is just a marker — Zola does not render a button or wire up clipboard. It is a hook for your JS (or a theme) to opt a block into showing a Copy button. This block uses it:

def greet(name: str) -> None:
    # copy=true adds data-copy="true" to the <code> tag
    print(f"Hello, {name}!")

greet("Revinder")

With line numbers

def fib(n: int) -> int:
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)

for i in range(10):
    print(fib(i))

Line numbers + highlighted lines

def fib(n: int) -> int:
    if n < 2:
        return n          # highlighted
    return fib(n - 1) + fib(n - 2)  # highlighted

Line numbers starting at 20 + hidden lines

hide_lines uses 1-indexed source line numbers (not the displayed linenostart value). Below, hide_lines=1-2 removes the first two source lines — the comments — so only the function body shows, with numbering continuing from the linenostart=20 base.

def visible():
    return "shown"

Named block (renders a data-name label)

fn main() {
    let xs: Vec<i32> = (1..=5).collect();
    println!("{:?}", xs);
}

A few more languages

SELECT username, tier
FROM users
WHERE created_at > now() - interval '30 days'
ORDER BY created_at DESC;
#!/usr/bin/env sh
set -euo pipefail
echo "deploying $1"
rsync -avz public/ user@host:/srv/blog/
name: CI
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

Images

Markdown image syntax

Bad process diagram

image shortcode (with caption + position)

The image shortcode wraps a single <img> with optional caption and CSS class (position).

Digital Minimalism book cover Caption rendered by the image shortcode.

Shortcodes

alert — all 7 types

Alerts are framed callout boxes. Each type picks its border/background colour and icon automatically. The title is optional (defaults to the uppercased type).

NOTE

A note alert. Supports Markdown, code, and links.

Pro tip

A tip alert with a custom title.

INFO

An info alert.

IMPORTANT

An important alert.

Check this out!

A warning alert with a custom title.

Careful!

A danger alert — use sparingly.

alert — AI notice

A special ai_notice type renders a robot icon and structured model/agent metadata. Used at the top of AI-assisted posts to disclose usage.

AI Notice

This article was not written by AI. AI was used for typo-spotting and to draft auxiliary functions. All scripts were read, understood, and run by a human.


Models: DeepSeek V4 Flash

Agent: Opencode v1.2.27

character — speech bubbles

Two characters ship with the theme: CoolPizza and Monk. They can appear on either side.

CoolPizza

Welcome to the blog! The avatar sits on the left and the bubble points rightward.

Monk

And I appear on the right, with a mirrored avatar.

quote — framed quote / poem

A dashed-border block for short quotes or multi-line verse. Whitespace is preserved (white-space: pre-wrap).

Two roads diverged in a wood, and I— I took the one less traveled by, And that has made all the difference.

chart — ApexCharts via JSON

The chart shortcode fetches a JSON file from static/ at render time and draws an ApexCharts line chart. The JSON must have labels (array) and series (array of {name, data}). Optional terminal-style window with dots via withDots=true, plus title, x_title, y_title.

plain_and_dataclass.json

Escaping & Edge Cases

Literal asterisks: \*not italic\*, literal backticks: `not code` (wrapped in double backticks with spaces).

A line that ends with two spaces
forces a hard line break (the line above has trailing spaces).

A very long word or URL like https://github.com/getzola/zola/blob/master/CHANGELOG.md should wrap rather than overflow the container.


That's everything. If a feature you need isn't shown here, it probably isn't wired up yet — check templates/shortcodes/ and sass/shortcodes.scss.

  1. This is the first footnote, rendered at the bottom of the page.

  2. Inline footnote should have been defined up top.