Skip to content
Build logBuild LogsSmall projectsCursorClaude Code

Rebuilding My Portfolio With AI: A Weekend Build Log

The code took a weekend. The two decisions that made the site good took longer than the code did.

By 5 min read

Build log: A record of building something real, including the parts that went wrong.

Project
Portfolio rebuild
Status
Shipped
AI tools
Cursor · Claude
Time invested
11 hours over 2 days
Contents (9 sections)
  1. The goal
  2. How the weekend went
  3. What AI did well
  4. What it got wrong
  5. It reached for a dependency by default
  6. Performance was never volunteered
  7. It could not tell me which landing page was right
  8. Mistakes I made
  9. Result

A portfolio is a good test case for AI-assisted building precisely because it is not technically hard. There is no interesting state, no auth, no data layer. Which means nothing hides behind technical difficulty: whatever is good or bad about the result is design, content and craft.

Stack

Application

  • Next.js
  • TypeScript
  • MDX
  • Hand-written CSS

AI tooling

  • Cursor
  • Claude

Hosting

  • Static export on a CDN

The goal#

The old site was four years old, built on a framework I no longer used, and its main problem was not looking dated — it was that it did not answer the question a visitor actually has: what has this person built, and were they any good at it.

So the requirement was written as content, not features:

requirements.md
A visitor should be able to answer, within 30 seconds:
  - What kind of work does this person do?
  - What have they built that is real?
  - Is the code any good?
  - How do I contact them?
 
Constraints
  - Static. No server, no database.
  - Under 100 KB of JavaScript on the landing page.
  - Keyboard-operable throughout, real focus states.
  - Case studies in MDX so writing one is not a coding task.

How the weekend went#

Build timeline

  1. Sat AM

    Content first, no code

    shipped

    Wrote the three case studies in plain markdown before opening an editor. This was the best decision of the build: with real text in hand, the layout questions mostly answered themselves.

  2. Sat PM

    Scaffold and type scale

    shipped

    Project set up, static export configured, CSS custom properties for the type scale and spacing. Chose the typefaces by hand — the one part I did not want generated, since it is most of the site's character.

  3. Sat late

    Case study template

    shipped

    Agent-written MDX pipeline and article layout. Clean first pass, and the frontmatter schema it proposed was better organised than the one I had sketched.

  4. Sun AM

    The landing page, three times

    reworked

    First version was a generic hero with a tagline. Second was too clever to scan. Third worked: name, one line of what I do, then the case studies immediately. The model produced all three competently; deciding which was right was not something it could do.

  5. Sun PM

    An animation library that should not have been there

    reworked

    Asked for scroll-reveal on the case study cards and got a 40 KB dependency. Replaced with a CSS transition and an IntersectionObserver in about 30 lines, which was also better because it respects prefers-reduced-motion by default.

  6. Sun eve

    Accessibility and metadata pass

    shipped

    Focus states, heading order, alt text, per-page metadata, sitemap. Almost none of this appeared without being asked for specifically.

What AI did well#

The MDX pipeline. Frontmatter parsing, validation, static params, reading time. Well-trodden territory with a clear right answer, and it produced a clean implementation faster than I would have.

Boilerplate that I resent typing. Sitemap generation, metadata helpers, the RSS feed. Tedious, well-specified, easy to verify. Ideal delegation.

Explaining a decision it had made. Asking "why did you use a CSS grid here rather than flex" got a genuinely useful answer that changed how I structured a later section. Using it as a reference rather than only a generator turned out to be underrated.

What it got wrong#

It reached for a dependency by default#

The scroll-reveal request came back with an animation library. Nothing about the requirement needed one, and 40 KB for a fade-in on a portfolio is indefensible.

the replacement, in full
.reveal {
  opacity: 0;
  translate: 0 8px;
  transition: opacity 400ms, translate 400ms;
}
.reveal[data-visible="true"] {
  opacity: 1;
  translate: none;
}
@media (prefers-reduced-motion: reduce) {
  .reveal { transition: none; }
}

Worth noting that the reduced-motion clause was not in the library version either. The smaller solution was also the more accessible one, which is a pattern I have now seen enough times to expect it.

Performance was never volunteered#

Nothing was slow enough to notice on a laptop, but the images were full-size PNGs, the fonts had no display strategy, and there was a layout shift on the case study cards. All standard, all invisible without measuring, and none of it mentioned until asked.

It could not tell me which landing page was right#

Three landing page versions, each competently built, and no help at all with the only question that mattered: which one communicates the thing in five seconds. When I asked directly, I got reasonable-sounding arguments for whichever one I mentioned last.

This is the real boundary. Implementation is delegable. Editorial judgement about what a page should say is not, and asking for it produces agreeable noise.

Mistakes I made#

Building the layout before writing the content. I did this on Saturday morning for one section and immediately regretted it. Layout designed around placeholder text collapses when real text arrives.

Not stating the JavaScript budget upfront. "Under 100 KB" was in my requirements file but not in the brief for the animation task, and the dependency arrived. A constraint that lives only in a document you did not attach is not a constraint.

Trusting "done" too early on Sunday afternoon. The site looked finished before the accessibility and metadata pass. If I had stopped there — and the temptation was real — it would have shipped with an unusable keyboard path through the case study grid.

Result#

Eleven hours, three case studies, a static site with about 34 KB of JavaScript on the landing page and no layout shift. Faster than the same build without AI, probably by half.

The honest accounting of where the time went, though, is the interesting part: roughly three hours of implementation, four hours of writing content, and four hours of deciding and correcting. AI compressed the first bucket substantially and did nothing for the other two.

For a portfolio, that ratio is not a disappointment — it is a reminder that the code was never the hard part.

More from Hamzify

Related reading

Other Hamzify pieces on this topic, the same tools, or the next format worth reading.

Related reading
ExperimentVibe Coding

Prompt to Deployed Product in One Evening: What Held Up

An experiment in shipping a small real product in a single evening with AI doing most of the implementation — and an honest account of which shortcuts were fine and which were debt.

Vibe Coding5 min read
WorkflowWorkflows

The AI Pair Programming Loop I Actually Use

A repeatable five-step loop for working with an AI coding assistant on a real codebase: brief, constrain, generate, verify, integrate — and what belongs in each step.

Workflows5 min read
WorkflowWorkflows

How to Review AI-Generated Code Without Reading Every Line

A review workflow tuned to the specific mistakes coding models make: a triage order, the six failure patterns worth hunting for, and where to spend your attention.

Workflows5 min read

From the same tool

More Hamzify coverage of Cursor

Reviews, comparisons, builds and workflows that mention Cursor, collected in one place. Open the Cursor coverage.