Back to Devlog
    v0.8.15
    EngineJanuary 9, 2026Release notes

    Every Number In One Place

    A typed cvar system with validation, bounds, change callbacks and localStorage persistence — and engine.json became mandatory.

    Typed Cvars

    src/engine/core/Cvar.ts: bool, int, float and string types with validation, min/max bounds, change callbacks, automatic localStorage persistence, and config export/import.

    text
    cvarlist [filter]   toggle <cvar>   reset <cvar>   resetall
    set <cvar> <value> cvarexport        help <cvar>

    Namespaces: r_* render, s_* sound, m_* mouse, g_* game.

    The Two Decisions That Were Not About Cvars

    `engine.json` became required, with no silent fallbacks. defaultGame is now required. allowGameOverride was added and defaults to false — "disabled for production security".

    The engine/game boundary got real. EngineScene was extracted from GameScene; GameAudio was pulled out of AudioManager; SettingsPanel was decoupled via callbacks; GameClock and GameTimer moved from src/game/ to src/engine/core/; mobile.css moved to the engine's UI styles; src/data/ and src/ui/ moved into the game. 26 game files updated for the new imports.

    The browser title comes from engine.json, falling back to "SHAG Engine v0.8.15".

    Also Here

    The example game is now "Isometric Game Test" — an RTS, four months before the first FPS map. Documentation for the cvar system and configuration, plus missing changelogs added for v0.8.12 and v0.8.13.

    Known Issues: none stated.