← All articles

How to add a post to this site

2 min read
metahow-to

This post exists so you can see what the formatting looks like when it renders, and so you have something to copy when you write your first real article. Delete it whenever you like — remove content/blog/2026-06-15-how-to-post.md and rebuild.

The three steps

  1. Create a new file in content/blog/ named YYYY-MM-DD-a-short-slug.md.
  2. Write it (front matter first — see below).
  3. Run python3 build.py, then commit and push. The site rebuilds and deploys itself within a minute or so.

Front matter

Every post starts with a small block between two --- lines:

---
title: Nobody reads your alerts
date: 2026-08-10
description: One sentence that appears on the blog index and in Google results.
tags: [detection, soc]
draft: false
---

title, date and description are the ones that matter. Set draft: true to keep a post out of the built site while you work on it. The URL comes from the filename, with the date stripped off — so the file above becomes /blog/nobody-reads-your-alerts/ if you name it 2026-08-10-nobody-reads-your-alerts.md.

Formatting that works

Regular paragraphs need no special treatment. Bold, italic, inline code and links all behave as you'd expect. External links open in a new tab automatically.

Lists

  • Bullet points, one per line
  • Nested content is best kept flat
  • Short lines read better than long ones
  1. Numbered lists work the same way
  2. Useful for procedures and runbooks

Code blocks

Fence them with three backticks. A language name after the opening fence is optional:

import hashlib

def sha256(path):
    digest = hashlib.sha256()
    with open(path, "rb") as handle:
        for chunk in iter(lambda: handle.read(65536), b""):
            digest.update(chunk)
    return digest.hexdigest()

Tables

FieldPurposeRequired
titleShown as the headlineYes
dateSort order and display dateYes
descriptionIndex card and meta descriptionRecommended
tagsSmall labels on the cardOptional

Quotes

Useful for pulling out a finding, a definition, or a line from an advisory that you want to sit apart from your own text.

Images

Put the file in static/ and reference it as /assets/filename.png:

![Alt text describing the image](/assets/diagram.png)

Always write real alt text. It matters for screen readers, and it's what displays if the image fails to load.


A note on what to write

The posts that do the most for a personal site are the ones only you could write: something you debugged, something that surprised you, a process you worked out because the documentation didn't cover it. Those are also the easiest to write, because you already know the material.

Publishing something imperfect regularly beats polishing something perfect indefinitely.