Back to Devlog
    v0.8.17
    BuildJanuary 11, 2026Release notes

    Two Problems, One Release

    The console became 45 class files, Quake 3 clip-brush collision landed, and tree-shaking took the bundle from 8.0MB to 3.36MB.

    The Console Became A Directory

    45+ commands migrated to individual class files under src/engine/console/commands/, with a Command base class and CommandRegistry providing auto-discovery of command files.

    Commands can require developer 1 for access. New: cvarlist, toggle, set, reset, resetall, exec, bind and developer.

    The cvar system arrived here, formally — Cvar.register('r_shadows', true, {type, description, onChange}), Cvar.get, Cvar.set — with r_*, s_*, g_*, m_* and cam_* categories, after having been written in v0.8.15.

    Quake 3 Collision

    Q3CollisionBackend: SlideMove with multi-plane clipping, StepSlideMove with 18-unit maximum stair stepping, and clip brush meshes for fullclip, playerclip and caulk. Content and surface flags: SOLID, PLAYERCLIP, DETAIL, NONSOLID.

    text
    freefly_collision on|off|mode      freefly_speed 500

    This is the release where the engine stopped gliding through Quake geometry and started respecting it.

    The Numbers

    text
    Bundle: 8.0MB -> 3.36MB  (58% reduction)
    Total JS: 4.24MB with code splitting

    Also: memory leak prevention — every map object tagged mapOwned: true, with EventBus subscriptions, observers and handlers cleaned up, plus leaktest maprenderer and leaktest mapcycle. Headless CI entry: npm run cli:game -- --command "map wdm7; bsp info; quit".

    The Honest Bugfix

    text
    freefly_speed - Fixed cvar registration (moved after class definition)

    A cvar that had to be registered after the class it belongs to existed. It is the v0.8.10 wrap-mode bug and the v0.9.11 dt / queue.length bug in embryo: a registration order that nobody tested because the console it printed to was not the console anyone was looking at.