The user directory
User administration runs offline against the data dir (daemon stopped; the daemon must have booted once):Local passwords
OH_DAEMON_USER_PASSWORD or
OH_DAEMON_USER_PASSWORD_FILE — never a flag.
Seats & licensing
The free tier includes 6 seats — active users in the directory. Paid plans only add seats above that; the software is otherwise identical. At the seat limit,ohd user add refuses; an
individual-seat key matching the user’s email admits past it:
SSO login (OIDC)
Team deployments can let users sign in to the served web app through an OpenID Connect provider instead of pasting a pairing token. Configure the provider indaemon.json:
<redirectOrigin>/auth/oidc/callback as the client’s
redirect URI with the provider. For confidential clients, put the
client secret in daemon.json as oidc.clientSecret or (better) in
the service environment as OH_DAEMON_OIDC_CLIENT_SECRET; public
clients need no secret — the flow always runs PKCE. redirectOrigin
may be omitted for single-hostname deployments; the daemon then
derives it from the request.
A successful login maps the provider’s verified email onto a daemon
user (ohd user add <name> --email <email>) and mints a session token
bound to that user, expiring after sessionTtlDays (default 30).
Unknown emails are refused unless autoProvision is true, which
creates the user with zero workspace grants — grant access with
ohd user grant. Daemon-local users, pairing, and operator-minted
tokens keep working unchanged; SSO is additive.