Re-writing my blog in Next.js 15
This winter break, I re-wrote my personal website. It went great. Hereās the behind-the-scenes story.
Motivation
In the summer of 2020 (āin the midst of the COVID-19 pandemic, locked in my parentās basement), I, as a bright-eyed computer science freshman, decided to take on a nobel endeavor: re-writing my personal website.
My previous instances (v1, v2, and v3) had used Jekyll (i.e., a lot of mangled HTML and CSS, managed with Ruby). I had recently learned React, and was overall a much more component developer. It was time for an upgrade!
I shopped around for frameworks. I knew I wanted something with built-in static site generation, since I was probably going to blog. I remember evaluating things like Hugo (Go), Pelican (Python), and Next.js, but ultimately settled on a lilā olā framework called Gatsby.
That was not a very good idea.
I subsequently endured 4 years of errors likeā¦

ā¦orā¦

Not fun. I had to perform maintaince constantly, and it felt like there was always something to upgrade. It wasnāt fun for me to work on my site anymore; I dreaded adding new features. No good! After Netlify acquired Gatsby, I knew it was completely doomed.
This Christmas break, I decided it was time for a change. Hereās the old site in case youāre curious. I have been writing a lot more in 2024, and need a platform to support that. I briefly evaluated 2 options.
- Go full āNat Friedman,ā and only use HTML and CSSākeep it plain
- Go full āoutāāopt for the latest-and-greatest in web tech, and add a bunch of fancy (useless) features
Option one solves the exact pain point from my most recent website⦠but option two is more fun! (Donāt worry, Iām aware Iām probably going to have to deal with an onslaught of Next and React upgrades).
After all, Iām (at least these days, primarily) a web developerāultimately, I love writing websites. Itās a chance to learn something new and explore the ecosystem. AlsoāNext.js has a fairly rich community, and Vercel seems like a wonderful hosting platform.
~62 commits later, Iām more or less done. Hereās how I got there.
Re-write
As mentioned, I went with option two. That translated to an app with React 19, Next.js 15, Tailwind, and shadcn/ui, deployed on Vercel. To make things more interesting, Iām using Notion as a kind-of CMS, since I like writing on here, and I like Notion sites, but still want my corner of the Internet to feature my blog, portfolio, and travel writing.
Ultimately though, I wasnāt super interested in doing all the basic boilerplate by hand. Thankfully, itās not 2020 anymoreāI have access to Claude Sonnet. For a mere price of $20 a month, I have (what feels like) ā2020 Michaelā in my back pocket. Letās put him to use!
Adventures with Claude
First things first: I made a project.

