Vibe code the physical world. Chat with an AI coding agent to build, simulate, and control 3D environments in Unreal Engine 5 — with embodied agent support, real-time pixel streaming, and a full data visualization stack.
SimWorld_Studio_Demo.mp4
SimWorld Studio is an AI-native 3D scene authoring and embodied agent testbed built on Unreal Engine 5.3. It connects Claude (via Claude Code CLI) to UE through a multi-protocol bridge, letting you:
- Build scenes by chat — describe a city block and watch it materialize in real time
- Control embodied agents — spawn, command, and observe AI agents navigating the scene
- Run multi-agent experiments — testbed with auto-PIE, trajectory recording, collision tracking
- Stream the viewport — Pixel Streaming delivers the live UE viewport to any browser
┌─────────────────────────────────────────────────────────┐
│ Browser (React UI) │
│ Coding Agent │ Viewport │ Embodied Agent │ Statistics │
└──────┬────────────┬──────────────┬────────────┬─────────┘
│ SSE/HTTP │ WebSocket │ SSE/HTTP │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────┐
│ Web Server (Node.js / Express) │
│ index.js │ AgentController │ MetricsHub │ SSE │
└──────┬──────────────┬──────────────────────────────────-┘
│ │
▼ ▼
┌────────────┐ ┌─────────────────────────────────────────┐
│ Claude CLI │ │ Unreal Engine 5.3 │
│ (MCP tools)│ │ UnrealMCP (TCP:55557) │ UnrealCV │
│ │──│ spawn / delete / move │ vget / vset │
└────────────┘ │ Python scripting │ camera / obj │
└─────────────────────────────────────────-┘
│
┌─────────────┴──────────────┐
│ Cirrus Signalling Server │
│ Pixel Streaming :8685/86 │
└────────────────────────────┘
| Component | Path | Description |
|---|---|---|
| Launch Scripts | SimWorld-Studio.ps1 / .bat |
One-click launcher: Cirrus → UE → Web Server |
| Web Server | web/server/index.js |
Express API, SSE push, asset catalog, metrics |
| MCP Server | web/server/mcp-server.js |
Claude ↔ UE tool bridge via TCP |
| Agent Controller | web/server/agent-controller.js |
Per-agent sessions, trajectory, collision tracking |
| Metrics Hub | web/server/metrics-hub.js |
Time-series data for all agents (collision, speed, turns) |
| Context Manager | web/server/context-manager.js |
Scene state (actors, environment, round) |
| UnrealCV Bridge | web/server/unreal-bridge.js |
Persistent TCP socket to UCV with FIFO queue + retry |
| Frontend | web/src/App.jsx |
React app: chat, viewport, agents, stats, asset browser |
| UE Plugin | UE_Project/Plugins/unrealcv/ |
Extended UnrealCV with hit tracking, actor camera commands |
- Natural language → 3D scene in real time
- 125 buildings (BP_Building_01–127), 6 trees, vehicles, street furniture, static meshes
- 17 marketplace packs discoverable via
list_assets()(allow-AI licensed) - Auto session-suffix on actor names prevents cross-map name collision crashes
verify_scenetool: Claude evaluates screenshot and returns PASS/NEEDS_IMPROVEMENT/FAIL
- Pixel Streaming via Cirrus signalling server — full UE viewport in browser
- Click to activate mouse/keyboard input
- 1920×1080 default, adaptive resolution via MatchViewportRes
- Spawn and control
Base_Pedestrian/Base_User_Agent/Base_Demoagents - Per-agent session: position, rotation, heading (compass), speed, status
- Real-time state: background poller every 3s via UnrealCV
- Trajectory view: top-down SVG map with heading arrows, collision markers (red dots)
- Camera tab: 3-strategy agent POV (actor camera → camera/0 at eye-level → latest screenshot)
- Activity log: ReAct thought → tool actions → response per turn
- Hit tracking:
OnActorHitplugin event → collision count, impulse, impact point - Floating draggable detail window per agent
- Embodied Agent Statistics: aggregate map (2D top-down, all agents), collision/speed time-series charts
- Coding Agent Verifier: rule-based (scene collision count) + VLM-based (Claude reads screenshot, scores 1–10)
- MetricsHub: server-side 5s sampling → real-time SVG
LineChart/MultiLineChart
- Built once at startup from live UE Python scan (
EditorAssetLibrary.list_assets) - UE Content Browser–style navigation: folder → shows subfolders + direct assets
- Left sidebar: global category filter (Buildings / Trees / Vehicles / etc.)
- Search: recursive subtree, category-aware
- Click any asset → inserts correct spawn command into chat
- Auto-start PIE (polls until confirmed active)
- Spawn N agents at configurable radius, broadcast goal
- Testbed log with per-step status
- Mock mode: replay pre-recorded sessions without GPU
- Session management: slot-based with heartbeat and TTL
- Skills: pre-made prompts for city layout, weather, navigation
- Learned tools: Claude can save custom tool recipes
Note on demo assets: The featured demo showcases scenes built with high-quality commercial 3D assets (buildings, vehicles, characters, etc.) that are not included in the open-source release due to licensing restrictions. The redistributable Minimal build ships with a different set of freely licensed assets, so the visual appearance will differ from the demo. The functionality and workflow remain the same.
Run all cells in order. Setup takes ~5 minutes. Requires a free Colab GPU runtime and an Anthropic API key.
For end users on a Linux machine with an NVIDIA GPU. For internal multi-user shared servers, see Linux — Shared Server below.
- OS: Linux (Ubuntu 20.04+ recommended)
- GPU: NVIDIA GPU with 8GB+ VRAM (tested on L40S, T4, A100)
- NVIDIA drivers: 525+ with Vulkan support
- Node.js: 18+
- Python: 3.9+
- Disk: ~40 GB free (15 GB download + 21 GB extracted)
# Download (~15 GB compressed, ~21 GB extracted)
wget -O SimWorld-Studio-Minimal.tar.gz \
https://huggingface.co/datasets/SimWorld-AI/SimWorld-Studio/resolve/main/SimWorld-Studio-Minimal.tar.gz
tar xzf SimWorld-Studio-Minimal.tar.gzpip install git+https://github.com/SimWorld-AI/SimWorld-Studio.git#subdirectory=packaging
npm install -g @anthropic-ai/claude-codeOption A — API Key:
export ANTHROPIC_API_KEY="sk-ant-..."Get your key at console.anthropic.com.
Option B — Claude Code Login (no API key needed):
claudeThis opens a browser for OAuth login. If on a headless server, use the API key option instead.
simworld-studio startThis will:
- Detect your GPU and authenticate with Claude
- Launch Unreal Engine (headless)
- Wait for the engine to be ready
- Start the Studio web server
- Print the URL to open in your browser
On multi-GPU systems, it will ask which GPU to use (or pass --gpu INDEX). For remote servers, it auto-detects your IP and prints SSH tunnel instructions.
Options:
--gpu INDEX GPU to use (auto-detected if omitted)
--port PORT Web UI port (default: 3002)
--binary PATH Path to SimWorld-Studio-Minimal directory
Try: "Set up the environment with a sunny sky, then build a small neighborhood with 4 houses and trees"
- Unreal Engine 5.3 (Epic Games Launcher)
- Node.js 18+
- Claude Code CLI:
npm install -g @anthropic-ai/claude-code
Edit SimWorld-Studio.ps1 lines 46–47:
$UeRoot = "C:\Program Files\Epic Games\UE_5.3"
$UeProject = "E:\UE\SimWorld-copy\SimWorld.uproject".\SimWorld-Studio.ps1The script will:
- Kill stale port processes
- Sync Cirrus
player.jsand build the React frontend - Start Cirrus signalling server (Pixel Streaming)
- Launch UE Editor with MCP + Pixel Streaming flags
- Wait for MCP port to be ready (up to 90s)
- Start Web Server on port 3002
- Stream all logs to terminal with
[cirrus]/[server]prefixes
Open http://localhost:3002 in Chrome.
.\SimWorld-Studio.ps1 -Port 3003 -McpPort 55560 -CirrusHttpPort 8687 -Gpu 1 -NoBuildUnreal Engine 5.3 has no native macOS build of this project, but the web stack (React UI, Node API, asset/skill/scene browsers, agent panel scaffolding) runs fine on Mac for frontend work and API exploration. UE-dependent features (viewport, scene spawn, agent control) will show ueConnected: false and are no-ops.
- Node.js 18+ (
brew install node)
./SimWorld-Studio-Mac.sh # installs deps, builds frontend, starts backend on :3002
./SimWorld-Studio-Mac.sh --no-build # reuse existing dist/
./SimWorld-Studio-Mac.sh --dev # vite dev server on :5173 with HMR + backend on :3002Then open http://localhost:3002 (or :5173 in --dev).
The script sets UNREAL_PORT=1 / UCV_PORT=1 so the backend's UE probes fail fast and stay quiet — no Cirrus, no UE Editor, no MCP subprocess required.
See INTERNAL_SETUP.md for port assignment table and multi-user setup.
export UE_ROOT=/data/murray/ue/UE_5.3
export UE_PROJECT_PATH=/data/user/simworld_projects
simworld-studio start \
--port 3004 --mcp-port 55561 \
--cirrus-http-port 8687 --cirrus-ws-port 8688 --cirrus-sfu-port 8990 \
--gpu 0The UnrealCV plugin has been extended with:
| Command | Description |
|---|---|
vget /object/{name}/velocity |
Actor velocity [vx, vy, vz] cm/s |
vget /object/{name}/overlaps |
Currently overlapping actors (JSON) |
vget /object/{name}/nearby {r} |
Actors within radius r cm (JSON) |
vset /object/{name}/track_hits |
Bind OnActorHit — start recording physics collisions |
vget /object/{name}/hit_events |
Get & clear hit event queue (JSON) |
vget /camera/actor/{name}/lit |
Render from named actor's camera (FusionCamSensor or UCameraComponent) |
Recompile required after updating plugin files (Ctrl+Alt+F7 in UE Editor).
| Module | README |
|---|---|
| Web Server (backend) | web/server/README.md |
| Frontend (React) | web/src/README.md |
| Web (full stack) | web/README.md |
| Gym / Navigation | gym_env/README.md |
| Co-Evolve | co_evolve/README.md |
# Requires access to the simworld_arena source repo
./build.sh./build.sh→ createsdist/simworld_studio-{VERSION}.tar.gz- Upload to GitHub Releases
- Update
version.json
| Symptom | Fix |
|---|---|
[cirrus] EADDRINUSE :8685 |
Get-NetTCPConnection -LocalPort 8685 | Stop-Process -Force |
| MCP port never ready | UE crashed — check simworld_studio_workspace/logs/ue.log |
| Pixel Streaming black screen | Wait 60s after UE launch; check logs/cirrus.log for Streamer connected |
Cannot generate unique name for X |
Fixed — actor names now include session suffix automatically |
| Agent not detected after PIE | Auto-discovery runs every 5s; or use ↻ Sync button in Agent panel |
| VLM Scoring fails | Ensure Claude Code is authenticated: claude |
| Camera tab black | Recompile UE plugin for vget /camera/actor/{name}/lit |
Vulkan memory crash (Linux) |
Use --gpu 0 flag; install vulkan-tools mesa-vulkan-drivers |
MCP port not opening (Linux) |
Wait 60s more; check GPU drivers with nvidia-smi |
game module not found (Linux) |
Ensure you extracted the full archive; check gym_citynav/Binaries/Linux/ |
CUDA context error (Linux) |
Set --gpu INDEX to isolate a single GPU |
Claude errors |
Run claude login or verify ANTHROPIC_API_KEY is set |
No GPU detected (Linux) |
Install NVIDIA drivers 525+; verify with nvidia-smi |
| Can't access UI remotely | Use SSH tunnel: ssh -L 3002:localhost:3002 -L 8585:localhost:8585 user@server |
# UE logs (Linux Minimal binary)
tail -f gym_citynav/Saved/Logs/gym_citynav.log
# Studio backend logs
tail -f simworld_studio_workspace/logs/server.logApache 2.0 — see LICENSE.