Skip to main content
Case Studies

Portfolio Site Engineering

Personal Project

November 2025
2 weeks
Solo project with AI-assisted development
Full-Stack Developer • Designer

Overview

With experience, you learn that form and function are not opposing forces—they amplify each other. This portfolio demonstrates that philosophy: a visually rich, animated experience built on production-grade engineering with strict TypeScript, WCAG 2.1 AA accessibility, and sub-2-second builds.

Every design decision is backed by solid architecture. The animated hero carousel with YouTube embeds? Fully keyboard-navigable with ARIA live regions. The dark mode with smooth transitions? Persistent across sessions with system preference detection. The frosted glass navigation? Performant CSS with hardware acceleration. Beautiful and bulletproof.

The Challenge

Most portfolios sacrifice either visual impact or technical rigor. Flashy sites often hide brittle code; well-engineered sites often look generic. The challenge was proving that deep frontend expertise enables both—creating something that looks polished and works flawlessly across devices, screen readers, and edge cases.

This meant building with the same standards I apply to enterprise code: strict TypeScript, comprehensive linting, accessibility from day one, performance budgets, and automated deployment—while still delivering the kind of visual polish that makes someone want to explore further.

Approach

1

TypeScript with Zero Compromises

Full strict mode TypeScript from the start—not just type annotations, but comprehensive interfaces for all data structures, proper generics for reusable components, and discriminated unions for type-safe conditional rendering.

ESLint 9 with flat config, TypeScript parser, React Hooks rules, and Prettier integration. Every commit passes typecheck, lint, and format checks. The codebase reads like documentation because the types tell the story.

TypeScript Architecture

Code snippet showing strict TypeScript with comprehensive interfaces, proper generics, discriminated unions, and ESLint 9 flat config integration.

Click to enlarge

Press Enter or Space to view in full size
2

Carousel Engineering: Beautiful and Accessible

The hero carousel showcases the form-meets-function philosophy. Visually: YouTube videos with responsive scaling (1.9x mobile, 1.7x tablet, 1.5x desktop) to crop player chrome, smooth crossfades, and color-coordinated slides. Technically: full keyboard navigation with arrow keys, ARIA live regions announcing slide changes, touch/swipe with 50px threshold, and focus management.

Lazy-loading YouTube embeds with loading indicators (three pulsing boxes) that only mount iframes when slides activate—keeping initial page weight low while delivering rich media. The iframe permissions (publickey-credentials-get) even anticipate WebAuthn demos.

Accessible Carousel Implementation

Screenshot of hero carousel with annotations: keyboard navigation, ARIA live regions, touch/swipe handling, lazy-loaded YouTube embeds with responsive scaling.

Click to enlarge

Press Enter or Space to view in full size
3

Dark Mode Done Right

Not a CSS filter hack—a complete dual-theme system. Custom ThemeProvider context with useEffect synchronization to document.documentElement. localStorage persistence with system preference detection via matchMedia on first visit. Smooth 200ms transitions on theme toggle.

Deep blue-gray palette (#000735d1) designed for AAA contrast ratios. Every component—cards, badges, form inputs, code blocks—has explicit dark variants. Verified with axe DevTools in both themes. The toggle is in the nav, but the engineering goes five pages deep.

Dark Mode System

Side-by-side comparison of light and dark themes with ThemeProvider architecture, localStorage persistence, and system preference detection via matchMedia.

Click to enlarge

Press Enter or Space to view in full size
4

Performance Without Sacrifice

Vite 5 delivers sub-2-second builds with hot module replacement. Final bundle: 225 kB JS (66 kB gzipped)—lean for a media-rich site. Static site generation via vite-react-ssg pre-renders all routes for instant first paint and SEO indexing.

YouTube thumbnails lazy-load with IntersectionObserver, swapping to iframes on hover. Images use responsive srcsets. CSS uses Tailwind JIT with aggressive purging. The frosted glass nav uses backdrop-filter with will-change hints for GPU compositing.

Performance Metrics

Lighthouse and build output showing: sub-2-second Vite builds, 225 kB bundle (66 kB gzipped), SSG pre-rendered routes, and lazy-loaded media.

Click to enlarge

Press Enter or Space to view in full size
5

Accessibility as Architecture

Skip-to-content link, properly hidden until focused. Mobile menu with aria-expanded, aria-controls, and aria-label. Form success messages with role="status" and aria-live="polite". All 20+ YouTube iframes with descriptive titles matching visible headings.

Custom useScrollWithOffset hook calculates nav height dynamically for scroll offset. CSS scroll-padding-top as fallback. Focus trapping in lightbox with Tab cycling between first and last focusable elements. Screen reader tested on VoiceOver and NVDA.

Accessibility Features

Annotated screenshots showing: skip-to-content link, mobile menu with aria-expanded, form success messages with role='status', and focus trapping in lightbox.

Click to enlarge

Press Enter or Space to view in full size
6

DevOps for Frontend

Secure VPS deployment via rsync with ACL-based permissions—deployuser has write access to exactly one directory, nothing more. Single npm run deploy command builds production bundle, transfers delta files, and sets permissions.

Apache .htaccess handles SPA routing with fallback to index.html. SSH config aliases streamline the workflow. Comprehensive SEO setup: meta tags, Open Graph, Twitter Cards, sitemap.xml, robots.txt. The infrastructure is invisible when it works—and this works.

Deployment Pipeline

Diagram showing deployment workflow: npm run deploy → Vite build → rsync delta transfer → ACL permissions → Apache SPA routing with .htaccess.

Click to enlarge

Press Enter or Space to view in full size

Results & Impact

225 kB

Bundle size (66 kB gzipped)

WCAG AA

Full accessibility compliance

< 2s

Vite build time

AAA

Contrast ratios in both themes

Technologies Used

React 18TypeScriptVite 5Tailwind CSSESLint 9PrettierReact RouterFormspreevite-react-ssgARIALucide IconsApache

Key Learnings

Form and function are not trade-offs—they are multiplicative. A well-architected codebase makes visual polish sustainable; thoughtful design makes technical complexity feel simple. Experience is knowing how to achieve both.

Accessibility built from the start is invisible; accessibility retrofitted is painful. The carousel took the same time to build with keyboard navigation as without—but adding it later would have meant rewriting the interaction model.

Modern tooling removes historical excuses. Vite makes builds fast, TypeScript makes refactoring safe, Tailwind makes dark mode systematic. The only barrier to quality is choosing not to pursue it.

Personal projects should meet professional standards. This site runs the same linting, testing, and deployment rigor as enterprise code—because that is how I work, and the portfolio should demonstrate it.