claude-code

How I Built My Portfolio Website With Claude Code And How You Can Too

By Peace Akinwale15 min read
How I Built My Portfolio Website With Claude Code And How You Can Too

I write for a living. I am not a developer.

And yet, somewhere between a deadline and a quiet Tuesday afternoon, I built a portfolio website from scratch without a web design agency or developer to call when something broke.

This is what my portfolio looked like before:

old Hashnode portfolio: a plain "Blog" header, search bar, and three article cards in a basic grid layout

And this is what it looks like now:

new custom portfolio: Peace Akinwale's editorial-style site with a featured article hero, magazine-style grid, and clean navigation

It’s also where you’re reading this article. You can check the landing page and other pages to see what I’ve done.

It took me about 24 hours across two days and would cost me $7/year to maintain it. I want to show you how to recreate this on your website, and even better, with Claude Code.

What you need

  • A Claude account (or an Anthropic API key)

  • A Hashnode account (or any other CMS that has an API)

  • A domain name via Namecheap (or any other registrar you prefer)

  • A free Vercel account for frontend

  • About two to three hours of your time.

Now, let's get into it.

How to Use Claude Code to Build a Portfolio Website

First, why Claude Code and not Codex, OpenAI’s coding agent?

Claude Code prompts you to review and approve new code before it writes anything. Codex feels slower, and its default setting doesn't ask for your sign-off before making changes.

That may work fine for senior developers, but as a junior dev guy, you want to read what it writes and decide what to accept before you accept it. This is my experience/preference though.

1. Start with your Namecheap

I've used Namecheap since 2023, when I first designed my portfolio website. It's cheap, straightforward, and gets the job done. But you can choose an alternative like Hostinger.

Search for your domain name on Namecheap:

Namecheap domain search page showing a .com domain available at 10.98/yr

Once it’s available, add it to your cart. You can use the code NEWCOM679 to bring the first year down to $6.79.

Here's what my purchase summary looked like, $6.99:

Namecheap purchase confirmation showing Domain Registration at $6.79, ICANN fee $0.20, Free Domain Privacy, Total Charged: $6.99

2. Set up Hashnode as your CMS

Hashnode is a headless content management system (CMS), which means it handles your content storage and management while you get full control over how that content looks on the front end.

Developers use it for API docs; I've always used it as a portfolio website, so migrating from it was straightforward.

If you're starting from scratch, say you've been on Journo Portfolio or a similar platform, you'll be creating a new blog from the ground up.

Head to Hashnode, sign up, hit "Create blog," and check if your preferred URL is available:

Hashnode "Create new blog" modal with Blog name and Blog URL fields, showing "Congrats, subdomain is available" in green

I'd use your domain name as the blog URL — peaceakinwale, or whatever your (brand) name is.

Once that's set, refresh the page, click "Dashboard," and you'll see options to add pages, write articles, and configure your setup:

Hashnode blog dashboard showing the live blog

But that's not the goal here. The goal is to vibe-code your entire website so it looks completely different and is fully customizable for your “brand.”

3. Enter Claude Code via the terminal

Every Windows and Mac device has a terminal built in. To install Claude Code, run this command if you're on a Mac or Linux:

curl -fsSL https://claude.ai/install.sh | bash

If you're on Windows:

irm https://claude.ai/install.ps1 | iex

Once it's installed, open your terminal and type “claude,” then hit Enter:

Windows PowerShell terminal showing "claude" typed at the prompt, Claude Code launching with a workspace safety check asking the user to confirm they trust the folder

If there's a specific folder on your computer where you'd like to keep your portfolio project, you'll want to navigate there before you start.

Type “cd” followed by the path to that folder. For example, cd C:/Peace PC, and hit Enter.

That tells the terminal to move into that folder so that when Claude Code starts building, the files land exactly where you want them.

If the folder doesn't exist yet, you can ask Claude Code to create it for you.

I keep a dedicated folder for my work, so I'd tell it to go to “C:/Peace PC” and create a new folder called “Portfolio” inside it, which I can then access by navigating to “C:/Peace PC/Portfolio.”

Quick note on what those terms mean: “cd” stands for "change directory." It's how you move between folders on your computer through the terminal, the same way you'd click into a folder on your desktop. “C:” refers to your C drive, the main storage drive on a Windows machine. The “/” separating the folder names works the same way a slash works in a web URL. It marks where one folder ends and the next begins.

4. Give Claude Code a master prompt

Here's a starting prompt you can copy, paste, and tweak:

"I need a portfolio website that integrates with Hashnode (or any other CMS) as a headless CMS via GraphQL API, automatically deploys to Vercel, and syncs with GitHub for version control. The site should have an editorial magazine-style design (you can change this) with an xyz color scheme. Use Georgia serif for headings and article content, and system sans-serif for UI elements.

The homepage should include xyz (specify your details and provide access where needed), a tagline with the words bla bla bla, and support for new pages I'll add over time."

A detailed starting prompt for Claude Code on the terminal interface

This prompt is a starting point. The more specific you are upfront, the less back-and-forth you'll need later, and the closer your first build will be to what you actually want.

