Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Build 3D scenes and interactive experiences using MML (Metaverse Markup Language) for the Otherside metaverse and other MML-compatible environments. Use when...
Build 3D scenes and interactive experiences using MML (Metaverse Markup Language) for the Otherside metaverse and other MML-compatible environments. Use when...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Full compiled reference: /home/ubuntu/.openclaw/workspace/research/mml-reference.md Source: mml.io + DashBODK Studio (dashbodk.vercel.app/docs). All elements, attrs, events, collision patterns. MML is an HTML-like markup language for building 3D scenes. Documents are served via WebSocket and rendered by clients (Web/Three.js or Unreal Engine). MML supports scripting via inline <script> tags (standard DOM APIs).
Units: Positions in meters, rotations in degrees, font sizes in centimeters Coordinate system: x (right), y (up), z (forward) Common attributes: All visible elements share x y z rx ry rz sx sy sz visible id class Collision system: Set collision-interval (ms) on an element to receive collisionstart, collisionmove, collisionend events Document time: Animations and media use document lifecycle time (ms since document start) Scripting: Standard DOM manipulation via <script> tags. Use document.getElementById(), addEventListener(), setAttribute(), etc.
ElementPurposeKey Attrsm-groupContainer, transforms children as unit(transform only)m-cube3D boxwidth height depth color opacitym-sphere3D sphereradius color opacitym-cylinder3D cylinderradius height color opacitym-planeFlat surfacewidth height color opacitym-modelLoad 3D model (GLTF/OBJ/FBX)src anim-src anim-loop anim-enabled start-time pause-timem-character3D character (composable with m-model children)src anim-src anim-loop anim-enabled start-time pause-timem-lightPoint or spotlighttype intensity distance angle enabled cast-shadows colorm-imageDisplay image in 3Dsrc width height emissive opacitym-videoDisplay video in 3D (supports WHEP streaming)src width height emissive loop enabled volume start-time pause-timem-audioSpatial audiosrc loop loop-duration enabled volume cone-angle cone-falloff-angle start-time pause-timem-labelText on a planecontent width height font-size font-color padding alignment color emissivem-frameEmbed another MML documentsrc min-x max-x min-y max-y min-z max-z load-range unload-rangem-linkClickable link (no visual)href targetm-promptUser text input on clickmessage placeholder prefill onpromptm-interactionAction at a point in spacerange in-focus line-of-sight priority prompt oninteractm-position-probeTrack user positionsrange interval onpositionenter onpositionmove onpositionleavem-chat-probeReceive chat messagesrange onchatm-attr-animKeyframe animation (doc-time synced)attr start end start-time pause-time duration loop easing ping-pong ping-pong-delaym-attr-lerpSmooth attribute transitionsattr duration easing
<m-group x="0" y="1" z="-5"> <m-cube color="red" width="2" height="0.5" depth="2"></m-cube> <m-sphere color="blue" radius="0.3" y="1"></m-sphere> </m-group>
<m-cube color="green" y="2"> <m-attr-anim attr="ry" start="0" end="360" duration="3000" loop="true"></m-attr-anim> </m-cube>
<m-cube id="box" color="red" y="1"> <m-attr-lerp attr="x,y,z" duration="500" easing="easeInOutQuad"></m-attr-lerp> </m-cube>
<m-cube id="btn" color="blue" onclick=" this.setAttribute('color', this.getAttribute('color') === 'blue' ? 'red' : 'blue'); "></m-cube>
<m-cube id="platform" width="5" height="0.2" depth="5" color="green" collision-interval="100"> </m-cube> <script> const platform = document.getElementById("platform"); platform.addEventListener("collisionstart", (e) => { platform.setAttribute("color", "yellow"); }); platform.addEventListener("collisionend", (e) => { platform.setAttribute("color", "green"); }); </script>
<m-position-probe id="probe" range="20" interval="500"></m-position-probe> <m-label id="info" content="Waiting..." y="3" width="3" height="1"></m-label> <script> const probe = document.getElementById("probe"); const info = document.getElementById("info"); probe.addEventListener("positionenter", (e) => { info.setAttribute("content", `User ${e.detail.connectionId} entered`); }); </script>
<m-model src="https://example.com/character.glb" anim-src="https://example.com/dance.glb" anim-loop="true" y="0" sx="1" sy="1" sz="1"> </m-model>
<m-frame src="https://example.com/other-scene.html" x="10" y="0" z="0" min-x="-5" max-x="5" min-y="0" max-y="10" min-z="-5" max-z="5"> </m-frame>
<m-audio src="https://example.com/music.mp3" loop="true" volume="0.5" x="0" y="2" z="0"> </m-audio>
<m-chat-probe id="chat" range="10"></m-chat-probe> <m-label id="msg" content="" y="3" width="4" height="1"></m-label> <script> document.getElementById("chat").addEventListener("chat", (e) => { document.getElementById("msg").setAttribute("content", e.detail.message); }); </script>
Available for m-attr-anim and m-attr-lerp: easeInQuad, easeOutQuad, easeInOutQuad, easeInCubic, easeOutCubic, easeInOutCubic, easeInQuart, easeOutQuart, easeInOutQuart, easeInQuint, easeOutQuint, easeInOutQuint, easeInSine, easeOutSine, easeInOutSine, easeInExpo, easeOutExpo, easeInOutExpo, easeInCirc, easeOutCirc, easeInOutCirc, easeInElastic, easeOutElastic, easeInOutElastic, easeInBack, easeOutBack, easeInOutBack, easeInBounce, easeOutBounce, easeInOutBounce Omit easing for linear interpolation.
EventSourceKey PropertiesclickAny clickable elementdetail.connectionId, detail.positioncollisionstartElements with collision-intervaldetail.connectionId, detail.positioncollisionmoveElements with collision-intervaldetail.connectionId, detail.positioncollisionendElements with collision-intervaldetail.connectionIdpositionenterm-position-probedetail.connectionId, detail.position, detail.rotationpositionmovem-position-probedetail.connectionId, detail.position, detail.rotationpositionleavem-position-probedetail.connectionIdchatm-chat-probedetail.message, detail.connectionIdinteractm-interactiondetail.connectionIdpromptm-promptdetail.value, detail.connectionIdconnected / disconnectedDocument-leveldetail.connectionId
Most elements work on both Web and Unreal. Notable exceptions: m-link: Web only m-attr-lerp: Web only m-frame bounds/load-range: Web only socket attribute: Web only
For detailed attribute lists per element, see references/elements.md.
Agent frameworks, memory systems, reasoning layers, and model-native orchestration.
Largest current source with strong distribution and engagement signals.