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 shipsoh (the CLI) and ohd (the daemon) as
self-contained executables — no Node.js required. The same binaries
are downloadable from the
releases page.
- macOS
- Linux
- Docker
The install script verifies SHA-256 checksums and installs Binaries currently ship for Apple silicon (
oh
and ohd to ~/.local/bin: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 fromshow-token. For the CLI:
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 binds127.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:
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:
--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: