Theming

Every blog loads the default stylesheet first, then your own CSS after it — so any selector you define there overrides the default. You only need to override what you want to change. There are two ways to provide it:

  • Styles URL — on the site form's Appearance tab, set Styles URL to a stylesheet you host yourself. Good if you already have a build pipeline for it.
  • Style Editor — open it from the site's card on the dashboard (or the link on the Appearance tab, once the site is saved). It's a live split view: your blog's index, post, and 404 pages on the left, a CSS editor on the right, updating as you type. Hover any element in the preview to see its selector in the status bar. This writes to the site's inline custom CSS (max 25,000 characters) — no hosting required.

Combine both if you like: the Styles URL loads first, then the inline CSS on top of it.

CSS variables

The easiest way to restyle a blog is to override the design tokens in :root. Changing a variable propagates to every element that uses it.

:root {
    --bg:   #fff;     /* page background */
    --fg:   #1a1a1a;  /* primary text and links */
    --border: #e5e5e5; /* lines: header, footer, post dividers, table borders */
    --muted:   #888;  /* timestamps, back link, footer text, subtle labels */
    --muted-2: #555;  /* nav links, excerpt, secondary metadata */
    --muted-3: #444;  /* post card excerpt */
    --surface: #f6f6f6; /* table header cell background */

    /* Tag pills */
    --tag-bg: #f0f0f0;
    --tag-fg: #555;

    /* Blockquotes */
    --blockquote-border: #ddd;
    --blockquote-fg:     #666;

    /* Code blocks */
    --code-bg:        #f6f6f6; /* fenced code block background */
    --inline-code-bg: #f0f0f0; /* inline code background */

    /* Copy button inside code blocks */
    --copy-btn-bg:     #fff;
    --copy-btn-border: #ddd;
    --copy-btn-fg:     #555;
}

For dark mode, redefine the same variables under html.dark — see below for when that class is applied:

html.dark {
    --bg:     #111;
    --fg:     #e0e0e0;
    --border: #2a2a2a;
    /* … and so on */
}

Global elements

SelectorWhat it styles
bodyPage background, base font family, size, line height, and text colour
aDefault link colour (inherits from parent by default)
a:hoverLink hover state
.containerThe centred content column (max-width 720 px with side padding)

Header & navigation

The header appears at the top of every page, built from the nav links you set per language on the site form's Languages tab (+ Add link under "Navigation links").

SelectorWhat it styles
headerThe top bar — background, border, padding
navFlex row that holds the site name and nav links
.site-nameThe site title/logo link in the top-left
.nav-linksThe <ul> list of navigation links
.nav-links aIndividual nav link text style
.nav-links a:hoverNav link hover state
.theme-btnThe light/dark toggle button in the nav bar
.theme-btn:hoverTheme button hover state
.rss-btnThe RSS feed icon link in the nav bar
.rss-btn:hoverRSS button hover state

Footer

SelectorWhat it styles
footerThe bottom bar — border, spacing, font size, colour

Its text content comes from the Footer text field on the same Languages tab.

Post list page

The index page that shows all published posts.

SelectorWhat it styles
.site-heroWrapper around the site title / description shown at the top of the list
.site-hero h1Site title inside the hero
.site-descriptionShort description text below the site title
.post-listThe <ul> that wraps all post cards
.post-cardA single post entry in the list
.post-card__coverThe cover image shown above the post card content
.post-card__metaRow containing the publication date (and any other metadata)
.post-card__titleThe post title heading inside the card
.post-card__title aThe link wrapping the post title
.post-card__title a:hoverPost title link hover state
.post-card__excerptThe short excerpt text below the title
.post-card__tagsFlex row that wraps the tag pills on a card
.empty-stateMessage shown when no published posts exist yet

Search & filter bar

The title search box, tag search box, and sort toggle shown above the post list. Title search and tag search are live (debounced, no page reload) when JavaScript is available, and fall back to a normal form submit otherwise.

