Spawn

Make Games with Words

Learn about spawn
spawn / swhat we're building

pinned

start herewhat spawn isfaqfrequently asked questionsthe betthe spawn bet

updates

engine v5.0For Real2 daysengine v4.6Atelier6 daysengine v4.5Surface Tension2 weeksengine v4.4Solid3 weeksengine v4.3Groovy3 weeksengine v4.2Continuum4 weeksengine v4.1FoundationsMay 4, 2026engine v0.1GenesisApril 29, 2026
← All posts

engine v5.0.4

Engine v5.0.4

June 7, 2026

A patch in the For Real line.

Skies now cost almost nothing, multiplayer sockets stop dropping when dev and live rooms share a server, and mobile play opens the moment a game declares it.

what's new

  • Mobile is now opt-in at the door: your game plays on phones once mobile support is declared on the box and the game runs engine 5.0.3 or newer. Undeclared games stay desktop-only — phone visitors see an honest notice (with a "Try anyway") instead of broken touch controls.
  • Skies cost almost nothing now — the same sunsets, the same drifting clouds, a fraction of the GPU. Cloudy skies that used to be the single most expensive thing on screen (especially on phones) now render from one texture lookup.
  • Multiplayer sessions stop randomly reconnecting when a world's dev and live rooms share a server — routing noise no longer restarts the game simulation, so live sockets stay up instead of dropping every player for 8-11 seconds at a time.
›technical notes
  • The publish skill's platform-declaration guidance flips to the new play-door law: undeclared games are desktop-only (NULL no longer reads as works-everywhere), and declaring mobile: true only opens the door when the game's resolved engine is at or above the 5.0.3 touch floor. Savi is taught to check the engine version in her context and upgrade with manage_engine_version before declaring mobile (propose_covers platforms and declare_platforms both carry the rule).
  • Sky cloud FBM baked (ledger #234): the procedural sky's dominant GPU cost was its cloud coverage field — two fractal-noise stacks (up to 5+3 octaves, each octave a full perlin-lattice evaluation) running per pixel, per frame, over up to half the screen, in both the background node and the IBL capture, for a field that is a pure function of the cloud-plane coordinate. The field now bakes into a plane-space window texture (rg16f, sky-cloud-field.ts) and the per-pixel composite samples it with one tap. Everything that animates stays live per frame and is exactly the same math: wind drift is a UV offset (now an accumulated-drift uniform, so a mid-session wind change bends cloud motion instead of re-scaling its whole history and teleporting the field), and coverage/density/altitude/colors/sun/moon remain uniforms in the per-pixel lighting composite. The atmosphere itself already followed this fix shape (Hillaire sky-view/transmittance LUTs re-rendered only on sun/media change), so per-frame day/night cycles keep their per-pixel smoothness untouched.
  • Re-bake policy: never for the day/night cycle or any authored knob — only on first activation (whole window, that frame; the targets start zeroed = coverage 0, so an unbaked frame shows no clouds rather than garbage), when accumulated drift crosses half the window margin (~8 minutes at default wind; re-centered one band per frame into a back target, committed via texture copy so the sampled binding identity never changes and no frame samples a half-baked window — the overlap re-bakes to identical values, making a completed re-center invisible), and when the authored cloud altitude outgrows/undershoots the window (window spans a fixed multiple of altitude, keeping constant angular resolution). Trigger logic is CPU-pure and unit-tested (sky-cloud-field.test.ts).
  • The per-tier cloud octave knobs (cloudBaseOctaves/cloudDetailOctaves) are gone: the bake band-limits its octaves to the window's Nyquist rate, so the new cloudFieldSize ladder (low/medium 1024, high/ultra 2048) reproduces the old octave ladder by construction (1024 ⇒ the old medium 4+2, 2048 ⇒ the full authored 5+3) while frequencies a texel can't represent are dropped instead of aliasing into baked moiré. No tier pays per-pixel octave cost anymore.
  • WGSL structure pins extended: the only fractal-noise call sites allowed in the sky fragment are the night stack's three (starlight grain, moon maria, moon craters — all behind the uniform night gate); the clouds branch must tap the baked field + transmittance LUT, one tap each. A fourth noise site failing the suite means per-pixel cloud octaves came back.
  • Container restart roulette deleted (ledger #239): the front door re-propagated x-spawn-{variant-id,room-id,room-mode,update-slug,api-url,sdk-api-key,config-version} headers into GLOBAL process env on every request, and ANY change respawned the simulation worker — one container serving a world's dev + live rooms (different variant ids) flip-flopped continuously, detaching every gameplay socket with 1006 and an 8-11s reconnect (50-500 respawns/hour in prod since May 31; 9,012 room-flip events on June 6). SDK identity is now per-room state on the room runtime — seeded once from boot env, updated only via per-RPC SDKConfig; propagateSdkEnvFromHeaders and its restart rail are deleted, and NO config change can restart the worker (only /admin/restart and genuine worker death). The spurious cold-boot restart that threw away every container's prewarmed worker (650-1500ms) is gone too. Variant change on the bound room (local dev) gets an in-place room reset instead of a worker kill. Stray-room RPCs get the explicit room-mismatch refusal instead of silently hijacking the worker. Residual (named follow-up): job-worker SDK snapshot + 3 other boot-env readers keep the previous app's identity after a local app switch until the dev kernel restarts.

pinned

what spawn isstart herefrequently asked questionsfaqthe spawn betthe bet

updates

For Realengine v5.02 daysAtelierengine v4.66 daysSurface Tensionengine v4.52 weeksSolidengine v4.43 weeksGroovyengine v4.33 weeksContinuumengine v4.24 weeksFoundationsengine v4.1May 4, 2026Genesisengine v0.1April 29, 2026
← All posts