Revamping Seasonal Themes: From Laggy JavaScript to Handcrafted PNGs
How we rebuilt Minnich.Awesome's seasonal themes from the ground up—swapping laggy JavaScript particles for high-detail transparent PNGs, webbing up buttons for Halloween, theming loading screens, and adding a quick On/Off toggle.
One of the best things about the golden era of the indie web was how websites changed with the calendar. In the mid-2000s, when October arrived, your favorite gaming forums and Flash portals would roll out cobwebs, dripping slime, and spooky orange banners. Come December, icicles clung to the navigation bar and snow fell across the page. It gave the web a sense of place and time—a reminder that real people were behind the screen, celebrating the season alongside you.
I've always loved that tradition, which is why Minnich.Awesome has featured seasonal themes for Halloween, Winter, Spring, and Chinese New Year. But over the last few weeks, it became painfully clear that our implementation had accumulated technical debt. What was meant to be a delightful visual touch had turned into a laggy, cluttered experience that actively got in the way of playing games.
Today, we completely overhauled the entire seasonal theme system from top to bottom. Here is why the old setup had to go, how we replaced CPU-heavy JavaScript with handcrafted transparent PNGs and GPU-accelerated CSS, and how we brought festive styling directly into our game loading screens.
The breaking point: Laggy JavaScript and smushed vectors
When we first added seasonal ambiance, we relied heavily on JavaScript particle loops and procedural canvas math. It worked in isolated tests, but on a busy arcade website running Godot 4 WebAssembly titles, real-time physics calculations, and canvas drawing routines, every spare CPU cycle is precious. Having requestAnimationFrame loops calculating trigonometric drift velocities for dozens of floating snowflakes or autumn leaves meant dropped frames in timing-sensitive arcade games.
Even worse were the visual clutter and layering bugs:
- Aggressive layering: Hanging spiders, flapping bats, and floating ghosts had high z-indices that sat directly on top of navigation buttons and search bars, intercepting mouse clicks and frustrating visitors trying to navigate the catalog.
- Vector smushing: Several header decorations were crammed awkwardly beneath the navbar in the center of the screen, creating an unreadable collision of text and icons.
- Uneven polish across seasons: The Winter theme had beloved snow-covered buttons that looked fantastic, but Halloween, Spring, and Chinese New Year had nothing comparable. The Chinese New Year theme in particular used flat geometric placeholders that looked nothing like real celebratory lanterns.
- No instant opt-out: While you could customize themes inside the Settings page, there was no quick, visible switch in the header for players on low-powered laptops or anyone who simply wanted a clean, distraction-free arcade view.
The new philosophy: Custom PNGs and GPU-composited CSS
The guiding principle of this overhaul was simple:
zero JavaScript overhead for rendering decorations. Instead
of recalculating coordinates in script loops, all motion is now handled by
pure CSS keyframes using
transform: translate3d(...)
and
will-change: transform. This offloads all sprite drifting, swaying, and floating to the GPU
compositor thread, leaving 100% of the main browser thread open for game
logic, audio decoding, and player input.
Every decoration was converted into a high-resolution transparent PNG tailored specifically for dark-mode arcade contrasts:
- Chinese New Year / Lunar Festival: We replaced generic circles with detailed imperial hanging lanterns with gold tassels, ornate red-and-gold dragon emblems, jade accents, and glowing sky lanterns.
- Winter: High-definition ice crystals, fractal snowflakes, and flying silhouettes of Santa's sleigh across the night sky. We also relocated the peeking snowman from the right screen edge to the bottom-left corner and mirrored him so he waves inward naturally.
- Spring: Delicate sakura blossoms, tulip buds, and fluttering swallowtail butterflies that drift lazily across the screen margins.
- Halloween: Flying bats, translucent ghosts, and spooky potion bottles. Most importantly, the hanging spider was moved into an isolated header layer strictly behind the navigation content, ensuring it never obstructs a dropdown, tab, or button.
Weaving spiderwebs for Halloween buttons
One of the standout features of our Winter theme has always been the snowdrifts resting on top of buttons, ribbons, search inputs, and active navigation tabs. It gave every UI component a tactile, physical presence that looked like fresh snowfall had settled across the arcade cabinet.
For Halloween, we wanted that exact same treatment, but themed as gossamer
cobwebs. To make it look authentic rather than a repeating cartoon zigzag, we
wrote an asset generator to build a crisp, seamless 64x24 @2x PNG (halloween_button_web.png). It features mathematical catenary sag curves, radial silk spokes, and tiny
pearl dew droplets catching the light.
Seamless catenary cobweb drapes applied to all primary arcade buttons
By applying this repeating drape through CSS
::before
pseudo-elements with
pointer-events: none, every button, panel header, and ribbon in the site now wears an eerie,
webbed trim that requires zero DOM modifications and zero runtime overhead.
Theming the game loading screens
The arcade experience doesn't start once the game boots; it begins the moment
you click a game tile and the retro preloader frame springs to life. Our
preloader component (<mc-game-frame>) features an arcade bumper sequence with letters slamming into place,
followed by a chrome shine sweep across the brand title:
MINNICH.AWESOME.
In this update, we wired the active seasonal theme directly into both the
Shadow DOM of
<mc-game-frame>
and our light-DOM Flash boot containers:
- Bumper Branding Accent: As the 15 arcade letters slam into place, a seasonal overlay materializes right on cue (~1.3s in). In Winter, snowbanks settle over the letters and icicles drip down. In Halloween, cobwebs stretch across the wordmark with a spider dangling beside the "M".
- Themed Loader Cards & Badges: Preloader sunburst rays, card borders, and progress tracks tint to match the season (ice-blue in Winter, toxic purple/green in Halloween, imperial red/gold in CNY, and cherry blossom pink in Spring).
- Themed Play Buttons: When asset loading reaches 100% and reveals the "Play Now" CTA, the button itself gets the seasonal treatment—snow-covered in Winter, and webbed up in Halloween.
The one-click toggle: Themes: On / Themes: Off
Not everyone wants holiday decorations on their screen all the time. If you're playing on battery saver mode or streaming a game, you should have complete control over your visual environment.
We added a dedicated toggle button right in the top navigation bar next to the Settings gear. It clearly displays its state as Themes: On with a glowing green status dot, or Themes: Off when disabled.
Under the hood, we made sure the toggle behaves intelligently:
-
Persistent Memory: When you turn themes off, we save your
last active seasonal theme in
localStorage. When you click it back on, it immediately restores that exact season even if you are testing outside the standard calendar month range. - Live Frame Syncing: Clicking the toggle dynamically broadcasts changes to any active game loaders on the page, instantly updating boot screen colors without requiring a page reload.
-
Clean Event Architecture: During testing, we caught an
interesting browser behavior where an inline
onclickattribute and an attached DOM event listener both fired in the same click cycle, causing the theme to toggle off and back on in less than a millisecond. We consolidated the handler and backed it with a 350ms debounce guard so every click alternates cleanly between On and Off.
What's next
With the seasonal engine now powered by clean transparent PNGs and GPU-composited CSS, Minnich.Awesome feels festive, lively, and blazingly fast. As we head into the autumn and winter months, we'll continue tuning per-game arcade effects and high score leaderboards.
Go ahead and try out the new toggle in the top navbar, fire up Raft Wars or Cyber Runner 2000, and let me know how the new themes feel. Happy gaming!
More from the Devlog