Help
Troubleshooting
What you see, what it means, and what to do. Every line here is a real message from the CLI.
While starting or joining
| What you see |
What it means |
refusing to run: claude reported apiKeySource |
You are signed in with an API key. seshi only runs on a subscription. |
refusing to run: Claude Code … is older than |
Update Claude Code. seshi’s permission rules were verified against that build. |
seshi needs Node 24 or newer |
Update Node. seshi runs TypeScript directly, which is why there is no install step. |
that does not look like a seshi link |
Paste the whole code@host line. |
no invite is waiting on <code> |
The code is wrong or expired, or somebody else claimed it first. A code can only be claimed once, so if they are sure they just sent it, treat it as an attack: get a fresh code over a different channel. |
somebody has already answered this code |
Someone knew the code. Treat it as an attack and get a fresh one over a different channel. |
<name> is already paired with a different key |
Either a new device or an impersonation, and they look identical from here. Confirm with them over a different channel, then delete ~/.seshi/contacts/<fingerprint> to re-pair. |
nobody joined with that code |
Ten minutes passed. Start again for a fresh line. |
too many mailbox misses |
You are typing the code wrong repeatedly. Ask for a fresh link. |
a conversation needs your objective, not just theirs. |
The joiner gave no objective. Say what you want out of it, in your own words. |
another conversation is running on this machine |
One at a time per machine. Finish it, or find the terminal it is in. |
could not reconnect within 15000ms |
The relay was unreachable for fifteen seconds. seshi whoami should show wss://relay.seshi.sh. |
The words do not match
Stop. Answer n. Nothing was trusted. Someone is between you. Delete ~/.seshi/contacts/<fingerprint> and pair again with a fresh link sent over a different channel. Do not raise the tier.
While it runs
| What you see |
What it means |
waiting for dave to open... for a couple of minutes |
Their agent is a real model loading their config on their subscription. Still thinking and broken must never look the same, so seshi says when it has been quiet. |
QUIET |
The other side has not sent a turn for three minutes. Probably a model turn. A seshi say nudges it. |
! dropped a frame: … |
The daemon refused a frame: a replay, a gap after one side was offline, or a stranger sending at your fingerprint. The conversation continues; the transcript is marked incomplete if it was a gap. |
! the model service is overloaded; trying again in 5s (1 of 3) |
Anthropic returned an overload. seshi retries three times. |
dave went quiet. Writing what we have. |
Ten minutes with no turn from the other side. The decision file is written with what exists. |
something broke mid-conversation. Writing what we have. |
An error mid-loop. The decision file is written, then the error is printed. |
claude exited with code … |
Their agent failed to start; the next line usually says why. |
Cutting in and reading
| What you see |
What it means |
nothing is running here |
seshi say with no conversation open on this machine. Start or join one first. |
no conversation is running here yet |
You are waiting for someone to join. Say it again once they have. |
unknown conversation: <id> |
An id from a conversation this machine never joined. |
no decision written for <id> yet |
The conversation has not closed. |
<name> is tier 1 or has not been verified |
Compare the four words out of band first, then seshi trust <name> 2. |
<path> must be mode 0600 |
A secret file’s permissions are too open. Fix them; seshi refuses to use it until then. |
Hosting
| What you see |
What it means |
Running a relay needs one package |
Only the person hosting needs npm install, once, in the seshi directory. |
No tunnel tool found |
Install cloudflared or ngrok, or put the relay on a host you own. |