Reference
Full listing of every localcan command, flag, and what it returns.
Every command supports -h/--help to print a short synopsis and --json (or --output json) to emit machine-readable output instead of formatted text.
Quick tunnels
localcan http <port> [--url <custom-domain>]
Open an ephemeral HTTP tunnel to http://localhost:<port>. Auto-starts the daemon if it isn't running. Generates a random LocalCan.dev URL unless --url is set to a custom domain you've verified for your account.
localcan https <port> [--url <custom-domain>]
Same as http but for local servers that already terminate TLS. LocalCan trusts your server's certificate even if it's self-signed.
localcan tcp <port>
Open a raw TCP tunnel. --url is not supported.
See Quick tunnels for more.
Daemon
localcan start [-d|--detach] [-v|--verbose]
Start the daemon. Foreground by default. --detach backgrounds the process. --verbose enables debug logging.
localcan stop
Stop the running daemon.
localcan restart [-d|--detach] [-v|--verbose]
Stop the running daemon (if any) and start a fresh one. Same flags as start.
localcan reload
Tell the running daemon to re-read every project file in ~/.localcan/projects/. The right command after editing YAML by hand.
localcan status
Print daemon status: version, RPC protocol, project count, listening address. JSON shape:
{
"status": "running",
"version": "3.0.0-beta.4",
"protocol": 1,
"projects": 2,
"address": "/Users/you/.localcan/daemon.sock"
}
Resources
localcan projects ls
List loaded projects. Columns: ID, NAME, SERVICES. JSON shape:
{
"my-app": {
"id": "my-app",
"file_path": "/Users/you/.localcan/projects/my-app.yml",
"ephemeral": false,
"project": {
"name": "My App",
"icon": "🚀",
"services": { "web": { "target": "http://localhost:3000", "endpoints": [/* … */] } }
}
}
}
localcan services ls
List services across all projects. Columns: PROJECT, SERVICE, TARGET, ENDPOINTS. JSON shape:
[
{
"project_id": "my-app",
"service_id": "web",
"name": "Storefront",
"target": "http://localhost:3000",
"endpoints": 2
}
]
localcan tunnel ls
List active tunnels (Public URLs). Columns: TUNNEL URL, TARGET, PROTOCOL, PROJECT, EDGE. JSON shape:
[
{
"key": "my-app/web/0",
"project_id": "my-app",
"service_id": "web",
"tunnel_url": "https://swift-falcon-12.localcan.dev",
"local_target": "http://localhost:3000",
"protocol": "http",
"edge_host": "edge-eu1.localcan.dev"
}
]
localcan config show
Pretty-print the daemon configuration and loaded projects. Falls back to reading config.yml from disk if the daemon isn't running. JSON shape:
{
"daemon": { "license_key": "localcan_…", "device_id": "…", "proxy_https": { "enabled": true } },
"projects": { "my-app": { "/* same as projects ls */": "" } }
}
localcan config path
Print the data directory (~/.localcan/).
License
localcan license activate <key> [flags]
Activate a license key. Flags:
| Flag | Effect |
|---|---|
--accept-terms | Skip the EULA prompt. Required when --json is set. |
--usage-data / --no-usage-data | Set the usage-data preference without prompting. |
--reassign | Move a key already activated on another machine. |
localcan license deactivate
Free the seat. Daemon keeps running but tunnels and proxy pause until a new key is activated.
localcan license status
Print license key (masked), device, platform, CLI and desktop version, and update window. JSON shape:
{
"device_id": "c5b1…",
"device_name": "my-laptop",
"license_key": "localcan_xxxxxxxxxxxx****",
"platform": "darwin",
"arch": "arm64",
"cli_version": "3.0.0-beta.4",
"desktop_version": "3.0.0-beta.4",
"updates": {
"expired": false,
"allowed_until": "2027-01-01T00:00:00Z",
"releases_behind": [],
"cli_releases_behind": []
},
"cli_update": null
}
cli_update is non-null only on standalone builds when a newer CLI is available — it carries { "name": "3.0.0-beta.5", "pub_date": "2026-05-01T12:00:00Z" }.
localcan license trial start
Start a 7-day trial bound to this machine.
localcan license trial status
Show trial state. JSON wraps the upstream license-server response — status is the HTTP status (200 active, 403 ended, 404 no trial):
{
"status": 200,
"response": {
"starts_at": "2026-05-04T10:00:00Z",
"ends_at": "2026-05-11T10:00:00Z"
}
}
Other
localcan version
Print the client and daemon versions:
localcan 3.0.0-beta.4 (client)
daemon 3.0.0-beta.4 (running)
JSON shape:
{
"client": "3.0.0-beta.4",
"daemon": "3.0.0-beta.4",
"daemon_status": "running"
}
daemon_status is "running", "not running", or "unknown". When the daemon is not running, daemon is an empty string.
localcan update [--check]
Download and replace the binary in place. --check only reports whether an update is available. No-op on bundled installs (the desktop app's auto-updater handles this).
localcan install-cli [--check|--uninstall]
Unix only. Symlinks the running binary into ~/.localcan/bin/localcan and adds that directory to your shell's PATH by appending a guarded block to your zsh, bash, or fish rc files. Normally invoked automatically — by the desktop app on macOS, by install-beta.sh on Linux — so you rarely run it by hand. Cases where you might: re-running after switching shells, uninstalling PATH wiring (--uninstall), or inspecting the current state (--check, prints JSON).
Global flags
These can appear anywhere in the argument list:
| Flag | Effect |
|---|---|
--json, --output json | Emit JSON instead of formatted text. Suppresses interactive prompts. |
-d, --detach | Background the daemon. Applies to start and restart. |
-v, --verbose | Enable debug logging. Applies to start and restart. |
-h, --help | Print usage. |
© 2026 LocalCan™. All rights reserved.