axol serve and runs each operation in-process inside that server, so it’s a drop-in alternative to the per-command CLI workflow.

Start the server
With the quick install, the server is already running on the main host (the upper computer wired to the robot) as a root systemd service that starts at boot and restarts automatically — open axol.almond.bot and connect to the host. On a development install, start it yourself:/control.
For a development install, the local UI must be built once (
cd web && npm install, then npm run build for the axol-vr-client and app workspaces) — or skip the build and use the hosted UI at axol.almond.bot, which connects to your axol serve directly. See Installation.Connections
The top of the panel is a row of three connection tiles — Axol Host, Axol, and ZED Box — each with a colored status dot. Connect them left to right.
Axol Host
The Axol Host is the machine runningaxol serve. Press Connect on the tile to open the host dialog and enter its address (just the IP — port 8001 is assumed). When connected, the tile shows the host’s name and a green dot; press the power button to disconnect. Teleop and gravity comp need only this connection.
Axol
Press Connect to bring up the robot. Under the hood this:- Enables the CAN interfaces, running
can.setupautomatically the first time if the host hasn’t been configured yet. - Pings all 16 motors once per second while idle, so the tile reflects live motor health (a green/red dot per joint, grouped L / R).
ZED Box
Data collection and policy inference also need the ZED Box (the Jetson streaming the cameras), which runs its ownaxol serve. Press Connect to open the dialog.

8001 assumed) and, optionally, the serial numbers of the overhead / left-arm / right-arm cameras. If the overhead is a stereo ZED X, tick the Stereo checkbox next to it — both eyes are then streamed (and recorded as overhead_left / overhead_right during data collection). A resolution dropdown sets the capture resolution for all cameras (SVGA / HD1080 / HD1200); the streaming bitrate is picked automatically from it. Connecting then:
- Checks the box is reachable.
- Starts PTP clock sync between the two machines (the Axol host as master, the box as slave) so camera frames and joint samples share a clock. The network interfaces are auto-derived from the box IP — you don’t pick them.
- Once the clocks lock, starts streaming the cameras whose serials you entered.
PTP daemons need root. Both machines’
axol serve run as root under the quick install’s systemd service, so this is automatic; on a development install run the server as root or configure passwordless sudo.Operations
Pick an operation from the selector. Each has its own settings form; required fields are shown directly and everything else lives under an Optional dropdown. Hover the ⓘ next to a field for its description, pulled from the CLI’s own help.
| Operation | Needs | Notes |
|---|---|---|
| Teleoperation | Axol (or sim) | Drive the arms from the VR headset. Toggle sim to use the browser visualizer with no hardware. If the ZED box is connected and streaming, the camera feeds are relayed to the headset automatically — see Camera views. |
| Gravity Compensation | Axol | Hold the arms weightless for hand-guiding. |
| Collect Data | Axol + ZED box | Record VR teleop episodes to a LeRobot dataset with the cameras. |
| Run Policy | Axol + ZED box | Run a trained policy via LeRobot async inference. |
Before you can start
The Start button stays disabled until everything an operation needs is ready, and a “Before you can start” list spells out what’s missing — e.g. Connect Axol, Connect the ZED box, Wait for clocks to lock, Wait for cameras to stream, or Set <required field>. The ZED-dependent operations are gated on both the clocks locking and the cameras actually streaming.Settings persistence & import/export
Each operation’s settings are saved to your browser automatically, so they reappear on reload. Use Export to download a settings JSON and Import to load one — handy for sharing a known-good configuration across machines. (Camera serials and the ZED box address live with the ZED connection, not in an operation’s export.)Running, logs, and stopping
Starting an operation streams its logs into the console at the bottom of the page and shows a status badge. Press Stop to end it; the robot link returns to idle 1 Hz polling and the ZED links stay up for the next run.Run Policy episode controls
While Run Policy is live, an Episode control box appears in the operation card with three buttons:| Button | Effect |
|---|---|
| Start episode | Begin the next rollout (advances the between-episode “reset the scene” gate). |
| Save | Save the current episode and return to the reset gate — press Start episode for the next one. |
| Discard | Drop the current episode and return to the reset gate to redo it. |
s / r keystrokes the run-policy CLI reads from stdin. To end the run entirely, use Stop in the card header.
Collect Data has no on-screen episode buttons — recording is driven from the VR controller (press A to record/save, X to discard, B to switch modes). See the Data Collection quickstart for the controller layout.
Next steps
serve reference
Flags, TLS, and what the server exposes.
VR interface
The in-repo WebXR app that drives teleop and recording.
