All posts

Hello, World

metaintro

A quick introduction to this blog — what it's for, what to expect, and how it was built.


Every developer eventually writes a "hello, world" post. This is mine.

What this blog is for

This site is a professional portfolio, but the blog section exists for a different purpose: to write things down before I forget them. Technical discoveries, lessons from shipped features, opinions about tools I've used long enough to have formed a real view on.

Not tutorials. Not hot takes. Just things I wish I could have told myself six months earlier.

How it's built

The site is a statically generated Next.js 16 app, using:

  • Tailwind CSS v4 for styling
  • shadcn/ui (base-nova style) for accessible UI primitives
  • Velite for processing MDX — I pick it over Contentlayer because Contentlayer is no longer maintained and Velite works cleanly with Turbopack
  • rehype-pretty-code + Shiki for syntax highlighting

This post, for example, is a plain .mdx file sitting in src/content/blog/. After a velite build, it becomes a typed TypeScript object consumed by Next.js's static site generation.

Code looks like this

// Velite schema for blog posts
const posts = defineCollection({
  name: "Post",
  pattern: "blog/**/*.mdx",
  schema: s.object({
    title: s.string(),
    date: s.isodate(),
    summary: s.string(),
    tags: s.array(s.string()).default([]),
    body: s.mdx(),
    slug: s.path(),
  }),
});

That's all. More posts when there's more to say.