A more thorough prompt can trigger Plan Mode immediately, and you’ll still have questions to answer. For example:

A more detailed starting prompt that triggered Plan Mode immediately that I used for a client’s project

So when you write your prompts, go deep.

Drop links to websites you like, and paste in screenshots of specific design details you want Claude to mirror: a particular header layout, a font pairing, the way a certain site handles images.

On Windows PC, paste a screenshot into Claude Code with Alt+V.

On Mac, use Control+V.

Quick note: The standard Ctrl+V on Windows and Cmd+V on Mac won't work here because terminal emulators handle paste differently from regular apps. If the shortcut is still being finicky, you can drag and drop an image file directly into the terminal window and Claude Code will recognize it as an attachment.

Specify your brand colors too.

Describe how you want your landing page arranged: whether it's clean text about what you do or something more visual. The more you put in, the more you get out.

One thing that made this stage easy was Wispr Flow. See demo.

When I have a clear picture of what I want to build and I don’t want to forget, I just say it out loud and Wispr Flow transcribes it into the terminal. It works anywhere on your PC or Mac, so it's not limited to this workflow.

Here's what a dictated prompt looks like inside the terminal:

Claude Code terminal showing a Whispr Flow-dictated prompt describing an image lightbox feature and table of contents

Of course you can edit this. If you want to try Wispr Flow, this is my referral link. If you sign up through it and actually record 2k words, I might get a free month’s sub.

When Claude Code needs more information (e.g. Github repo, Hashnode publication ID) to get started, it'll ask:

Claude Code terminal asking for Hashnode publication URL, GitHub repository name, and local project folder path, with Option 1 (manual setup) and Option 2 (Claude creates the repo via CLI) visible

If you don't know how to find some of these details, just tell Claude Code. It will walk you through the process, step by step.

Asking Claude questions on how to create a github repo

One thing worth knowing: Claude Code can create a GitHub repository for you directly from the terminal.

If you'd like it to handle the full setup while you watch (Github and Vercel), choose the option where it asks if you have a CLI and whether it should install one so it can create the repo for you. It'll install GitHub and Vercel CLI, it’s essentially a remote control for GitHub that lives on your machine, and take it from there.

Once you've fed it everything it needs, it starts building:

Claude Code terminal showing project overview: Next.js 15 + TypeScript + Tailwind CSS stack, Hashnode GraphQL API integration with a checklist of build tasks in progress

5. Interrupt and redirect mid-build

You don't have to wait until Claude is done to change course. If you want to add something, e,g, a particular animation, a styling choice, press Esc to interrupt and tell it what you want.

This is also a good moment to reach for Wispr Flow if the idea in your head is easier to say than to type.

For example: while building this project, I got a TechCrunch email and loved the way their article page was laid out. I pasted the link into Claude and told it I wanted the blog styling to look like that. Here's what it pulled from the page:

Claude Code terminal showing a fetch from a TechCrunch article URL, returning a detailed design and typography analysis: font families, heading scales, line heights, color palette

But this doesn’t say much, right? You can press Ctrl+O on Windows (or Cmd+O on Mac) to expand the view and see exactly what Claude saw and how it processed the page:

Claude Code expanded view showing the full TechCrunch design analysis broken down into font families, typography scale, color palette, and layout structure

6. Check your site on localhost and deploy when you're ready

When Claude Code tells you to check your site at localhost:3000, it means the initial build is done. Open your browser and go to that address.

What you see there is exactly what your live site will look like.

Localhost is just your computer acting as its own private server, showing you the site before anyone else can see it.

At this point, you can keep tweaking. Change the layout, adjust the colors, add a new section; anything you want to refine before it goes public.

When you're excited enough to share, even as a rough draft, you can deploy to Github (and then Vercel) and send the link to anyone who wants to see what you've built.

Ask Claude Code to walk you through how to push to GitHub, set up Vercel, and connect your domain. It will guide you through each step and make the whole process faster than you'd expect:

Claude Code terminal showing deployment guidance, walking through GitHub push, Vercel connection, and domain setup steps

7. Import your repo on Vercel

If you have allowed Claude via the terminal to connect your Github with Vercel, you don’t need this part of the article.

But if not, it can still guide you on how to do it. Simply create a Vercel account and allow Github (or sign up with Github). It’ll automatically pull all your repositories.

Then, create a new project, and choose your portfolio repo to get started. Hit deploy afterwards:

Vercel "New Project" screen showing a Portfolio repo being imported from GitHub, with Next.js selected as the application preset and the HASHNODE_API_TOKEN environment variable already filled in

When it comes to adding your custom domain from Namecheap, click "Add Existing" and Vercel will point you through the DNS configuration.

Once it's done, you'll have two domains listed: a Vercel subdomain and your Namecheap domain. The live site runs on the Namecheap one:

Vercel Project Settings showing the Domains section, with a .com subdomain marked as "Valid Configuration" and connected to Production

8. Keep building: When things break, use Plan Mode

You’ll hit roadblocks, and you’ll be frustrated. Treat each error as part of the process because that’s what this is: a process.

