Thuyen Vu

Hello, world

2 min read

metaastro

Contents

Every blog starts with a post explaining why the blog exists. This is that post, kept short.

I wanted somewhere to put the things I work out while building software — the debugging sessions that took three hours and could have taken ten minutes, the design decisions I only understood in hindsight, the tools I keep rewriting. Notes to my future self, published in case they help someone else.

The constraints

The design started from a short list of rules rather than a mood board:

  • One column, roughly 65 characters wide. Long lines are the single most common reason text is tiring to read.
  • Two type sizes for body copy and three for headings. That is enough hierarchy for an article.
  • One accent colour, used only for links and focus rings.
  • No JavaScript required to read a post.

Everything else followed from those. There is no hero image because there is nothing an image would add. There is no sidebar because a sidebar competes with the thing you came to read.

The stack

The site is Astro with Markdown files as the database. Writing a post means adding a file to src/content/blog/ and committing it — no CMS to log into, no API to be down.

Astro ships zero JavaScript by default, which means the only interactive parts of this page are the ones that genuinely need to be interactive:

// The theme toggle is a React island. Nothing else on this page hydrates.
export default function ThemeToggle() {
  const [theme, setTheme] = useState<Theme | null>(null);
  // ...
}

The search box on the archive page is the other island. It is server-rendered first, so the full post list is in the HTML — turn JavaScript off and you lose the filtering, not the content.

What to expect

Irregular posts about backend systems, developer tooling, and whatever I happen to be stuck on. The RSS feed is the best way to follow along.