Skip to content

Dissecting My Portfolio

Naseebullah AhmadiSenior Software Engineer, London

Three years of starting, stopping and rewriting a personal site. The blocker was never the technology: it was perfectionism dressed up as engineering standards.

2 min read
#engineering
The itsnas.me portfolio homepage

Three years, but not three years of coding. Some months I shipped every week; some months I opened the repo, stared at it, and closed it. Every design choice felt personal and every unfinished page felt like public evidence I wasn't ready. Version three shipped once I stopped trying to build a final portfolio and started building something boring enough to keep running.

How it fits together

  1. MDX posts to content-collections (validated, typed): frontmatter checked at build
  2. content-collections (validated, typed) to Next.js app: typed articles
  3. @nas/ui (Tailwind + shadcn) to Next.js app: components
  4. Next.js app to Reader: server-rendered pages
One monorepo. Content is typed data, the UI is a shared package, and the app just puts the two on a page.

The repo is a #turborepo monorepo on #pnpm, which keeps the app, the UI kit and the content pipeline separate while they share types and tooling.

PieceJob
#nextjs + #typescriptServer rendering and routing without fighting the framework; content models stay explicit.
#mdx + #content-collectionsPosts are typed data, not loose text: bad frontmatter fails the build, not the page.
#tailwindcss + #shadcnOne visual language, so a new section doesn't need a new design.
#figmaWhere a design starts. Real content in the browser is where it gets decided.

Every tool had one job: help me publish faster with less maintenance.

What three years taught me

I used toWhat actually worked
Push through late nights to finishProtecting energy. Tired me rewrote things I'd already solved.
Wait for one more polish passShipping rough. Readers cared about clarity and speed, not my spacing system.
Get the design right in FigmaIterating on live pages. A section that looks great in a mock can read heavy.
Chase new toolsBoring, reliable ones. Shiny tools become a side quest.
Cringe at old versionsTreating each as a milestone: V1 taught momentum, V2 structure, V3 restraint.

If you're building your own: pick a stack you can maintain when life gets busy, publish before your inner critic is satisfied, and let small, frequent changes do the work. No hero rewrites.