Installation
Install the client
Section titled “Install the client”Curl installer (recommended)
Section titled “Curl installer (recommended)”curl -fsSL https://get.hle.world | shInstalls via pipx (preferred), uv, or pip-in-venv. To pin the current release:
curl -fsSL https://get.hle.world | sh -s -- --version 2611.3To also enroll the machine as an agent and run it as a service that starts at boot:
curl -fsSL https://get.hle.world | sh -s -- --agentpipx install hle-clientHomebrew
Section titled “Homebrew”brew install hle-world/tap/hle-clientUpdate the client
Section titled “Update the client”Re-running the installer upgrades in place:
curl -fsSL https://get.hle.world | shIt detects the existing install and hands off to hle update, so this is the
same upgrade as running the command explicitly:
hle updatehle update works out where the client lives — pipx, uv, a venv, Homebrew,
plain pip — and runs the right upgrade. Either way it rebuilds any services
installed on the machine against the new client and restarts them, because a
service started before the upgrade is still running the old code while
hle version reports the new one.
To look before you leap, or to pin a version:
hle update --checkhle update --version 2611.3To force the old from-scratch build — the installer deletes the environment and
recreates it — pass --reinstall:
curl -fsSL https://get.hle.world | sh -s -- --reinstallYou rarely want this; prefer the upgrade. The installer falls back to the from-scratch rebuild on its own if the in-place upgrade fails.
If a client was upgraded some other way — a package manager, a restored backup — the services on the machine can be left describing the old one. Rebuild them without touching the client:
hle daemon refresh --allRun it as a service
Section titled “Run it as a service”To keep a tunnel (or the agent) running across reboots, install a systemd unit or launchd job:
# The dashboard-managed agent — all endpoints in one servicehle daemon install agent
# Or a single fixed tunnelhle daemon install tunnel ha http://localhost:8123Scope is auto-detected: as root you get a system service that starts at boot, as
a normal user you get a per-user one. Force it with --system or --user.
Credentials are read at runtime from ~/.config/hle/ and never written into the
service file.
Manage it with hle daemon status, hle daemon list, and
hle daemon uninstall. See the agent guide for logs and
troubleshooting.
Get an API key
Section titled “Get an API key”- Sign up at hle.world/register
- Go to Dashboard > Keys
- Click “New API Key” and copy the key
Expose a service
Section titled “Expose a service”hle tunnel create http://localhost:8123 --api-key hle_your_keyYour service is now accessible at https://<label>-<code>.hle.world
Save your API key
Section titled “Save your API key”To avoid passing --api-key every time, set the environment variable:
export HLE_API_KEY=hle_your_keyOr save it permanently in your shell profile (~/.bashrc, ~/.zshrc, etc.).
The client also stores your key in ~/.config/hle/config.toml after the first successful connection.
Docker
Section titled “Docker”Run the HLE client as a Docker container:
docker run -d --name hle-tunnel \ -e HLE_API_KEY=hle_your_key \ ghcr.io/hle-world/hle-client:latest \ tunnel create ha http://host.docker.internal:8123Kubernetes sidecar
Section titled “Kubernetes sidecar”Run the HLE client as a sidecar container alongside your app:
containers: - name: my-app image: my-app:latest ports: - containerPort: 8080 - name: hle-tunnel image: ghcr.io/hle-world/hle-client:latest env: - name: HLE_API_KEY valueFrom: secretKeyRef: name: hle-credentials key: api-key command: ["hle", "expose", "--service", "http://localhost:8080", "--label", "myapp"]Licensing
Section titled “Licensing”The HLE client is MIT-licensed open source. You can inspect the code, build from source, and verify that nothing shady happens with your traffic. The relay server at hle.world is a managed service.