Writing your first post

Everything you need to publish on this blog: where files live, the frontmatter fields, and the Markdown that's supported.

· 2 min read

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:

content/blog/hello-world.md
---
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 {…}:

components/greeting.tsx
export function Greeting({ name }: { name: string }) {
  return (
    <p className="text-lg">Hello, {name}!</p>
  )
}

Tables

FieldRequiredUsed for
titleYesPage title, cards
descriptionYesCards, SEO, RSS
dateYesSorting, display
tagsNoFiltering
coverNoCard 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.