Skip to content

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.

sh
sudo qorin-agent login

qorin-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.

sh
sudo qorin-agent logout

qorin-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 + git version
  • 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:

sh
sudo systemctl {start,stop,restart,status} qorin-agent
sudo journalctl -u qorin-agent -f

macOS:

sh
sudo launchctl {bootstrap,bootout,kickstart} system/dev.qorin.agent
sudo log stream --predicate 'subsystem == "dev.qorin.agent"'

Files & paths ​

PathPurpose
/usr/local/bin/qorin-agentThe binary
/etc/systemd/system/qorin-agent.serviceLinux unit file
/Library/LaunchDaemons/dev.qorin.agent.plistmacOS plist
/var/lib/qorin-agent/ (Linux) / /var/db/qorin-agent/ (mac)State dir (token, keys)
<project>/.claude/settings.local.jsonHook config, claude-code (merged in, restored on cleanup)
<project>/.codex/hooks.jsonHook config, codex
<project>/.cursor/hooks.jsonHook config, cursor
<project>/.gemini/settings.jsonHook 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):

VarDefaultPurpose
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.

Qorin is built by Benito Borriello.