Build 3D prototypes in your browser — alone or together.
Peer-to-peer sessions, no account needed. Free and open source.
A collaborative 3D editor that runs entirely in the browser. Drop in primitives or your own models, wire up behaviour in a node graph, turn on physics, and walk through the result in VR — then send someone your peer ID and they are editing the same scene with you, in real time.
Sessions are peer-to-peer: edits, objects, node graphs, voice, cursors and files travel directly between browsers over WebRTC (a peerjs mesh). Servers do the jobs a browser cannot do alone, and on theprototype.app those servers are ours:
- Signalling introduces peers to each other, and a TURN relay carries a session's encrypted traffic when two networks cannot reach each other directly.
- Accounts and cloud saves (PocketBase) — optional; without signing in, your scenes stay in your browser.
- Assets — packs, skies and models download from our storage (Cloudflare R2) and the jsDelivr CDN.
- Community pages — shared scene pages, embeds and the gallery run on Cloudflare Workers.
- Anonymous error reports (on by default; Settings ▸ Privacy turns them off) and anonymous aggregate counters such as page views — no cookies, nothing that identifies you.
The engine in this repository is open source: point it at your own signalling server, or self-host the whole thing, and none of the above involves us.
Build together
- Peer-to-peer sessions with explicit approval for every join — share an ID, approve, done
- Everything replicates: objects, materials, node graphs, annotations, physics, music
- Spatial voice chat, text chat, live cursors, ping markers, per-object locks
- Late joiners get the full scene automatically
Model and edit
- Primitives, groups, snapping, measuring, multi-select, undo/redo for everything
- Import
.glb.gltf.obj.stl.fbx— animated rigs replicate as original bytes - Mesh editing: move vertices, extrude / inset / move faces, polygon selection
- Terrain sculpting with raise / lower / smooth / flatten brushes
Make it move
- A node editor (flow) driving events, effects, physics, sound and scripts
- Every object can carry its own graph, embeddable in the scene graph as a node
- Rapier physics: dynamic bodies, joints with motors, drag and throw, a simulation HUD
- Particles, deterministic scripted animation, shared background music
VR 🥽
- Full WebXR editing with hands or controllers — not a viewer mode
- Teleport and fly locomotion, two-handed world grab, snap turning
- Radial menus, grabbable follower panels, a laser keyboard, in-headset mesh editing
AI, if you want it 🤖
- A scene assistant that actually builds — create, move, style and wire objects from a prompt, undone in one step
- Text-to-3D through ComfyUI/TRELLIS or Meshy, imported straight into the scene
- Bring your own endpoint and key (Settings ▸ AI). Nothing leaves the browser until you configure one
Assets and files 📦
- Explorer: a local asset library with folders, thumbnails, 3D previews, drag-out placing
- Asset packs, installable from a
.zipor a URL .tpscene— one file holding objects, graphs, annotations, joints and their assets- Local autosave with crash recovery
Just use it: open theprototype.app. Nothing to install, no sign-up. To collaborate, send someone the peer ID in the top bar and approve their request.
Run it yourself: (needs node 24 — .nvmrc / .mise.toml pin the exact Node and npm; mise install or nvm use picks them up)
git clone https://github.com/theprototype-app/core.git
cd core
npm ci
npm run dev # https://localhost:5173WebXR and getUserMedia need HTTPS, so the dev server serves over TLS using
certs/localhost.crt and certs/localhost.key. Those are gitignored — generate a
self-signed pair once, from the config already in the repo:
npm run certs # writes certs/localhost.crt + .key via openssl (once per clone)Without them Vite falls back to plain http, which disables VR and voice chat. The pair is
self-signed, so the browser warns once per port. npm run certs -- --force replaces an
expired one.
By default the app uses a public signalling server; point it at your own under
Settings ▸ Connection, or set VITE_PEER_HOST / VITE_PEER_PORT / VITE_PEER_PATH
in .env (see .env.example).
npm run build # static site into build/ (adapter-static)
npm run check # svelte-check
npm run e2e # Playwright suites (npm run e2e -- <name> for one)Modules are self-contained bundles of play content — nodes, primitives, click handlers,
effects, VR menu entries — installed from a .zip or a URL. The core ships a dungeon
generator, a piano, pong, a drivable car, avatars and a set of clickable interactables.
MODULES.md— authoring guide and the SDK surfaceNODES.md— the node cataloguePACKS.md— asset pack formatOPEN-CORE.md— the seams the optional cloud tier plugs into- theprototype-app/modules — community modules
| Path | What lives there |
|---|---|
src/components/ |
Svelte UI — menus, editors, VR panels, scene overlays |
src/lib/ |
the engine: replication, physics, flow runtime, VR, assets, files |
src/stores/ |
app / scene / flow state |
src/modules/ |
core modules |
tests/e2e/ |
Playwright suites, including two-peer sessions |
Issues and pull requests are welcome. Before opening a PR: npm run build should pass and
npm run check should not add new errors. If you touch a feature, update or add its
Playwright suite in tests/e2e/.
theprototype.app is free and MIT-licensed. If it is useful to you, sponsoring it (the Sponsor button at the top of this repo) helps pay for the signalling and relay servers that keep public sessions connecting. Starring the repo and telling someone about it helps just as much.
MIT.
Bundled sample assets keep their own licences — see each pack's attribution entry in the
Explorer, and PACKS.md.
