Hossein Shakouri

July 4, 2026 · 1 min read

Building mhshakouri.dev

  • nextjs
  • meta

After 15+ years of building websites for other people, I finally built one for myself. This post documents the stack and a few decisions — partly as a hello-world for the blog, partly as a reference for future me.

The stack

  • Next.js 16 (App Router) with React Server Components by default
  • Tailwind CSS v4 with design tokens as CSS custom properties
  • content-collections for type-safe MDX content — this very post is a validated document with a zod schema
  • Cloudflare for hosting (via OpenNext)

Type-safe content

Every post is validated at build time. If I forget a description or typo a date, the build fails instead of shipping a broken page:

const posts = defineCollection({
  name: "posts",
  directory: "content/blog",
  include: "**/*.mdx",
  schema: z.object({
    title: z.string(),
    description: z.string(),
    date: z.iso.date(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false),
  }),
});

That's the kind of guarantee I want from a side project I'll touch twice a year: the site should refuse to build before it ships something half-broken.

What's next

Projects, talks, and a playground for interactive experiments. The full roadmap lives in the repo, and future posts will dig into the more interesting corners of it.