Changelog - February 27, 2026
Major updates to WebGPU enforcement, GPU rendering, audio capture, and agent stability.Breaking Changes
WebGPU-Only Rendering (Commit 47782ed)
BREAKING: Removed ALL WebGL fallback code. WebGPU is now REQUIRED. Removed:RendererFactory.ts- WebGL detection and fallback logicisWebGLForced,isWebGLFallbackForced,isWebGLFallbackAllowedflagsisWebGLAvailable,isOffscreenCanvasAvailable,canTransferCanvaschecksUniversalRenderertype (now onlyWebGPURenderer)forceWebGLanddisableWebGPUURL parametersSTREAM_CAPTURE_DISABLE_WEBGPUenvironment variable (now always false)DUEL_FORCE_WEBGL_FALLBACKconfiguration option (removed)
- 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 - game won’t render without WebGPU
- Simplifies codebase and reduces maintenance burden
- Ensure browser supports WebGPU (Chrome 113+, Edge 113+, Safari 18+)
- Check compatibility at webgpureport.org
- For server/streaming: Must use Xorg or Xvfb with NVIDIA GPU
CLAUDE.md- Added WebGPU requirement sectionAGENTS.md- Created with WebGPU guidancepackages/shared/src/renderer/RendererFactory.ts- Removed (WebGL code deleted)packages/server/scripts/stream-to-rtmp.ts- Removed WebGL flagsecosystem.config.cjs- Removed WebGL fallback options
GPU Rendering & Streaming
Xorg/Xvfb GPU Setup (Commits 263bfc5, 5fe4a18, 30bdaf0, 725e934, e51a332)
Added: Robust GPU rendering setup for Vast.ai deployment with WebGPU support. Features:-
Xorg with NVIDIA (preferred):
- Headless Xorg configuration with NVIDIA driver
- Auto-detects GPU BusID via
nvidia-smi - Config:
/etc/X11/xorg-nvidia-headless.conf - Options:
AllowEmptyInitialConfiguration,UseDisplayDevice=None - Verifies with
xdpyinfobefore use - Detects swrast fallback (software rendering) and rejects it
-
Xvfb with NVIDIA Vulkan (fallback):
- Virtual framebuffer for X11 protocol
- Chrome uses NVIDIA GPU via ANGLE/Vulkan
- CDP captures frames from Chrome’s internal GPU rendering
- Works in containers without DRM access
-
Failure Mode:
- Deployment FAILS if neither Xorg nor Xvfb can provide WebGPU
- No soft fallback to headless mode (doesn’t support WebGPU)
- Explicit error message with troubleshooting steps
DISPLAY=:99- X server display numberVK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json- Force NVIDIA Vulkan ICDGPU_RENDERING_MODE=xorg|xvfb-vulkan- Rendering mode indicatorDUEL_CAPTURE_USE_XVFB=true/false- Dynamically set based on GPU setup
scripts/deploy-vast.sh- GPU rendering setup logicecosystem.config.cjs- GPU environment variablesdocs/vast-deployment.md- Deployment guidedocs/webgpu-requirements.md- WebGPU requirements
Vulkan Driver Management (Commits 89b78e3, ba1cf0a, ef8033c, e5aa1e7)
Fixed: Force NVIDIA-only Vulkan ICD to avoid conflicts with broken Mesa ICDs. Changes:- Set
VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json - Prevents libGLX_nvidia.so.0 driver conflicts
- Ensures consistent Vulkan behavior across containers
- Some Vast.ai containers have misconfigured Mesa Vulkan ICDs
- Mesa ICDs can conflict with NVIDIA drivers
- Forcing NVIDIA-only ICD ensures WebGPU works reliably
Chrome Dev Channel (Commits 47782ed, 92ee48e)
Added: Use Chrome Dev channel (google-chrome-unstable) for WebGPU support. Changes:- Install
google-chrome-unstablein deploy script - Set
STREAM_CAPTURE_CHANNEL=chrome-devin ecosystem config - Playwright channel mapping:
chrome-dev→google-chrome-unstable
- Chrome Dev has WebGPU enabled by default
- Stable Chrome may have WebGPU behind flags
- Ensures consistent WebGPU availability
Audio Capture
PulseAudio Setup (Commits 3b6f1ee, aab66b0, 7a5fcbc, d66d13a)
Added: Game audio capture via PulseAudio virtual sink. Features:- User-mode PulseAudio with
chrome_audiovirtual sink - FFmpeg captures from
chrome_audio.monitordevice - Graceful fallback to silent audio if PulseAudio unavailable
- Automatic sink creation and verification
scripts/deploy-vast.sh- PulseAudio setupecosystem.config.cjs- Audio environment variablespackages/server/scripts/stream-to-rtmp.ts- Chrome audio output configdocs/streaming-configuration.md- Audio configuration reference
Audio Stability Improvements (Commits b9d2e41, 4c630f1)
Fixed: Audio buffering and synchronization issues. Changes:thread_queue_size=1024for audio input (prevents buffer underruns)use_wallclock_as_timestamps=1for PulseAudio (real-time timing)aresample=async=1000:first_pts=0filter (recovers from audio drift >22ms)- Increased video
thread_queue_sizefrom 512 to 1024 (better a/v sync) - Removed
-shortestflag (caused audio dropouts during video buffering)
- Prevents intermittent audio dropouts
- Maintains audio/video synchronization
- Recovers from audio drift automatically
Streaming Configuration
RTMP Multi-Platform (Commits 5dbd239, 7ee730d, a71d4ba, 50f8bec)
Fixed: Stream key management and multi-platform RTMP streaming. Changes:- Twitch, Kick, X/Twitter streaming (YouTube explicitly disabled)
- Kick URL corrected:
rtmps://fa723fc1b171.global-contribute.live-video.net/app - Explicit unset/re-export of stream keys (prevents stale environment values)
- Masked logging for security (
***configured***instead of plaintext) - Stream keys passed through GitHub secrets → SSH →
.envfile
scripts/deploy-vast.sh- Stream key managementecosystem.config.cjs- RTMP destination configurationpackages/server/src/streaming/rtmp-bridge.ts- Kick URL fix
Improved Buffering (Commits 4c630f1, b9d2e41)
Changed: FFmpeg encoding configuration for smoother playback. Changes:- Changed x264 tune from
zerolatencytofilm(allows B-frames) - Increased buffer from 2x to 4x bitrate (18000k bufsize)
- Added FLV flags:
flvflags=no_duration_filesize - Added input buffering:
thread_queue_sizefor frame queueing - Added stream recovery:
genpts+discardcorruptflags
- Better compression efficiency
- Smoother bitrate for viewers
- Reduces buffering during network hiccups
- Better stream recovery from errors
Canonical Platform Change (Commit 34255ee)
Changed: Canonical platform from YouTube to Twitch. Changes:STREAMING_CANONICAL_PLATFORM=twitch(was youtube)STREAMING_PUBLIC_DELAY_MS=0(was 12-15s)
- Twitch has lower latency than YouTube
- Live betting requires minimal delay
- YouTube explicitly disabled in production
Agent Improvements
Movement Completion Tracking (Commit 60a03f4)
Added:waitForMovementComplete() API for multi-step actions.
Features:
waitForMovementComplete(timeoutMs?: number): Promise<void>- Wait for movementisMoving: boolean- Check if currently moving- Movement state tracked via
tileMovementEndpacket - Timeout handling (default: 15s)
packages/plugin-hyperscape/src/services/HyperscapeService.ts- Movement trackingpackages/plugin-hyperscape/src/actions/banking.ts- Banking actions now await movementdocs/agent-movement-api.md- API documentationdocs/api/hyperscape-service.md- API reference
Action Locks & Fast-Tick Mode (Commit 60a03f4)
Added: Action lock system to prevent LLM interference during multi-step actions. Features:- Skip LLM ticks while movement is in progress
- Fast-tick mode (2s) for quick follow-up after movement/goal changes
- Short-circuit LLM for obvious decisions (repeat resource, banking, set goal)
- Banking actions now await movement completion
- Prevents LLM from changing goals mid-action
- Faster response for obvious decisions
- More reliable multi-step actions (walk → bank → deposit)
Resource Detection Range (Commit 60a03f4)
Changed: Increased resource approach range from 20m to 40m. Why:- Matches skills validation range
- Prevents “too far away” errors
- More reliable resource gathering
Deployment Automation
Vast.ai Improvements (Commits 1025071, 4a6aaaf, b754d5a, bb5f174, 50f8bec)
Added: Comprehensive deployment automation and diagnostics. Features:- Clean up X lock files before starting Xvfb (prevents startup failures)
- DATABASE_URL persistence through git reset (via
/tmp/hyperscape-secrets.env) - Secrets injection overhaul (pm2 kill instead of delete)
- Database warmup (3 retry attempts after schema push)
- Bun installation automation (with unzip dependency)
- First-time setup (auto-clone repo if not present)
- Solana keypair setup from
SOLANA_DEPLOYER_PRIVATE_KEY - Comprehensive streaming diagnostics (FFmpeg, RTMP, PulseAudio checks)
scripts/deploy-vast.sh- Deployment script.github/workflows/deploy-vast.yml- CI/CD workflowdocs/vast-deployment.md- Deployment guide
Cloudflare Pages Workflow (Commits 3e4bb48, e012ed2)
Added: Automated client deployment on push to main. Features:- Triggers on changes to
packages/client/**orpackages/shared/** - Uses wrangler pages deploy (not GitHub integration)
- Proper build steps (shared package first)
- Multi-line commit message handling
- R2 CORS configuration
.github/workflows/deploy-pages.yml- Workflowpackages/client/scripts/deploy-cloudflare.mjs- Deploy script
Security
JWT_SECRET Enforcement (Commit b56b0fd)
Added: JWT_SECRET now required in production/staging. Changes:- Throws error if JWT_SECRET not set in production
- Generate with:
openssl rand -base64 32
- Prevents session hijacking
- Enforces secure token signing
Stream Key Security (Commits 7ee730d, a71d4ba, 50f8bec)
Added: Masked logging and explicit unset of stale stream keys. Changes:- Keys logged as
***configured***instead of plaintext - Explicit unset before re-sourcing
.env - Prevents accidental exposure in logs
Secrets Management (Commits b466233, 8e6ae8d, 55f93c6, b56b0fd)
Added: Comprehensive secrets injection for CI/CD. Changes:SOLANA_DEPLOYER_PRIVATE_KEYadded to secretsARENA_EXTERNAL_BET_WRITE_KEYadded to secretsJWT_SECRETadded to secrets- pm2 kill instead of delete (ensures daemon picks up new env vars)
Configuration Changes
Solana Markets (Commit 34255ee)
Changed: Markets now use native token (WSOL) instead of custom GOLD. Changes:MARKET_MINTenv var replacesGOLD_MINT- Defaults to WSOL on each chain
- Perps oracle disabled by default (
ENABLE_PERPS_ORACLE=false)
- Simplifies market setup
- Uses native token for better liquidity
- Perps program not deployed on devnet yet
Client Fixes (Commits e012ed2, 1b2e230, 8626299)
Fixed: Vite polyfills, CSP, and CORS issues. Changes:- Vite polyfills: Aliases resolve
vite-plugin-node-polyfills/shims/*to dist files - CSP: Allow Google Fonts (
fonts.googleapis.com,fonts.gstatic.com) - CSP: Allow
data:URLs for WASM loading - CSP: Allow Cloudflare Insights (
static.cloudflareinsights.com) - Disabled
protocolImportsin nodePolyfills plugin
- Fixes “Failed to resolve module specifier” error in production
- Allows Google Fonts to load
- Allows WASM modules to load
Documentation
New Documentation Files
AGENTS.md- AI assistant guidance for WebGPU requirementsdocs/webgpu-requirements.md- Browser and GPU requirementsdocs/streaming-configuration.md- Streaming configuration referencedocs/vast-deployment.md- Vast.ai deployment guidedocs/agent-movement-api.md- Movement API documentationdocs/api/hyperscape-service.md- HyperscapeService API referencedocs/deployment-workflow.md- Deployment workflow guidepackages/server/.env.streaming.example- Streaming environment variables
Updated Documentation
CLAUDE.md- Added WebGPU requirements sectionREADME.md- Updated with WebGPU requirements and recent changespackages/plugin-hyperscape/README.md- Added movement API documentationguides/playing.mdx- Added WebGPU system requirements
Commit Summary
Total commits analyzed: 50 (from 2026-02-26 to 2026-02-27) Categories:- WebGPU enforcement: 1 breaking change
- GPU rendering: 10 commits (Xorg, Xvfb, Vulkan)
- Audio capture: 5 commits (PulseAudio, buffering)
- Streaming: 8 commits (RTMP, keys, buffering)
- Deployment: 12 commits (Vast.ai, secrets, automation)
- Agent improvements: 1 commit (movement API, action locks)
- Security: 4 commits (JWT, secrets, stream keys)
- Client fixes: 3 commits (Vite, CSP, CORS)
- Configuration: 2 commits (Solana, markets)
- Miscellaneous: 4 commits (CDN, debugging)
Migration Guide
For Developers
- Update browser: Ensure Chrome 113+, Edge 113+, or Safari 18+
- Remove WebGL code: Delete any WebGL fallback logic
- Update renderer references: Use
WebGPURendereronly - Test WebGPU: Verify at webgpureport.org
For Server Operators
- GPU Setup: Ensure NVIDIA GPU with Vulkan support
- Install drivers: NVIDIA drivers + Vulkan tools
- Configure display: Xorg or Xvfb with GPU access
- Update secrets: Add streaming keys to GitHub secrets
- Test deployment: Run manual deployment via workflow_dispatch
- Monitor health: Check
/healthendpoint after deployment
For Agent Developers
- Update actions: Use
waitForMovementComplete()for multi-step actions - Banking protocol: Follow proper sequence (open → deposit → close)
- Movement awaiting: Await movement before interacting with entities
- Action locks: Use locked goals for multi-step actions
See Also
- CLAUDE.md - Development guide
- README.md - Project overview
- docs/vast-deployment.md - Vast.ai deployment
- docs/webgpu-requirements.md - WebGPU requirements
- docs/streaming-configuration.md - Streaming config
- docs/agent-movement-api.md - Movement API