Skill v1.0.0
currentTrusted Publisher100/100version: "1.0.0" name: xb-netblocks description: >- Add real-time multiplayer to an XR Blocks app with the netblocks addon — presence avatars (remote heads + hands), replicated NetObject transforms with cooperative ownership, typed pub/sub RPC events, and opt-in spatial WebRTC voice, over pluggable transports (BroadcastChannel for local dev, WebRTC/PeerJS for serverless P2P, WebSocket relay for scalable rooms). Use when building shared or co-located XR. Covers enableNet(), joinRoom(), NetObject, and session.events; the full reference (wire protocol, transports, threat model) is at src/addons/netblocks/.
xb-netblocks: multiplayer XR
A Transport moves bytes between peers; a NetSession layers presence, RPC, replicated objects, and voice on top. Swap transports without changing app code.
Full reference: `../../src/addons/netblocks/SKILL.md`
When to use
Cooperative, trusted rooms (demos, classrooms, co-presence). It is prototype-grade — no peer authentication, cooperative ownership, no rate limiting. For adversarial workloads, put a server-authoritative arbiter on top.
Quick start
import * as xb from 'xrblocks';import {enableNet,BroadcastChannelTransport,} from 'xrblocks/addons/netblocks/src/index.js';class MyApp extends xb.Script {async init() {const net = enableNet(); // ticks on the standard xb frame loopconst session = await net.joinRoom('my-room', {transport: new BroadcastChannelTransport(), // two tabs see each other instantlydisplayName: 'Alice',});session.events.on('chat', (text, fromPeerId) =>console.log(`${fromPeerId}: ${text}`));}}xb.add(new MyApp());xb.init();
Share an object
import {NetObject,WebRTCTransport,} from 'xrblocks/addons/netblocks/src/index.js';const shared = new NetObject({id: 'cube', object: this.cube});const net = enableNet();await net.joinRoom('demo', {transport: new WebRTCTransport(),displayName: 'Alice',});net.session?.netObjects.add(shared);// session.claim(obj) on grab, session.release(obj) on drop; owners broadcast, others interpolate.
Transports
BroadcastChannelTransport— local dev, two tabs, zero infra.WebRTCTransport— serverless P2P via PeerJS (≤ ~12 peers); passiceServers/signalingUrl.WebSocketTransport— a small relay (server/relay.js) for scalable rooms.
Enable voice with joinRoom({voice: true}) or session.voice.enable().