







Above: dougrosenberg.com's old Blazor-template site, archived here for reference before the rebuild replaces it.
The Starting Point
dougrosenberg.com is my other site — under a different hat, I'm a saxophonist, composer, and educator, and that's where that identity lives online. It's been running on Blazor WebAssembly on top of a stock component template: the same rounded glassmorphism cards, the same corner-blur decoration, the same floating circular chat launcher you'll find on a thousand other template-based sites. It worked. It just didn't read as built for anyone in particular — real content (a working musician's bio, performance history, a full sheet music library) sitting inside a shell that could have belonged to anyone.
What Actually Changed
The rebuild (Astro, deployed to Cloudflare Workers) keeps every piece of real content — bio, performance credentials, albums, teaching history, sheet music, photo gallery, contact — and gives it an identity built around the one thing that's actually distinctive about the site: notation. A fixed nav rendered as icon-marked notes sitting on staff lines, a full-bleed broadcast-graded hero photo instead of a generic template hero, and a self-hosted type system (a display serif, a body sans, a monospace for the nav) instead of a default Google Fonts stack.
The Technical Migration
Blazor WebAssembly ships a full C# runtime to the browser for what is, in the end, a static content site — the same structural mismatch I wrote about auditing on this site. Astro prerenders to static HTML served straight from Cloudflare's edge instead, and that switch is what made the rest of the work verifiable instead of assumed:
- Lighthouse CI run against the production build on every pull request — 90+ performance/best-practices/SEO, 95+ accessibility, measured, not estimated
- A 36-test Playwright end-to-end suite covering navigation, gallery, and search behavior, run against a real browser at real viewport widths on every PR
- A real Content-Security-Policy with sha256-pinned inline scripts, HSTS, and the rest of the security-header baseline, checkable in the response headers
A Concrete Example: Verifying an Optimization Actually Works
The sheet music library alone was 88MB of scanned PDFs and photos. The obvious move is “just recompress everything” — and it's the wrong move, because sheet music that's actually illegible defeats the point of the feature. Instead of a bulk pass, I wrote a script that recompresses a candidate file, re-renders it, and pixel-diffs the result against the original — it only keeps the change if the render comes back near-identical. Most of the payload turned out to already be JPEG-compressed inside its PDFs, so there was nothing safe left to win without heavier tooling. But the same script caught something real: one file had two images stacked at the exact same position on the page, which looked like a redundant duplicate. Deleting the “duplicate” actually changed what rendered, and the verification step correctly rejected that change and left the file untouched. Three other files did get real, verified reductions — one JPEG dropped 44.5% with no visible difference. The tool earned its keep by refusing bad changes as much as by accepting good ones.
What's Still Open
Being honest about where this actually stands: the sheet music library is still catching up to what's live on the old site — seven pieces are missing, pending source files. Contact is currently a plain mailto: link rather than the Cloudflare Worker-backed form I've built elsewhere. And the domain itself hasn't moved — the new build is live only on its Cloudflare Workers subdomain, since pointing the real domain at it is a real production step I'm not taking without deliberately deciding to.
The Takeaway
A template gets you to “functional” quickly, and that's a legitimate reason to start there. But functional and distinctive are different bars, and closing that gap took more than a redesign — it took a foundation that could actually be checked: real performance numbers instead of assumed ones, a real test suite instead of “looks fine,” and a verification step even on something as unglamorous as image compression. If you're wondering whether your own site's template is quietly costing you, that's the actual question: not just how it looks, but whether you can prove what it does.