Skip to main content
← All Posts

Arcade Under the Hood: The April Infrastructure Sprint

When you’re running 40+ browser games, the stuff nobody sees matters more than the stuff everybody plays. Players click “Play” and expect things to work. They don’t think about how the game got there or why the leaderboard knows who they are. I think about it all the time. This first week of April, I finally dealt with the infrastructure debt that had been piling up since launch.

The Monorepo Restructure

For months, the EchoForge Arcade was exactly what you’d expect from something that grew organically: 40-some game folders sitting next to each other with a hand-edited homepage. Every time I added a new game, I’d copy a folder, tweak the HTML, then manually update play.html to include the new card. It worked. It was also the kind of thing that slowly drives you insane.

On April 1st, I tore the whole thing apart and rebuilt it as a proper source/build/deploy layout. The centerpiece is build.js — a build pipeline that reads from game-manifest.json and generates the homepage, game cards, detail pages, and routing automatically. Adding a new game is now exactly two steps: create the game folder, add an entry to the manifest. That’s it. No more editing five files every time I ship a card game.

The manifest is just title, slug, description, thumbnail, and tags. The build script reads it and spits out static HTML for Cloudflare Pages. A JSON file and a Node script doing the boring work I shouldn’t have been doing by hand.

Bringing Blackwood Manor and Avalon Station Home

Blackwood Manor and Avalon Station had been living on their own subdomains as separate Cloudflare Pages projects. That made sense when they were standalone, but once they joined the arcade, the separate hosting caused problems. Cross-origin restrictions broke auth token sharing. Leaderboards needed workarounds. Deploying meant managing three Pages projects instead of one.

On April 2nd, I folded both games into the main arcade as same-origin paths. Blackwood Manor went from blackwood.echoforge.games to arcade.echoforge.games/games/blackwood-manor/. Same for Avalon Station. The old subdomains redirect, so nothing breaks for anyone who bookmarked the old URLs. But now both games are first-class arcade citizens — same auth flow, same leaderboard hooks, same deploy pipeline. Two fewer things to manage.

Hardening EchoForge Accounts

The accounts service handles auth for everything — the arcade, EchoQuest, the portal. “Good enough” stops being good enough fast when it’s the front door. I knocked out several things that had been on my list too long.

First, the Logto OIDC integration was technically working but had some rough edges. The email scope wasn’t being requested correctly, and the sub claim from Logto needed proper resolution to our internal UUID format. Both fixed now.

Second, the accounts portal had no idle timeout. If someone walked away from a logged-in session on a shared computer, that session stayed active indefinitely. I added a 15-minute idle timeout — standard practice, should have been there from day one.

Third — and this one was overdue — I added a date-of-birth age gate during registration. This is a COPPA compliance requirement. If you’re running a service that minors might use, you need to verify age at signup. The implementation is simple: a DOB field that blocks registration for users under 13. No data is stored for rejected signups.

Finally, field-level encryption for PII in the database and SSL for all DB connections. Email addresses and birthdates are encrypted at rest with app-level keys, not just disk encryption. Belt and suspenders.

Pause Menus and Player Controls

This one’s smaller but matters to players. Several arcade games didn’t have a pause function — you’d press Escape and nothing would happen, or worse, you’d lose focus and the game would keep running. I added ESC/P pause support to Hex Drop, Neon Serpent, Signal Lost, Barricade Run, and Forge Drop. While I was in Hex Drop’s code, I also added Q/E rotation keys as an alternative for WASD players. Small stuff, but players notice.

Bug Tracking Gets Serious

Bug tracking was “I remember it” or “there’s a note somewhere.” That stops working at 40 games. I set up GitHub Issues as the canonical bug tracker with a proper label system: bug, critical, enhancement, in-progress, qa-ready, verified, plus origin labels like found-by-claude, discord-reported, and user-reported.

The Discord part is the best bit. Our Fig bot now listens in the #feedback-and-bugs channel. Players can use the /bug command or just describe their issue in plain text, and it auto-creates a GitHub Issue with the discord-reported label. Bug goes from “player hits it” to “tracked issue” in seconds instead of hours. Or never.

Site Health, SEO, and Compliance

On April 9th I turned to the public-facing side. All 41 game detail pages got a visual refresh — better layout, clearer descriptions, proper screenshots. Added Twitter card meta tags, fixed broken Open Graph tags, cleaned up accessibility issues.

There was also an AdSense compliance issue with the Blackjack game page. The original description used words like “gambling” and “betting” a bit too liberally. Google’s ad policies are strict about gambling language even when no real money is involved. Softened the copy to focus on strategy — same game, just described in a way that doesn’t trip filters.

I also added a devlog navigation link to the site header and created proper content pages that had been missing. The site finally feels like a real website instead of a game launcher with a domain name.

Fixing What Was Broken

Alongside all the structural work, I squashed several game-specific bugs. Void Breaker had a crash triggered by a specific enemy spawn pattern. Cribbage had an edge case in scoring that would occasionally throw an unhandled error. FreeCell’s layout was broken on mobile — cards overlapping and unplayable on smaller screens. Blackwood Manor had a module script issue from the subdomain migration that prevented it from loading in certain browsers. I also swept through and updated a handful of external URLs that had gone stale.

Not glamorous, but every crash is a player who might not come back.

What’s Next

With the infrastructure in better shape, I can focus on making games instead of fighting the platform. New games ship faster. Login works the same everywhere. Player feedback goes somewhere.

Next up: more arcade games, continued work on Idle Acres (our upcoming idle farming game), and some long-overdue performance work on EchoQuest. The plumbing is done. Time to build on top of it.

— Bruno