Changelog - February 2026
Comprehensive documentation of all major changes pushed to main in February 2026.🎨 Rendering & Performance
Instanced Rendering System (PR #946)
Impact: Massive performance improvement for resource rendering Changes:- Implemented
GLBResourceInstancerfor rocks, ores, herbs - Extended
GLBTreeInstancerwith depleted model support - Added
InstancedModelVisualStrategyas default for GLB resources - Reduced draw calls from O(n) to O(1) per unique model
- 1000 trees: 1000 draw calls → 3 draw calls (LOD0/LOD1/LOD2)
- Instanced depletion (stumps) for zero-cost state changes
- Automatic LOD switching with hysteresis
ResourceVisualStrategy.onDepleted()now returnsPromise<boolean>- Added optional
getHighlightMesh()method for instanced entities EntityHighlightServicesupports instanced hover outlines
docs/instanced-rendering.md- Complete system documentationdocs/api/resource-visual-strategy.md- API reference
🖥️ WebGPU Enforcement (Commit 47782ed)
Impact: Removed all WebGL fallback code - WebGPU is now strictly required Changes:- Removed
isWebGLForced,isWebGLFallbackForced,isWebGLFallbackAllowed - Removed
isWebGLAvailable,isOffscreenCanvasAvailable,canTransferCanvas - Changed
UniversalRenderertoWebGPURendererthroughout RendererBackendis now only"webgpu"- Removed
--disable-webgpuandforceWebGLflags from streaming
- All materials use TSL (Three Shading Language) which ONLY works with WebGPU
- Post-processing effects use TSL-based node materials
- No WebGL fallback path exists
- Updated
AGENTS.mdwith WebGPU requirements - Updated
CLAUDE.mdwith browser requirements - Created
docs/vast-ai-streaming.mdfor GPU streaming architecture
🎮 Vast.ai GPU Streaming
Impact: Production-ready GPU streaming to Twitch, Kick, X/TwitterGPU Rendering Modes
Xorg with NVIDIA (preferred):- Requires DRI/DRM device access
- Best performance, lowest latency
- Falls back to Xvfb if DRI unavailable
- Virtual framebuffer + GPU rendering via ANGLE/Vulkan
- Works in containers without DRM access
- CDP captures from Chrome’s GPU compositor
Audio Capture (Commits 3b6f1ee, aab66b0)
Added:- PulseAudio with
chrome_audiovirtual sink - FFmpeg captures from PulseAudio monitor
- Configurable via
STREAM_AUDIO_ENABLED
RTMP Multi-Streaming (Commits 5dbd239, d66d13a)
Added:- Simultaneous streaming to Twitch, Kick, X/Twitter
- FFmpeg tee muxer for single-encode multi-output
- YouTube explicitly disabled (set
YOUTUBE_STREAM_KEY="")
- Kick RTMP URL:
rtmps://fa723fc1b171.global-contribute.live-video.net/app - Added
KICK_STREAM_KEYandKICK_RTMP_URLto CI/CD secrets
Stream Quality Improvements (Commit 4c630f1)
Changed:- Default x264 tune:
zerolatency→film(better compression) - Buffer multiplier: 2x → 4x bitrate (18000k for 4500k bitrate)
- Added FLV flags for RTMP stability
- Improved input buffering with
thread_queue_size
Deployment Validation (Commits 47782ed, 30bdaf0)
Added:- GPU validation: Fails if
nvidia-smifails - Vulkan validation: Checks ICD availability
- Display validation: Ensures Xorg/Xvfb is accessible
- No soft fallbacks: Deployment FAILS if WebGPU cannot initialize
docs/vast-ai-streaming.md- Complete architecture guidescripts/deploy-vast.sh- Deployment script with inline docs
🤖 AI Agent Improvements (Commit 60a03f4)
Impact: 67% reduction in LLM API calls, 70% faster decision-makingAction Locks
Added:- Action lock prevents LLM ticks during movement
waitForMovementComplete()for synchronous actionsisMovingtracking inHyperscapeService
- Reduces LLM calls by ~70%
- Prevents decision conflicts
- Improves responsiveness
Fast-Tick Mode
Added:- 2s interval after movement/goal changes
- 3 fast ticks, then returns to 10s interval
- Movement completed
- Goal changed
- Resource depleted
- Banking completed
Short-Circuit LLM
Added:- Skip LLM for obvious decisions
- Repeat resource gathering
- Banking when inventory full
- Goal execution immediately after setting
- Reduces LLM calls by ~40%
- Faster decision-making
- More predictable behavior
Banking Improvements
Changed:- Banking actions now await movement completion
- New
bankinggoal type auto-restores previous goal - Filter depleted resources from nearby entity checks
docs/ai-agent-improvements.md- Complete guide
🔒 Security Updates
CSP Changes (Commits e012ed2, 1b2e230, 8626299)
Added:fonts.googleapis.comtostyle-src(Google Fonts)fonts.gstatic.comtofont-src(Google Fonts)static.cloudflareinsights.comtoscript-src(Analytics)data:toscript-src(WASM loading)
report-uridirective (broken endpoint)
docs/security/csp-updates.md- CSP configuration guide
Deployment Secrets (Commits b466233, 4a6aaaf, b754d5a)
Added:SOLANA_DEPLOYER_PRIVATE_KEYto secrets fileJWT_SECRETto secrets fileARENA_EXTERNAL_BET_WRITE_KEYto secrets fileKICK_STREAM_KEYandKICK_RTMP_URLto CI/CD
- Secrets now written to
/tmpto survivegit reset - PM2 uses
pm2 killinstead ofpm2 deleteto pick up new env vars - YouTube explicitly disabled to prevent stale keys
🎯 Solana Markets
WSOL as Default (Commit 34255ee)
Changed:GOLD_MINT→MARKET_MINT(defaults to WSOL)- Markets use native token of each chain
- Perps oracle disabled by default (
ENABLE_PERPS_ORACLE=false)
docs/solana-market-updates.md- Migration guide
🐛 Bug Fixes
Client Rendering (Commit 205f964)
Fixed:- Updated WebGL references to WebGPU in comments
SettingsPanel.tsxalways shows ‘WebGPU’ instead of conditionalerrorCodes.tsupdated to mention WebGPUvisualTesting.tsuses 2D canvas for pixel reading (WebGPU compatible)
Deployment Stability (Commits 8575215, 1025071, 77403a2)
Fixed:- Clean up X server sockets before starting Xvfb
- Remove
/tmp/.X11-unixdirectory and recreate - Kill all X processes (Xorg, Xvfb, X) before restart
- Added
STREAM_CAPTURE_USE_EGLvariable (was missing) - Added
STREAM_CAPTURE_EXECUTABLEfor custom browser path
PulseAudio Permissions (Commit aab66b0)
Fixed:- Add root user to
pulse-accessgroup - Create
/run/pulsewith proper permissions (777) - Export
PULSE_SERVERin both deploy script and PM2 config - Add
pactlcheck before using PulseAudio
📊 Performance Metrics
Instanced Rendering
- Draw calls: 1000 trees = 3 draw calls (99.7% reduction)
- Memory: Shared geometry/materials (1x cost vs. Nx cost)
- LOD switching: O(n) per frame with early-exit optimization
AI Agents
- LLM calls: 6/min → 2/min (67% reduction)
- API cost: 0.007/hr (65% reduction)
- Decision latency: 10s → 3s (70% improvement)
Streaming
- Encoding: Single H.264 encode for all platforms
- Latency: Twitch ~12s, Kick ~15s, X ~18s
- Quality: 1280x720 @ 30fps, 4500kbps bitrate
🔄 Breaking Changes
ResourceVisualStrategy API
Before:onDepleted() to return boolean.
WebGPU Requirement
Before:- WebGL fallback available
forceWebGLparameter supported- Headless mode worked (software rendering)
- WebGPU strictly required
- No WebGL fallback
- Headless mode NOT supported
- Deployment fails if WebGPU unavailable
- Ensure browser supports WebGPU (Chrome 113+, Edge 113+, Safari 18+)
- Vast.ai deployments must have NVIDIA GPU with Vulkan
- Update CI/CD to validate WebGPU availability
📝 Documentation Added
New Files
docs/instanced-rendering.md- Instanced rendering system guidedocs/vast-ai-streaming.md- GPU streaming architecturedocs/ai-agent-improvements.md- AI agent optimization guidedocs/api/resource-visual-strategy.md- API referencedocs/security/csp-updates.md- CSP configuration guidedocs/solana-market-updates.md- Market token migration guidedocs/CHANGELOG-2026-02.md- This file
Updated Files
AGENTS.md- Added Vast.ai deployment architectureCLAUDE.md- Updated browser requirements (Safari 18+)README.md- Added recent updates section, WebGPU requirementpackages/server/.env.example- Added GPU streaming variablespackages/client/.env.example- Updated streaming canonical platform
🔗 Related Pull Requests
- #946 - Instanced rendering for GLB resources
- #948 - Instanced highlight depleted fix
- #945 - Model agent stability audit