I built my portfolio CMS using Claude Code & Notion

How I designed and built this site end-to-end — a Next.js front end, Notion as the CMS, and Claude Code as my pair — with a living style guide keeping every component consistent.

Timeline2026
My RoleDesign & development (end-to-end)
TeamSolo — design, build & content
Platform
Websites
Focus
Design SystemVibe CodingAI
I built my portfolio CMS using Claude Code & Notion

Context

The way designers build portfolios keeps changing. Over the last decade I've gone from PDF to Notion, then Webflow, Figma Sites, and now vibe-coding. Others use Dribbble or Behance to get discovered, but those platforms own the layout and the story. Your own site is the one place you control both.

But the real question was never the tool. It was who it's really for. What does a recruiter need to grasp quickly? What does another designer want to dig into? And how do I make it fun and easy to maintain?

What I want from a portfolio changed too. I've leaned toward clarity over process, signal over volume, and a voice that sounds like me.

AI is what finally let me build all of that myself. It's more flexible than the platforms before it, with no monthly fee. Built this way, a portfolio stops being proof of skills and becomes a reflection of how you think. This site is my current answer.

Challenges

ChallengeWhy it matters
Every update meant editing codeA new project or a one-line fix needed a code change and a deploy. Too slow to keep fresh.
Site builders didn't fitTemplates looked generic and couldn't match my type, spacing, and components.
Writing should feel like writingPublishing a case study should be as easy as writing a Notion doc, not a coding task.
Consistency across pagesEvery page had to follow the same design rules without me checking each one by hand.

Goals

GoalTarget outcome
Publish without codeAdd or edit a project in Notion and see it live, with no deploy.
Stay on-brandEvery page uses my design system: the same type, spacing, and components.
Own the whole buildDesign and build it myself, end to end, fast.
Keep it low-maintenanceA simple stack I can run and update on my own for years.

Results

MetricResult
Time to publishMinutes, from Notion to live
Content I controlCase studies and articles, all edited in Notion
BuildSolo, with Claude Code
CostRuns on Notion's free plan and low-cost hosting

The build

The CMS

Notion is the content source. I keep two databases, one for case studies and one for articles. Each page's properties become the metadata on the site, and the page body becomes the content. The site connects through an internal Notion integration: I share the databases with it, and it reads them with a secret key kept out of the code. I only added the properties I use, and each one drives something on the page.

PropertyWhy it's there
TitleNames the case study and gives it a clean, shareable URL.
Company, Role, TeamGives a recruiter the context at a glance: who it was for and what I did.
TimelineSignals when the work happened and how recent it is.
Platform, Industry, FocusDrive the filters so visitors can quickly find the work they want to see (industry, platform, focus).
CoverGives each tile a visual hook and sets the hero image, so the work invites a click.
Description, ExcerptA short subtitle that helps visitors decide what to open, and powers SEO and link previews.
StatusLets me draft privately and publish only when a case study is ready.
PasswordKeeps sensitive work private, so I can share it with recruiters, not the whole internet.
The CMS in Notion. Every case study is just a page in this list.
The CMS in Notion. Every case study is just a page in this list.
Editing a case study in Notion. Properties become the metadata, the body becomes the page.
Editing a case study in Notion. Properties become the metadata, the body becomes the page.

Rendering

A renderer I built with Claude Code maps each Notion block to my own components, so the output always matches my design system.

LayerApproachTools
FrameworkServer-rendered for speed and SEONext.js, TypeScript
StylingDesign tokens and utilities, no stray CSSTailwind CSS
ContentFetched from Notion's API, cached and auto-refreshedNotion API
RenderingEach Notion block mapped to an on-brand componentClaude Code
Design systemTokens → components → pages, consistent everywhereFigma, Claude Code
Version controlHistory, branches, and a safety net for every changeGit, GitHub
DeploymentBuilds and ships on every push to mainVercel
Claude Code in my terminal, where the planning, prompting, and refactoring happen.
Claude Code in my terminal, where the planning, prompting, and refactoring happen.

Style guide

Every component also renders on a living style guide that imports the same code the site uses, so the design system can’t quietly drift. I check changes there before they ship.

The living style guide, rendering the real components the site ships.
The living style guide, rendering the real components the site ships.

Reflection

The goal was never to build a CMS. It was to make writing and shipping easy enough that I’d keep the site alive. And that part worked.

What I learned

  • Notion is a lovely place to write, but a loose CMS. Mapping its blocks to my own components keeps the design tight. It also brings quirks, like image links that expire and content that only refreshes on a delay.
  • Owning the whole stack pays off. Design and code decisions feed each other, and nothing gets lost in a handoff.
  • The speed of AI comes from the loop, not blind trust. Describe it, read the diff, then check it in the browser.
  • A living style guide is what keeps everything consistent. Without it, small drifts quietly pile up.
  • Notion is great for writing, but a loose CMS. Mapping its blocks to my own components keeps the design tight.
  • Owning the whole stack pays off. Design and code decisions feed each other.
  • With AI, the speed comes from the loop: describe, review the diff, check it in the browser.

What I'd improve

  • Publish the moment I hit save, with Notion webhooks instead of a refresh interval.
  • Cache Notion's images properly, so pages load faster and don't lean on links that expire.
  • Add a draft preview, so I can see a case study before it goes live.
  • Grow the renderer to cover more Notion blocks as I reach for them.
  • Publish instantly with Notion webhooks, instead of a refresh interval.
  • Cache Notion images so pages load faster and don’t rely on links that expire.
 — I shipped a product solo, from prompt to 599 users
2025

I shipped a product solo, from prompt to 599 users

A weekend vibe-coding project that became a live app. I designed, built, shipped, and marketed an attendance tracker solo with AI — the build turned out to be the easy part.

Suncorp Bank — Personalised communication at scale
Suncorp Bank2025-2026

Personalised communication at scale

Who, Where, When: build a comprehensive customer communication system across digital banking channels.

Suncorp Bank — Scaling a Design System into an App Demo Tool
Suncorp Bank2025-2026

Scaling a Design System into an App Demo Tool

Without a consistent, up-to-date reference, call quality and compliance were at risk. I built frontline staff a single source of truth—faster calls, better resolution, no test devices.