Skip to main content

HLE Client

PyPI Python License CI

HomeLab Everywhere — Expose homelab services to the internet with built-in SSO authentication, WebSocket support, and webhook forwarding.

One command: hle expose --service http://localhost:8080

Your local service gets a public URL like myapp-x7k.hle.world with automatic HTTPS and SSO protection.

Install

Curl installer (recommended)

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

Installs via pipx (preferred), uv, or pip-in-venv. Supports --version:

curl -fsSL https://get.hle.world | sh -s -- --version 2607.7

pipx

pipx install hle-client

Homebrew

brew install hle-world/tap/hle-client

Quick Start

  1. Sign up at hle.world and create an API key in the dashboard.

  2. Save your API key:

hle auth login

This opens the dashboard in your browser. Copy your key and paste it at the prompt. The key is saved to ~/.config/hle/config.toml.

  1. Expose a service:
hle expose --service http://localhost:8080

# Or forward webhooks from GitHub/Stripe:
hle webhook --path /hook/github --forward-to http://localhost:3000 --label github-hook

CLI Usage

hle expose

Expose a local service to the internet.

hle expose --service http://localhost:8080              # Basic usage
hle expose --service http://localhost:8080 --label ha   # Custom subdomain label
hle expose --service http://localhost:3000 --auth none  # Disable SSO
hle expose --service http://localhost:8080 --no-websocket  # Disable WS proxying
hle expose --service http://localhost:8080 --allow user@gmail.com  # Allow a specific user
hle expose --service http://localhost:8080 --allow google:user@gmail.com --allow github:dev@co.com

Options:

  • --service — Local service URL (required)
  • --label — Service label for the subdomain (e.g. ha → ha-x7k.hle.world)
  • --auth — Auth mode: sso (default) or none
  • --allow — Allow an email to access the tunnel (repeatable). Format: email or provider:email
  • --websocket/--no-websocket — Enable/disable WebSocket proxying (default: enabled)
  • --verify-ssl — Enable SSL certificate verification for the local service (default: off, accepts self-signed)
  • --upstream-basic-auth USER:PASS — Inject Basic Auth into requests forwarded to the local service
  • --forward-host — Forward the browser's Host header to the local service
  • --api-key — API key (also reads HLE_API_KEY env var, then config file)

hle update

