Changelog - February 2026
Comprehensive changelog for all changes in February 2026.[0.2.0] - 2026-02-28
🚨 Breaking Changes
WebGPU-Only Rendering
- BREAKING: Removed all WebGL support - WebGPU is now REQUIRED
- Removed
isWebGLAvailable(),isWebGLForced(),isWebGLFallbackAllowed() - Removed
UniversalRenderertype - useWebGPURenderer - Removed
forceWebGLparameter from renderer creation - Removed
--disable-webgpuandforceWebGLflags from streaming - Updated all WebGL references to WebGPU in client code
- Minimum browser versions: Chrome 113+, Edge 113+, Safari 18+ (macOS 15+)
✨ New Features
Instanced Rendering for Resources
- Added
GLBResourceInstancerfor rocks, ores, herbs - Added
InstancedModelVisualStrategywith automatic fallback - Separate InstancedMesh per LOD level (LOD0, LOD1, LOD2)
- Distance-based LOD switching with hysteresis
- Depleted model support with separate pool
- Highlight mesh support for instanced resources
- Collision proxies for raycasting
- 40% FPS improvement with 1500+ resources
AI Agent Improvements
- Added action locks to prevent LLM ticks during movement
- Added fast-tick mode (2s interval for 30s after actions)
- Added short-circuit LLM for obvious decisions
- Added banking goal type with auto-restore of previous goal
- Added
waitForMovementComplete()for reliable action chains - Added depleted resource filtering in nearby entity checks
- Increased resource approach range from 20m to 40m
- Track last action name/result in LLM prompt
- 65% reduction in LLM API costs
- 60% faster action chains
GPU Streaming Architecture
- Added Xorg/Xvfb automatic GPU mode detection
- Added PulseAudio audio capture with
chrome_audiovirtual sink - Added CDP screencast capture (2-3x faster than MediaRecorder)
- Added RTMP multi-streaming to Twitch, Kick, X/Twitter
- Added automatic recovery (soft/hard restart)
- Added browser rotation every hour to prevent GPU memory leaks
- Added resolution tracking and mismatch detection
- Added comprehensive deployment validation
🔧 Improvements
Streaming Enhancements
- Improved FFmpeg buffering with 4x bitrate buffer
- Added configurable GOP size (
STREAM_GOP_SIZE) - Added low-latency mode option (
STREAM_LOW_LATENCY) - Changed default x264 tune from
zerolatencytofilm(better compression) - Added audio buffering with
thread_queue_size - Added async audio resampling for drift recovery
- Added frame resolution tracking from CDP metadata
- Added automatic viewport recovery on resolution mismatch
Deployment Improvements
- Persist GPU/display settings to
.envfor PM2 restarts - Remove hardcoded secrets from
ecosystem.config.cjs - All secrets now read from environment variables only
- Added
.env.exampledocumenting required secrets - Updated
.gitignoreto block all.envfiles in subdirectories - Added database warmup step with retries
- Fixed PulseAudio permissions (add root to pulse-access group)
- Fixed X server socket cleanup before Xvfb start
- Fixed bun installation (install unzip first)
- Handle first-time Vast.ai setup by cloning repo
Client Improvements
- Allow Cloudflare Insights in CSP
script-src - Allow Google Fonts in CSP (
fonts.googleapis.com,fonts.gstatic.com) - Allow
data:URLs for WASM loading in CSP - Remove broken
report-urifrom CSP - Fix vite-plugin-node-polyfills shims resolution
- Update WebGL references to WebGPU in comments
- Settings panel always shows “WebGPU”
- Visual testing uses 2D canvas for pixel reading (WebGPU compatible)
🐛 Bug Fixes
Streaming Fixes
- Fixed PulseAudio permissions and fallback for audio capture
- Fixed missing
STREAM_CAPTURE_USE_EGLvariable causing crash - Fixed Xorg swrast fallback detection
- Fixed headless EGL env var passing to PM2
- Fixed
--headless=newpassing via args (not Playwright option) - Fixed Xorg/Xvfb fallback handling with diagnostic logging
- Removed
--ozone-platform=headless(breaks WebGPU) - Fixed resolution mismatch recovery
Deployment Fixes
- Fixed secrets injection (write to
/tmpto survive git reset) - Fixed env var writing to
.envfile in SSH script - Fixed multi-line commit messages in Pages deploy
- Fixed X server lock file cleanup
- Added
ARENA_EXTERNAL_BET_WRITE_KEYto secrets - Added
JWT_SECRETto secrets file
Client Fixes
- Fixed vite-plugin-node-polyfills shims resolution
- Fixed Google Fonts loading errors
- Fixed CSP blocking WASM loading
📝 Documentation
New Documentation
- Added
docs/vast-ai-streaming.md- GPU streaming architecture - Added
docs/instanced-rendering.md- Instanced rendering system - Added
docs/ai-agent-improvements.md- AI agent optimizations - Added
docs/api/renderer-factory.md- Renderer API reference - Added
docs/migration/webgpu-only.md- WebGPU migration guide - Added
docs/configuration/environment-variables.md- Complete env var reference - Added
docs/RECENT_CHANGES.md- Recent updates summary - Updated
AGENTS.md- Vast.ai deployment architecture - Updated
CLAUDE.md- WebGPU requirements and troubleshooting - Updated
README.md- New features and breaking changes - Updated
.env.example- All streaming and GPU variables
Updated Documentation
- AGENTS.md: Added Vast.ai deployment architecture section
- CLAUDE.md: Added WebGPU troubleshooting section
- README.md: Added WebGPU requirements, instanced rendering, streaming
Performance Metrics
Rendering
- Draw calls: 1500 → 6 (99.6% reduction)
- FPS: 30-40 → 55-60 (40% improvement)
- GPU memory: 20MB → 2.2MB per 1000 instances (89% reduction)
AI Agents
- LLM calls: 360/hour → 126/hour (65% reduction)
- API costs: 0.18/hour (64% reduction)
- Action latency: 30s → 12s (60% improvement)
Streaming
- Capture speed: 2-3x faster (CDP vs MediaRecorder)
- Encoding: Single-pass (JPEG → H.264)
- Latency: ~2-3s (with low-latency mode)
Migration Guide
From v0.1.x to v0.2.0
- Update browser to Chrome 113+, Edge 113+, or Safari 18+
- Remove WebGL code - No longer supported
- Update renderer creation - Remove
forceWebGLparameter - Update materials - Use TSL node materials
- Test WebGPU - Verify at webgpureport.org
Contributors
- @lalalune - WebGPU enforcement, streaming architecture, deployment fixes
- @tcm390 - Instanced rendering, highlight meshes
- @dreaminglucid - AI agent improvements