I Built My Blog Without Slugs, MDX, or Headaches

June 17, 2025

So I built this blog section of my portfolio recently, and I just want to say: dynamic routes are great and all, but sometimes you just want things to work.

At first, I tried setting up the typical [slug]/page.tsx structure, loading.mdx files from folders, using gray-matter andgenerateStaticParams(). But then Next.js 15 hit me with “Event handlers can’t be passed to Server Components” and honestly? I was over it.

So I simplified everything. No dynamic routes. No MDX. I just created a folder for each blog post (like /blog/first-post/page.tsx) and wrote the content directly in JSX. When I want to add a new post, I copy a folder, write a new one, and link to it manually from the blog index.

Yeah, it’s manual — but it’s solid. No 404s, no broken builds, no weird frontmatter parsing. And it still gets statically generated and fast.

Could I switch to MDX later? Totally. But right now, I just wanted to ship something that worked without wrestling my setup every step of the way.

If you’re also struggling to get a blog working in the App Router without Next yelling at you about Client Components, this setup might save you some frustration.

Anyway, welcome to the blog. More posts soon. Hopefully less debugging in the next one.