NAME
steadystate troubleshooting - common issues and solutions
AUTHENTICATION ISSUES
“Refresh token has expired or been revoked”
Cause: Your authentication session has expired.
Solution:
steadystate logout
steadystate login
Device code expires before authorization
Cause: The device code has a 15-minute timeout.
Solution: Run steadystate login again
and complete authorization more quickly.
“Failed to get user info from GitHub”
Cause: Network issue or GitHub API problem.
Solution: 1. Check internet connection 2. Verify GitHub status at githubstatus.com 3. Try again in a few minutes
CONNECTION ISSUES
“Permission denied (publickey)”
Cause: Your SSH key isn’t authorized for the session.
Solutions:
Ensure you’re logged in:
steadystate whoamiVerify your GitHub account has SSH keys:
curl https://github.com/<username>.keysEnsure you’re a collaborator on the repository
Ask the session host to re-create the session
“Connection refused”
Cause: Cannot reach the session host.
Solutions:
Verify you can reach the host:
ping <host-ip>Check the port is correct:
nc -zv <host-ip> <port>Ask the host to check firewall settings:
sudo ufw allow <port>/tcpIf on different networks, you may need VPN or port forwarding
“Host key verification failed”
Cause: SSH host key mismatch.
Solutions:
The magic link may be outdated - ask host for a new one
Remove old known_hosts entry:
ssh-keygen -R "[host]:port"
Connection hangs
Cause: Firewall blocking, network timeout, or sshd not running.
Solutions:
Try with verbose SSH:
ssh -v -p <port> user@hostCheck if sshd is running (host side):
ps aux | grep sshdCheck sshd logs (host side):
journalctl -u steadystate -f
SYNC ISSUES
“Push failed - please sync again”
Cause: Another collaborator pushed changes while you were syncing.
Solution: This is normal in active collaboration. Just run:
steadystate sync
The second sync will fetch their changes, merge, and push.
“Binary file conflict”
Cause: Two users modified the same binary file (image, PDF, etc.).
Solution: Binary files cannot be auto-merged. Coordinate with your collaborator:
- Decide whose version to keep
- One user reverts their change
- Both users sync
Sync completes but changes don’t appear
Cause: May be looking at wrong directory or stale worktree.
Solutions:
Verify you’re in the worktree:
pwd ls -la .worktree/Check the sync actually pushed:
cd ../canonical git log -1Other user should sync:
steadystate sync
“Metadata file not found”
Cause: Not in a SteadyState worktree, or worktree corrupted.
Solution:
Navigate to your worktree:
cd ~/worktrees/<username>If corrupted, leave and rejoin the session
Merge produces unexpected results
Cause: Both users edited the exact same text.
Explanation: SteadyState uses an additive merge strategy. If two users replace the same word with different values, both replacements are kept (canonical first, then local).
Example:
Base: "Hello World"
User A: "Hi World"
User B: "Hey World"
Result: "HeyHi World"
Solution: Coordinate with collaborators to work on different sections. After sync, manually clean up if needed.
SESSION ISSUES
“Session not found”
Cause: Session expired, terminated, or backend restarted.
Solution: Ask the host to create a new session.
Dashboard shows “Observer - No worktree”
Cause: Opened dashboard without joining first.
Solution: Use steadystate join to
create your worktree, then use dashboard.
Session host cannot see collaborators’ changes
Cause: Collaborators haven’t synced, or sync failed.
Solution:
- Ask collaborators to run
steadystate sync - Host should also run
steadystate syncto fetch their changes
Magic link doesn’t work
Cause: URL encoding issues or incomplete copy.
Solutions:
Ensure the entire link is quoted:
steadystate join "steadystate://collab/...full-link..."Check for truncation - the link should include
host_key=Ask host to share via a method that preserves the full URL
BACKEND ISSUES
Backend won’t start
Cause: Missing configuration or port conflict.
Solutions:
Check required environment variables:
echo $GITHUB_CLIENT_ID echo $GITHUB_CLIENT_SECRET echo $JWT_SECRETCheck port availability:
lsof -i :3000Check logs:
RUST_LOG=debug ./steadystate-backend
“Address already in use” for SSH
Cause: Port conflict with another sshd or service.
Solution: The backend now uses dynamic port allocation. If you see this error, ensure the port range (2000-3000) is available.
GitHub OAuth errors
Cause: Misconfigured OAuth app.
Solutions:
- Verify Client ID and Secret are correct
- Check OAuth app callback URL matches your backend URL
- Ensure OAuth app is not suspended
DEBUGGING
Enable debug logging
export RUST_LOG=debug
steadystate sync
Enable merge debugging
export STEADYSTATE_DEBUG_MERGE=1
steadystate sync
Check session files
Inside a session:
# View session metadata
cat .worktree/steadystate.json
# View sync log
cat ../sync-log
# View active users
cat ../active-users
# Check canonical state
cd ../canonical && git log --oneline -5
Test SSH manually
ssh -v -p <port> \
-o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null \
steadystate@<host>
GETTING HELP
If your issue isn’t covered here:
- Check existing issues: https://github.com/b-rodrigues/steadystate/issues
- Open a new issue with:
- SteadyState version
- Operating system
- Steps to reproduce
- Error messages and logs
- Output of
steadystate whoami
SEE ALSO
steadystate(1), ssh(1), git(1)