Skip to main content
By the end of this page you have ohd running as a service, a client token in hand, and the browser extension, desktop app, or CLI syncing against your own server. No account, no cloud relay — the daemon makes zero outbound connections except ones you configure.

Install

Each release ships oh (the CLI) and ohd (the daemon) as self-contained executables — no Node.js required. The same binaries are downloadable from the releases page.
The install script verifies SHA-256 checksums and installs oh and ohd to ~/.local/bin:
Binaries currently ship for Apple silicon (mac-arm64). The service lifecycle below runs on launchd — the LaunchAgent starts at login.

Start the service

ohd show-token prints the join URLs and a one-time secret — copy it now; it is shown once. On Linux, install also enables the unit for boot and turns on user lingering, so the daemon survives reboots and outlives the SSH session that installed it; if a step needs privileges, the exact manual command is printed instead. On macOS the LaunchAgent starts at login.

Connect a client

Add the server as a backend in any client — extension, desktop app, or web app — under Settings → Backends, using a join URL and the token from show-token. For the CLI:
The daemon also serves the Open Headers web app on its bind: open http://<daemon-host>:8137/ in a browser. The CLI installs on any client machine — the same script as above on macOS and Linux (without --with-daemon), or the PowerShell script on Windows:

Reach it from the LAN

The daemon binds 127.0.0.1:8137 by default — loopback only. To make it LAN-reachable you must also say how the connection is protected: either a TLS-terminating reverse proxy in front, or an explicit acknowledgment that cleartext on a trusted network is acceptable:
Without one of the two, a 0.0.0.0 bind refuses to boot rather than serve auth tokens and pairing secrets unencrypted by accident. Run ohd show-token (daemon stopped) to see the LAN join URLs. If clients still cannot connect, check that the host firewall (ufw/firewalld) admits port 8137. For anything beyond a trusted LAN, terminate TLS at a reverse proxy — Caddy makes it two lines:
The full decision guide — with the nginx config and the --trusted-proxy semantics — is LAN vs TLS proxy.

Reconfigure at any time

daemon.json is the durable configuration. ohd install persists the flags it is given into it and may be re-run at any time to reconfigure — an omitted flag keeps its persisted value — and ohd restart applies the result. Runtime settings (like the MCP switches) are separate: