claude-rc-keep: Remote-Control-Sessions online halten

Ein kleines Werkzeug, das Remote-Control-Sessions von Claude Code nach einem Neustart oder einem beendeten Prozess wieder startet, sodass sich die offene Web-Session mit dem vollständigen Verlauf neu verbindet.

Das Problem

Mit Remote Control lässt sich eine Claude-Code-Session, die auf einem Server läuft, über claude.ai/code oder die Claude-App auf dem Handy fortsetzen. Startet der Server neu oder wird der Session-Prozess beendet, zeigt die Web-Session "Can't reach . It may be asleep or offline." und bleibt in diesem Zustand. claude remote-control kommt als systemd-Dienst zurück, übernimmt die vorher laufenden Sessions aber nicht zuverlässig.

Alle folgenden Issues sind offen (Reaktionen Stand 2026-10-21):

Wie es funktioniert

Claude Code schreibt für jede laufende Session eine Datei ~/.claude/sessions/<pid>.json mit der lokalen Session-ID, dem Ordner und, wenn Remote Control aktiv ist, der ID der Web-Session (bridgeSessionId). Die Datei wird gelöscht, wenn der Prozess endet. claude-rc-keep läuft jede Minute über einen systemd-User-Timer und kopiert diese Einträge in ein eigenes Register unter ~/.local/state/claude-rc-keep/. Eine erfasste Session, die nicht mehr läuft, wird als claude --resume <id> --remote-control in einem abgekoppelten tmux in ihrem ursprünglichen Ordner neu gestartet. Eine interaktive Session verbindet sich wieder mit derselben Web-Session. Der offene Tab auf dem Handy oder im Browser verbindet sich dann neu und zeigt den vollständigen Verlauf.

Sessions, die der Server claude remote-control gestartet hat, werden anders behandelt. Nach einem Neustart übernimmt der Server manchmal selbst eine alte Web-Session, und sein Worker überschreibt das lokale Transkript mit der Kopie vom Server. Die README hält einen Fall fest, in dem das Transkript von 77 MB auf 14 MB schrumpfte und alles vor dem letzten /compact aus der Datei verschwunden war. claude-rc-keep stellt eine Server-Session deshalb einmalig mit --fork-session wieder her: als Kopie mit neuer lokaler ID und neuer Web-URL, die das ursprüngliche Transkript unverändert lässt. Danach ist die Kopie eine interaktive Session und behält ihre URL.

Eine Session ohne neue Nachricht seit mehr als 3 Tagen wird gestoppt und aus dem Register entfernt. Ihr Transkript bleibt erhalten, claude --resume funktioniert also weiter. CLAUDE_RC_KEEP_MAX_IDLE_DAYS ändert die Grenze, 0 schaltet sie ab. claude-rc-keep rm stoppt eine Session dauerhaft.

Das ist die Ausgabe von claude-rc-keep ls für ein Register mit drei Beispieleinträgen:

$ claude-rc-keep ls
4f1c09ab  running           10-21 16:42  ~/projects/app  https://claude.ai/code/session_01EXAMPLEA
9b72d4e0  stopped           10-21 16:42  ~/projects/app  https://claude.ai/code/session_01EXAMPLEB
c35e8a17  running (server)  10-21 16:42  ~/projects/app  https://claude.ai/code/session_01EXAMPLEC

Tests

Die Tests laufen gegen temporäre Konfigurations- und Zustandsverzeichnisse und nutzen kurzlebige echte Prozesse als Sessions. Sie prüfen, dass tote PIDs ignoriert werden und dass eine von einem anderen Prozess wiederverwendete PID über die Startzeit des Prozesses in /proc erkannt wird. Die Neustart-Logik wird mit einem eingeschleusten Starter getestet: Eine fehlende Session wird mit dem erwarteten Befehl gestartet und innerhalb einer Schonfrist von 300 Sekunden nicht erneut, eine Server-Session wird nur einmal geforkt, und Sessions mit leerem Transkript oder gelöschtem Ordner werden übersprungen. Weitere Tests stoppen und entfernen eine inaktive Session nach 3 Tagen, behalten sie bei der Grenze 0 und ignorieren beim Bestimmen der letzten Aktivität die Einträge, die Claude Code beim Neustart schreibt. Ein Test startet echte tmux-Fenster und prüft, dass der Neustart einer Session ihr vorhandenes Fenster ersetzt.

Das CI führt die Tests auf Python 3.10 bis 3.13 aus, prüft mit ruff und ruft tick und ls gegen ein leeres Profil auf. Laut README ist das Werkzeug mit Claude Code 2.1.306 getestet.

Grenzen

  • Es braucht Linux mit systemd-User-Diensten und tmux.
  • Die Session-Dateien sind nicht dokumentiert und können sich mit jeder Version von Claude Code ändern.
  • Jede neu gestartete Session ist ein vollständiger Claude-Code-Prozess mit etwa 270 MB Speicher.
  • Eine wiederhergestellte Server-Session bekommt eine neue Web-URL. Der alte Tab bleibt offline oder zeigt die Kopie des Servers, falls dieser die Session übernommen hat.
  • Eine Session, die im tmux-Fenster mit /exit beendet wird, startet innerhalb einer Minute neu. Dauerhaft stoppt man sie mit claude-rc-keep rm.
  • Eine Session, die mitten in einer Aufgabe unterbrochen wurde, wird wiederhergestellt, arbeitet aber erst nach einer neuen Nachricht weiter.

Code und Installationsanleitung liegen unter github.com/Jwrede/claude-rc-keep.