OpenAI recently shipped this feature too, but I find Anthropic a far more deserving company of my hard-earned dollars, o3 or otherwise. Letās hope they catch up in 2025.
Anyhoo, here was the project prompt.
I'm in the midst of re-writing my personal website. The old version is written in Gatsby, under the folder
\\\\\\\\wsl.localhost\\\\Ubuntu\\\\home\\\\mdema\\\\code\\\\michaeldemar.co(note the escaped slashes). The new code is written in Next.js 15, available in\\\\\\\\wsl.localhost\\\\Ubuntu\\\\home\\\\mdema\\\\code\\\\michaeldemar.co-v5. It also now uses TypeScript,shadcn, and Tailwind. It follows best practices. Currently, the basic website is in place, and we have a blog and design portfolio made. The new website is mostly a superset of the old one, bringing over the existing features but also adding a bunch of new, cool functionality. You will help me finish the website re-write, by leveraging code and making sure I don't miss details from the old site.
and the snippet in project knowledgeā¦
The old Gatsby.js code is at
\\\\\\\\wsl.localhost\\\\Ubuntu\\\\home\\\\mdema\\\\code\\\\michaeldemar.co. The new Next.js 15 code is at\\\\wsl.localhost\\Ubuntu\\home\\mdema\\code\\michaeldemar.co-v5. You have access to the filesystem (note the paths). You have access to your own memory bank; use it as you'd like. You have access the Brave Search, in case you need to look anything up. The new site uses Next.js 15, TypeScript, Tailwind,shadcn. Weāre in the middle of the re-write; some progress has been made
The astute reader may notice something weird. Iām giving Claude file paths⦠but no files? And access to Brave Search? A memory bank?! What is this hersey?
This hersey is Claudeās āModel Context Protocol.ā Iām still surprised when I meet other developers that havenāt heard of it. The short is that it gives LLMs a standard protocol to interface with MCP servers, which can take actions on their behalf. For example, if you have an MCP server with access to filesystem operations (e.g., listing files in a directory, reading files, writing files), an MCP client (such as Claude Desktop) can take those operations with your permissions.
Setting up my MCP server was a bit tricky. I use Ubuntu on Windows (i.e., WSL); to get Claude Desktop to connect, I had to run the MCP servers on Windows, and then provide those wonky filepaths you see in my prompt. After a bit of hair pulling to get it all working, the end product is fantastic.
Once it was setup, I used Claude as a fully-fledged junior engineer. Below are some highlighted conversations. It was able to walk me through the entire re-write, step-by-step. It also helped me write a fully-functional ābuild stepā for using Notion as a CMS. I also had it develop some fun features, like a sitemap view or a list of other sub-domains under michaeldemar.co.
(I want to put them in toggles here, but for now Iāll just link the files. Go to take a look at the filesystem MCP server if youāre curious)
Conversation #1: Setup
Conversation #2: Notion CMS
Conversation #3: Polish
All in all, I donāt think I wouldāve been able to get this project done at nearly the same quality or efficiency without Claude or MCP. Shoutout to the Anthropic team!
shadcn is magic
Iād seen a lot of shadcn in the wild, but never really bothered to look it up. Candidly, I assumed it was just another CSS framework. I could not have been more wrong!
This is the component library. In mere seconds Iām able to able to sketch out features that wouldāve taken my days or weeks prior, thanks to npx shadcn@latest add (component). It works beautifully with my chosen color scheme (in src/app/globals.css) right out of the box. It feels like magic!
It was so easy and fun to use this tool, I ended up shipping a few nonsense features like search (hit CTRL + \ on my site) and an image gallery for each of my design portfolio entries. (For example, take a look at this page.) And Iām not done either.
Vercel is (also) magic
Vercel is a wonderful hosting platform. For a long-time, I had been a bit of a Vercel doubterāone of the āitās just an AWS wrapperā folks. To be honest, thatās still probably true, but with a generous hobby tier and a bunch of very handy bells and whistles, I donāt care. What really sold me was Guillermo Rauch (Vercelās CEO) statingā¦

If itās good enough for him, itās good enough for me. And that makes me inclined to believe Iām not going to get Herokuād off of Vercel. (Never forgive, never forget.)
Iām trying out the analytics and speed insights available on the platform. Will follow-up with thoughts on those in due time.
The new michaeldemar.co
So, go check it out! Here are some of my favorite pages and features from the new site.




Next (up)
So whatās Next for my website? A few thingsā¦
Smarter CMS
Right now, on a prebuild script, Iām pulling all of my Notion and Cloudflare data. This is a bit expensive.
For Notion, each database entry has an Edited property. If Edited is before the current date, I can skip that item.
For Cloudflare, I can save a lastFetched field to the JSON, and skip the query if weāve fetched within, say, the last week. Thatās probably sufficient.
Better MDX
The MDX logic (for rendering content pulled from Notion could improve). Some easy examples: render to-do list blocks properly, and show YouTube embed blocks.
Automated deployments
OK, of course Vercel has automated deployments when I push to main. What I mean is the ability to trigger new builds when a blog post is released.
Better search
My search is a bit lazy. Iām hard-coding in available pages, and it currently doesnāt support searching for page content. Lots to improve there.
Design re-think
The color scheme is okay, but I could definitely do gruvbox a bit more justice.
Closing
Thanks for reading! Hope you enjoy the new site.
Also while youāre hereāconsider subscribing to my Buttondown newsletter here.
Happy New Year!
