A markdown publishing server

Drop a file.
Publish a page.

Blatt is a zero-config publishing server for people who write in markdown. No admin panel. No database. No build step. Just files.

The filesystem is your admin panel

Files are the interface

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.

Everything works by default

Math rendering, syntax highlighting, footnotes, RSS feeds, sitemaps, Open Graph tags. All on. Toggle off what you don't need in one config file.

Single-person publishing

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

A folder becomes a website

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

Hello from Blatt

A paragraph with bold and math: E = mc²

const message = "it works";
This is a callout block.

Built-in

Batteries included, no assembly required

Everything you need for a publishing site ships out of the box. Every feature can be toggled off in config.toml.

Markdown pipeline

GFM tables, footnotes, definition lists, task lists, smart typography, heading anchors, figure captions, external link decoration.

Math and code

KaTeX for LaTeX math expressions. Shiki for syntax highlighting with VS Code themes. Mermaid diagrams from fenced code blocks.

30 themes

From Windows 98 to Dracula to academic papers. Pick a theme per page in frontmatter, or create your own with Nunjucks.

Collections

Blog index, project listing, any aggregation. Declare what to collect in frontmatter, the template receives sorted pages.

RSS + Sitemap

Auto-generated /feed.xml and /sitemap.xml from your published pages. Tag and category index pages created from taxonomy.

SEO

Open Graph tags, JSON-LD structured data, canonical URLs, meta descriptions, reading time. All generated from your frontmatter.

Drafts

Set published: false in frontmatter. Preview with a secret token in the URL. Public visitors see a 404.

Live reload

File watcher detects changes to content and templates. Next request serves the update. No restart needed.

Get started

Running in sixty seconds

Create a docker-compose.yml

services:
  blatt:
    image: ghcr.io/felixfoertsch/blatt
    ports:
      - "3000:3000"
    volumes:
      - ./content:/data/content

Write your first page

mkdir -p content/hello
cat > content/hello/index.md << 'EOF'
---
title: Hello World
published: 2026-04-04
---

# It works!
EOF

Start and visit

docker compose up -d
# open http://localhost:3000/hello

30 built-in themes

One post, thirty looks

Every theme ships with Blatt. Set template: dracula in frontmatter and you're done.

Scroll to see more →   30 themes total

Intentionally absent

No admin panel
No user accounts
No database
No build step
No plugin system
No comments
No search (yet)
No multi-language routing
No upsells