When your pages are returning 404 errors or something isn't behaving the way it should, tell Claude Code about it and prompt it to enter Plan Mode to properly debug the issue.

You can also paste in a screenshot of whatever is breaking. Claude can read it and use it to understand what's going wrong.

It may ask you to fetch your deployment logs (activity records from your production environment) that help Claude understand exactly what's failing.

Here's an example: the portfolio I was designing had a build error.

Pages were showing 404s even though I had already published the blog posts on Hashnode. Instead of digging through it myself, I explained the problem to Claude and told it to enter Plan Mode:

Claude Code terminal showing the 404 debugging session: Claude identifies the root cause, enters Plan Mode, and begins investigating

It read the files, checked the logs, reviewed the deployment, and diagnosed the root cause. Here’s what a Plan Mode outcome looks like:

Claude Code Plan Mode output showing the fix

Once you've read through the plan and have nothing to flag, hit "Yes, clear context and auto-accept edits" and it gets to work:

Claude Code showing the "Ready to code?" prompt with four options

Tweaking Your Website

Your imagination is your only impediment when you’re vibe coding.

The other real limit is whether you can (and how you) articulate what you want. The clearer the picture in your head and in the prompt, the closer Claude Code gets to putting it on the screen.

Here are a few things I added that made my portfolio feel a bit better IMO:

1. Image Lightbox

GIF showing more prominently over the screen when clicked

Click any image in this article and it opens in a full-screen overlay. It has a dark backdrop, zoom-in animation, and left/right swipe if there are multiple images on the page.

I added this because I saw it on someone else's site and thought: if I’ll have screenshots in a post, people should be able to actually play with them. It made sense to me.

2. Table of contents

table of contents modal

Hashnode's default build had one, but it didn't carry over when I rebuilt the UI with Claude Code.

So I built one from scratch, and it ended up better than Hashnode's original. There's still room to improve it, and I will.

3. Search bar on the blog

blog page with search bar

Back in the day, I read literary magazines obsessively. Poetry Foundation, The Iowa Review…, places that published the kind of writing that made you want to read it twice.

When I fell in love with a particular poem, essay or a writer, I used the search bar to find everything they'd published. When I had the flexibility to build that into my own site, it was an obvious choice.

4. Added an image to my About page

about page

I added a photo of myself to my About page. Could I have done this without Claude Code? Probably.

But having AI handle the implementation made it easy.

Which CMS Can You Use as a Portfolio Website?

After my LinkedIn post on how I built this, a few people DM'd asking about alternatives to Hashnode (because that’s where their sites were hosted). I looked into it. Here's what works:

  1. WordPress

  2. Ghost (note: if you're in Nigeria, you may run into payment issues. They rejected every USD card I tried, which is genuinely maddening).

  3. Sanity.io: a headless CMS with a visual editor

  4. Keystatic: similar to Sanity, but stores your content as files directly in your GitHub repo

  5. Plain markdown files saved to GitHub, if you're comfortable enough on the technical side

What they all share, except option 5, is an API.

That's what allows Next.js, the underlying code structure that handles how your site is built, to fetch and display your content from whichever CMS you choose.

In other words, you can use any CMS that has an API so Next.js can fetch your posts easily.

Other FAQs:

1. How long does this take?

Anywhere from three hours to a full day, depending on how many pages your current site has and whether you can export them.

It also depends on the tweaks you want to make, and how detailed your initial prompt was. A more specific prompt from the beginning will get you closer to your vision faster, and leave you with less to fix afterward.

Also, with Hashnode specifically, their editor has been acting up lately, so you may need to manually re-add images to existing blog posts.

But I think a website for a full day of work is a good deal. You’d probably spend as much tweaking a “done-for-you” portfolio website.

2. How much did this cost?

Honestly, just $7.49 in total on domain for the first year, plus whatever Claude Code cost for your time on the terminal. The typical $20/m should do. After the first year, you’d renew your domain for less than $15/year.

If you're using a paid CMS like WordPress or Ghost, factor in their subscription costs on top of that.

3. Can I add animations?

Yes. And if you can picture the animation clearly and describe it in detail, you'll be genuinely surprised by what Claude Code builds.

4. Can I edit later?

Yes. Your project files are saved locally on your computer.

Go back to the terminal, start Claude with “claude,” and navigate to your project folder using cd C:/... and make whatever changes you want with Claude Code's help if you need it.

I just added a blog UI (for lines of code) as I reviewed this article:

Asking Claude Code to make lines of code visible on the blog.

I'll update this article as more questions come in.

Need help getting this set up? Reach out on LinkedIn or send a message on WhatsApp. I'm happy to walk you through it.

And if you’d like to talk about a potential project, book a call or fill a form in the contact page.

If this article saves you time or money, you can buy me a coffee here. It goes a long way.

Related Articles

How to Create an Editorial Style Guide With Claude
claude-code

How to Create an Editorial Style Guide With Claude

Every freelance writer has that moment: you submit what you thought was a polished draft, only to get it back marked up with notes like "This doesn't sound like us" or "Our product doesn't work that way. See (link to resource) for more." The problem ...

10 min read