> ## Documentation Index
> Fetch the complete documentation index at: https://docs.almond.bot/llms.txt
> Use this file to discover all available pages before exploring further.

# Quest over USB

> Stream Quest controller poses to the robot over a USB cable instead of Wi-Fi for a low-latency teleop link.

By default the Quest streams controller pose to the robot over Wi-Fi. On some networks the headset's Wi-Fi power-save buffering holds pose packets and releases them in bursts, adding **\~150 ms gaps** between updates that show up as stair-stepped, laggy arm motion. **Quest over USB** moves the active pose link onto a USB cable via an [`adb reverse`](https://developer.android.com/tools/adb) tunnel, so the link is wired and deterministic — while keeping Wi-Fi as an automatic standby if the cable drops.

<Note>
  USB carries **controller poses only**. Camera video still streams over the LAN — WebRTC can't cross the `adb` TCP forward — so you connect to the robot's address as usual and the cameras keep working over Wi-Fi/Ethernet. USB just takes over the pose link.
</Note>

When USB is selected, the headset sends every pose frame over **both** the cable and Wi-Fi. The robot prefers the wired stream and uses the Wi-Fi frames only while the cable goes quiet, so a mid-session USB drop (or a yanked cable) **fails over to Wi-Fi instantly** with no reconnect, and the cable reclaims the link the moment it comes back. You get the wired link's low latency whenever it's up, without teleop stalling when it isn't.

## One-time setup

<Steps>
  <Step title="Enable Developer Mode on the Quest">
    1. Open the **Meta Quest** mobile app on your phone, with your headset connected.
    2. Go to **Menu → Devices →** select your headset **→ Headset Settings → Developer Mode**, and toggle it on (you may be prompted to create a free Meta "organization" first).
    3. Restart the headset.

    This is the same Developer Mode used for [remote teleop](/guides/remote-teleop#sideload-tailscale-on-the-quest).
  </Step>

  <Step title="Confirm adb is installed on the robot machine">
    Nothing to do on the **Perception Kit ZED Box** or any [one-command install](/installation) — [`axol provision`](/cli/provision) sets up `adb` and the Quest udev rule for you. On a development install, run `axol provision` once.
  </Step>
</Steps>

## Connect and drive

<Steps>
  <Step title="Plug the headset into the robot machine">
    Use a data-capable USB-C cable from the headset to the machine running [`axol serve`](/cli/serve) (the one wired to the robot).
  </Step>

  <Step title="Authorize and connect from the control panel">
    In the [control panel](/guides/control-panel#quest-usb), the **Quest USB** settings tab shows the headset state. The first time, accept the **Allow USB debugging?** prompt in the headset (check **Always allow from this computer**). Once authorized, the tunnel comes up **automatically** and the status turns green (*Controller over USB*); the tab's **Connect** button is a manual fallback / reconnect.
  </Step>

  <Step title="Enable USB in the VR app">
    Open the VR app at [axol.almond.bot](https://axol.almond.bot), enter the robot's address as usual, and tick **Quest over USB** before connecting.
  </Step>

  <Step title="Authorize the USB certificate">
    The USB link uses `wss://localhost:8000`, whose self-signed certificate is a **separate origin** from the host cert you already approved. Until it's approved the app runs on Wi-Fi and shows *WiFi fallback — USB link down* with an **Authorize USB certificate** button — tap it and proceed past the warning (equivalently, open `https://localhost:8000` in the headset browser and proceed). The status then flips to *controller over cable*.
  </Step>

  <Step title="Enter VR">
    Press **Enter VR** and teleoperate as usual. You don't have to wait for the USB link — Wi-Fi drives the arm until the cable comes up, then the robot switches to the wired stream automatically.
  </Step>
</Steps>

<Warning>
  If the **Quest USB** settings tab shows `unauthorized`, re-accept the prompt in the headset. If it shows no device, replug the cable and confirm Developer Mode is on. A flaky cable is the most common cause of a link that won't come up.
</Warning>

## Next steps

<CardGroup cols={2}>
  <Card title="Web Control Panel" icon="sliders" href="/guides/control-panel">
    Where the Quest USB settings tab lives and how connections work.
  </Card>

  <Card title="VR Interface" icon="vr-cardboard" href="/guides/vr-interface">
    The WebXR app, camera views, and connection details.
  </Card>
</CardGroup>
