Abdul Wahab
FeaturedNext.jsTypeScriptTailwind CSSFramer MotionMDX

Engineering Portfolio (this site)

A production-grade personal portfolio built ticket-by-ticket with strict TypeScript, a real CI pipeline, and zero fabricated content — every section either ships real functionality or is explicitly marked as a placeholder pending real data.

Overview

Most portfolio sites show pretty pictures and describe engineering discipline in prose. This one had to prove it: every section either ships real, working functionality or is honestly marked as a placeholder waiting on real content — never fabricated project history, credentials, metrics, or media.

Problem Statement

A personal portfolio needed to demonstrate senior-level engineering judgment, not just list technologies. That meant a real CI pipeline gating every change, strict TypeScript catching real bugs before they shipped, and a hard rule against inventing content (fake project stats, fake credentials, fake video links) just to make sections look fuller.

System Architecture

  • Next.js App Router with Server Components by default; client components are opt-in and scoped to the smallest interactive unit (a form, a modal, a filter control) rather than whole pages
  • Content lives in typed `lib/constants/*` modules or MDX files under `content/`, never inline in components — one source of truth per data shape
  • A shared `TERMINAL_COMMANDS` registry models the terminal's behavior as data instead of a branching dispatcher, so adding a command means adding an entry, not editing control flow
  • GitHub Actions runs type-check, lint/format, and build on every pull request into `develop`; nothing merges without all three passing

Key Outcomes

  • 10 tickets shipped end-to-end (PORT-101 through PORT-110), each with its own branch, PR, and passing CI run
  • Multiple real bugs caught by the strict TypeScript config before they shipped — including a TS narrowing-through-closures issue and several noUncheckedIndexedAccess cases
  • Zero fabricated professional content anywhere on the site: every placeholder is explicitly labeled as such rather than filled with invented specifics

Metrics

CI
type-check + lint + build on every PR
Type safety
strict, zero `any`