Dev.to WebDev 🛠 Dev 👁 1 📖 3 min read

Why I moved my portfolio off Notion and Contentful

My portfolio, amsyn.org, is two things: a blog and a photo gallery. Until recently, I wrote the blog in Notion and kept the gallery in Contentful. Both made sense when I set them up, and both still worked. But over time

My portfolio, amsyn.org, is two things: a blog and a photo gallery. Until recently, I wrote the blog in Notion and kept the gallery in Contentful. Both made sense when I set them up, and both still worked. But over time the site got slower, messier and harder to change, so this month I took them both out.

My blog lived somewhere else

I like writing in Notion, and the editor is great. To get posts onto the site, I forked an old notion-parse project, kept it working with the current Notion API, and added a Next.js MDX mode. It's on npm as @amsyn/notion-parse, and I'll keep maintaining it.

Every time I edited a post, a webhook kicked off a full rebuild that pulled everything from Notion and converted it to MDX. It worked, but it was fragile. My articles only existed inside that build step, a typo fix meant rebuilding the whole site, and when the sync failed quietly, the site could ship without its articles.

A CMS I was only using as a database

The gallery's photos were always in my own storage. Contentful only held the details: title, camera, lens, tags and albums. I had also built my own upload screen, so I never used Contentful's editor, which is the main reason you'd pick a headless CMS in the first place.

That left me fighting its limits without getting its benefits. Every photo page asked Contentful for data while the visitor waited, and the images were resized on the fly from full-size camera files. That's why the gallery always felt a little slow to load.

AI tags I couldn't manage

When I first imported my photos, I let a vision model write the tags and albums. It felt clever. A few hundred photos later, I had Cityscape, Cityscapes and CityScapes as three different albums, and so many tags that the filters had stopped filtering anything. The model also had a habit of guessing locations: plenty of my European photos were apparently taken in Mong Kok.

The model wasn't the problem. Letting it invent its own labels was.

The fixes

A short, fixed list of tags. The site now has one list of allowed tags: subjects like street, mountains or food, and conditions like golden hour or snow. Every photo was re-tagged against that list. Any AI tagging from now on can only pick from it, never add to it. Albums are now trips I name myself, and a location only appears when I actually know it.

The gallery became plain data. All the photo details now sit in one file in the site's code and are read when the site is built. No CMS and no live queries. Every gallery page is generated ahead of time, and each photo is resized once into a few web-friendly sizes and served from a CDN. Location data is stripped from the images, which I should have been doing all along.

The blog moved to my own CMS. Rather than swap Notion for yet another service, I connected my site to Aori Studio, the CMS I build for my clients' websites, so amsyn.org is now its first "client" that's actually me. Studio didn't have a field for long-form writing, so I added a Markdown one, and this post is the first one written in it. When I hit publish, only the blog refreshes, not the whole site.

Write once, publish in a few places. The site has an RSS feed with full articles, and new posts are cross-posted automatically with a link back to the original here. If you're reading this somewhere else, that's how it got there.

What changed

  • The gallery is faster. Pages are ready before anyone asks for them, and images are already the right size.
  • The filters are useful again. A handful of tags you can actually browse by, instead of hundreds of near-duplicates.
  • Writing is simpler. I write in my own CMS, preview the draft on the real site, publish, and that's it.
  • Fewer moving parts. Two services gone, and less for me to keep alive.

The lesson I keep relearning: pick tools for how you actually use them, not for what they can do. Next up is a full redesign of the site, and I'll write about that when it's done.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.