ALFTANET
← All devlog posts

We moved every game off its own subdomain

Each game used to live at its own address. Folding them all onto paths under one domain was the right decision for reasons we understood at the time — and it completely failed to fix the thing we actually did it for.

The original setup was one subdomain per game: swarmfall.alftanet.com, driftbreak.alftanet.com, and so on. It felt tidy. Each game was its own service, its own container, its own certificate, its own little site.

Today they all live at alftanet.com/swarmfall/, alftanet.com/driftbreak/, and the old addresses redirect. Here's why, and what it did and didn't achieve.

What was actually wrong with subdomains

Search engines treat a subdomain as, roughly, a separate site. That's a defensible default — blog.example.com and shop.example.com often are different things — but it's exactly wrong for a games portal, where every subdomain is one page of the same small site.

The consequences compound:

The move

Mechanically it was less work than expected, because the games were already separate services behind a reverse proxy. The proxy learned to route /swarmfall/* to the container that used to answer for swarmfall.alftanet.com, and the game didn't need to know anything had changed.

The one real requirement was that every game's internal links and asset references had to be relative. A game that asked for /game.js was fine at the root of its own subdomain and broken under a path prefix, where it needed /swarmfall/game.js. Relative references work in both.

Then every old subdomain got a permanent redirect to its new path, which is the part you cannot skip. A redirect is how you tell a search engine "this moved, carry everything you knew about the old address over to the new one". Without it you don't move a page, you abandon one and publish another.

We checked the redirects again while writing this — all of them still resolve correctly, which is worth verifying occasionally, because a redirect that quietly breaks is invisible until you notice traffic has gone.

What it didn't fix

We made this change largely because our ad network had rejected the site for "low value content", and the fragmentation across subdomains was our best theory as to why.

The theory was reasonable. Eleven one-page sites genuinely do look thin. The move genuinely did consolidate everything correctly.

And the rejection didn't budge.

It took us considerably longer to work out that the reviewer wasn't objecting to our URL structure at all. They were objecting to the fact that a game page on this site had almost nothing on it to read — the games were canvases with a leaderboard and no words. The architecture was a red herring; the site was thin in the ordinary sense of not having much on it.

That realisation is what produced the day we wrote thirteen game pages, and eventually this whole guides section.

The lesson we took

We fixed the most technically interesting problem rather than the most likely one.

Subdomain consolidation is a satisfying piece of work: there's a clear architecture argument, it's mechanically fiddly enough to feel substantial, and you can verify it succeeded with a few requests. Writing a thousand words about a game you already built is none of those things. It's just work.

When a system gives you vague feedback — "low value" — there's a strong pull toward the interpretation you'd enjoy fixing. It's worth deliberately asking which explanation is the boring one, because in our case the boring explanation was simply correct, and we spent weeks on the interesting one first.

Two things worth adding, in fairness to the move: it was still the right change, and we'd do it again. Every game added since has been a single proxy route and nothing else — no certificate, no DNS record, no analytics setup. And the site now genuinely reads as one site, which matters for the next reviewer even if it didn't sway that one.