A markdown publishing server
Blatt is a zero-config publishing server for people who write in markdown. No admin panel. No database. No build step. Just files.
Philosophy
Your content lives in folders as markdown files. Create a folder, drop an index.md, it's a page. No import, no migration, no lock-in.
Math rendering, syntax highlighting, footnotes, RSS feeds, sitemaps, Open Graph tags. All on. Toggle off what you don't need in one config file.
No accounts, no roles, no permissions. You are the author. If you can see the folder, you're the admin. Publish by writing. Draft by setting one field.
How it works
Write markdown with YAML frontmatter. Blatt reads it, renders it through a full-featured pipeline, applies your template, and serves it.
blog/2026-04-04-hello/index.md
--- title: Hello World published: 2026-04-04 template: post taxonomy: tags: [intro, first-post] --- # Hello from Blatt A paragraph with **bold** and math: $E = mc^2$ ```js const message = "it works"; ``` :::note This is a callout block. :::
What your visitors see
2026-04-04 · 1 min read · intro, first-post
A paragraph with bold and math: E = mc²
Built-in
Everything you need for a publishing site ships out of the box. Every feature can be toggled off in config.toml.
GFM tables, footnotes, definition lists, task lists, smart typography, heading anchors, figure captions, external link decoration.
KaTeX for LaTeX math expressions. Shiki for syntax highlighting with VS Code themes. Mermaid diagrams from fenced code blocks.
From Windows 98 to Dracula to academic papers. Pick a theme per page in frontmatter, or create your own with Nunjucks.
Blog index, project listing, any aggregation. Declare what to collect in frontmatter, the template receives sorted pages.
Auto-generated /feed.xml and /sitemap.xml from your published pages. Tag and category index pages created from taxonomy.
Open Graph tags, JSON-LD structured data, canonical URLs, meta descriptions, reading time. All generated from your frontmatter.
Set published: false in frontmatter. Preview with a secret token in the URL. Public visitors see a 404.
File watcher detects changes to content and templates. Next request serves the update. No restart needed.
Get started
services: blatt: image: ghcr.io/felixfoertsch/blatt ports: - "3000:3000" volumes: - ./content:/data/content
mkdir -p content/hello cat > content/hello/index.md << 'EOF' --- title: Hello World published: 2026-04-04 --- # It works! EOF
docker compose up -d # open http://localhost:3000/hello
30 built-in themes
Every theme ships with Blatt. Set template: dracula in frontmatter and you're done.
Scroll to see more → 30 themes total
What Blatt is not