BE AWESOME
Settings
Design & Art
📅 September 19, 2026 · ⏱️ 7 min read

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.

This post is about Revamping Seasonal Themes: From Laggy JavaScript to Handcrafted PNGs
Theme Settings →

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.

Play Raft Wars
Halloween Mode

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 onclick attribute 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!

Hello!