Skip to main content
The one-command install is the right path for running Axol on the robot machine. This page is for working on Axol itself — installing from a clone, picking optional dependency extras, and building the web UI locally. If you just want to use the robot, you don’t need any of this.

Install from a clone

Install the package from a checkout using uv. pyroki and lerobot are sourced from Git and resolved automatically:
Then activate the virtual environment so the axol CLI is on your path:
You need to activate the environment in every new shell session. Alternatively, prefix every command with uv run (e.g. uv run axol can.setup) to skip activation.

Optional extras

Install optional dependency groups as needed (the install script includes lerobot and sim):
Streaming the ZED camera feeds to the headset (teleop --cameras, collect-data) isn’t a dependency extra — it needs the system GStreamer + camera stack, installed via axol provision (see Headset-video stack below).

ZED Python bindings

The ZED Python bindings (pyzed) are not on PyPI and must be installed separately, after the ZED SDK is installed:
See zed.install for details.

Headset-video stack

Relaying the ZED cameras to the headset grabs and NVENC-encodes frames on the GPU via the zed-gstreamer pipeline (zedxonesrc / zedsrc) and sends them over WebRTC with aiortc (a normal Python dependency). The encode path needs the system GStreamer + GObject-introspection packages, PyGObject, and the patched ZED source elements — none of which are PyPI extras. axol provision installs all of them idempotently in one step (the same command the install script and the axol serve self-updater run):
This runs the Quest-over-USB adb setup, zed.install, gst.install, and gst.build-zed in order; each self-gates and no-ops if the ZED SDK or apt isn’t present. You can also run them individually. On a Jetson, pin the NVENC/VIC and CPU clocks for low-latency encode and a steady IK loop (the install script wires this into the systemd unit so it re-runs at every boot):
See jetson.setup. It’s a no-op on non-Jetson machines.

First-run hardware setup

Before using any motor or robot commands, initialize the CAN hardware once:
sudo is invoked automatically where required. See can.setup for what it configures, and can.enable for bringing the interfaces back up after a mid-session replug.

Build the web UI

axol serve looks for the built web bundle at web/app/dist. To serve the control panel and VR interface from your own machine, build it once:
Then start the server and open the printed URL:
axol serve works without this step (the API is still available) — the hosted UI at axol.almond.bot connects to it directly. See serve and the Web Control Panel guide.

Next steps

CLI Reference

Every axol command, flag, and the draccus config model.

Python API

Axol, the kinematics solver, VR teleop, and the LeRobot wrappers.