
Every post is a single file in content/blog/. The filename becomes the URL, so content/blog/hello-world.md is published at /blog/hello-world. Save the file and it shows up on the blog, the homepage and the RSS feed — no code changes needed.
Frontmatter
The block between the --- lines at the top of a file describes the post:
---
title: "Hello world" # required
description: "One-line summary" # required — cards, search engines, RSS
date: 2026-09-28 # required — newest posts come first
tags: [design, process] # optional — powers the tag filter
cover: /blog/hello-world.png # optional — image in /public
draft: true # optional — hidden in production
---If a required field is missing, the build stops and tells you which file to fix.
Markdown you can use
Write normal Markdown. Bold, italic, inline code, links and lists all work:
- Use
##and###headings — they appear in the table of contents. - Put images in
public/blog/<your-post>/and reference them as/blog/<your-post>/image.jpg. - Code blocks get syntax highlighting and a copy button.
Code
Add a language after the opening fence, an optional title, and highlight lines with {…}:
export function Greeting({ name }: { name: string }) {
return (
<p className="text-lg">Hello, {name}!</p>
)
}Tables
| Field | Required | Used for |
|---|---|---|
title | Yes | Page title, cards |
description | Yes | Cards, SEO, RSS |
date | Yes | Sorting, display |
tags | No | Filtering |
cover | No | Card and header image |
Quotes
Good writing, like good design, removes everything that doesn't help the reader.
Going further with MDX
Need more than Markdown? Name the file .mdx instead of .md and you can use components like <Callout> and <Figure> — see A design system that lasts for examples.
Enjoyed this? Let's talk.
Talk to me