← All posts

Space Defence v3.70: Multiplayer Stable, Frontier Extracted, 70 Versions In

I wrote about Space Defence back in February — a browser-based wave shooter I'd been quietly building for months. That post covered the foundation: 9 weapons, 11 ships, achievements, the Dark Forge, and a basic multiplayer stub. A lot has changed since then.

We're now at v3.70.4. The tagline is 'Defence Keeps the Core; the Rim Ships Out' — which is about as apt a description of the last 50 versions as I could manage.

Space Defence title screen — The Silence Between Stars
The title screen. Minimal and dark, exactly as intended.

Multiplayer: 50 versions of iteration

Multiplayer shipped at v3.16. What I didn't anticipate was how many versions it would take to make it actually good. The architecture was sound from the start — Go WebSocket relay, binary state protocol, host-authoritative simulation, ring buffer interpolation on the guest — but the edge cases were brutal.

Ghost enemies that existed on the host but not the guest. Invisible enemies rendered in the wrong position. Entity sync jitter from unquantized floating point. Snapshot aliasing causing state corruption. WS disconnects from missing keepalive pings and write deadlines. By v3.67-3.68 we'd fixed 10 multiplayer bugs in a single sprint and completely overhauled the entity sync, quantization, and interpolation pipeline. It's stable now. You can play through a full co-op run without it falling apart.

The binary protocol encodes full game state into ArrayBuffers — positions, HP, weapon state, active effects — delta-compressed and broadcast at 30Hz. The guest interpolates, not simulates. Host is authoritative. In practice it means one player can be in London and one in Sydney and it still works.

Space Defence command deck — HANGAR, ARMORY, DEFENCE, SHIELDS, TECH LAB, COMMS, UPGRADES, SCORES
The command deck. Everything from your loadout to the leaderboard lives here.

Audio, cloud saves, and auto-update

ZzFX audio engine landed at v3.65.6. Web Audio API procedural synthesis — no audio files, no loading, no CORS issues. Every shot, explosion, and upgrade sound is generated on the fly from a tiny parameter set. Total audio payload: 0 bytes.

Cloud save was always partial — achievements and mastery saved locally, game results sent to the leaderboard. At v3.65.5 we completed it: JWT refresh, full cloud save on death and on CR purchase (debounced), reload on login. Your run state persists across devices now.

Auto-update via service worker was always there but fragile. At v3.68 we switched to network-first JS loading with SW reload signals and disabled HTTP caching on JS files entirely. You get the latest version on every visit without needing to clear cache.

Frontier Mode: started here, left home

The most significant thing to happen in the last 50 versions wasn't a feature — it was a game leaving the nest. Frontier Mode started as a mode within Space Defence: a top-down exploration layer where you'd fly between systems, dock at stations, and take contracts in between wave runs. It had its own canvas game loop, ship HUD, dock screens, 5300 background stars, 18 world art SVGs, and a full story bible.

By v3.70 it was clear that Frontier was its own game, not a mode. It got extracted into its own repo (rt-space-frontier) and will ship separately. The v3.70.4 tagline — 'Defence Keeps the Core; the Rim Ships Out' — is literally about this. Space Defence goes back to being what it does best.

Space Defence Wave 1 in-game — player hub glowing cyan in deep space, first enemy approaching
Wave 1. It gets considerably less peaceful.

What the game looks like right now

At v3.70.4, Space Defence is a browser game with no install, no login required, and no ads. It runs offline. Here's the full feature inventory:

Space Defence v3.70.4 feature inventory
AreaWhat's there
Weapons9 weapons, 6-upgrade tree each, Enhanced + Legendary evolution tiers
Ships11 ships with unique abilities (Nighthawk, Bee, Titan, Tempest, Sentinel + 6 more)
Enemies16 enemy types, 7 bosses, 6 AI behaviour patterns
Progression40 achievements, 5 daily challenges, weapon mastery (5 tiers), milestones, codex
Void Cards53 roguelike modifiers across 6 categories, drawn between waves
Dark ForgeRisk/reward crafting system, 10 offers per run
MultiplayerReal-time WebSocket co-op, binary protocol, 30Hz, ring buffer interpolation
BackendGo server, PostgreSQL (Neon), leaderboards, telemetry, 15 Prometheus metrics
InfraAzure Container Apps, blue-green pipeline, Cloudflare CDN, Telegram notifications
AudioZzFX procedural Web Audio — 0 audio files
Tests244 Vitest unit tests + 52 Playwright E2E tests
Wiki69 articles covering every weapon, ship, enemy, and mechanic

What's next

The backlog is honest. The cards system works but looks rough — 53 void cards need proper SVG art, a collection overlay, and a pick animation. Boss art is still placeholder geometry; all 7 bosses need capital ship designs. Enemy spawn progression needs redesigning so new types are introduced gradually rather than all at once.

On the engine side, there's a refactor planned to decompose the monolithic update loop into extracted systems — comet updates, pickup logic, projectile collision, enemy wave logic. Longer term: Android APK, prestige system, and Frontier Mode finding its own shape in its own repo.

Play Space Defence at spacedefence.0ryant.com — no sign-in, no install, works offline. If you enjoy it, Ko-fi support goes a long way. Updates and patch notes in the Telegram community.