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:

blogs/what-this-blog-can-do/blog.mdyaml
---
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:

main.gogo
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:

deploy.shbash
aws s3 sync dist/ s3://example-bucket/ --delete --cache-control "public, max-age=31536000, immutable" --exclude "index.html"

Images

A gradient from blue to green, with a white ring in the middle
A generated gradient, here only to show an image and a caption.

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:

![A gradient from blue to green](gradient.png "A generated gradient.")

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.