SelectorWhat it styles
.search-barFlex row that holds the search input, tag box, sort toggle, and buttons
.search-bar__inputThe "Search posts…" text input
.search-bar__btnThe "Search" submit button (hidden once JS enhances the form with live search)
.search-bar__sortThe "Newest first" / "Oldest first" sort-order toggle link
.search-bar__clearThe "✕ Clear" link shown once a search, tag, or sort filter is active
.filter-labelThe "Filtering by tag: …" line shown above the list when a tag is active
.tag-selectWrapper around the tag search box and its dropdown
.tag-select__controlThe bordered box containing the tag input (matches .search-bar__input)
.tag-select__control inputThe tag text input itself, inside .tag-select__control
.tag-select__menuThe dropdown list of matching tags shown while typing
.tag-select__itemA single selectable tag suggestion in the dropdown
.tag-select__item:hoverHover state for a tag suggestion
.tag-select__emptyMessage shown in the dropdown when no tags match the search

Pagination

SelectorWhat it styles
.paginationWrapper around the "Newer" / "Older" links and page count
.pagination__btnEach "← Newer" / "Older →" link
.pagination__btn:hoverPagination link hover state
.pagination__infoThe "1 / 3" page-count text

Post detail page

The full post view.

SelectorWhat it styles
.post-headerWrapper for all post header content (back link, meta, title, cover)
.post-header__backThe "← All posts" back link
.post-header__back:hoverBack link hover state
.post-header__metaRow containing the publication date
.post-header__titleThe large post title (<h1>)
.post-header__excerptThe italic excerpt / subtitle below the title
.post-header__tagsFlex row of tag pills shown in the post header
.post-header__coverThe full-width cover image below the post header
.post-bodyWrapper <div> around the rendered Markdown content

Post body — Markdown elements

These selectors style the rendered content of a post's body. All are scoped inside .post-body so they don't affect the rest of the page.

SelectorWhat it styles
.post-body h1 .post-body h2 .post-body h3 .post-body h4Headings inside the post
.post-body pParagraphs
.post-body ul .post-body olBulleted and numbered lists
.post-body liIndividual list items
.post-body blockquoteBlock quotes (has a left border by default)
.post-body preFenced code blocks
.post-body codeInline code snippets
.post-body pre codeCode inside a fenced block (resets the inline code background)
.post-body imgImages embedded in the post
.post-body aLinks inside the post body
.post-body hrHorizontal rules (---)
.post-body tableTables
.post-body th .post-body tdTable header and data cells

404 page

SelectorWhat it styles
.not-foundWrapper for the 404 block — controls top padding
.not-found__codeThe large "404" number
.not-found__titleThe "Page not found" heading
.not-found__messageThe explanatory text below the heading
.not-found__backThe back link (also carries .post-header__back)

Shared components

SelectorWhat it styles
.tagA tag pill — used on both the post list cards and the post detail header

Dark mode

When a site has Enable theme switcher checked on the Appearance tab, the blog adds class="dark" to the <html> element whenever dark mode is active — via the toggle button or prefers-color-scheme. Target html.dark in your stylesheet to apply dark-mode overrides.

Example: light defaults with dark overrides

/* Light defaults */
body {
    background: #fff;
    color: #1a1a1a;
}

header, footer {
    border-color: #e5e5e5;
}

.tag {
    background: #f0f0f0;
    color: #555;
}

.post-body pre {
    background: #f6f6f6;
}

/* Dark overrides — applied when html.dark is set */
html.dark body {
    background: #0f0f0f;
    color: #e8e8e8;
}

html.dark header,
html.dark footer {
    border-color: #2a2a2a;
}

html.dark .site-name {
    color: #fff;
}

html.dark .nav-links a {
    color: #aaa;
}

html.dark .tag {
    background: #2a2a2a;
    color: #aaa;
}

html.dark .post-body blockquote {
    border-left-color: #444;
    color: #aaa;
}

html.dark .post-body pre {
    background: #1a1a1a;
}

html.dark .post-body code {
    background: #1e1e1e;
    color: #e8e8e8;
}