”Another runner is already running - exiting”
What it means. The singleton lock at~/.slackhive/runner.lock is held by a live process. A second runner (from npm run dev, tsx watch, or an accidental re-invocation) tried to boot and refused.
Fix:
slackhive stop sweeps orphan processes and unlinks the lock. Then start acquires it cleanly.
Amber “stale” dot on an agent
What it means. The agent’s row says it’s running, but the runner stopped sending heartbeats (missed ≥ 45s). Usually the runner crashed or waskill -9’d.
Fix:
”Slack bot token is invalid or revoked”
What it means. The runner probed Slack with the saved bot token and Slack rejected it. The agent’slastError shows the full message.
Fix:
- Open the affected agent → Overview
- Open Manage Slack in the Slack connection card
- Paste a fresh Bot Token and App-Level Token
- Add the Signing Secret only if your workspace requires it
- Save the connection, then restart the agent if it does not reconnect automatically
Stale lock after a crash
What it means. The runner was killed without cleanup (kill -9, power loss). The lock file points to a PID that no longer exists.
Fix: none needed - slackhive start auto-detects stale locks (checks the PID with process.kill(pid, 0)), removes the lock, and starts cleanly.
Dashboard AI backend badge is amber or red
What it means. The dashboard header shows the active AI backend status. Amber usually means the local login or cached credential needs refresh. Red means SlackHive cannot find a usable credential for the selected backend. Fix:- Open Settings → AI Backend
- Check which backend is selected
- For Codex/OpenAI, refresh your
codex login/ ChatGPT session or setOPENAI_API_KEY - For Claude/Anthropic, run
claude loginor setANTHROPIC_API_KEY - Save or detect credentials again, then restart with
slackhive stop && slackhive startif you changed.env
OAuth MCP stopped working
What it means. The OAuth token expired or was revoked. Fix:- Open MCP Catalog
- Find the server and click Test
- If the token is expired, click Reconnect or edit the server and paste a fresh token
- If the server was imported from Claude Code CLI, refresh
claude login, then re-import or update the server - If it references
${env:NAME}, confirm the secret still exists in Settings → Env Vars
Linux: claude login says “keyring unavailable”
What it means. Common on headless servers or fresh Linux VMs - no GNOME/KDE keyring daemon running, so secret-tool has nowhere to write.
Fix (pick one):
- Start a lightweight keyring:
gnome-keyring-daemon --start(requires dbus session) - Set
DBUS_SESSION_BUS_ADDRESSto an active bus if you have one - Ignore it -
claude loginfalls back to writing~/.claude/.credentials.jsondirectly. SlackHive picks it up from there
Port conflicts
What it means. Default ports 3001 (web) or 3002 (runner) are taken. Fix: none - the CLI auto-negotiates free ports. Check the actual ports with:PORT and RUNNER_INTERNAL_PORT in .env.
Agent shows “error” status
What it means. The runner tried to start the agent and something failed - Slack auth, MCP connection, missing integration. The real reason is inlastError on the agent detail page.
Fix: read the error, fix the underlying cause (bad token, missing env var, offline MCP server), then restart the agent from the detail page.
Logs don’t show up in the UI
What it means. The log SSE stream is disconnected. Fix: reload the page. If it stays disconnected, checkslackhive status - the web server may be down. slackhive start recovers it.
Agent directory left behind after delete
What it means. In older versions, deleting an agent left~/.slackhive/agents/<slug>/ on disk. Fixed in the current release - delete now removes the directory too.
Fix for legacy orphans:
Still stuck?
Check~/.slackhive/logs/runner.log for the full stream. Each line is JSON - most errors include a message and an error field that points straight at the cause.