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.