unopenrouter Log in

Run your runner

The runner is a small program you run on your own computer, Pi or server. Your Claude and ChatGPT logins stay there. While it runs, your API works.

  1. In the dashboard: Runners → Add runner. Copy the pairing code.
  2. On the machine, run these with your code:
    curl -fsSL https://unopenrouter.com/install-runner.sh | sudo bash
    sudo -u unopenrouter-runner unopenrouter-runner pair <code>
    sudo -u unopenrouter-runner unopenrouter-runner login claude   # and/or: login codex
    npx https://unopenrouter.com/unopenrouter-runner.tgz pair <code>
    npx https://unopenrouter.com/unopenrouter-runner.tgz login claude   # and/or: login codex
    npx https://unopenrouter.com/unopenrouter-runner.tgz                # start it; leave it running
    docker build -t unopenrouter-runner https://unopenrouter.com/unopenrouter-runner-docker.tgz
    docker run -d --restart unless-stopped --name unopenrouter-runner -v unor-runner:/data unopenrouter-runner
    docker exec -it unopenrouter-runner unopenrouter-runner pair <code>
    docker exec -it unopenrouter-runner unopenrouter-runner login claude   # and/or: login codex
  3. The dashboard shows the runner with a green dot. Make a key and go.
Which machine should I use?
OptionUptimeCostWhat you needWho holds your login
Runner at home (Pi, old PC)While it's plugged in~$70–110 once, ~$1/mo powerA small Linux boxYou, at home
Runner on a VPSHighFrom ~$2/mo*A VPS account, sshYou, on your VPS
Runner on your computerOnly while it runs$0Node 22You
Your phone or TV (exit node)While the device is on$0A device that runs Tailscaleunopenrouter, encrypted

*Check the current price: VPS prices change, and the cheapest deals are seasonal promos. A home address is the least likely to be flagged; a datacenter address works, but logging in from it is fussier (see Troubleshooting).

What it needs

Node 22+ and the claude and/or codex CLIs (the installer and the Docker image include them). 1 GB RAM minimum (with swap), 2 GB comfortable, 1 vCPU, 3 GB disk. Under 1.5 GB of RAM it runs one request at a time.

Every setup starts with a pairing code: log in, then Runners → Add runner. It lasts 15 minutes and works once.

A Raspberry Pi 4/5 or a thin client at home

About $70–110 once and ~$1 a month of power, a home address (the safest), always on while it's plugged in. A Pi 4 or 5 with 4 GB, or any old PC.

  1. Put Raspberry Pi OS Lite (64-bit) on a card with Raspberry Pi Imager (or Debian/Ubuntu on a PC). In the Imager's Edit settings → Services, turn on Enable SSH. Plug it into your router.
  2. ssh in, then run the Linux box lines above.

The installer installs Node 22, both CLIs and the runner, adds swap on small boxes, and starts a systemd service that comes back after reboots. The service picks up the pairing and new logins by itself.

A VPS

RackNerd's own site lists its 1 GB plan at $21.99 a year (about $1.83 a month); the ~$11-a-year deals you may see are seasonal promos. 1 GB is enough with swap, which the installer adds. In the EU, Hetzner's CAX11 (ARM, 4 GB) is about €6 a month. Check the current price before you buy.

  1. Create an Ubuntu 24.04 server and ssh in.
  2. Run the Linux box lines above. Make the Claude token on your own home computer (see Logging in).

Oracle Cloud Always Free (ARM A1) is $0, with two catches: free A1 capacity is often "out of host capacity" in a region (retry later, or pick another home region when you sign up), and Oracle reclaims Always Free instances that stay idle (under ~20% CPU for 7 days), which a runner's light load can trigger. Treat it as a free trial. Create a VM.Standard.A1.Flex instance with Ubuntu 24.04 (1 OCPU / 6 GB is plenty), then the same steps.

Your own computer

macOS or Linux; on Windows, WSL. Needs Node 22 (from nodejs.org, or brew install node) and the CLIs: npm install -g @anthropic-ai/claude-code @openai/codex. It works only while it runs.

On Windows, run wsl --install in PowerShell, open Ubuntu from the Start menu, and follow the Linux steps; the runner isn't tested on Windows itself.

Logging in

Claude. On your own computer at home, run claude setup-token, sign in in the browser it opens, and copy the token it prints. On the runner, run login claude and paste it. The token lasts about a year and never refreshes, so you can paste the same one on every runner.

Codex (ChatGPT). On the runner, run login codex, open the address it shows on any device, sign in to ChatGPT and enter the code. Each runner does its own login codex: never copy Codex's auth.json from one machine to another, or the two will log each other out.

Use --name to keep several logins apart, e.g. login claude --name work.

A second runner for uptime

Your API is down only when every runner is. Pair a second machine (Runners → Add runner again) and log the same accounts in there: the same Claude token, and a separate login codex. Requests go to whichever runner's account has the most room. A conversation stays on its runner while that's online and moves to another if it goes away (its prompt cache starts over). A runner whose last three requests failed is skipped for two minutes.

Is it working?

In the dashboard, Runners shows each runner with a green dot when it's online, and the line API available: yes (2 of 3 runners online). Its accounts show their 5-hour and weekly usage once the runner has checked them, within a minute.

Logs: journalctl -u unopenrouter-runner -f (installer), docker logs -f unopenrouter-runner (Docker), or the terminal (npx). A healthy runner logs connected as "…".

Then send a request with one of your keys, as in the docs.

Troubleshooting

Login refused on a VPS address. Claude's browser login often meets a Cloudflare challenge or a 403 from datacenter addresses. Make the token with claude setup-token on your home computer and paste it on the VPS: the token itself works from anywhere.

Codex 403. Codex's device login, and its token refresh, get a 403 from some VPS hosts. Do that login on a runner at home or on your own computer. The dashboard shows the account as signed out, with the reason.

The runner won't stay connected. It keeps one outbound connection to api.unopenrouter.com on port 443 and reconnects by itself. Check that the box can reach it (curl -I https://api.unopenrouter.com/v1/models answers 401), that its clock is right, and what the log says. If it says the token was revoked, pair it again.

Requests answer 503 runner_offline. No runner of yours is online, or the ones online have no login for that provider. Start one, or log in on it.

A runner shows "cooling down". Its last three requests failed, so it's left alone for two minutes. The log says what failed.

Privacy and removing it

Transcripts stay on your runner. With Don't store my data on (the default), they're deleted after 3 idle hours; start the runner with --keep-transcripts to keep them. unopenrouter keeps only metadata about each request (key, model, token counts, status, timing), never its content.

Remove a login: unopenrouter-runner logout <name>. Disconnect a runner: Revoke it in the dashboard; its token stops working and it exits. Uninstall: sudo systemctl disable --now unopenrouter-runner, then sudo rm /etc/systemd/system/unopenrouter-runner.service and sudo userdel -r unopenrouter-runner (installer); docker rm -f unopenrouter-runner and docker volume rm unor-runner (Docker); or delete ~/.config/unopenrouter-runner (npx). To end a Claude token for good, sign out of all sessions in your Claude account settings.

Commands
pair <code> [--name N]Pair this machine with your account, with a code from Runners → Add runner
login claude|codex [--name N]Add a login: Claude takes a token from claude setup-token, Codex runs a device login
accountsList this runner's logins
logout <name>Remove a login
start [--concurrency N] [--keep-transcripts]Run it (the default command): two requests at a time, one under 1.5 GB RAM
versionPrint the version