Skip to content
← All work

P—08 Case study · Web & apps

Personal Portfolio

Role

Frontend Developer

Status

active

Started

May 2026

Last activity

Nov 2026

Stack

10 technologies

Personal Portfolio

Overview

Version two of my portfolio, rebuilt from scratch around a camera viewfinder theme. The hero name is a variable font that reacts to the pointer, and a lens over it runs a small WebGL shader and tags the letters with confidence scores like a detection model. Projects sit on a horizontal rail grouped by domain, with an index view for scanning, and every project has a case study generated from the same data.

The content is data, not code. Projects and updates live in JSON files that a build script validates and turns into pages. A weekly GitHub Action reads activity from my repositories and another applies the edits I request, so the site stays current without hand-editing. Fields I change by hand are never overwritten by the automation.

It is a static export on Cloudflare Pages. Motion runs on GSAP and Lenis, animations pause when they leave the screen, and a reduced-motion setting in the menu turns the effects down.

Outcomes

220 kB

Home page first-load JS

0

Servers: a static export

2

Content automation workflows

6

Libraries dropped from v1

Impact

  1. 01Rebuilt the site from scratch as a Next.js 15 static export with a camera viewfinder design, replacing the first version's template layout.
  2. 02Generated every case study, update and the recent-work list from validated JSON that GitHub Actions keep in sync with my repositories.
  3. 03Kept first-load JavaScript on the home page to about 220 kB and dropped six libraries the first version shipped.
  4. 04Drew the Figmenta internship as a measured n8n-style pipeline map, and the résumé as an X-ray scan that links each section to the site.

Features

01

Kinetic name and inference lens

The hero name is a variable font whose weight and width follow the pointer. A lens over it runs a WebGL shader and tags letters with confidence scores, like a detection model.

02

Work rail and index

Projects scroll sideways in groups by domain, flagships first. An index view lists every project with a preview, and switching views keeps your place.

03

Generated case studies

Each project page comes from its JSON record: overview, outcomes, features, architecture, stack and a development log of dated updates.

04

Content automation

A weekly GitHub Action reads repository activity and writes updates, and another applies requested edits. A build step validates every record, and hand-edited fields are never overwritten.

05

Command palette and section ruler

Ctrl K or ⌘K jumps to any section or project. A ruler on the right marks the sections, and the nav pill shows where you are.

06

Résumé X-ray

The About section shows the real résumé page. A scan bar reveals a blueprint underneath that maps each résumé section to the part of the site that covers it.

07

Light on the machine

Diagram animations pause off screen, smooth scrolling stops when you stop, and screenshots are served as AVIF or WebP at the size the layout needs.

Architecture

Next.js 15 with the App Router, exported as static HTML and deployed on Cloudflare Pages. There is no server: every page is built ahead of time. Content lives in content/projects and content/updates as JSON. scripts/content/build.mjs validates each record against a schema, works out each project's status and latest update, and writes the data the pages import. Two GitHub Actions write to these files: a weekly sync that reads activity from my repositories, and an apply workflow for edits I request. Each field records who wrote it with a hash, so the automation skips anything changed by hand. The interface is React 19 with Tailwind CSS and SCSS tokens. GSAP drives scroll-linked motion (ScrollTrigger pins for the flagship stage and the work rail, SplitText, DrawSVG, Flip), and Lenis smooths scrolling only while you scroll. The hero lens is a small WebGL shader. A build step uses sharp to write AVIF and WebP copies of every screenshot, and the pages pick the right width with srcset.

Stack

Next.jsReactTailwind CSSSCSSGSAPLenisWebGLsharpGitHub ActionsCloudflare Pages

Development log

  1. · Release

    MPGA v2: the portfolio rebuilt from scratch

    Rebuilt the whole site around a camera viewfinder theme: a kinetic name with an inference lens, a work rail grouped by domain, generated case studies, a pipeline map of the Figmenta internship and a résumé X-ray. Content now comes from validated JSON that GitHub Actions keep current, and animations pause when they leave the screen.

  2. · Started

    Portfolio Refactoring, MPGA (Make Portfolio Great Again)

    Implemented horizontally scrollable live-project timelines and refactored the experience section. Big updates to about section and also added recent internship experience.