Troubleshooting
Start here when something does not work. The first sections are the checks that apply to almost everything. The tables after them lead from what you see to the page that has the fix. Most of those pages end with their own troubleshooting section; this page does not repeat them.
First steps #
On the relay's machine, in a terminal:
oar status
oar doctor
oar statussays whether the relay answers. Read its first lines against the table below.oar doctorprints the install, the config and the provider CLIs it finds. It changes nothing and always exits 0, so read the lines.- Look at the browser. The status dot and the banners tell whether the problem is between the browser and the relay or behind the relay.
- Read the log that belongs to the problem (Logs).
- Restart the smallest thing that could help (Restarting).
Both commands are described on The oar command.
Reading oar status #
| Line | What it points to |
|---|---|
Not set up yet — run: oar setup |
No config in this install. Run oar setup. First run |
The relay is running on port <port> (<access>): <url> |
The relay is fine. Open the URL; oar url prints it with the token. A problem is then in the browser, the sign-in or a session |
The relay is stopped (port <port>, <access>). Start it with: oar start |
Nothing answers on the port. Run oar start and read Installing and starting if it fails |
Port <port> is held by another program, or by a relay with another token. |
Another program uses the port, or an old relay with an earlier token is still running. See If it does not start |
The relay runs with its earlier settings; restart it to apply the new ones. |
You changed the port, token or access with oar setup. Run oar restart |
Service: <state> |
The start-at-login service. See Start at login |
Tunnel: <state> |
The built-in Cloudflare tunnel. See Cloudflare tunnel |
Exit code 3 means the relay is not running, the port is held by something else, or there is no config. Exit code 0 means the relay runs.
Reading oar doctor #
| Line | What it tells you |
|---|---|
OAR <version> and node |
The OAR version and the Node.js that runs oar. Put both in a report |
mode |
git checkout: oar update and oar service refuse to work there. global install is the normal case |
state root and config |
Which install the command looks at. Two installs on one machine have two of each. (missing — run: oar setup) after the config path means there is no config; port, auth token and tunnel are then left out |
port |
The port and who can reach it. localhost means only this machine; other devices need oar setup --lan or a tunnel |
auth token |
MISSING means no token is set. Run oar setup |
tunnel |
disabled, managed (cloudflared: <path>) or managed, cannot start: <reason>. The reason names what is wrong, for example a missing cloudflared |
database |
The database this install uses, with its size. (not created yet) means the relay never ran from this install. If your conversations are missing, or messages stay pending, check that this is the database you expect (One relay per data folder) |
provider CLIs |
gh (Copilot), claude and grok show their version, or not found. Doctor looks with your terminal's PATH; a service has the PATH from when it was installed (Start at login). cursor always reads bundled (@cursor/, whether or not a key is saved |
warning |
In WSL, Windows holds the relay's port. Choose another with oar setup --port <port> |
Doctor prints the state folder, not the log folder, and it does not say whether
the relay runs: that is oar status. Where the logs are is on
Files and folders.
Logs #
| Problem | Read |
|---|---|
| The relay does not start, or stops | server- in the log folder, but only when oar start started the relay itself in the background. Under the Linux service the start-up errors are in the journal (journalctl --user -u oar), not in server-; see Status and logs |
| Anything the relay did: previews, tunnels, updates, restarts | relay-. It shows your access token as [token] |
| One conversation does not answer, or its agent stops | worker-<session>., the worker of that conversation. The Copilot extension engine has none; see ext- and the Copilot terminal |
| The service does not start | systemctl --user status oar, then journalctl --user -u oar |
All log files, their rotation and the folder in a git checkout are on Files and folders.
In the browser #
- The status dot at the top of the conversation list: grey is Web relay unreachable (the browser cannot reach the relay), green is Web relay reachable, amber is the relay reached through a connected Cloudflare tunnel. The tooltip says more, for example how many workers are busy. The status dot
- The banner
CLI is offline — messages will queue until it reconnectsand CLI offline in the sidebar mean no session worker has reported in for 10 seconds. On an idle relay this is normal: send a message and the banner clears. If it stays, read the worker log. When the agent is not reachable
Restarting #
| What | When | How |
|---|---|---|
| One conversation's agent | A conversation is stuck, Stop does not work, or the agent should pick up new settings | ☠️ Kill session in the ⋯ menu. History and queue stay; the next message starts a fresh worker. Kill session |
| The relay | A new version, a changed config, a newly installed provider CLI | oar restart on the relay's machine, or 🌄 Restart web relay in the ⋯ menu. Both wait for running turns, except under the Linux service, where oar restart ends them. Restarting the relay |
Symptoms #
Installing and starting #
| What you see | Usual cause | Fix |
|---|---|---|
npm install -g @oar- fails with EACCES |
npm's global folder needs root | Use the installer, not sudo. Install |
Node.js too old or not found; oar: command not found; oar blocked in PowerShell |
Node.js below 22.13, or the PATH is not reloaded |
Install |
| The install fails with node-gyp or prebuild errors | No prebuilt better- for your platform |
Install |
The relay does not start after an npm 12 install, with a better- error |
npm 12 skipped the install scripts | Reinstall with --allow-, never with --ignore-. Install. The error is in server- if oar start started the relay, else in the journal |
Port 3333 is in use by another program ... |
Another program or an old relay holds the port | If it does not start |
The relay did not come up — see …/ |
The relay started and exited | If it does not start |
Relay already running or Relay appears to be owned by another live process, exit code 78 |
A second relay on the same data folder | Follow the hint at the end of the line (oar stop, or end process <pid>). One relay per data folder |
[data] Not starting: each database has changes newer than the other's |
Added in 0.9.14 The relay found an earlier database it ran on, and both hold work | Keep one, move the other one's copilot., -wal and -shm into a folder of your own, then oar start. Upgrade notes for 0.9.14 |
[oar] The relay … is bringing over the database it ran on until now … |
Added in 0.9.14 The first start after the update copies a large database | Wait; it answers once that is done. Do not start a second relay. Upgrade notes for 0.9.14 |
After updating, the conversations of a Windows autostart or gh copilot relay are gone |
Before 0.9.14 that relay kept its data inside the package | Upgrade notes for 0.9.14 |
[startup] Cannot create … or … is a file, not a folder, exit code 78 |
Added in 0.9.14 The data or upload folder cannot be created, for example its drive is missing | Make the drive or folder available. Waiting for TEMP and the data drive |
No systemd user session here, Could not enable lingering, the relay is gone after a reboot |
No systemd user session, or lingering is off | Start at login |
| WSL: the Windows browser shows another page or refuses the token | Windows holds the port | oar setup --port <port>. If it does not start |
Under the service a tool or node is not found in sessions |
The service keeps the PATH from when it was installed |
Start at login |
Nothing changed: OAR does not delete or overwrite an autostart entry it did not make. (Windows) |
Added in 0.9.15 A Startup entry, boot task or launcher made or edited by hand stands in the way of the switch | Remove it yourself, or run the switch with --replace, which keeps a copy. Entries OAR did not make |
Nothing changed: the boot task could not be read (…) (Windows) |
Added in 0.9.15 The task is there but OAR cannot read it, often Access is denied because it stores another account's password | Look at it in Task Scheduler as an administrator. Entries OAR did not make |
oar uninstall stops with Not done: … |
Added in 0.9.15 A step failed: the relay did not stop, an administrator prompt was declined, a folder could not be deleted | Sort out the line before it, then run the same command again. oar uninstall |
A hidden . folder is left beside the removed package |
Added in 0.9.15 A session worker still ran from the package while npm removed it | Delete the folder once those programs have ended, at the latest after a reboot. oar uninstall |
Signing in and reaching the relay #
| What you see | Usual cause | Fix |
|---|---|---|
| Invalid token in the sign-in box | An old or wrong token | Use the token from oar url. If it does not start |
| Too many failed sign-in attempts. Try again in … seconds. | Ten wrong tokens from this address within a minute | Wait for the minute to pass, then use the right token. Behind a proxy on another machine, set trust, or all visitors share one lockout. Protections on sign-in |
A script gets 401 on API or file addresses that carry ?token= |
Since 0.9.11 ?token= signs in the page only |
Send Authorization: Bearer <token>. Ways to present it |
| Every device asks for the token again | oar setup --new- signs all devices out |
If you lose the token |
| The status dot is grey: Web relay unreachable | The relay is stopped, or the address is wrong | Run oar status on the relay's machine. The status dot |
| A phone cannot open the address | Access is this machine only | oar setup --lan, or a tunnel. From a phone |
The tunnel is off (cloudflared is not installed) or keeps reconnecting |
cloudflared missing, token wrong, or the SSH login fails |
Cloudflare tunnel, SSH tunnel |
| Messages stay queued and the queue is paused | The tunnel is set as required and is not connected |
The same two sections |
| Behind Caddy or nginx the page reconnects forever, is blank under a prefix, or asks for the token again and again | The proxy blocks WebSockets, strips a prefix or needs more settings | Reverse proxy |
Behind a proxy the page loads but nothing updates live, and the relay log says Refused a handshake from origin |
The proxy rewrites the Host header |
List the public origin in allowed. allowed |
A conversation does not start or the agent does not answer #
Each provider page ends with the failures that provider can produce. A failed reply usually names its cause and often carries a button that fixes it.
| Provider | Typical failures | Fix |
|---|---|---|
| GitHub Copilot | Saving SDK is refused (COPILOT_SDK_PATH did not resolve), the runtime could not authenticate, no AI credits left, oar copilot says the GitHub CLI is missing |
GitHub Copilot, When saving SDK is refused |
| OpenAI | Open, model discovery failed, Open |
OpenAI |
| Claude | Missing from New Chat, Not logged in, a reply that points at billing, Added in 0.9.18 relay. |
Claude |
| Claude API | Added in 0.9.18 The key is outside a workspace (HTTP 400), the monthly cap is reached (relay., or New Chat offers Start on subscription), the key is not accepted (relay.), the account's credit or spend limit (relay., relay.), the card shows no price known for a model |
Claude API, Errors |
| Claude Cloud | The login expired, GitHub is not connected, no cloud environment | Claude Cloud |
| Cursor | Cursor API key is not configured, Cursor model "…" is not available |
Cursor |
| Grok | Grok CLI was not found on PATH, Grok authentication failed |
Grok |
| DeepSeek | Added in 0.9.17 The balance is used up (relay.), the key is not accepted (relay.), too many requests at once (relay.); other failures print as relay., for example relay. |
DeepSeek, Errors |
| What you see | Usual cause | Fix |
|---|---|---|
| A provider is missing from New Chat | It is switched off, or has no key or login | The provider's page above; A provider that is switched off |
| Set up a provider on the first screen | No provider is ready | The first look |
| The model list is old or wrong | Discovery has to run again | 🤗 Select Models → Refresh; per provider on its page above |
| No usage line under a reply | Only Copilot turns record plan usage | GitHub Copilot |
| A Check Usage card shows Error, Unavailable or only estimates | The live read failed; the card falls back to what it has | Refresh and how fresh the numbers are |
A turn is stuck, fails or restarts #
| What you see | Usual cause | Fix |
|---|---|---|
The banner CLI is offline |
No worker has reported in | When the agent is not reachable |
| A long turn goes back to the queue and starts again | Max turn duration (60 minutes by default) or the inactivity window (10 minutes) ran out | Raise or clear Max turn duration in Settings → General. When a turn is stuck |
System note: the … runtime sent nothing for Ns ... |
The silence watch of the Copilot SDK engine, Cursor or Grok ended the turn | Send the message again. When a turn fails |
Relay timeout after 5 attempts or Relay recovery limit reached |
The turn was requeued until the attempts ran out | When a turn fails |
| A conversation seems wedged; Stop does nothing | The worker hangs | ☠️ Kill session, then send the message again. Kill session |
| Messages stay pending | A restart is queued and holds new messages, or another relay uses the database | The restart waits, One relay per data folder |
| New messages stay queued and a banner says Relay restart queued — waiting for N sessions | A restart is queued and waits for the running turns of the sessions it links; until then no message is handed to a session | Wait, or press Restart now or Cancel restart in the banner. After Ask after a queued relay restart has waited (30 minutes by default) the banner asks instead of waiting on. The restart waits |
| Messages to one conversation stay queued after a relay restart | Its worker has not reconnected yet. It retries by itself, at most 8 seconds apart, and since 0.9.13 also when its connect hangs | Its worker-<session>. has a worker ws disconnected line per failed attempt (the first three, then one a minute) that says why. ☠️ Kill session starts a new worker. When the agent is not reachable |
| After a relay restart a session stopped mid-turn and did nothing more | Its turn could not run again: the agent had already taken the message | Send a short "carry on", or switch on After a relay restart, tell interrupted sessions to carry on in Settings → General. A relay row that says the relay restarted is that note. Telling an interrupted session to carry on |
| A send fails with This conversation's model "…" is no longer available. Choose a model and send again. | The send named no model, and the Copilot model the conversation was set to has left the catalog. Since 0.9.13 the relay no longer switches to another model by itself | Pick a model in the composer and send again. Models and reasoning |
| Restart web relay or Empty queue shows an error | The relay refused the request and names its reason, or did not answer | Restart web relay, Empty queue |
| A variable set for the relay has no effect on the agents | Under tmux only a fixed list of variables reaches them | Which variables reach the agents |
| A reply stopped with a Paused note | A usage limit | When a usage limit is reached |
| A background agent or shell stopped on its own | It reached the Background task timeout (4 hours by default) | Background task timeout |
A task row says no output for N min in amber |
The command has written nothing for longer than Mark a background task as quiet after (10 minutes by default) | Open its console to see the last lines. Some steps are silent for long; raise the setting, or Stop the task if it hangs. Quiet tasks |
| A command's console says This session did not report an output file for this task. | A session whose agent started before the update to 0.9.12, or a shell without Stop on Copilot's SDK engine | For the second, ☠️ Kill session on an idle session; the next commands have a console. By provider |
| A console says This task's output is no longer available. | The task ended more than an hour ago, or it ran before the update to 0.9.13 and the relay restarted since | Finished commands, After a relay restart |
| A console stops at Output stops here: this command pipes into tail | A command piped into tail writes nothing until it ends; the output arrives then |
To follow such a run live, have it log to a file (> run.) and follow that file. Commands piped into tail |
| After a relay restart a console says it is waiting for its worker, without Stop | The relay kept the command's output, but only its worker can say whether it still runs | Wait a few seconds. A command whose worker did not come back is marked finished after about a minute and a half. After a relay restart |
| Switching back to a long conversation does not bring back all the older messages you had loaded | Only Messages kept per conversation for switching back (200 by default) are kept around your place, for the last eight conversations | Raise it in Settings → General. Reload, switching, rotating |
| A conversation will not delete or archive | A turn or a background task still runs | Delete |
| A failed reply shows a button | The relay knows the fix | Buttons on a failed reply |
| The relay stopped or restarted, and its log says JavaScript heap out of memory | Added in 0.9.19 The relay's memory reached its heap limit | The relay starts again by itself. The relay ran out of memory |
Questions and approvals #
| What you see | Usual cause | Fix |
|---|---|---|
| The agent waits and nothing happens | A question or approval card is open, perhaps on another device. A turn that waits on a card is never treated as stuck | Answer the card, or press Stop. While a card is open |
| An approval card does not take your typed answer | Typed text is not a way to say yes | Use Allow or Deny. Approval cards |
| The card disappeared and the agent went on | Nobody answered in 8 hours (2 on Copilot's extension engine), or Stop closed it | While a card is open |
| The send button reads Queue | A card is open; the message goes in after you answer | While a card is open |
You are offline. Answer queued |
No connection when you answered | Answering from somewhere else |
| A Grok agent asks a question and no card appears | Grok has no cards | Answer in the composer. Grok |
| An answer button is missing in a notification | The question has no choices, or they are too long | Notifications |
Agents working with other sessions and relays #
| What you see | Usual cause | Fix |
|---|---|---|
The agent has no tool for sessions, or reports REMOTE_, REMOTE_ or REMOTE_ |
The switch is off, or a limit applies | Agent sessions |
REMOTE_ |
You have not mentioned the relay in this conversation | Paired relays |
| A relay shows Offline or Token not accepted | The other relay is down, or its token changed | Paired relays |
Another relay's agents cannot send prompts here (REMOTE_) |
Accept prompts from other relays' agents is off | Paired relays |
| Watching a session on a paired relay says it needs an update | The other relay runs an older OAR | Sessions on a paired relay |
REMOTE_ |
The agent named a model the target relay does not list for the provider, for example gpt- for gpt- |
The answer names the close matches and the valid ids. Which models are accepted |
| A watching agent is no longer woken when a shell command ends | Since 0.9.13 the default events leave out shell commands that ended well; failures still wake it | Subscribe with task_ in events. The default events |
Any other REMOTE_ code |
Errors |
Files, previews and sharing #
| What you see | Usual cause | Fix |
|---|---|---|
| File not found when a path in a reply is clicked | An absolute path outside the workspace is read as a workspace path | Where a link in a reply leads, What the viewer can open |
| A file link fails or a file will not open | The file is outside what the viewer may read | What the viewer can open |
| A folder in the file browser opens empty | The relay cannot read it | Limits |
| The agent should commit, undo or push, but Git changes has no button | That view only shows changes | What it does not do |
A preview link does not open, shows No such preview or Preview upstream unreachable, or the page is blank |
The lane is off, the dev server stopped, or the app writes absolute paths | Previews |
Preview lane is disabled or Preview lane failed its startup checks |
The lane is off or a check failed | When the lane refuses to start |
Too many live previews (max 8) |
The limit | Previews |
| A shared link asks the viewer to sign in, shows an old state, or cannot be opened by anyone else | Cloudflare Access, a cache rule, or a relay that listens on this machine only | Reaching the relay |
A shared link answers 404 |
Sharing was stopped, the link renewed, or the conversation deleted | Settings → Sharing lists the links that work. Your shared links |
| A path still shows in a shared view | A relative path, or one in a picture | Paths and file names |
| A preview shows as not served in Settings → Previews | The relay could not check it at its start | It is checked again every 15 seconds. Previews after a restart |
Notifications and the installed app #
| What you see | Usual cause | Fix |
|---|---|---|
| The notification switch is greyed out | The page is not on HTTPS or localhost |
Notifications |
| Notifications stopped, or arrive on one device only | Blocked in the browser, disabled device, or another device has OAR open in front | Notifications |
| The browser offers no install | The relay is not on HTTPS or localhost |
What it needs |
| The app shows Enter your access token to connect | No valid sign-in in the app | Signing in inside the app |
| Suspend host is missing or does nothing | Its setting is off, the relay is not on Windows, or something still runs | Suspend host |
Updates #
| What you see | Usual cause | Fix |
|---|---|---|
| Update is missing, or the check finds nothing | A git checkout, a dismissed version, or no newer version known | If it does not work |
| Check for updates is greyed out | OAR_ is set on the relay |
If it does not work |
oar update exits 1 with Could not fetch … or points to --to |
The manifest cannot be fetched, or the check is switched off | oar update --to X. still works. If it does not work |
oar update --to= installs the newest release |
--to= is ignored |
Write --to 0. with a space. oar update |
An update fails with EACCES |
npm cannot write to the package's folder | If it does not work |
| The old version still runs after an update | The restart waits for running turns, or the update did not apply | The restart waits, If it does not work |
| The installed app shows an old page | It switches to the new version when it starts | Updates |
The relay ran out of memory Added in 0.9.19 #
The relay starts with a fixed heap limit: 60 % of the machine's RAM, in 64 MB steps, at least 2048 MB and at most 8192 MB, and never below Node.js's own default, but never above the memory there is. In a container with a memory limit, that limit counts instead of the RAM. On a machine with 4 GB that is about 2.3 GB. Each start logs the limit and where it came from:
[relay] heap limit 2368 MB (default: 60% of 3.9 GB RAM)
At start and every 10 minutes the log gets a line such as
[relay] memory rss=, and one extra
[relay] memory high: … line when the heap in use passes 80 % of the limit.
When the relay runs out of memory, it starts again by itself, as after any
crash: up to 2 times in a row, and the 3rd crash in a row stops it with exit
code 1, after which the Linux systemd service starts it again. A run of 10
minutes or more starts the count afresh. Before 0.9.19 a relay that ran out of memory stayed down. After an update from an earlier version, the heap limit and this relaunch work only once oar itself has been stopped and started again (Upgrade notes for 0.9.19).
To set the limit yourself, put heap (whole MB, at least 512) in
config. and restart the relay. A
--max- in NODE_, or on the node command line that
starts server., wins over heap. Unlike heap, a
NODE_ set in a shell is lost when something else restarts the relay.
The heap snapshot #
When the heap nears its limit, Node.js writes one heap snapshot
(Heap.<date>.<time>.<pid>.) to the diagnostics folder in the
relay's data folder (Files and folders).
The relay creates that folder and logs its path at start; on Linux and macOS
only you can open it.
- Disk: a snapshot is about as large as the heap in use, so up to the limit. When the drive of the data folder has less than twice the heap limit free, the relay starts without a snapshot and logs why.
- Memory: writing it can take up to about twice the heap in use, and the relay does not answer while it writes. On a small machine writing it can fail or get the process ended; the relay then ends as it would have without it.
- Reading it: copy it off the machine, open it in Chrome DevTools (Memory → Load) and sort by Retained size to see what holds the memory. A snapshot from an earlier, healthy run shows what grew.
A snapshot holds your secrets
A heap snapshot holds everything that was in the relay's memory, the access token and the provider API keys included. Never share one as it is, and delete it once it has been read: the relay never deletes snapshots.
Reporting a problem #
If nothing above helps, file an issue at github.com/oar-sh/oar/issues. Include:
- the output of
oar --version; - the output of
oar doctor, and ofoar status; - what you did, what you expected and what happened, with the exact message;
- the relevant lines of the log that fits the problem (Logs), not the whole file.
Remove secrets first
Before you post, remove access tokens (also the ?token= part of an address),
API keys and tunnel tokens, and replace personal paths, host names and
account names. The issue is public.