Skip to content
Development
Skill

/hz-xr-simulator-control

Routes Meta VR and Horizon OS simulator work to the right `metavr` command group, and drives a running Meta XR Simulator via `metavr xrsim` — runtime, device, input, compositor layers and MP4 recording. Use when a goal concerns a simulated headset rather than a physical one,

From plugin
meta-vr
24936 skills1 MCP

Claude Code

$ npx -y skills add meta-quest/agentic-tools --skill hz-xr-simulator-control --agent claude-code

SKILL.md

hz-xr-simulator-control.SKILL.md
name: hz-xr-simulator-control
license: Apache-2.0
description: Routes Meta VR and Horizon OS simulator work to the right `metavr` command group, and drives a running Meta XR Simulator via `metavr xrsim` — runtime, device, input, compositor layers and MP4 recording. Use when a goal concerns a simulated headset rather than a physical one, when choosing between `xrsim`, `ssim`, `capture` and `tapedeck`, or when a `metavr xrsim` command returns a connection error. For installing the simulator or configuring it into a Unity, Unreal or native OpenXR project, use hz-xr-simulator-install-and-configure instead.
allowed-tools: Bash(metavr:*), Bash(hzdb:*)

XR Simulator Control

`metavr` is overwhelmingly a **physical Quest or Glasses** CLI: `device`, `app`, `capture`, `input`, `log`, `files` and `ui` all talk to a headset over ADB. `xrsim` is one group among them and drives a **simulated** headset instead. Choosing the wrong group is the most common failure here, and it is quiet: `metavr device list` prints `No devices connected` and exits 0, so the wrong answer looks healthier than the right one.

This skill drives a simulator that already exists. Installing one, or wiring it into a project, belongs to `hz-xr-simulator-install-and-configure`.

Which Command Group

| The goal concerns | Use | Not | |---|---|---| | The simulated headset model, IPD, refresh rate | `metavr xrsim device …` | `metavr device …` (physical, ADB) | | The simulator frontend process | `metavr xrsim app …` | `metavr app …` (APKs on a headset) | | Simulated hands and controllers | `metavr xrsim input …` | `metavr input …` (keyevents to hardware) | | The simulator's synthetic room | `metavr xrsim env …` | — | | Compositor layers, simulated frame rate | `metavr xrsim layer` / `xrsim runtime fps` | — | | The simulator's own logs | `metavr xrsim runtime logs` | `metavr log` / `metavr adb logcat` (device logcat) | | What the simulated headset renders | `metavr xrsim record` | `metavr capture` (physical device screen) | | Recording and replaying an app's OpenXR calls on a real headset | `metavr tapedeck` | `metavr xrsim record` (compositor pixels, not a call stream) | | The SpatialSim emulator | `metavr ssim` | `metavr xrsim` (a **different** simulator) |

Read the `Use` column as the right tool for that goal and `Not` as the one you might reach for by mistake. The last two rows are in this table because they are the mistakes, not because they are this skill's job.

Three are worth stating outright, because a plausible command exists on both sides:

  • **"Record an OpenXR session"** is the most confusable intent in the CLI. `xrsim record` captures

the simulator's compositor output to MP4; `tapedeck` captures and replays an app's OpenXR call stream on a physical device. They are not substitutes.

  • **"The simulator"** is ambiguous inside this binary. `ssim` is the SpatialSim emulator, `xrsim`

is the Meta XR Simulator.

  • **`device`, `app` and `input` exist both at the top level and under `xrsim`**, so the same verb

means different things depending on the group. `capture` does not: there is no `xrsim capture`, and the simulator equivalent is `xrsim record`.

The Three Connection Tiers

Once you are inside `xrsim`, what a command needs decides which error you get.

