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
- one page plus header and footer pack.zip
- right sidebar layout sidebar.zip
- blog blog.zip
1. Register your Press
Go to slowpress.pub/register and choose:
- Press name, This becomes your subdomain:
yourpress.slowpress.pub. Lowercase letters, numbers, and hyphens, max 12 characters. - Passphrase, you'll need this every time you publish. There is no password reset, so store it somewhere safe. If you lose the passphrase, email the admin.
- Email, for account recovery.
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:
- Every
filename.mdfile in the press root becomes a page atyourpress.slowpress.pub/filename - Files in
posts/are accessible atyourpress.slowpress.pub/posts/filename - A
global.cssat the press root is loaded on every page - A
.cssfile with the same name as a.mdfile is loaded only on that page - Allowed file types:
md,css,jpg,jpeg,png,gif,webp,html layout.htmlin the root folder of your press replaces the default layoutlayout.htmlin a subfodler of your press replaces the default layout only for the files in that subfolder- Maximum press size: 25 MB
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:
 ← relative to current file's directory
 ← absolute, relative to press root

- Local images get
widthandheightattributes injected automatically to prevent layout shift - All images get
loading="lazy"automatically - Images with a title attribute are wrapped in
<figure>and<figcaption> - External URLs (
http://,https://) and base64 strings are passed through unchanged
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.