Blog

A Day of Polish — and Two Real Bugs

A new About page milestone, smaller sliders, a full bright mode, a CTA glow rolled out sitewide — and two bugs worth explaining.

Michael Roehn
Back to Blog

Today was one of those days that started as small polish and ended with a couple of genuinely interesting bugs. Here's what changed, roughly in the order it happened.

Small stuff first

  • Added a new milestone to the About page's timeline: my first self-made HTML page, back in 1997 — the actual starting point behind "Building on the web since 1997."
  • The RGB color-mixer sliders on the AI Journey page's "Mix your own" study are smaller now, and each one shows its live numeric value as you drag it, instead of moving a track with no feedback.
  • The cursor-following light effect from the tilt cards elsewhere on the site — without the 3D tilt itself — now plays on the "Get in touch" box at the bottom of every page. That box is also new to the Blog, Contact, Legal Notice, and Privacy pages, each with its own text (Contact's version jumps to the form above instead of linking to itself).

Bug one: blog posts had a broken footer

Individual posts like this one live one folder down from everything else (/blog/...), and the footer is fetched once and shared across the whole site. Its links were written assuming the page was at the site root, so from inside a blog post every footer link — and the logo — quietly pointed to the wrong place. Fixed by having the footer rewrite its own links relative to wherever it's actually loaded from.

Bug two: a page could load blank

This one was more interesting. Every section below the hero fades in as you scroll, and that fade-in worked by hiding content with CSS and only revealing it once JavaScript confirmed it was ready to animate. That's backwards: if that script ever failed to run for any reason, the content it was supposed to reveal would just never appear — the page would still be there, still scrollable, just invisible below the hero. That's exactly what happened on the About page.

The fix flips the assumption: content is visible by default, and JavaScript only opts into hiding it right before it animates in. A failed script can no longer blank the page — worst case, you simply don't get the fade-in.

While chasing that one down, I also found and fixed a smaller sibling bug: that same cursor-light effect from the CTA box above was, on every page, sitting invisibly on top of the "Get in touch" button and swallowing its clicks. One pointer-events: none later, buttons click again.

Also: deploys are safer now

The way changes get pushed to the live site now swaps files into place atomically instead of overwriting them in place, so a page request can no longer land mid-upload and get served a half-finished file.

And later: a full bright mode

The site's been dark-only since day one — that changed today too. There's now a "Bright" / "Dark" switch in the nav, right next to the language picker, and it's not just a background-color swap: bright mode is a complete, separate light theme — text, cards, borders, the hero and CTA panels, dropdown menus, all of it, rather than a light background sitting under colors that were only ever designed for a dark one.

A few details worth mentioning:

  • It mirrors the AI Journey page's existing accent-color picker: there's now a "Study 06 — Bright mode" tile below the custom color mixer, and picking any of the other five studies switches back to dark automatically — same idea, both directions.
  • The Experiment page's WebGL hero shader used to bake its colors in once at page load and never touch them again. It now repaints live the moment you toggle brightness, instead of needing a reload.
  • The cursor-following light effect on cards flips too — a light glow reads as a highlight on a dark card, but the same glow barely shows up on a light one, so bright mode swaps it for a dark glow instead.

Getting there took a few rounds of catching my own mistakes along the way — a button that ended up dark-text-on-dark-background, a whole tile that rendered as literally nothing because a plain <button> doesn't stretch to fill its container the way a CSS grid item does, and a "Contact details" card I'd missed converting entirely. All fixed now. Turns out a light theme touches every corner of a site, not just the one thing you were thinking about when you started.

Nothing here is dramatic on its own, but it's a good reminder: the parts of a site you don't design — how it fails, not just how it looks — deserve just as much attention as the parts you do. Get in touch if you'd like that kind of attention on your own project.

Enjoyed this post?

I'd love to hear your thoughts, or talk about your own project.

Get in touch