Update the client to the latest version, regardless of how it was installed (pipx, uv tool, the installer's venv, or pip). It detects the install method and runs the right upgrade.

hle update            # upgrade to the latest release
hle update --check    # just report current vs. latest, don't change anything
hle update --version 2607.7   # pin an exact version

After updating, restart any running tunnels (e.g. systemctl restart hle-<label>) so they pick up the new version.

hle service

Install and manage a background service for a tunnel, so it survives reboots and restarts on failure. Uses systemd on Linux and launchd on macOS (Windows is unsupported — use Task Scheduler or NSSM). The API key is read at runtime from ~/.config/hle/config.toml (or HLE_API_KEY) and is never written into the service file.

# Install + start a system service
#   Linux → /etc/systemd/system/hle-tv.service
#   macOS → /Library/LaunchDaemons/world.hle.tv.plist
sudo hle service install --service http://localhost:9998 --label tv

# Custom zone / extra expose options are supported
sudo hle service install --service https://192.168.2.200:8006 --label prox --zone pr.t00t.us

# Per-user service (no sudo)
#   Linux → ~/.config/systemd/user/hle-tv.service
#   macOS → ~/Library/LaunchAgents/world.hle.tv.plist
hle service install --user --service http://localhost:9998 --label tv

hle service status --label tv       # service status
hle service list                    # list all hle services
hle service uninstall --label tv    # stop, disable, remove the service

hle webhook

Forward incoming webhooks to a local service.

hle webhook --path /hook/github --forward-to http://localhost:3000 --label github-hook
hle webhook --path /hook/stripe --forward-to http://localhost:4000/stripe --label stripe-hook

Options:

  • --path — Webhook path prefix, e.g. /webhook/github (required). Cannot be /
  • --forward-to — Local URL to forward webhooks to (required)
  • --label — Webhook label, e.g. github-hook (required)
  • --api-key — API key (also reads HLE_API_KEY env var, then config file)

Webhook tunnels bypass SSO so external services (GitHub, Stripe, etc.) can deliver payloads without authentication.

Server notices

While a tunnel is connected, the relay can push informational messages that the client renders to stderr (e.g. ✓ Auto-protect added you@example.com via Google SSO). Wording is server-controlled so new notices do not require a client release.

hle auth

Manage your API key.

hle auth login                              # Save key (opens dashboard)
hle auth login --api-key hle_xxx            # Save key non-interactively
hle auth status                             # Show current key source
hle auth logout                             # Remove saved key

hle config

All tunnel and client configuration lives under hle config. Tunnel subcommands accept a label (resolved to <label>-<user_code>) or a full subdomain.

hle config show / list

hle config list                       # List your active tunnels
hle config show ha                    # Full status for one tunnel (auth, rules, PIN, …)

hle config auth-mode

hle config auth-mode ha --set sso     # SSO gate on
hle config auth-mode ha --set none    # Tunnel becomes public

hle config access — SSO email allow-list

hle config access list ha                                # List rules
hle config access add ha friend@example.com              # Allow an email
hle config access add ha dev@co.com --provider github    # Require GitHub SSO
hle config access remove ha 42                           # Remove rule by ID
hle config access replace ha google:alice@x.com github:bob@y.com   # Declarative — adds + prunes
hle config access replace ha --clear                     # Remove all rules

replace is declarative: rules on the server but not in the args are removed. hle expose --allow remains additive (never prunes) for ad-hoc sessions.

hle config pin

hle config pin set ha          # Set a PIN (prompts for 4-8 digits)
hle config pin status ha       # Check PIN status
hle config pin remove ha       # Remove PIN

hle config basic-auth

hle config basic-auth set ha          # Prompts for username + password (min 8 chars)
hle config basic-auth status ha       # Check Basic Auth status
hle config basic-auth remove ha       # Remove Basic Auth

hle config share — temporary share links

hle config share create ha                        # 24h link (default)
hle config share create ha --duration 1h          # 1-hour link
hle config share create ha --max-uses 5           # Limited uses
hle config share create ha --label "demo"         # Label for reference
hle config share list ha                          # List share links
hle config share revoke ha 42                     # Revoke a link

Global Options

hle --version    # Show version
hle --debug ...  # Enable debug logging

Configuration

The HLE client stores configuration in ~/.config/hle/config.toml:

api_key = "hle_your_key_here"

API key resolution order:

  1. --api-key CLI flag
  2. HLE_API_KEY environment variable
  3. ~/.config/hle/config.toml

Development

git clone https://github.com/hle-world/hle-client.git
cd hle-client
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"

# Run tests
pytest

# Lint
ruff check src/ tests/
ruff format --check src/ tests/

License

MIT — see LICENSE.

Release files for hle-client 2607.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hle-client 2607.7
File Size Uploaded
hle_client-2607.7.tar.gz 129.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for hle-client 2607.7
File Interpreter ABI Platform
hle_client-2607.7-py3-none-any.whl Python 3 none any Details

Total release size: 209.0 kB

Release files / hle_client-2607.7.tar.gz

Download URL hle_client-2607.7.tar.gz
Size 129.0 kB
Tags Source
SHA-256 checksum
How to use checksums
9eed68a2cd584f9fb421a7e304ee49ad7ee38587cc068cba3454b8c13e51e312
BLAKE2b-256 checksum
How to use checksums
c5987cef99e52e773300b210c4c2769e735a43b46a015c92cba6df2119f7aaba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.9

Release files / hle_client-2607.7-py3-none-any.whl

Download URL hle_client-2607.7-py3-none-any.whl
Size 80.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8e14ef2eeea6ef0b0e23aaefb8dde961b3a21a3e2f2321a3089191c8b88bba52
BLAKE2b-256 checksum
How to use checksums
e17483fe3163acca9628a0ba2f7c7e7f05413996f4b6068ad6b04e0cfe788d47
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.9

Release history Release notifications | RSS feed

2609.9

2 release files

2609.8

2 release files

2609.7

2 release files

2609.6

2 release files

2608.6

2 release files

2607.8

2 release files

This release

2607.7 This release

2 release files

2607.6

2 release files

2607.5

2 release files

2607.4

2 release files

2607.3

2 release files

2607.2

2 release files

2607.1

2 release files

2605.6

2 release files

2605.5

2 release files

2604.4

2 release files

2604.2

2 release files

1.19.0

2 release files

1.18.0

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

0.4.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page