| Tier | Commands | Needs | |---|---|---| | Local | `readme`, `runtime logs`, and on Linux bare `record --output … --duration …` | nothing running | | Lifecycle | `app launch`/`quit`/`ensure-running` | nothing running — these *manage* the frontend | | Frontend | `runtime activate`/`deactivate`/`list`, `env set`/`list` | the frontend app | | Runtime | `runtime ping`/`status`/`info`/`fps`, `device *`, `input *`, `layer *`, `record start`/`stop`/`status` | the frontend **and** a connected XR app |

`device list` and `device refresh-rates` read like static catalogs but come from the live runtime. `input sources` prints a fixed list yet still needs a connection, because the `input` group opens one before it dispatches.

Two that a reasonable guess gets wrong in the other direction:

  • **The `app` group is how you fix a down frontend, not something blocked by one.** `app launch`

and `app ensure-running` start it if it is absent. `app quit` asks the frontend on `--port` to close; `--force` terminates that same process instead, and `--all` is the explicit escape hatch for stopping every MetaXRSimulator on the host. Treating lifecycle commands as frontend-tier rules out the recovery.

  • **Bare `record` is local on Linux.** Without `--runtime-addr` it never connects — it captures the

framebuffer through `ffmpeg`, so it needs `ffmpeg` on `PATH` but neither tier. The `record start` / `stop` / `status` subcommands are runtime-tier and additionally refuse to run on Linux without `--runtime-addr`.

Each error names exactly one hop, so do not retry blindly.

| Message | What broke | Fix | |---|---|---| | `XR Simulator is not running…` | nothing listening on the frontend port | start the app, or pass `--port` | | `XR Simulator is running but no app is connected…` | frontend up, no OpenXR app attached | launch the app under test | | `Runtime at <addr> is no longer responding…` | the attached app died | restart it; the stale endpoint clears itself | | `Meta XR Simulator is not installed in a registered system or MQDH location` | the frontend binary was never found | an install problem — see `hz-xr-simulator-install-and-configure` | | `native recording subcommands require --runtime-addr on Linux` | `record start`/`stop`/`status` on Linux | pass `--runtime-addr`, or use bare `record --output … --duration …` | | `ffmpeg is required to record XR Simulator MP4s` | the Linux `record` path has no `ffmpeg` | install `ffmpeg` |

**Check liveness with a frontend-tier command before asking runtime-tier questions.** A refused connection returns `XR Simulator is not running` immediately, and `--timeout` is the total connection budget rather than a fresh budget for every

Read more
@meta-quest
Ships withmeta-vr

Agentic skills and tools for Meta VR and Horizon OS development.

24936 skills1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
249
Star history of meta-quest/agentic-tools on GitHub, a chart by star-history.com

Other skills on meta-vr.

hz-android-2d-porting

hz-android-2d-porting

Guides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements. Use…

@meta-quest@meta-questInstall Skill
hz-api-upgrade

hz-api-upgrade

Upgrades Meta VR apps to newer Horizon OS SDK versions — migration guides, deprecated API replacements, changelog. Use when…

@meta-quest@meta-questInstall Skill
hz-immersive-designer

hz-immersive-designer

Guides design of comfortable, intuitive VR/MR experiences for Meta VR and Horizon OS — comfort guidelines, interaction patterns,…

@meta-quest@meta-questInstall Skill
hz-iwsdk-webxr

hz-iwsdk-webxr

Builds WebXR experiences for Meta VR and Horizon OS using the Immersive Web SDK (IWSDK) — ECS architecture, Three.js integration,…

@meta-quest@meta-questInstall Skill
hz-metavrx-layout-sdk

hz-metavrx-layout-sdk

Build multi-window Meta Horizon OS experiences with the MetaVrx Layout SDK in Jetpack Compose or React Native. Covers framework…

@meta-quest@meta-questInstall Skill
hz-metavrx-ui-set

hz-metavrx-ui-set

Builds app UI for Meta VR and Horizon OS with the MetaVrx UI Set, a Jetpack Compose component library and design system. Covers…

@meta-quest@meta-questInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about hz-xr-simulator-control.

Which coding agents can use hz-xr-simulator-control?
hz-xr-simulator-control installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.