Server-authoritative runtime for virtual camera and motion workflows.
MotionStage provides a deterministic motion runtime where the server owns scene state, mapping, and recording behavior. It is designed for:
- virtual camera ingest from devices over QUIC
- real-time mapping and filter pipelines for scene attributes
- deterministic
.cmtrkcapture and export to USD/CHAN - integration across Rust crates and Python-based DCC adapters
Virtual production tooling is often expensive, fragmented, or built for large studios. MotionStage exists to make the same core workflow available to everyday artists, small teams, and indie creators.
The goal is practical access:
- capture and stream motion without studio-scale infrastructure
- keep data portable with open, deterministic recording and export paths
- let artists connect familiar DCC tools through clear SDK and adapter contracts
- make iterative VP workflows reproducible on normal development hardware
MotionStage focuses on the runtime layer so creators can spend less time wiring systems together and more time making shots.
cargo run -p motionstage-cli -- simulate --server-bind 127.0.0.1:0 --sample-hz 120Then in motionstage-sim>:
start
record start recordings/demo.cmtrk
status
record stop
quit
This gives you a local runtime, live motion samples, and a recording exportable by integrator crates.
simulate runs an embedded server and a simulated client that connects through the same QUIC
handshake/control/datagram path used by real devices.
--server-bind controls the embedded server bind address; it is not a remote server connect flag.
cargo run -p motionstage-cli -- simulate --connect 127.0.0.1:7788 --output-attribute demo.positionThis runs in client-only mode and does not start an embedded server. Ensure scene/mapping/mode are
already configured on the target server.
Source outputs are normalized to fully-qualified IDs:
<device-id>.<attr>[.<component>].
You can also discover a server over mDNS:
# auto-connect when exactly one server is discoverable
cargo run -p motionstage-cli -- simulate --connect discover
# select a specific server by advertised discovery name
cargo run -p motionstage-cli -- simulate --connect discover:motionstage-blendercargo run -p motionstage-cli -- serveThis starts QUIC control/datagram ingest, mDNS discovery, and scheduler loops.
- Device discovers and connects over QUIC.
- Control handshake negotiates versions/features and opens a session.
- Server applies mapping transforms and filters to incoming attributes.
- Runtime publishes snapshots for downstream systems.
- Recording mode persists
.cmtrk(CMTRK2) events. - Export crates produce deterministic USD or CHAN output.
- Design and Architecture
- Concepts and Workflow
- DCC Integrators
- Device Integrators
- iOS Integrators
- Protocol Overview
- Hardening Gates
- Completion Matrix
crates/motionstage-core: scene/mapping/mode model, transform/filter enginecrates/motionstage-server: authoritative lifecycle, sessions, scheduling, recordingcrates/motionstage-protocol: wire contracts, role/features, control negotiationcrates/motionstage-transport-quic: QUIC transport, control streams, motion datagramscrates/motionstage-discovery: mDNS advertisement/browser (_motionstage._udp.local)crates/motionstage-media: video descriptor model and signaling queuecrates/motionstage-webrtc: server-owned WebRTC helperscrates/motionstage-recording:.cmtrkread/write/index (CMTRK1+CMTRK2)crates/motionstage-export-usd: deterministic USD text exportercrates/motionstage-export-chan: deterministic CHAN exportercrates/motionstage-cli:serveandsimulateworkflowscrates/motionstage-testkit: integration harness and soak helperscrates/motionstage-sdk-swift: C ABI bridge for iOS/Swift client appspython/motionstage_sdk: strict OOP delegate SDK backed by the native Rust bridgepython/blender_adapter: reference Blender delegate adapter
cargo test --workspace
python -m pip install -e ./python
python -m pytest -q python/tests
./scripts/build-swift-ios.sh