✶ welcome traveler ✶ site under gentle construction ✶ last updated: feb 10, 2026 ✶ new art coming soon ✶
{ learnings }

~ wisdom dug up through trial and error ~

things I learned so you don't have to

February 5, 2026

Audio Player Refactor

removed: webamp
added: custom unified audio player

Initially integrated Webamp because the UI matched the site aesthetic really well. Classic winamp-style player, playlists, visualizer. Looked great in isolation.

Integration into a React SPA was the actual problem. Spent almost 5 days on this. Even tried building my own version using AI at some point. Honestly not worth my time.

Issues I ran into:

  • Webamp renders directly to document.body, which bypasses React entirely
  • React StrictMode double-mounts in dev, resulting in orphaned DOM nodes
  • Frequent removeChild errors during route changes
  • Two independent audio engines existed at the same time: homepage player and webamp player
  • Navigating between routes could cause both to play simultaneously
  • R2 + CORS issues caused Webamp to skip tracks without playing audio
  • Window positioning / centering required far more work than justified

None of this was subtle. Debugging felt like someone tied my hands up and tossed a bucket of cement over my head.

Removed Webamp entirely. Implemented a single global audio engine using Howler.js. One audio instance, one source of truth, shared across all routes. Playback persists through navigation. Track changes propagate everywhere. Simpler system, fewer edge cases, predictable behavior.

Lost some visual flair. Gained stability, clarity, and sanity.

Webamp is solid software. Just not designed for modern React routing, StrictMode, or shared application state. Forcing it into that shape created more complexity than it removed.

audiowebampreactrefactor

February 5, 2026

Wiring a Personal Site with Hostinger, Cloudflare, Vercel & R2

First time I set up a custom domain was back in high school. Spent almost two days trying to figure out nameservers, DNS records, and why nothing was working. During undergrad I did it a few more times but it's been a while since I dealt with frontend infrastructure from scratch.

Site wiring diagram showing Hostinger, Cloudflare, Vercel, and R2 connections

The idea is simple: each service does one thing well. Hostinger just holds my domain registration. Cloudflare handles DNS and security. Vercel runs the actual website. R2 stores media files. No service tries to do everything.

the stack:

  • Hostinger: registrar only, owns the domain record
  • Cloudflare: DNS, TLS, edge routing, R2 storage
  • Vercel: production hosting for the Next.js frontend
  • R2: object storage for static/media assets

the flow:

mossyrealm.space → cloudflare dns → vercel frontend

media.mossyrealm.space → cloudflare dns → r2 storage

key steps:

  1. Register domain on Hostinger
  2. Add domain to Cloudflare, get new nameservers
  3. Switch nameservers at Hostinger to Cloudflare's
  4. Wait for DNS propagation (Cloudflare polls for it)
  5. Set up R2 bucket with custom subdomain (media.)
  6. Connect root domain to Vercel project

why no www:

I didn't want www.mossyrealm.space. Just mossyrealm.space. Looked it up and turns out the www prefix is a relic from the early web when it helped distinguish web servers from mail or ftp servers on the same domain. These days it's unnecessary. Modern DNS and hosting handle the apex domain (the "naked" domain without www) just fine.

Both Cloudflare and Vercel support apex domains cleanly. It's purely a preference thing. I think mossyrealm.space looks cleaner in the address bar.

dnscloudflarevercelr2infra

January 16, 2026

The Great Cursor & Effects Experiment

Tried adding fancy cursors, sparkle trails, fireflies, and click animations to make the site feel more magical. The result? It turned into a circus.

I always thought old websites had simple interactions because of technical limitations. But actually, when you have a visually dense layout with lots of boxes, borders, and patterns, simple interactions make sense. The complexity is in the layout, not the behavior.

Modern sites flip this. Minimal layouts but fancy animations. You can't have both maxed out without it feeling overwhelming.

what I tried:

  • Pressed flower cursor that opens on hover
  • Wax seal stamp cursor with click animation
  • Sparkle trail following the cursor
  • Fireflies floating around the page
  • Windows 95 bevel buttons

what I learned:

  • Animated cursors (.ani) don't work in most browsers
  • Custom cursors need to be small (32px max recommended)
  • New effects need to match existing vibe, not fight against it
  • The satisfying click animation I imagined was actually distracting

decision:

Reverted everything. The site doesn't need fancy effects right now. Maybe later with a lighter touch.

cursorseffects90s webreverted

December 2025

Finding the Right Color Palette

Explored six different color palettes before landing on "Sunlit Glade." The journey taught me a lot about what makes colors feel cozy versus clinical.

Cool-toned palettes looked nice in isolation but felt sterile when applied to the site. Warm amber accents made all the difference. They added that "sunlight through trees" feeling I was going for.

colorspaletteaesthetic

December 2025

Choosing Fonts That Feel Right

Tested multiple font combinations. Learned that serif fonts carry the "old book" vibe better than anything else.

typographyfonts

earlier...

~ more learnings growing here soon ~

✶ the forest remembers → take your time → all paths lead onward ✶
Undertale Main Theme Toby Fox
paused