Skip to main content
Every site uses one theme with a light and a dark mode, which you fit to your brand with a few settings in blog.json and CSS for everything else.
blog.json

Colors

Colors are hex values with 3 or 6 digits, like #0D9373.

Light and dark mode

appearance.default is "system" (follows the reader’s device), "light" or "dark". Readers switch with the toggle in the header, and the site remembers their choice. "strict": true hides the toggle and always uses the default, and the short form "appearance": "dark" works too.

Fonts

fonts.family loads any Google Font by name, while heading and body set a different font for each:
blog.json
To use your own font file, put it in public/ and point source at it:
blog.json
weight is a number from 100 to 900 and format is woff2 (default) or woff, while code always uses the system’s monospace font.

Background

Width

layout.width sets the widest content column in rem, from 40 to 120, or "full", and the default is 72. Set it to the width of your landing page so the blog lines up with it. Index pages, posts and the reading column all scale with it, and with "full" the reading column keeps its default width.

Code blocks

styling.codeblocks picks the syntax theme. See Code.

Your own CSS

Every .css file in the site loads on every page after the theme, so it can override anything, whether it’s style.css, styles/brand.css or buttons.css next to a component.
style.css
The theme’s colors are CSS variables that switch with light and dark mode, and you can use --background, --foreground, --muted, --muted-foreground, --border, --accent, --card, --success, --warning, --info and --destructive. --accent is your brand color for the current mode, while --primary always holds colors.primary. Use html.dark to style dark mode only. Tailwind classes also work in your MDX, header, footer and components.

Styling hooks

These IDs and class names stay stable, so your CSS keeps working when the theme updates. The navbar IDs only exist in the built-in header and #footer only in the built-in footer, so with your own header.mdx, use your own class names.
Last modified on October 8, 2026