metadevopsnextjs

Hello World: Why I Built This Site

·2 min read

This is the post where I explain why I built yet another personal site. I know, I know — every developer has one. But this one is mine, and it's built to do exactly what I need: showcase the things I'm building and give me a place to write about them.

Why MDX?

I wanted to write posts that feel like code. MDX lets me drop in custom components mid-paragraph, render live examples, and keep everything version-controlled. No CMS, no database — just files in a repo.

// lib/mdx.ts — the whole blog engine in one file
export function getAllPosts(): PostMeta[] {
  const files = getPostFiles();
  return files
    .map((filename) => parsePost(filename))
    .filter((post) => post.frontmatter.published)
    .sort((a, b) => new Date(b.frontmatter.date).getTime() - new Date(a.frontmatter.date).getTime());
}

The getAllPosts() function reads every .mdx file from content/blog/, parses the frontmatter with gray-matter, filters out unpublished drafts, and returns them sorted newest-first. That's the entire blog engine. Zero dependencies on external services.

The Stack

This site runs on Next.js 14 with the App Router. Styling is Tailwind with CSS custom properties for the theme system. Syntax highlighting is rehype-pretty-code backed by Shiki — which means the highlighting happens at build time, not in the browser.

If you're building a blog with Next.js, use rehype-pretty-code over highlight.js or prism. It's faster, more accurate, and supports every language you'll ever need.

Deployment is Vercel. The domain is letmecook.engineer — which I registered because it was available and made me laugh.

What's Coming

I'll be writing about:

  • DevOps and infrastructure — pipeline architecture, monitoring setups, Terraform patterns
  • Project retrospectives — what I built, what broke, what I'd do differently
  • Side project deep dives — DataCommand, CompoundVice, the Godot game that may never ship

Posts will be irregular. Quality over cadence.

Posts with published: false in their frontmatter won't appear in the index or be accessible by slug. Drafts stay private until I'm happy with them.

If something here is useful to you, great. If you disagree with something, the email link is in the footer.

Let's cook.