Zurück zu den Projekten
experimentell

CCrab

Ein Desktop-Begleiter für Claude Code, der im Leerlauf null CPU kostet.

Ein nativer macOS-Desktop-Begleiter für Claude Code: eine Pixel-Krabbe auf einem schwebenden Panel, die darauf reagiert, was deine Agent-Sessions gerade tun — dazu ein Menüleisten-Item mit 5-Stunden- und Wochen-Verbrauchsbalken, allen aktiven Sessions und zuletzt genutzten Projekten. In Swift gegen AppKit und Core Animation geschrieben — kein Electron, kein WebView.

Problem

Ambienter Status für einen Coding-Agenten heißt sonst Browser-Tab oder Electron-App — beide verbrennen dauerhaft CPU für ein Widget, auf das man nur kurz schaut.

Was ich gebaut habe

Jede Animation ist eine Core-Animation-Keyframe-Animation über Layer-Contents, damit der Render-Server die Zeitachse besitzt und der Prozess keine Wakeups pro Frame bekommt. Die Ruhepose wird aus Vektor-Rects in CALayer geparst statt als Bitmap dekodiert, und Animationen werden entfernt — nicht pausiert —, sobald das Panel verdeckt ist, das Display schläft oder der Bildschirm sperrt.

Ergebnis

0,0 % CPU, egal ob im Leerlauf oder bei einer 60-Frame-Sprite-Schleife, mit einem auf drei Animationen begrenzten Decode-Cache, der beim Parken des Renderers komplett geleert wird.

Zielgruppe

Für Entwickler, die den ganzen Tag Claude Code laufen lassen und Session-Status und Limits im Blick haben wollen — ohne ein weiteres Electron-Fenster.

Entwickler-Setup

source without GitHub CLIgit clone https://github.com/jx-grxf/CCrab.git && cd CCrab
source with GitHub CLIgh repo clone jx-grxf/CCrab && cd CCrab
latest releaseopen https://github.com/jx-grxf/CCrab

Highlights

  • 0,0 % CPU im Leerlauf und während der Animation — Core Animation besitzt die Zeitachse, kein Timer, kein Draw-Loop.
  • Menüleiste mit 5-Stunden- und Wochen-Verbrauchsbalken, Reset-Countdown und jeder aktiven Session.
  • Status kommt über Claude-Code-Hooks an einen Loopback-Endpunkt — kein Polling, keine zusätzlichen API-Aufrufe, kein Token wird gelesen.
  • Der Verbinden-Schritt sichert deine settings.json vorher weg und lässt fremde Hook-Einträge unangetastet.