Next.js work
App Router, static by default. Live data comes from cached API routes that client leaves read, so I never have to make a whole page dynamic. That is how the blog and project pages stay prerendered while the GitHub, Spotify and reaction counts keep changing.
- project
StarWalls
The slickest NASA wallpaper app on the web
- project
301st.xyz
Interactive 3D countdowns for every moment
- project
VdoCard
Animated greeting cards in about 30 seconds
- project
New Testament
Multi project documentation template
- project
Material You
High-performance static portfolio site
- blog
Every Phosphor Icon You Import Ships Six Times
I was hunting for the last few kilobytes on my landing page and found 51KB of SVG paths. For 26 icons. That's about 2KB per icon, and most of them are a circle with two lines in it. The reason is the API. Phosphor icons take a weight prop: That's decided at runtime. So the component has to carry…
- blog
I Deleted the Carousel Library
Two carousels on this site, one carousel library. Embla, with the wheel-gestures plugin, about 64KB raw and 20KB gzipped. Both carousels scroll sideways and snap. The browser does that: Touch drag, momentum, trackpad, keyboard, snapping. All of it free, from the platform. What a library adds on top…
- blog
I Rebuilt This Site for Three Years
I rebuilt this site for three years. It was supposed to be a weekend job. The old version ran on Gatsby — fine, fast enough, but I'd been hitting walls. The routing and GraphQL pipeline were rigid in a way that fought me every time I wanted to add anything new. There was no built-in image…
- blog
StarWalls: A Minimal Space Photo Wallpaper PWA
I wanted a better way to browse NASA photos on my phone and save them as wallpapers. NASA has the APOD API, the Image of the Day RSS feed, and the full Images API — tons of great content — but no mobile interface that makes it easy to frame and download a shot for your lock screen. So I built one.…