Skip to content
Khaled.dev
← Back to work

Solo engineer — design, build, content pipeline · 2026

This Portfolio Site

A statically-exported Next.js 16 personal site with a blog, prompt library, agent-skills catalog, and photography gallery.

This Portfolio Site

Stack

  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind v4
  • Cloudflare Pages

Links

Overview

What it is

The site you're reading. Built on Next.js 16 App Router with a fully static export (no server at runtime) so it deploys to Cloudflare Pages for pennies. Content for the blog and prompts is sourced at build time and rendered to static HTML.

Motion is handled by a tiny in-house reveal-on-scroll primitive instead of a heavy animation library, and every page ships build-time OG images and JSON-LD structured data for clean link previews.

The problem

What needed solving

Most portfolio sites are either a static template with no soul or a heavy SPA that costs real money to host and crawls badly. I wanted something fast, cheap, and rich — interactive tools and motion included — without a server in the loop.

The approach

How I built it

I built on Next.js 16's App Router with a full static export, so the whole site ships as HTML/CSS/JS to Cloudflare Pages. Content for the blog and prompts is sourced from Notion at build time and rendered to static HTML, degrading gracefully when secrets are absent.

Interactivity that needs JS — the command palette, carousels, and client-side generators — runs entirely in the browser. Motion is a tiny in-house reveal-on-scroll primitive instead of a multi-hundred-kilobyte animation library.

The outcome

Results

0
Runtime servers
0
Lighthouse performance
0+
Pre-rendered routes
  • Deploys for pennies on Cloudflare Pages with no runtime server to maintain.
  • Every page ships build-time OG images and JSON-LD, so link previews and rich results work everywhere.

Highlights

4 things worth calling out

100% static export — no runtime server

Build-time OG images + JSON-LD on every page

In-house reveal-on-scroll instead of a heavy animation lib

Notion-backed content pipeline that degrades gracefully