Skip to main content
The web control panel is a browser UI for driving Axol without the terminal. It wraps the four core operations — teleoperation, gravity compensation, data collection, and policy inference — behind connect/run buttons, with live status for the robot motors, the PTP clock sync, and the camera streams. It’s served by axol serve and runs each operation in-process inside that server, so it’s a drop-in alternative to the per-command CLI workflow. Axol web control panel

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:
axol serve
This prints a local and a LAN URL (HTTPS by default):
Axol control panel:
  Local : https://localhost:8001
  LAN   : https://192.168.1.50:8001
Open the Local URL on the host, or the LAN URL from another machine on the same network (accept the self-signed certificate once). The control panel lives at /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.
The nav bar’s Quickstart button has copyable commands for installing the CLI and launching the server.

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. Connection tiles: Axol Host, Axol, ZED Box

Axol Host

The Axol Host is the machine running axol 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.setup automatically 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).
The server runs as root under the quick install’s systemd service, so CAN bring-up needs no password. While a task is running the 1 Hz polling pauses and the robot is handed to the task.

ZED Box

Data collection and policy inference also need the ZED Box (the Jetson streaming the cameras), which runs its own axol serve. Press Connect to open the dialog. ZED Box dialog Enter the box’s IP (port 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:
  1. Checks the box is reachable.
  2. 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.
  3. Once the clocks lock, starts streaming the cameras whose serials you entered.
The tile header shows two status lights — CLOCK and STREAM — that are green when healthy, amber while starting, and red on error (hover for the reason). The camera serials and box IP persist in your browser, so they’re pre-filled next time.
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.
When connected, the ZED tile shows Restart (re-run clock sync + streaming) and Disconnect buttons. If clock sync or streaming fails, an inline panel appears below the connections with the error and the full log streamed from the box, so you can see exactly which camera serial wasn’t found or why the clocks didn’t lock.
Closing the browser tab does not stop anything — the robot link, clock sync, and camera streams live in the serve process and keep running. Use Disconnect (or stop axol serve) to tear them down.

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 settings and start blockers
OperationNeedsNotes
TeleoperationAxol (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 CompensationAxolHold the arms weightless for hand-guiding.
Collect DataAxol + ZED boxRecord VR teleop episodes to a LeRobot dataset with the cameras.
Run PolicyAxol + ZED boxRun 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:
ButtonEffect
Start episodeBegin the next rollout (advances the between-episode “reset the scene” gate).
SaveSave the current episode and return to the reset gate — press Start episode for the next one.
DiscardDrop the current episode and return to the reset gate to redo it.
These mirror the 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.