Loom

A blog engine that just works. One binary, no setup, no dependencies.

Themes

Built-in Themes

Set theme = name in site.conf. All 21 themes support dark and light mode.

Classic

ThemeFontStyle
defaultSystem sans-serifClean, neutral grays, blue accent
serifGeorgia / GaramondEditorial, warm tones, literary feel
monoMonospaceTerminal aesthetic, green accent
typewriterCourier NewOld-school ink-on-paper, raw and minimal
brutalistSystem sans-serifAnti-design, bold borders, red accent, uppercase

Editor Palettes

ThemeFontStyle
nordInter / sans-serifArctic palette, muted blues
solarizedSystem sans-serifEthan Schoonover's precision-engineered palette
draculaSystem sans-serifThe beloved dark-first theme, purple accent
gruvboxSystem sans-serifRetro groove, warm earthy contrast, orange accent
catppuccinSystem sans-serifSoothing pastels, purple accent
tokyonightSystem sans-serifNeon-tinged Tokyo evening palette
kanagawaCharter / GeorgiaInspired by Hokusai's The Great Wave

Warm & Earthy

ThemeFontStyle
earthCharter / GeorgiaWarm organic tones, olive accent
warmGeorgia / CharterGolden amber palette, cozy reading feel

Cool & Blue

ThemeFontStyle
cobaltSystem sans-serifDeep blue developer theme
oceanSystem sans-serifDeep blue, calm and professional
midnightSystem sans-serifRich dark-first, electric blue, polished

Soft & Colorful

ThemeFontStyle
roseSystem sans-serifSoft pinks, elegant, magenta accent
sakuraSystem sans-serifCherry blossom pinks, delicate and refined
lavenderSystem sans-serifSoft purple tones, warm and inviting

Minimal & Raw

ThemeFontStyle
hackerMonospaceGreen on black, no border-radius, no frills

Overriding Variables

Tweak a built-in theme without replacing it entirely:

theme = nord
theme_accent = #e06c75
theme_dark-accent = #e06c75
theme_font_size = 18px
theme_max_width = 800px

Underscores in key names become hyphens in CSS. Prefix with dark- for dark-mode-only overrides.

Available Variables

VariableDescription
bgBackground color
textPrimary text color
mutedSecondary/muted text
borderBorder and separator color
accentLinks, highlights, active elements
fontFont family stack
font-sizeBase font size
max-widthContent area max width
heading-fontHeading font (defaults to inherit)
code-fontCode/monospace font
line-heightBody line height
heading-weightHeading font weight
border-radiusDefault border radius
sidebar-widthSidebar width
sidebar-gapGap between content and sidebar
nav-gapGap between nav items
header-sizeSite title font size
tag-radiusTag badge border radius
tag-bgTag background
tag-textTag text color
link-decorationLink text decoration
card-bgCard background (cards layout)
card-borderCard border color
card-radiusCard border radius
card-paddingCard padding
accent-hoverAccent color on hover
header-border-widthHeader bottom border (set 0 to remove)
footer-border-widthFooter top border
content-widthContent column max width

All variables have dark- counterparts (e.g., dark-bg, dark-accent).

Full CSS Override

Drop a style.css in content/theme/:

content/
  theme/
    style.css    # Replaces the entire default stylesheet

This completely replaces the built-in CSS. You're responsible for all layout, typography, and responsive design.

Custom CSS Additions

For small tweaks without replacing everything:

custom_css = .post-full h1 { font-size: 2.2em; } .sidebar { display: none; }

This CSS is injected after the theme, so it overrides theme styles.

Custom Head HTML

Inject anything into <head> — Google Fonts, analytics, meta tags:

custom_head_html = <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">