A silent Runi is always one of a small number of things, and every one leaves a trace on the machine. Start with the doctor. It reads all of those traces in one pass and prints a line per subsystem, which is faster than working down this page by hand.
$ cd # into the repository where you expected work to appear
$ runi doctor
Not on your path? It sits beside the daemon at
~/.relay/relay-doctor. It exits 1 when anything failed, so a
script can gate on it. Every line it can print is explained in
Reading runi doctor.
The seven causes, in order#
Check them in this order. Each one makes the ones below it impossible to diagnose.
1. This machine is not signed in#
FAIL config ~/.relay/config.json missing or unreadable —
install from the app (Settings → Agents)
The daemon has no credentials. It signs in separately from the app, so being signed into the window proves nothing about this.
Connect an agent from Settings → Agents, which performs that sign-in. See Connect your first agent.
2. The repository is not tracked#
warn this repo scratchpad (a1b2c3) is not tracked — sessions here
stay private. Add it in the app under Repositories.
Hooks are installed globally and do nothing outside tracked repositories. Nothing is captured and nothing is sent.
Add it in Settings → Repositories, then start a new session. See Repositories.
3. No hooks are registered#
warn hooks no Runi hook entries registered — connect Claude Code
from the app
Connect that agent. If you connected from the portable Windows build, it was refused on purpose. See Install problems.
4. Hooks point at a file that is gone#
FAIL hooks registered but pointing at missing file(s):
C:\Users\…\Temp\2F8B\relay-hook.cmd — reinstall from the app
The hook points at a file that has gone. Almost always because Runi was connected from the portable build, whose folder disappears when you quit it. The hook then fails silently on every event, which looks exactly like "no work happened".
Reconnect the agent from an installed build.
5. The two hooks that carry the product are missing#
FAIL hooks SessionStart not registered — sessions start with no
team briefing and adopt no task
A machine registered only for the later events publishes steps and turn endings all day, so the teammate looks busy, while every session starts with no briefing, no linked task and no prompt. This is why the doctor checks which events are registered instead of counting them.
Reconnect the agent from the app, which registers the full set.
6. This account cannot write#
FAIL publish last attempt failed: access-denied — this account is
read-only in the workspace, or was removed
FAIL publish last attempt failed: auth-expired — sign in again
from the app
For access-denied, ask an owner or admin for member access.
A viewer's writes are refused by the database, not hidden by the UI. For
auth-expired, sign in again from the app.
Either way, expect a pile of dead letters afterwards. Deal with those here.
7. Writes are queued, or were refused#
warn outbox 14 write(s) waiting (oldest 2 h ago)
FAIL dead-letter 863 rejected write(s) need review
Pending writes replay on their own with bounded backoff. Rejected ones need a decision from you: Queued and rejected writes.
Agent-specific silence#
| Agent | The usual reason |
|---|---|
| OpenClaw | Its default workspace is not a Git repository, so there is nothing to attribute a session to. Expected on a fresh install, and the doctor says so by name. |
| Codex | The rollout watcher is not running, so Desktop and VS Code sessions are unobserved. Opening the Runi app starts it. |
| Cursor | Version older than 2.2. Agent hooks did not exist, so the connect registered nothing. |
| OpenCode | Version older than 1.18. The plugin is not loaded. |
| Gemini CLI | Version older than 0.5. No hook system to register into. |
| Claude Code on the web | Runs in a cloud sandbox with no local machine to observe. Not supported, and cannot be. |
Registered, and still nothing#
Registration is not firing. A hook can be written perfectly into a settings file the agent never reads, or a wrapper the shell cannot execute, and that failure is invisible from the settings alone. So the doctor compares registration against what has arrived:
warn hooks registered but never observed firing: SessionStart —
other events have arrived, so the hook runs; these specific
ones are not reaching it
If you see that, run the hook by hand and read what comes back. Nothing is
published under DRY_RUN:
$ echo '{"hook_event_name":"UserPromptSubmit","prompt":"hello"}' \
| DRY_RUN=1 node ~/.relay/daemon/hooks/claude.js
Everything is green and the app still looks empty#
The doctor's closing line covers this:
Nothing broken. If the app still looks empty, work in a tracked repo
and give it one prompt.
Three states that are working as designed:
- The workspace is new. There is nothing to brief with until sessions have happened. See What to expect in the first hour.
- You are alone in it. Most of the surface is about other people. One seat sees activity, not collaboration.
- Your sharing switches are off. Files still travel; prompts and change detail do not. See The two sharing switches.
Still stuck#
Email us and paste the doctor's output. It is the single most useful thing you can send, and it usually turns three exchanges into one.