Engineering · Self-Directed · 2026

Portfolio Website
Design, Build & Deployment

Type
Self-Directed Web Build
Duration
2026
Scope
14 pages · multiple case studies
Stack
HTML5 · CSS3 · JavaScript · Web3Forms
Overview

A case-study portfolio, built page by page from scratch

This is the site you're reading right now. It's a multi-page personal portfolio built to present detailed case studies - manufacturing operations, product strategy, analytics and engineering work - in a consistent, readable, recruiter-friendly format, without relying on a website builder or a JavaScript framework.

The brief was self-set: every project needed its own full case-study page and a place in a filterable index, the whole thing had to feel like one coherent product rather than a stitched-together set of documents, and it had to load fast and work cleanly on a phone in a train station as well as a laptop at a desk.

Site Architecture

One shared shell, many independent case studies

🏠
Home & About
Hero, experience, core strengths, education & certifications, contact
🗂️
Projects Index
Filterable list (by category) plus full inline case studies on one page
📄
Case-Study Pages
Each project also ships as its own standalone, linkable page
🎨
Shared style.css & site.js
One design system and one behavior layer reused across every page
Technical Implementation

Plain HTML, CSS and JavaScript - no build step

The design system runs on CSS custom properties (color, spacing and type tokens shared across light and dark section variants), a single Inter type family from Google Fonts, and reusable component classes (section-block, index-row, feat-list, outcome-row, tech-badge) so every case study looks native to the site instead of pasted in.

Interaction is handled by one shared vanilla JavaScript file: a custom cursor that follows the pointer with an eased requestAnimationFrame loop, scroll-triggered reveal animations via IntersectionObserver, a scroll-aware navigation bar with active-link tracking, and a mobile hamburger menu - all DOM lookups guarded so the same file runs unmodified on pages that only use a subset of these elements.

The project index uses a lightweight category filter (data attributes + class toggling, no framework), and the CV/contact capture flow is wired to Web3Forms as a serverless form endpoint, so there's no backend to host or maintain.

"The constraint was deliberate: no framework, no bundler, no dependencies to keep patched. Just files that open in a browser and still feel designed."

Challenges & Solutions

Keeping every page consistent without a framework

Template drift across case studies: each project has a very different content shape. Solved with a small, reusable component library (section-block, arch-diagram, outcome-row, tech-badges) so every case study inherits the same rhythm.
One script, many page shapes: case-study pages don't have a hamburger or nav-links; the home page does. Every site.js lookup checks the element exists before wiring behavior, so nothing throws on pages missing that markup.
Custom cursor on touch devices: a pointer-follow cursor is meaningless on mobile. Guarded so it only initializes when the cursor elements are present, leaving the native cursor untouched elsewhere.
Duplicated content, single source of truth: each project needs both an index-list summary and a full case study. Kept both in projects.html plus a linkable standalone page, sharing identical copy so nothing drifts out of sync.
Asset-heavy pages without a bundler: 55+ images across dashboards, certificates and screenshots. Organized into one /images directory with consistent naming so pages stay lightweight without image-pipeline tooling.
Form handling with no backend: CV downloads and contact capture needed a submission target. Integrated Web3Forms so the flow works as a static site with zero server code.
Testing & Validation

Confirmed on real widths, not just assumptions

Every page was served from a local static server and driven with headless Chrome rather than checked by reading code alone - full-page screenshots at desktop width against the rest of the site, then a responsive sweep across the site's own breakpoints (≤1024px, ≤960px, ≤540px, ≤480px) from small-phone widths up to a 1440px desktop, with an automated check comparing the document's scroll width to the viewport width to catch horizontal overflow.

Desktop visual regression: full-page screenshots of every new page and section, compared against sibling case studies for spacing, alignment and color.
Responsive sweep: headless Chrome from ~500px up to 1440px, with document.documentElement.scrollWidth checked against viewport width at each size - zero horizontal overflow confirmed.
Real bug caught and fixed: a Challenges list mixing <strong> and <code> tags inside a display:flex row caused each inline tag to become its own flex item, fragmenting the layout. Fixed by wrapping the trailing content in a single <span>, matching the pattern already used elsewhere on the site.
Functional checks: nav-back links, the shared cursor/scroll-reveal behavior from site.js, and the project index's filter bar and inline case sections, verified on both the hub page and this standalone page.
Broken layout: the Challenges and Solutions list fragmented into separate flex items, mixing strong and code tags without a wrapping span
Before - a real bug caught during testing: mixing <strong> and <code> tags inside a flex row fragmented the list instead of flowing as one paragraph.
Fixed layout: the same Challenges and Solutions list rendering correctly as clean two-column rows after wrapping trailing content in a span
After - fixed by wrapping the trailing content in a single <span>, collapsing it back into one flex item per row.
Three side-by-side screenshots at 500px mobile-floor, 768px tablet and 1440px desktop viewports, each with a diagnostic overlay confirming viewport width equals document scroll width with zero overflow
Responsive sweep - mobile, tablet and desktop viewports, each with an automated overlay confirming document scroll width matches viewport width (zero horizontal overflow).
Outcomes
14
Pages shipped
4
Responsive breakpoints verified
55+
Image assets organized
0
Build dependencies
Tech Stack
HTML5 CSS3 (Custom Properties) JavaScript (ES6+) IntersectionObserver API Google Fonts (Inter) Web3Forms Responsive / Mobile-First Design Static Site, No Framework
Full Documentation

Go beyond the overview. Explore the complete project documentation, process, and supporting files on GitHub.

View testing screenshots Back to all projects Explore the Full Project →