How this blog works

A sample post that doubles as a reference for the frontmatter and Markdown features available here.

This post exists so you have something to copy. Delete it once you’ve written your own — or keep it as a scratchpad.

Writing a new post

Add a .md or .mdx file to src/content/blog/. The filename becomes the URL, so indoor-coverage-basics.md is served at /blog/indoor-coverage-basics/.

Every post needs this frontmatter block at the top:

---
title: 'Your title'
description: 'One or two sentences. Used in listings, search results and RSS.'
pubDate: 2026-09-28
tags: ['rf', 'tooling'] # optional
updatedDate: 2026-10-02 # optional
draft: true # optional — hides it from the built site
---

The schema is checked at build time. If you typo a field name or write a date the parser can’t read, npm run build fails and tells you which file is wrong, rather than quietly shipping a broken page.

Drafts

Set draft: true and the post is visible while you run npm run dev but dropped from the production build, the RSS feed and the sitemap. That’s the safe way to leave something half-finished in the folder.

What Markdown gives you

Ordinary emphasis works — italic, bold, inline code — as do links, lists, and tables:

Band Duplex Typical indoor use
380–400 MHz FDD TETRA / ASTRID
700–900 MHz FDD Coverage layer
1800–2600 MHz FDD Capacity layer

Code blocks get syntax highlighting, and follow the page’s light/dark theme:

def path_loss_db(distance_m: float, freq_mhz: float) -> float:
    """Free-space path loss — the optimistic starting point."""
    return 20 * math.log10(distance_m) + 20 * math.log10(freq_mhz) - 27.55

Blockquotes look like this. Useful for pulling out a definition or a caveat.

Images

Put images in src/assets/ and reference them relatively — Astro will optimise and hash them:

![Antenna layout on level 2](../../assets/level-2-layout.png)

Files in public/ are copied through untouched, which is what you want for a PDF or anything you link to directly.

Headings and the table of contents

Any post with more than two ## headings gets an automatic table of contents at the top. You don’t have to do anything — it’s built from the headings.