What this blog can do
This is a tour of what this blog can do, and it uses each feature as it goes. It's also a test page: if something here looks wrong, the blog is broken. I'll add to it as the blog gains features, and when I do, the box at the top will say what changed.
Writing
Every post is one Markdown file in the site's repository. A short block at the top, called front matter, gives the post its details:
---
title: What this blog can do
date: 2026-11-13
description: Optional. For search results and link previews.
tags: [meta]
---The name of the post's folder is its address, so this post lives at
/blogs/what-this-blog-can-do. The title and date are required, and a typo
in the front matter fails the build instead of publishing something half
understood.
Text
Posts are written in GitHub-flavoured Markdown: bold, emphasis,
strikethrough, inline code, links,
lists and quotes.
A quote gets a shaded background and a bar down its side, so it's easy to see where it starts and stops.
Task lists and tables work too:
- Write the post
- Write the next one
| Feature | How it works |
|---|---|
| Highlighting | At build time, so no script reaches the browser |
| Images | Resized at build time, with alt text, captions |
| Updates | A list in the front matter |
| Feed | Atom, at /feed.xml |
Raw HTML isn't rendered, so a post can't bring a script onto the page. It's Markdown only.
Code
Code is highlighted when the site is built, with colours for both light and dark mode. Name the language after the opening fence, and, if you like, a title, such as a file name:
package main
import "fmt"
func main() {
fmt.Println("hello, blog")
}A block that's too wide for the page scrolls sideways instead of stretching it:
aws s3 sync dist/ s3://example-bucket/ --delete --cache-control "public, max-age=31536000, immutable" --exclude "index.html"Images

I drop an image into the post's folder at full size and the build does the rest. It makes a few smaller WebP copies, so a phone downloads a small one and a big screen gets a sharp one, and while an image loads it shows a blurred copy of itself in the space it will fill, so the page doesn't jump around. The original file is never published: the largest copy is the full size. Click or tap an image to see it larger, full screen on a phone. Each has alt text for screen readers. This one is a generated gradient, here only to show an image.
Put a title after the image's address and it becomes a caption under the image, like the one above:

The alt text and the caption do different jobs. The alt text describes the image for people who can't see it, and the caption is for everyone, so I write both and don't repeat one as the other.
Tags and the feed
Tags show as badges under the title, like meta above. There's an Atom feed at
/feed.xml for feed readers, listing the 50 newest posts, and a
sitemap for search engines.
Changes after publishing
When I change a post in a way that matters, I add an entry to updates in its
front matter, and fix typos without one:
updates:
- date: 2026-12-03
note: Added a section on tags.
A box titled "Updates" then appears at the top of the post, listing each change
with its date, newest first. The post also gets an updated tag, and the blog
list and the feed show the new date. This post has one now, at the top: it's
showing the change I made to add this section on captions.
Drafts
There's no draft flag. A draft is a pull request, read at a private preview address behind a password, and merging it publishes the post. Nobody sees a post before that.