Changelog
Code evolution in 0xBrsm/NexQuake — client, Nexus (relay), and server.
Versioning note: entries through 0.19.x represent pre-1.0 development history. Legacy 0.20.0 is the stable-versioning commitment point and maps to 1.0.0.
1.15.0
Added
- Play demos from the in-game file overlay: each
.dementry has a play button and double-clicks to play, so recorded games and instant replays can be reviewed without typingplaydemo— and a demo recorded under one game directory plays back from any other.
Fixed
- Mid-game
record/replaydemos no longer open on an out-of-world ("void") camera or drop into an intermission/scoreboard screen when playback ends. The captured signon preamble now reflects the live connection, so playback starts cleanly at the current game state. - Particle size now scales linearly with the view projection instead of in exponential power-of-2 steps, so particles stay consistently sized across resolutions and detail tiers (mid-distance particles previously bloated up to ~2x at higher render widths). Classic mode at the default fov is unchanged.
- Native (window-fill) modes no longer drop to ~30fps from compositing cost on wide/ultrawide windows: the WebGL canvas backbuffer is sized to the render resolution and upscaled by the browser, so present cost tracks the Detail tier rather than the window size.
1.14.1
Fixed
- Particle effects (rocket trails, explosions) rendered about twice their
intended size in Native mode at High detail. Particle size now tracks the
view's projection scale instead of the raw render width, so it matches the
rest of the scene at any aspect ratio, and is guarded against extreme
render widths or very low
fovvalues.
1.14.0
Added
- Mid-game demo recording:
recordcan now be started at any point during a live game, not only before connecting, capturing from the current frame. - Instant replay: bind a key to
replayto play back a rolling in-memory ring of the last few seconds of play. Recording and replay share a passive signon-preamble capture so playback is contiguous, and demos are written to the in-browser filesystem (no automatic download). - Native (window-fill) video modes that render at the browser window's live
aspect with no black bars and follow it on resize and device rotation;
Classic mode keeps a fixed 4:3 image. A redesigned Video Options menu adds
Mode (Classic/Native) and Detail (Low/Medium/High) rows plus a live
Resolution readout.
vid_modenow spans 0–5 (Classic/Native × Low/Med/High) and the selected mode persists across launches, so the client boots straight into it.
Changed
- The software renderer now supports render widths up to 3840px to cover 4K-wide and 32:9 ultrawide displays, and the viewmodel scales independently of aspect so the weapon no longer recedes on ultrawide or portrait viewports.
Fixed
- Bounded the demo-filename copies in
CL_Record_f/CL_PlayDemo_f(bugfix/cl_demo.c.patch): a long demo name typed at the console could overflow the stack via uncheckedsprintf/strcpyplus the.demappend.
1.13.0
Added
net_transportcvar (auto|tcp|udp) to pin or auto-select the client network carrier.- Touch "Customize Controls" menu for editing the on-screen control layout.
Changed
- The server browser now updates live, streamed from Nexus over a session-scoped Server-Sent Events channel instead of on-demand control-protocol queries; a manifest-generation change also triggers a jittered client refetch to pick up server-added assets.
- Renamed the bootstrap/asset endpoints to
/gamedir(per-session manifest + boot config) and/pak/<hash>(content-addressed asset bytes); on-the-wire JSON and the asset-ref header are unchanged. - The client transport carrier is now lazy and per-connection (keep-warm retired) with a bounded WebTransport probe that falls back to TCP, and the indicator is redesigned into a compact UDP/TCP chip.
- Un-precached mod sounds now play non-blocking instead of stalling the client.
- Autoscaling now spawns on reactive free-slot headroom rather than server-browser poll rate.
Fixed
- Eliminated the network-dependent menu-entry hitch caused by a synchronous manifest refetch on filesystem-lookup misses; new files are still picked up via async refresh.
- Client/transport config is now applied once at boot and no longer re-applied on manifest refetches (reconnect, lazy-load recovery), so a refetch can't reconfigure a live session.
1.12.1
Changed
- Crosshair is now enabled by default.
- Mouselook requests raw (unaccelerated) pointer movement from the browser.
Fixed
- HTTP/3 page loads no longer intermittently 404; the WebTransport h3 listener
now serves the full app mux, not just
/connect. - Reduced first-use audio hitches by prefetching the client sound precache set and warming core UI sounds at boot.
rcon loginreports its outcome consistently by device (console always; mobile toast) across both edge-gated and PKCE flows.- The
rcon loginlanding page is rendered via string substitution instead offmt.Sprintf, avoiding format-verb corruption from%in the HTML template.
1.12.0
Added
- Native HTTPS + WebTransport via a single
EXTERNAL_URLswitch (seesrc/docs/ENVIRONMENT.md"Run Paths"). Unset keeps plain HTTP + WebSocket;EXTERNAL_URL=https://hostmakes Nexus own the public endpoint, sourcing one cert fromCERT_DIR(BYOcert.pem/key.pem, else Let's Encryptautocert) for both HTTPS and QUIC. Bind + TLS is a fatal startup gate. - Active transport indicator: a lower-right "Connected by: WebTransport (UDP) / WebSocket (TCP)" readout in the browser shell; double-click to collapse, hidden on touch.
Changed
- Nexus owns its public endpoint; a reverse proxy is no longer required (the
behind-a-front shape stays via
AUTH_CLIENT_IP_HEADER).WT_CERT_DIR/WT_CERT_ROTATE_DAYSreplaced byCERT_DIR. - Admin auth is verify-only (no server-side login flow): Nexus verifies an OIDC
JWT (Bearer or
AUTH_JWT_HEADER-injected). Direct-exposurercon loginruns Authorization Code + PKCE as a public client (POST /rcon/session→ httpOnlynq_session); new optionalAUTH_CLIENT_ID.AUTH_RCON_PASSWORDstill works. AUTH_ADMIN_IDis now fail-closed: unset grants admin to no verified login (was: any); set=anyor list claim matchers (groups:admins,email:[email protected]). Admin methods are named password and SSO in the boot summary and docs.fov_adaptdefaults to1(pure Hor+, was0.5) and is now archived.- Connection lines ("Connected by X", "Connection upgraded to X", …) now print to the browser console instead of the in-game console (plus the lower-right overlay).
- Reduced log noise on a public endpoint: per-connection upgrade failures and full-tx-queue drops no longer warn per event, and the benign quic-go receive-buffer warning is silenced.
Fixed
- Hor+ FOV scaling applies on the same refdef recalc as a video mode change; previously a boot-time or mid-session mode switch left FOV unscaled until another recalc was forced.
Removed
- The auto-rotating self-signed WebTransport cert manager; WT uses the
CERT_DIRcert now. - Client network diagnostics: the
net_diagcvar andnetdiag/netdiag resetcommands.
1.11.0
Added
- WebTransport (QUIC/HTTP3) transport for the browser client (
net_wt.c, nexuswt.go,trunk/webtransport/). The client tests for a landed WT handshake and adopts it over the existing WebSocket path; falls forward to WebSocket automatically when WT is absent or fails. - Active transport surfaced to the player on connect/upgrade;
rconappends the source transport in parens after the client IP.
Changed
- emsdk toolchain pinned to 5.0.0 in local and headless builds to match production; prevents the lazy-VFS guard regression introduced by emsdk 5.0.3.
Fixed
- Oversized WT datagrams are now dropped silently (like UDP loss) instead of killing the session.
- Dead WT transport is closed on WebSocket fall-forward so the server correctly reaps the orphaned session.
- Asyncify re-entry: JS transport callbacks no longer call back into the WASM engine or delete sockets during the boot path.
- emsdk 5.0.3 lazy-VFS guard: replaced
node.contentscheck with the size field to avoid false-positive boot failures ("Corrupted data file").
1.10.0
Added
rcon login(WASM): opens an OIDC popup againstGET /rcon; Nexus pushesrcon: authenticated.over the trunk control channel on completion. Sidesteps COOP-same-origin restrictions for proxy-gated deployments.error.data.hinton401responses: operator-facing auth hint built from configured methods.trunkpublic API additions:Session.SendControl/End,SessionByVirtualIP,SessionInfo.ActiveServerPort, control-channel handler hooks.
Changed
- Admin RPC:
session.*→client.*;client.bannow disconnects the WASM engine viaCbuf_AddTextand returnsdisconnectedcount andsource_ips[]. server.instance.commanduses random__NQX_*sentinels instead of a time-window heuristic — long replies no longer truncate; adjacent commands can't interleave.- Nexus top-level split by concern (
connect.go,log.go,env.go,ws.go,version.go);accesssplit intoauth.go,gate.go,identity.go; console-bound text lowercased. - Docs:
ADMIN.md,nexus/README.md,client/README.mdaligned to current shape.
1.9.1
Changed
- Browser client networking is now a pluggable transport shell (
net_wasm.c,net_nqchan.c,net_ws.c); the WebSocket transport is unchanged but additional transports can be added without reworking the channel layer. WASM→JS bridge symbols are unified under theNQWasm_prefix. - Nexus relay extracted into the transport-agnostic
trunkpackage (renamed fromnqrelay) with an exportedTransportinterface and a singleNewConnconstructor. Public RPC and HTTP surfaces are unchanged. - Internal cleanup: dead code removed (
deadcode/staticcheckclean forsrc/nexus);internal/sessionfolded intointernal/adminnow that the cross-package coupling that forced the split is gone. - Docs:
client/README.md,nexus/README.md, andATTRIBUTIONS.mdupdated to match the new file/symbol layout.
1.9.0
Added
POST /rconJSON-RPC 2.0 endpoint for admin control. External tools can list servers/sessions, run lifecycle operations (server.start/stop/restart/remove/launch), forward commands to a specific instance (server.instance.command), ban sessions (session.ban), and discover available methods viarpc.discover. All admin commands share the same registry as the in-gamerconsurface. See ADMIN.md for the full reference.Authorization: Rcon <password>scheme for admin credentials (RFC 7235). OIDC JWT continues to use the header configured byAUTH_JWT_HEADER(defaultAuthorization).rcon.helpandrpc.discoveras first-class admin commands.
Changed
- Admin commands moved into a flat namespace:
server.list,server.instances,server.start,server.stop,server.restart,server.remove,server.launch,server.instance.command,session.list,session.info,session.ban,logs.tail. - Per-instance dispatch accepts port only.
rcon <host> <cmd>(slist-hostname) andrcon <idx> <cmd>(pool slot index) are no longer recognized — usercon <port> <cmd...>with the listen port shown inrcon nexus server list. The fan-out-to-all-backends behavior those forms provided is gone with the server/instance rework. - Terminology: Pool → Server, Backend → Instance, VIP → NQIP across log output, command help, and RPC field names.
- Env var
POOL_SIZErenamed toSV_MAX_INSTANCES. Operators withPOOL_SIZE=Nin their environment must update.
1.8.5
Added
fov_adaptcvar (default0.5) controls the blend between literal horizontal FOV and pure Hor+ aspect scaling.0gives stock Quake behavior (vertical FOV shrinks on widescreens);1gives pure Hor+ (vertical preserved, horizontal widens aggressively on ultrawide); values in between trade peripheral vision for edge comfort.
Changed
- Browser client applies Hor+ aspect scaling at refdef calculation time:
fovis interpreted as the intended horizontal FOV at 4:3 and wider viewports widen fov_x based onfov_adapt. Previously an ultrawide mode left the vertical view as a narrow slit; thefovcvar is no longer mutated on mode changes. - Nexus watches
GAME_DIR/<mod>/{common,server}/with fsnotify and reconciles the dedicated server's runtime filesystem per event. Files dropped into the game directory after server start are visible to running servers without a restart..pakarchives still require a server restart because the engine caches pak directories at load. - Browser client recovers from VFS-manifest misses transparently within a single
fopen: both stale-hash XHR 404s and brand-new paths trigger a synchronous manifest refresh and retry in place. Files dropped into the game directory are reachable in the current session without a page reload.
Fixed
- Video mode menu no longer shows the "Weapon hidden in widescreen" notice; with Hor+ in place, the weapon renders correctly at any aspect.
1.8.4
Added
- Site now generates static HTML documentation pages from Markdown sources, with client-side navigation between doc routes.
- Homepage PLAY NOW button auto-launches the game on desktop browsers via
?autostart=1; touch devices retain the ENTER screen for fullscreen/landscape activation. - Site publishes
sitemap.xmlandrobots.txtfor search-engine indexing.
Changed
- Gameswitch connection lookup moved from inline
cl_parse.cpatch logic intocom_gameswitch.c(COM_SwitchGameForConnection). - Homepage SEO improved with structured data, Open Graph / Twitter meta tags, and semantic HTML headings.
- Dead client-side docs route helpers removed from static shell generator in favor of the new static page pipeline.
1.8.3
Added
- Browser client startup now supports
-notouchand-nojoyso operators can explicitly disable touch and gamepad input paths.
Changed
- Browser client startup now preloads
/startbefore WASM instantiation, derives imported WASM memory from the startup-memvalue, and defaults the client heap to 64 MB. - Client install-icon packaging now uses
client/shell/pwa-icon.svgas the source asset and generates PNG install icons when raster tooling is available.
Fixed
- Game-directory switching now restores the base hunk level before mounting mod content, preventing stale allocator state from leaking across client gameswitches.
- Generated NexQuake install icons now keep the legacy glyph placement while restoring the missing
Qsegment in the mark.
1.8.2
Added
- Web app install metadata now includes dedicated NexQuake PWA icons (
192,512, and Apple touch) so home-screen installs use branded assets.
Changed
- Client packaging now ships
manifest.webmanifestand install icon files alongside the WASM shell output, with shell metadata links resolved relative to the install path.
Fixed
- Client server-list refresh now clears stale hostcache entries before rebuilding results, avoiding leftover server metadata between
slistruns.
1.8.1
Added
- The in-game settings logo now links to the documentation site as a direct help entry point.
Changed
- The docs site now ships with pre-rendered navigation and home-page content so the initial page is readable before client-side navigation boots.
Fixed
- The ninth touch-control slot now maps cleanly through the WASM input layer, bind names, and client docs.
- Browser
quitnow returns to a fresh loader page again, with mobile fullscreen re-entered on the next normalENTERtap instead of getting stuck after teardown.
1.8.0
Added
- Touch text entry added with a dedicated top-of-screen bar for mobile console/chat/menu text, kept in sync with engine buffers.
- Touch controls added a ninth slot.
- Touch controls updated default binds and glyphs.
Changed
- WASM touch/menu text handling is simplified: new menu text helpers keep JS and C in lockstep, and overlay resize/focus logic is shared to avoid stray inputs when the keyboard appears.
- Startup prefetch warms common
gfxassets so the first overlay/console paint is smoother on the web client.
Fixed
- Nexus relay writes now apply a deadline to prevent rare WebSocket stalls under load; the stress-test harness handles larger UDP bursts more safely.
1.7.7
Fixed
- Browser
connectandrcontarget resolution now stay aligned across reconnects and scaled server pools, including exact hostname targeting for RCON and host-cache invalidation after WebSocket reconnects. - Nexus now chunks oversized admin replies and preserves joinable candidate ports in pooled server listings, avoiding silent client-side drops and broken joins from
slist.
Changed
rcon nexus slistnow shows pool summaries by default and can drill into grouped backend details withall, a pool index, or a pool hostname.- Nexus pool admin commands and server-targeted
rconusage now consistently accept pool indices/hostnames, with pool-targeted RCON fan-out to every running backend in that pool.
1.7.6
Fixed
- WASM touch tap detection now uses event timestamps and guarded async key pulses, improving tap reliability and avoiding stray gameplay input while the overlay editor is open.
POOL_SIZE=1entries now behave as ordinary non-autoscaled servers in Nexus andslist, without demand tracking or pool instance-count suffixes.
1.7.5
Changed
- Refactored
cd_wasm.c,in_wasm.c,sys_wasm.c, andvid_wasm.c, plus related shell styles, while preserving existing WASM client behavior. - Refreshed product docs, README content, and the GitHub Pages docs hub, including the new
docs/CONTROLS.mdguide.
Fixed
- Browser shell now defaults the multiplayer TCP/IP join cursor to the search field and blocks gameplay keys while the editor overlay is open.
1.7.4
Changed
- Refactored the WASM client shell JavaScript into clearer startup, touch, and overlay concern boundaries while preserving existing gameplay and operator-facing behavior.
- Simplified overlay startup wiring and shared fullscreen request handling across startup and touch input paths.
1.7.3
Fixed
- WASM client audio pause/resume now uses smoother fade and delayed suspend/resume handling on mobile browsers, reducing audible pop/click artifacts and improving visibility-transition stability.
1.7.2
Changed
- Refactored Nexus handler and relay internals (route split, package boundary cleanup, and dead-code removal) while preserving external tunnel protocol semantics.
1.7.1
Fixed
- Nexus relay now allows server-observed return-path UDP source ports in addition to primary managed listen ports, preventing post-connect gameplay hangs when server traffic shifts to ephemeral ports.
1.7.0
Added
- Mobile-focused touch controls for browser play, including on-screen action glyphs, configurable touch layout behavior, and touch-driven menu navigation.
- WASM client gamepad support with bind-driven action routing so touch/gamepad inputs map through standard Quake command binds.
Fixed
- Mobile fullscreen and safe-area handling now keeps the overlay/menu surfaces usable across orientation and settings transitions.
Changed
- Client video mode and canvas sizing behavior now adapts more consistently across mobile and desktop aspect ratios, with cleaner runtime mode selection.
- Browser shell startup/UI modules were reorganized to simplify input and overlay behavior across touch, mouse, and controller use.
1.6.2
Fixed
- Client
slistrow formatting now uses bounded writes for user-count and row rendering, preventing hostcache line buffer overflows.
Changed
- Refactored Nexus relay internals into public package
nqrelayas a pure WebSocket<->UDP relay API for import/vendoring use. - Consolidated Nexus control-frame handling through a single orchestrator control handler for relay port
0traffic. - Moved
slistresponse codec helpers into orchestration and removed duplicated relay-side server-list codec paths from the relay package.
1.6.1
Fixed
- Nexus autoscaling now avoids premature pool scale-up during warmup demand windows.
POOL_SIZEnow defaults to1when unset, and single-instanceslistrows no longer show an instance-count suffix.
Changed
- Nexus pool routing now selects a backend listen port at
slistrequest time instead of maintaining proxy-port session affinity. - Removed pool proxy listener/routing paths and simplified Nexus pool orchestration around direct backend ports.
1.6.0
Added
- Nexus dynamic server scaling for startup entries configured with
-port 0, including demand-aware scale-up/scale-down headroom and per-line caps viaPOOL_SIZE. - Session-affine relay routing for scaled server entries so join/handshake flows stay backend-consistent while preserving raw NetQuake datagram tunneling.
Changed
slistnow reports aggregate users/maxusers plus instance counts for scaled server entries, with client server-list formatting updated to display the instance total.- RCON target resolution for scaled server entries now requires a single routable backend listen port and returns an explicit ambiguity error otherwise.
- Nexus orchestration internals and docs now use explicit registry/policy/proxy lifecycle paths for reconcile heartbeat, draining, despawn, and routing decisions.
1.5.7
Changed
- Production image publish workflow now pushes per-architecture images by digest.
- Quickstart README minor wording changes.
1.5.6
Changed
- Dev image release workflows now publish from SemVer tag pushes with stable tags only (
<version>andlatest) and include tag-propagation handling to avoid transient release gate failures.
1.5.5
Changed
- Production release metadata now enforces strict
MAJOR.MINOR.PATCHtagging, explicitNQ_VERSIONpropagation, and aligned version signaling across mainline validation and runtime startup output.
1.5.4
Fixed
- Nexus
/startmanifest generation now skips malformed.pakarchives instead of failing the full bootstrap with HTTP500, so one bad pak no longer blocks client startup. - Nexus now logs unreadable pak warnings with the offending pak path and parser error during manifest generation, making corrupt archive diagnosis actionable in production logs.
1.5.3
Fixed
- Team Fortress quickstart map pack
q1/tf28maps.zipnow patchesstorm1(FORTRESS/maps/STORM1.BSP) by adding the missingteam_noon aninfo_player_teamspawn, preventing map-loadHost_Error: Program errorfailures.
Changed
- Clarified quickstart examples wording in
docs/QUICKSTART.md(docker runlaunch comment and compose snippet label).
1.5.2
Changed
- Standardized Nexus naming/capitalization across docs and inline comments for consistency.
- Standardized internal docs link text style (human-readable Title Case in prose, filename-style where file identity is the point) and documented the rule in
agents/DOC_STYLE.md. - Expanded
docs/QUICKSTART.mdwith clearer Docker Compose guidance for moving beyond basicdocker runusage.
1.5.1
Changed
- Quickstart
server.cfgadded forfvfwith default Purge mode. - Tweaked Arena and FFA quickstart server configs.
1.5.0
Changed
- Client
connectandrconnow share a single hostcache resolver that supports case-insensitive unique prefix matching (with explicit ambiguity rejection), so short server-name targets work consistently across both commands. - Client hostcache server-name capacity was raised from
16to24characters. slistconsole output and multiplayer server-list menu formatting were widened for the longer server-name column, and the server-list menu rows/cursor were recentered to keep the layout aligned.
1.4.1
Fixed
- Client remote VFS lazy-load recovery now throws filesystem
ENOENTon failed remote fetches and triggers throttled/startmanifest refresh retries with backoff, preventing repeated manifest-refresh request loops after idle/resume transport failures. - RCON server-command replies now continue capture long enough for outputs delayed by the audited
echo ...; wait; wait; wait; <cmd>wrapper, so cvar queries liketimelimitno longer return only the admin audit line. - Docker
wasm-buildernow copiesetc/into the build context so client seed cfgs (autoexec.cfg,nexquake.cfg) are present when bundling/nqseed, fixing CI image builds that failed with missing seed cfg errors.
1.4.0
Fixed
- Dedicated server map rotation now forces
changelevelat(timelimit + 1)minutes when no players are connected, preventing the known no-player QuakeC mapchange hang (mapcyclefirst, thenstart->e1m1, then maptrigger_changeleveltarget, otherwise current map). - Dedicated server map spawn now falls back to
maps/start.bspwhen the requested startup map is missing, preventing failed server activation on bad map names. - Dedicated server
mapcycleselection now skips missing map BSPs and advances to the next valid entry, avoiding repeated fallback loops when cycle lists include maps not present on disk. - Dedicated server
mapcycleparsing now dedupes consecutive valid map tokens so QW-stylelocalinfo <from> <to>cfg chains can be used as mapcycle files without self-looping on repeated adjacent maps. - Client cfg seed marker handling now only skips reseeding when the marker contains the success value (
1), avoiding false-positive "already seeded" states from partial/empty marker writes. - Client seed packaging now resolves cfg defaults from
src/etc/client/(with legacy fallback), fixing build failures after thesrc/etcconfig split.
Changed
- Server
host.cidle rotation now reuses the sharedmapcycleselector frompr_cmds.cto keep map parsing behavior consistent and DRY. - Server/docs now document idle
mapcyclefallback behavior undertimelimit. - Quickstart defaults now ship mod-specific server config assets for
arenaandffa(includingffamapcycle list), andfortressnow includestf28maps.zipin common assets.
1.3.1
Fixed
- Mouse wheel input in the WASM client is now deterministic across browser delta modes (
pixel/line/page) and smoother on mixed ratchet/trackpad hardware.
Changed
- Client bootstrap now seeds
autoexec.cfgandnexquake.cfginto IDBFS once on first load. - Quickstart defaults in
src/etcwere updated for the config split (config.cfg->nexquake.cfg) andautoexec.cfgnow executesnexquake.cfg. - Built-in quickstart
id1no longer installs a client cfg fromgame.json; client defaults now come from the first-load seed flow.
1.3.0
Added
- Browser Quake client (WASM), Nexus relay/admin service, and dedicated server runtime.
- Docker-first deployment with quickstart game-pack bootstrap.
Changed
- Omitting AUTH_ADMIN_ID now promotes any authenticated user with JWT. Intended for admin-only OIDC endpoints, use with caution.
1.2.1
Fixed
- Added the missing
SV_RecursiveHullCheckdeclaration in sharedbugfix/world.h.patch(applied to both client and server) to prevent strict-toolchain build failures and remove duplicate per-target patching
Changed
- Build and release packaging now inject
NQ_VERSIONinto Docker/WASM build inputs so shipped binaries and published images report a consistent release version
1.2.0
Changed
- Simplified
compose.ymlfor out-of-the-box usage with inline env defaults - Added
compose.build.ymlfor power-user and production image builds
1.1.0
Added
- Quickstart download progress logging per mod with base vs game mod breakdown
Fixed
- WebSocket reconnect socket state handling and widened session user column
- Session info with transient route ports now treats unknown ports as disconnected
Changed
- Rcon admin requests are now audit-logged with admin tag before command output
- Renamed
og_ctfquickstart entry toog-ctfand simplified download log format - Updated etc configs, quickstart scan, and admin wait pacing
1.0.2
Fixed
- Remote CD track URL resolution now uses the latest
/startbundle data, preventing stale/nq/<hash>fetches after idle/reconnect cycles - Mouse wheel handling now normalizes browser delta modes and accumulates partial deltas for more consistent Quake wheel ticks
Changed
- Lowered client default
net_messagetimeoutfrom300to10
1.0.1
Changed
- Refined client favicon rendering (updated SVG styling/color treatment and shell cache-buster) to improve visibility across themes and ensure browsers pick up favicon updates reliably
1.0.0
Added
- Initial stable release
- Quickstart catalog support for local config assets via relative paths resolved from
CFG_DIR(for exampleclient: ["config.cfg"]forid1) - New built-in quickstart catalog entries for
og-ctf(3Wave CTF 2.51 server package) andfvf(Future vs Fantasy 4.2R)
Changed
- Reworked quickstart bootstrap flow around
CFG_DIR/game.json+servers.iniseeding, withid1always included and invalidQUICKSTARTnames explicitly skipped - Consolidated quickstart and asset install logic into
src/nexus/internal/assets/game.go, removing legacy split entrypoints and dead bootstrap code paths - Updated built-in asset URLs to the
0xBrsm/QuakeAssetsrepository (q1/layout), matching the renamed asset catalog structure - Refreshed
src/docs to match current quickstart behavior, catalog location, and asset source references
0.19.0
Added
- Client startup argument pipeline with
CL_ARGSand optional URL argument passthrough viaCL_URL_ARGS - Session-oriented admin command flow (
session ...) with dedicated session command handling
Changed
- Unified
/startclient configuration handling in Nexus/client startup wiring, includingCL_SMENUand startup setting delivery - Refactored Nexus admin/orchestration internals by splitting manager state/session logic into focused files and reducing duplicated dispatch/status parsing paths
- Updated server/docs defaults and operational documentation to align with the revised startup/admin flows
0.18.4
Changed
- Preserved original filename casing for user CD uploads in the browser overlay while keeping lowercase normalization for non-CD user files
- Lowercased runtime server VFS overlay symlink paths so classic uppercase mod assets resolve under Linux Quake's lowercase lookups
- Added runtime VFS case-collision guardrails so same-layer path collisions (e.g.
PROGS.DATvsprogs.dat) fail fast instead of silently overwriting
0.18.3
Changed
- Unified WebSocket transport browser-console logging paths in the client (
net_ws_transport.c) so connect/error/close and queue-overflow diagnostics use a shared logger - Clarified unload lifecycle naming in browser persistence glue:
NexQuake_OnPageUnloadandrequestUnloadShutdown, with an explicit note thatpagehide/beforeunloadare unload signals (not tab-visibility changes) - Added an explicit Nexus log event when a WebSocket session is promoted to admin via valid
rcon_passwordframe auth
0.18.2
Changed
- Renamed Nexus internal game-data package paths and symbols from
gamedatatoassets, withassets.go/assets_test.gorenamed togame.go/game_test.go - Standardized runtime game-data naming from
datatogameacross env/config/routes (GAME_DIR,/app/game,/game/...,/game-manifest)
0.18.1
Changed
- Nexus now promotes a connected client session to admin after a successful
rcon_passwordadmin frame, sosessionsrole output reflects that elevation during the same WebSocket lifetime - Loader bootstrap phase labels/status text are centralized and phase-1 bootstrap logging now flows through the shared phase path
0.18.0
Changed
- Split browser persistence roots into
/NexQuake/game(mods/config) and/NexQuake/cd(uploaded CD tracks), with/cdwired directly to the CD root - Renamed the user-overlay link namespace from
.nqto.usrfor clearer separation from remote asset roots - Simplified overlay file operations to use canonical runtime paths directly (
/mod/...,/cd/...) and removed intermediate path-mapping helpers - Streamlined CD track display/state matching in the overlay after game/CD path separation
0.17.1
Changed
- Refactored shell pre-js architecture into smaller concern-focused modules, splitting runtime bootstrap from remote VFS install/prefetch logic
- Rebalanced overlay responsibilities so CD state/controls and VFS/file-manager behavior live in dedicated modules
- Standardized shell module numbering by concern (
tensfor layers,onesfor sublayers) and updated build prep file lists to match - Simplified shell helper logic by deduplicating shared localStorage boolean reads/writes and minor review-driven duplication cleanup
0.17.0
Added
- Session-scoped hashed asset gateway flow in Nexus (
/start+/nq/<hash>) with manifest parsing/validation coverage - RCON integration coverage additions aligned with updated admin auth behavior
Changed
- Runtime asset bootstrap moved from direct
/data-manifestconsumption to/startbundle metadata plus hash-addressed asset fetches - Client/headless asset resolution standardized on FNV-1a hashing using
X-NexQuake-Ref, including CD remote track URL resolution
0.16.1
Changed
- Nexus HTTP routing and wiring cleanup: removed redundant
/data-manifest/route registration and simplifiednewMux/admin env function binding inmain.go - Nexus internals tightened across admin/orch/nqnet/gamedata packages by removing dead wrappers/helpers, collapsing duplicate logic, and trimming redundant checks
- Bugfix
net_dgrm.cpatch/docs now intentionally keep only the POSIX portability + receive-buffer overflow fixes (drops the prior NATAddrComparechange)
Added
- Expanded
src/client/README.mdwith a feature-to-patch index and missing patch documentation (cl_main.c.patch,menu.c.patch)
0.16.0
Added
- Empty server mod directories now propagate to the client manifest set, so config-only mods (no shipped data files) still appear as usable client mod folders
0.15.3
Changed
- No product-facing behavior changes in
src/(internal maintenance release)
0.15.2
Fixed
- Overlay/input UX regressions: arrow-key passthrough with UI open, modal interaction behavior, and sidebar/file interaction polish
0.15.1
Changed
- VFS bootstrap and mod switching flow simplified around
.nqremotesearchpath layering and updated manifest/install behavior
0.15.0
Added
- Modular shell UI architecture for overlay/file-manager behavior, including expanded CD management workflows
- Browser CD audio backend plus Nexus CD manifest streaming (
/cd-manifest) with integrated client/server track handling
0.14.0
Added
- Overlay file move by dragging files onto a game directory tab
- Upload progress and storage sync status in the upload message area
Changed
- Mod switching now rebuilds searchpaths from a base snapshot instead of using cached mod searchpaths
- Global-config mode now skips auto-
exec quake.rcon mod switch
Fixed
- Upload and drag-move now prompt before overwriting existing files
- Upload queue is locked while busy to prevent overlapping writes
0.13.1
Changed
- SVG favicon redesigned with overlapping DpQuake N/Q glyphs and entwined layering effect
0.13.0
Added
- Per-mod config support:
config.cfgis saved/loaded on mod switch viaCOM_SwitchGame(), with a JS-togglable per-mod vs unified mode - Game directory is reset to base on disconnect so config writes target the correct mod
Changed
- Client shell user-file allowlist is centralized and now includes
.pakfor upload/listing/persistence
Fixed
- Missing null termination on
com_gamedircopy in unified-config path - Upload validation error bubble now wraps and uses full row width before wrapping
0.12.0
Added
- Nexus websocket keepalive pings for better idle resilience
- Server browser menu headings/centering improvements
Changed
- Nexus
sessionsoutput columns reordered and now includes client source IP
Fixed
- Client websocket reconnect-on-send (including
rcon) and improved send-failed reasons smenuno longer flashes the full console backdrop when invoked from the console
0.11.0
Added
- Dedicated server
mapcyclesupport for deathmatch map rotation from either a file or inline list
Changed
- Server
changelevelflow now falls back to stock behavior whenmapcycleis unset or invalid
0.10.0
Added
- NexQuake in-browser VFS/settings panel ("Slipgate Complex") with per-mod tabs, drag-drop upload, inline
.cfgediting, and file export/delete actions - Branded NexQuake loading screen with status/progress presentation
Changed
- Browser user-file persistence now restores/syncs
.cfg,.sav,.dem, and.pcxunder/nexquakeacross sessions - Build-time version injection into
shell.html, with consistentv<version>display in UI and WASM startup banner
Fixed
- VFS overlay/input interactions and remote-file write fallback behavior for mixed base/mod data paths
0.9.0
Added
- Comma-separated
QUICKSTARTmanifests:QUICKSTART=ctf,arena,tfloads all three.jsonmanifests in order, concatenating their game data entries
Changed
loadGameDataEntriesrefactored to iterate comma-separated names with per-name validation
0.8.0
Added
- Distributed Server Orchestration: Nexus now coordinates multiple Quake instances via
servers.iniwith PTY-based console monitoring and dynamic port discovery. - Unified Admin Plane: A new administrative Nexus RCON endpoint (port 0) for remote management of the server fleet, including live process controls (
start/stop/restart) and session visibility. - Engine Stability Patches: Standardized security and portability patches (addressing format strings, buffer overflows, and 64-bit alignment) and integrated into the core engine.
- Browser UX Enhancements: Fixed audio buffering jitter, improved vsync synchronization, and stabilized platform shutdown for a smoother browser experience.
Changed
- Architectural Refactor: Decoupled the monolithic Nexus relay into domain-specific internal packages (
nqnet,orch,admin,gamedata), eliminating global state and circular dependencies. - Runtime Observability: Transitioned from static polling to real-time console monitoring, allowing Nexus to detect effective server ports and game states automatically.
0.7.0
Changed
- Replace SDL2 platform layer with direct Emscripten (WebGL2, WebAudio, HTML5 input)
- Split platform into
sys_wasm.c,vid_wasm.c,snd_wasm.c - GPU-side palette conversion: 8-bit R8 texture + fragment shader lookup
- Fullscreen triangle from
gl_VertexID(no VBO needed) - Event-driven input via Emscripten HTML5 callbacks (no polling)
- 256-byte keymap lookup table replacing 75-line switch statement
Fixed
- Choppy audio: reduced ScriptProcessorNode buffer from 2048 to 512 frames
Removed
- SDL2 dependency (
sys_sdl.c,vid_sdl.c,snd_sdl.c) - Dead WASM_SAVE_PAKS code (game data uses HTTP cache)
- Unused stubs, globals, and dedicated-server code paths
0.6.0
Added
- Mod switching (hot swap): client can change game directory at runtime without reload
- Common, host, and network patches for dynamic mod context (
common.c.patch,host.c.patch,net_main.c.patch) - Server polling for live game state (
slist.go)
Changed
- Nexus VFS and routing updated for per-mod file serving
0.5.0
Changed
- Refactor WebSocket stack: split
net_websocket.cinto transport (net_ws_transport.c) and protocol layers - Extract RCON into standalone
cmd_rcon.cwith JS token bridge (cmd_rcon_token.js) - Upgrade Go from 1.21 to 1.25; adopt
net/httprouting and modern stdlib APIs
Added
- Source attribution documentation (
ATTRIBUTIONS.md)
0.4.0
Added
- Authentication system for admin privileges (
auth.go) - RCON: client console commands relayed through Nexus to server (
net_websocket.c,auth.go) - Persistent filesystem: user config and saves survive browser sessions (
sys_sdl.c,shell.html)
0.3.0
Added
- PAK exploding and individual file streaming (
vfs.go,pak.go) - Asset manifest system for game data management (
assets.go,quake106.go) - Precache prefetch: client fetches assets during map load (
cl_parse.c.patch) - Server
.entfile overrides for custom entity placement (sv_main.c.patch)
Changed
- Extract quake106 asset handling into standalone Go package (
quake106/)
Fixed
- 32-bit pointer alignment for server builds
0.2.0
Added
- Server browser: aggregated server list replies from Nexus (
net_websocket.c) - Nexus routing and server info caching (
routing.go,slist.go)
Changed
- Split Nexus into focused modules:
vfs.go,servers.go,udp.go,websock.go - Rename gateway to Nexus
Fixed
- Reconnect stability after server disconnect
0.1.0
Added
- Go relay server (Nexus): WebSocket-to-UDP bridge for browser clients (
main.go,ws_handler.go,udp_relay.go) - NetQuake dedicated server with selective upstream patching (
src/server/) - Control message protocol between WASM client and Nexus (
net_websocket.c)
Fixed
- Server crash on client disconnect (
net_websocket.c,udp_relay.go) - Compilation errors in
net_websocket.cacross architectures
Built on the Quake GPL source (1999), the Quake-WASM port by Gregory Maynard-Hoare, and WebSocket multiplayer by initialed85.