Personal Portfolio Website
Sole developer, June 2026 to Present
Next.jsTypeScriptReactZustandreact-three-fiberThree.js
Problem
A resume and a list of links don't say much about how someone actually builds things. I wanted a portfolio that showed some front-end work directly, with real interactivity and some personality, without giving up a fast, crawlable site underneath it.
Approach
- Built the Windows 95 desktop as a presentation layer over a fully server-rendered content layer, so every page still reads with JavaScript off.
- Hand-built the drag-and-resize window system on Pointer Events, committing state only on release to keep dragging smooth.
- Gated the 3D screensaver behind an idle timer and a dynamic import, and skipped it for reduced-motion, low-power, and no-WebGL visitors.
- Used Next.js so the server-rendered and client-side layers could coexist without slowing down the initial load.
- Kept window, focus, and desktop state on the client with Zustand.
- Logged the architecture decisions and tradeoffs in a separate design-decisions file as I went.
- Ran a full security and accessibility review before launch, then shipped a Content-Security-Policy and the rest of the security headers, deriving each allowance from what the app actually does rather than copying a template.
Outcome
Live at cartertull.com, running the dual-layer setup described above. The interesting parts were the rendering architecture, the low-level pointer handling for drag and resize, keeping the 3D work off the critical path, and writing a CSP strict enough to be worth having without breaking the embedded PDF and video.