qorin-agent CLI
The host-side binary. Single static Go executable; same binary works in interactive mode (qorin-agent login) and as a system daemon.
Subcommands
qorin-agent login
Start the device-flow pairing with your Qorin account. Prints a short code (e.g. WXYZ-1234) and a URL; you complete it in the browser. Requires sudo because the resulting agent token is written to the daemon state dir.
sudo qorin-agent loginqorin-agent logout
Revoke this host's agent token at the control plane and clear local state. The dashboard flips the host to "offline" until you re-pair.
sudo qorin-agent logoutqorin-agent doctor
Self-check. Reports:
- Daemon process status (running / pid / uptime)
- Last heartbeat timestamp
- CLI agents found in the daemon's PATH (claude, codex, cursor-agent, gemini, opencode). opencode's own installer puts its binary in
~/.opencode/bin, which is not on a default PATH — if doctor can't see it, check CLI not found. tmux+gitversion- Daemon authentication state (has token / token age)
Run it after install and any time the dashboard shows "enrolling" stuck or weird spawn failures.
qorin-agent --version
Prints the agent version (e.g. 0.42.1) and build date.
Service / daemon
The installer wires the daemon to systemd (Linux) or launchd (macOS). You usually don't interact with it directly after install.
Linux:
sudo systemctl {start,stop,restart,status} qorin-agent
sudo journalctl -u qorin-agent -fmacOS:
sudo launchctl {bootstrap,bootout,kickstart} system/dev.qorin.agent
sudo log stream --predicate 'subsystem == "dev.qorin.agent"'Files & paths
| Path | Purpose |
|---|---|
/usr/local/bin/qorin-agent | The binary |
/etc/systemd/system/qorin-agent.service | Linux unit file |
/Library/LaunchDaemons/dev.qorin.agent.plist | macOS plist |
/var/lib/qorin-agent/ (Linux) / /var/db/qorin-agent/ (mac) | State dir (token, keys) |
<project>/.claude/settings.local.json | Hook config, claude-code (merged in, restored on cleanup) |
<project>/.codex/hooks.json | Hook config, codex |
<project>/.cursor/hooks.json | Hook config, cursor |
<project>/.gemini/settings.json | Hook config, gemini |
<project>/.opencode/plugin/ | Hook plugin, opencode — it has a plugin API rather than a hooks file |
<project>/.qorin/worktrees/<branch> | Worktree dirs the agent creates for git workspaces |
Environment variables
The daemon respects a small set of env vars (set them in the systemd unit override or launchd plist):
| Var | Default | Purpose |
|---|---|---|
HTTPS_PROXY | (none) | Corporate proxy for the outbound WebSocket |
NO_PROXY | (none) | Bypass list |
QORIN_DEFAULT_USER | (stamped at install) | OS user the daemon expects to setuid to when no per-user mapping exists |
That's it. The daemon stays slim on purpose — no plugin system, no runtime config file. Everything else comes from the control plane.