Slow Press

A local-first web publishing engine.

Getting Started with Slow Press

Slow Press is a local-first publishing engine. Your site lives as a folder of Markdown files on your machine. Publishing is a single upload. No database, no build step, no deployment pipeline.

Your site lives at your-press-name.slowpress.pub.

Grab a starter pack theme


1. Register your Press

Go to slowpress.pub/register and choose:


2. Create your Press folder

Make a folder on your machine. The name doesn't matter locally, only the press name you registered matters.

A minimal working press needs one file:

my-press/
└── index.md

That's it. Everything else is optional.


3. The folder structure

Standard

my-press/
├── index.md          ← homepage
├── global.css        ← styles, loaded on every page if present
├── about.md          ← any .md file becomes a page
├── about.css         ← paired CSS, loaded only on the about page
└── posts/            ← folder containing blogposts
    ├── my-first-post.md
    └── another-post.md

Advanced

my-press/
├── index.md          ← homepage
├── global.css        ← loaded on every page if present
├── layout.html       ← custom layout (optional, see below)
├── header.md         ← included in <header> by default layout
├── footer.md         ← included in <footer> by default layout
├── about.md          ← any .md file becomes a page
├── about.css         ← paired CSS, loaded only on that page
└── posts/
    ├── my-first-post.md
    └── another-post.md

Rules:


4. Front matter

Front matter is a set of meta info for a page or blog posts. It's totally optional for pages. Blog posts will need it, to be included in the RSS feed of the blog. Add front matter at the top of any .md file between --- delimiters:

---
title: My Page Title
description: A short description for search engines
pubDate: 2024-06-01
lang: en
author: Your Name
---

Your content starts here.

Keys:

Key Purpose
title Page <title> and browser tab
description Meta description tag
pubDate Publication date. Accepts YYYY-MM-DD or full ISO 8601. Posts with a pubDate in posts/ are included in your RSS feed
lang Sets the lang attribute on <html>. Defaults to en
author Appears in the RSS feed per-item

Any custom key variable you add to the frontmatter becomes available as a \{{ variable }} in your layout.


5. The include system

Inside any .md file or layout.html, use:

{{ include: filename.md }}

The file is resolved relative to the including file's directory. Includes can be nested. Front matter from included files is merged upward, the including file's values take priority on conflicts.

Special keyword:

{{ include: allposts }}

Outputs a Markdown list of all posts in posts/, sorted by pubDate descending, then alphabetically for undated posts. Useful for a blog index page.


6. Layout

By default Slow Press uses its built-in layout, which looks for header.md and footer.md in your press root and wraps your content in a standard HTML structure.

To take full control, add a layout.html to your press root. The default layout is a good starting point:

<!DOCTYPE html>
<html lang="{{ lang }}">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
    {{ meta_description }}
    {{ css_links }}
</head>
<body>
    <div id="wrapper">
        <header>
            {{ include: header.md }}
        </header>
        <main>
            {{ content }}
        </main>
        <footer>
            {{ include: footer.md }}
        </footer>
    </div>
</body>
</html>

Layout variables:

Variable Value
{{ title }} From front matter title key
{{ content }} The rendered HTML of the current page
{{ css_links }} All <link> tags for CSS files (global + page-specific)
{{ meta_description }} The <meta name="description"> tag if description is set
{{ lang }} From front matter lang key, defaults to en
{{ anything }} Any front matter key is available as a variable

Layout priority: Slow Press looks for layout.html in the current file's directory first, then the press root, then falls back to the built-in default. This means you can use a different layout for a subfolder by placing a layout.html inside it.

To use {{ literally in content without triggering the template engine, escape it: \{{.


7. Images

Reference images with standard Markdown syntax:

![Alt text](image.jpg)              ← relative to current file's directory
![Alt text](/logo.png)              ← absolute, relative to press root
![Alt text with caption](photo.jpg "This becomes a figcaption")

8. RSS

Your press automatically generates an RSS feed at yourpress.slowpress.pub/rss.

Any .md file in posts/ with a valid pubDate front matter key is included. Posts without a pubDate are excluded from the feed but still accessible as pages.


9. Publish

Go to slowpress.pub/upload, enter your press name and passphrase, and select your press folder. The upload replaces your live press , the old version stays live until the new one is fully uploaded, then the swap happens instantly.

Obsidian users can work directly in their vault, all .md files are compatible. CSS and other assets are invisible in Obsidian's file explorer but are included in the upload as they remain on disk.


10. Clean URLs

Pages are accessible without the .md extension:

File URL
index.md yourpress.slowpress.pub/
about.md yourpress.slowpress.pub/about
posts/my-post.md yourpress.slowpress.pub/posts/my-post

Minimal example press

The smallest possible press that demonstrates the main features:

index.md

---
title: My Press
description: A place for my writing
---

# Hello

Welcome to my press. Here are my [posts](posts) and the [about](about) page.

{{ include: allposts }}

about.md

---
title: About
---

# About

This press is built with [Slow Press](https://slowpress.pub).

posts/first-post.md

---
title: My First Post
pubDate: 2024-06-01
description: This is my first post on Slow Press.
---

# My First Post

Content goes here.

global.css

body {
    font-family: Georgia, serif;
    max-width: 680px;
    margin: 2rem auto;
    padding: 0 1rem;
}

Upload that folder and your press is live.