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:

JSON
{
  "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:

JSON
{
  "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:

JSON
[
  {
    "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:

JSON
[
  {
    "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:

JSON
{
  "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:

FlagEffect
--accept-termsSkip the EULA prompt. Required when --json is set.
--usage-data / --no-usage-dataSet the usage-data preference without prompting.
--reassignMove 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:

JSON
{
  "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):

JSON
{
  "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:

Text
localcan 3.0.0-beta.4 (client)
daemon   3.0.0-beta.4 (running)

JSON shape:

JSON
{
  "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:

FlagEffect
--json, --output jsonEmit JSON instead of formatted text. Suppresses interactive prompts.
-d, --detachBackground the daemon. Applies to start and restart.
-v, --verboseEnable debug logging. Applies to start and restart.
-h, --helpPrint usage.

© 2026 LocalCan™. All rights reserved.