> ## 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.

# serve

> Run the Axol web control panel — drive the robot from a browser instead of the terminal.

Runs the **Axol web control panel**: a small local server that lets you drive the robot from a browser instead of a terminal. It serves the built web UI and a JSON/WebSocket API that starts, streams, and stops the core operations — teleoperation, gravity compensation, data collection, dataset replay, and policy inference — in-process.

With the [one-command install](/installation), this command already runs as a root systemd service (`axol.service`) that starts at boot, restarts automatically, and offers an update in the control panel whenever a newer [release](https://github.com/almond-bot/axol/releases) exists — you don't run it by hand. Manual invocation is for development installs:

```bash theme={null}
axol serve                    # https://localhost:8001 (LAN-reachable)
axol serve --port 9000
axol serve --open             # also open a browser window on startup
axol serve --host 127.0.0.1   # localhost only
axol serve --no-tls           # plain HTTP instead of HTTPS
```

<Tip>
  For a guided walkthrough of the control panel — connecting the Axol host and Axol, assigning the cameras, and running each operation — see the [Web Control Panel guide](/guides/control-panel).
</Tip>

| Flag          | Description                                                                                      |
| ------------- | ------------------------------------------------------------------------------------------------ |
| `--host HOST` | Interface to bind. Default `0.0.0.0` (reachable on the LAN); use `127.0.0.1` for localhost only. |
| `--port INT`  | Port to listen on. Default `8001`.                                                               |
| `--open`      | Open a browser window on startup. Off by default.                                                |
| `--no-tls`    | Serve plain HTTP instead of HTTPS. TLS is on by default.                                         |

## TLS

TLS is **on by default** so a browser on an HTTPS origin (e.g. the hosted VR app at `axol.almond.bot`) can reach this machine without mixed-content blocking. On first run a self-signed certificate is generated in `~/.almond/vr/certs/` — the **same** certificate the VR teleop WSS server uses, so accepting it once covers both the control panel and VR teleop.

To connect from a browser on another machine, open the printed **LAN** URL once and accept the certificate warning. Pass `--no-tls` to disable TLS entirely (plain HTTP).

## Building the web UI

The server looks for the built web bundle at `web/app/dist` (a repo checkout only — one-command installs have no checkout). If it isn't there, `axol serve` still runs and the **API is available**; use the hosted UI at [axol.almond.bot](https://axol.almond.bot), which connects to the server directly. To serve the UI locally instead, build it once with:

```bash theme={null}
cd web
npm install
npm run build --workspace=packages/axol-vr-client
npm run build --workspace=app
```

See [Development install → Build the web UI](/advanced/development-install#build-the-web-ui) for details.

## What it serves

| Path           | Description                                                                                                                            |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `/control`     | The control panel UI (operations, connections, settings).                                                                              |
| `/diagnostics` | The [diagnostics dashboard](/guides/diagnostics-dashboard) — live motor telemetry, health tiles, and diagnostics scripts (same build). |
| `/vr`          | The [VR teleop interface](/guides/vr-interface) (same build).                                                                          |
| `/`            | Redirects by device — headset browsers to `/vr`, everything else to `/control`.                                                        |
| `/api/*`       | JSON + WebSocket API used by the UI.                                                                                                   |

<Note>
  The operations launched from the panel run **in-process** inside the `serve` process — the same Python entry points as the [`teleop`](/cli/teleop), [`gravity-comp`](/cli/gravity-comp), [`collect-data`](/cli/collect-data), [`replay-dataset`](/cli/replay-dataset), and [`run-policy`](/cli/run-policy) CLI commands. Anything those commands need on the host (CAN, the `lerobot`/`sim` extras, ZED access) is required here too.
</Note>
