Iderbrandt
HemOmBloggAnteckningarLänkar
Logga in☕ Coffee

© 2026 iderbrandt.com. Alla rättigheter reserverade.

☕ Coffee
Building a Custom Notion CMS with Next.js 14
Project•Admin•3 min read•2 visningar

Building a Custom Notion CMS with Next.js 14

December 25, 2025

Building a Custom Notion CMS with Next.js 14

I've always loved Notion for its writing experience, but I wanted full control over my blog's frontend. Today, I'm excited to share (and test!) the new custom Content Management System (CMS) I've built for iderbrandt.com.

In fact, I am writing this very post inside the new Admin Dashboard we just built!

Why Build a Custom CMS?

While there are plenty of headless CMS options out there, I wanted something that felt personal and integrated perfectly with my workflow. My requirements were simple but specific:

Notion as the Database: I want to keep my data in Notion because it's portable and easy to manage.

Frictionless Writing: I need a distraction-free editor that supports Markdown.

Image Power: Handling images should be as easy as dragging and dropping.

The Tech Stack

  • Framework: Next.js 14 (App Router)

  • Database: Notion API

  • Styling: Tailwind CSS

  • Auth: NextAuth.js (Secure Admin Access)

  • Storage: Cloudinary (for high-performance images)

Key Features

  1. The Admin Dashboard

I built a secured /admin route that allows me to manage all my posts. It connects directly to the Notion API to fetch, create, update, and delete pages. No more jumping between Vercel logs and Notion tables.

  1. The "Split View" Editor

Writing Markdown is great, but seeing how it renders is better. I implemented a Split View mode that shows the raw Markdown on the left and a live preview on the right.

  1. Drag & Drop Image Uploads

This is my favorite feature. I can simply drag an image from my desktop directly into the editor. The system automatically:

Uploads it to Cloudinary.

Optimizes it.

Inserts the correct Markdown ![image](url) tag right where my cursor is.

  1. Slash Commands

Inspired by Notion itself, I added "Slash Commands". Typing / opens a menu to quickly insert headings, code blocks, quotes, and lists without taking my hands off the keyboard.

How It Works Under the Hood

When I hit Publish, the application sends the Markdown content to a server-side API route. This route parses the Markdown into Notion "Blocks" (paragraphs, headings, images) and pushes them to the database via the Notion SDK.

Finally, it triggers revalidatePath, so this post appears on the live site instantly—no rebuilds required.

Conclusion

Building your own tools is one of the most satisfying parts of being a developer. This new workflow removes all the friction from writing, allowing me to focus on what matters: sharing ideas.

Hello world, from my new CMS! 🚀

Enjoyed this post?

Share it with others who might find it helpful!

Share this post
X (Twitter)FacebookLinkedInEmailWhatsApp

Enjoyed this post?

If this content helped you, consider buying me a coffee to support my work!

Buy me a coffee

Popular Posts

Svårflörtade Google

Svårflörtade Google

8 views

Chrome and My Mac: Facing the End of Monterey Support (and My Ubuntu Solution!)

Chrome and My Mac: Facing the End of Monterey Support (and My Ubuntu Solution!)

5 views

The Hobby Machine: Moving Beyond the "Boring" PC

The Hobby Machine: Moving Beyond the "Boring" PC

5 views

Fortsätt läsa

💭Senaste tankarna

Just testing

Hello 🙂

Jan 23
Visa alla anteckningar →

Related Posts

Why I Migrated my Next.js Blog from Vercel to Cloudflare Workers

A practical, step-by-step account of why I moved my Next.js (App Router) site off Vercel and onto Cloudflare Workers using OpenNext—what broke, how I fixed it, and the lessons learned for future migrations.

How to Implement Notion as a CMS for Your Next.js Blog

A complete step-by-step guide to using Notion as a headless CMS for your Next.js blog, including setup, implementation, and automated migration scripts.