Skip to content
Login

Installation

Terminal window
curl -fsSL https://get.hle.world | sh

Installs via pipx (preferred), uv, or pip-in-venv. To pin the current release:

Terminal window
curl -fsSL https://get.hle.world | sh -s -- --version 2611.3

To also enroll the machine as an agent and run it as a service that starts at boot:

Terminal window
curl -fsSL https://get.hle.world | sh -s -- --agent
Terminal window
pipx install hle-client
Terminal window
brew install hle-world/tap/hle-client

Re-running the installer upgrades in place:

Terminal window
curl -fsSL https://get.hle.world | sh

It detects the existing install and hands off to hle update, so this is the same upgrade as running the command explicitly:

Terminal window
hle update

hle 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:

Terminal window
hle update --check
hle update --version 2611.3

To force the old from-scratch build — the installer deletes the environment and recreates it — pass --reinstall:

Terminal window
curl -fsSL https://get.hle.world | sh -s -- --reinstall

You 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:

Terminal window
hle daemon refresh --all

To keep a tunnel (or the agent) running across reboots, install a systemd unit or launchd job:

Terminal window
# The dashboard-managed agent — all endpoints in one service
hle daemon install agent
# Or a single fixed tunnel
hle daemon install tunnel ha http://localhost:8123

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

  1. Sign up at hle.world/register
  2. Go to Dashboard > Keys
  3. Click “New API Key” and copy the key
Terminal window
hle tunnel create http://localhost:8123 --api-key hle_your_key

Your service is now accessible at https://<label>-<code>.hle.world

To avoid passing --api-key every time, set the environment variable:

Terminal window
export HLE_API_KEY=hle_your_key

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

Run the HLE client as a Docker container:

Terminal window
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:8123

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"]

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.