Md Foysal Ahmed

How I Built My High-Performance Portfolio Website

A detailed walkthrough of the technologies and design choices I made while building my portfolio website.

How I Built My High-Performance Portfolio Website

Your portfolio should feel like you. Mine needed to reflect the way I think about system design: purposeful architecture, smooth interactions, and fast feedback loops. This post is a full breakdown of how I shipped the new version of my site using Next.js 16, React 19, Tailwind CSS 4, and a lean component system that keeps content flexible without sacrificing performance.

Project Goals

Core Stack & Why It Works

| Layer | Choice | Reason | | --------- | ------------------------------------------------------ | --------------------------------------------------------------------------------- | | Framework | Next.js 16 (App Router) | Server Components for data-heavy sections, file-based routing for marketing pages | | UI | React 19 + Shadcn UI + Tailwind 4 | Type-safe components with utility styling and accessible primitives | | Motion | Framer Motion + Lucide + React Icons | Adds micro-interactions (see components/home/hero.tsx and projects.tsx) | | Content | MDX (assets/blogs/*) + structured JSON in lib/*.ts | Keeps copy in plain text while components stay reusable | | Tooling | pnpm, ESLint, Turbopack dev server | Fast installs, lint-on-save, hot reloads that mirror production |

Information Architecture

The App Router gives me composable layouts and route groups, keeping marketing pages isolated from case-study detail views. The trimmed structure below mirrors what ships in app/:

app/
├─ (root)/
│  ├─ page.tsx          # Landing page assembling Hero, Services, Skills, Projects, Contact
│  ├─ blog/
│  │  ├─ page.tsx       # Blog index fed by `lib/blogs.ts`
│  │  └─ [slug]/page.tsx# Dynamic MDX rendering per article
│  └─ projects/
│     └─ [slug]/page.tsx# Long-form case studies sourced from `lib/projects.ts`
└─ layout.tsx           # Global metadata, fonts, analytics hooks

Each route layer stays server-first unless interactivity demands it. For example, components/home/projects.tsx uses "use client" so I can hydrate Framer Motion timelines and keep hover states buttery smooth, while static sections like app/(root)/page.tsx render server-side for instant Time to First Byte (TTFB).

Designing the Experience

Color + Typography

Hero & Services Modules

Projects Grid

Skills & Workflow

Content Pipeline with MDX + Structured Data

Blogs

  1. Draft an MDX file inside assets/blogs/<slug>/index.mdx.
  2. Export it through assets/blogs/index.ts and register metadata inside lib/blogs.ts.
  3. The blog index (app/(root)/blog/page.tsx) maps over blogs, while [slug]/page.tsx renders the MDX component directly. No extra MDX compiler setup is required thanks to Next.js’ native MDX support in the app directory.

Projects

Performance, SEO, and Accessibility

Tooling & Deployment

Lessons Learned

  1. Content belongs close to content authors. Locating MDX files under assets/blogs/ keeps Git diffs surgical and empowers future collaborators.
  2. Animations should guide, not distract. Framer Motion eased meaningful transitions (hero entrance, project hover) while keeping CPU usage low.
  3. Design tokens beat ad-hoc values. Leaning on Tailwind’s theme ensures consistent spacing and typography whether I’m coding a new section or updating the footer.
  4. Ship instrumentation early. Adding analytics + sitemap + robots files up front prevented SEO debt later.

What’s Next?

Thanks for following along! If you have questions about any part of this build, reach out via the contact section or ping me on GitHub.