← Alle Playbooks
Playbook· setup

Statusline für Claude Code, in 15 Minuten Kontext im Blick

Wie Du Dir mit einer Shell-Skript-Zeile in settings.json eine eigene Statusline baust. Aktuelles Modell, Context-Prozent, Git-Branch, Kosten-Ticker. Mit konkretem Beispiel-Skript und den Stolperfallen die ich beim ersten Versuch eingesammelt habe.

Claude Code zeigt Dir im Normalfall nur das Notwendigste am unteren Rand. Welches Modell, ob Vim-Mode an ist, das war es. Wenn Du länger arbeitest, merkst Du dass Du Sachen vermisst. Wieviel Prozent vom Context ist verbraucht. In welchem Git-Branch bist Du. Wie hoch sind die Kosten der laufenden Session. Genau das kannst Du Dir selbst dazumalen, mit einer Zeile in der settings.json und einem Shell-Skript. Ich zeig Dir wie das geht und welche Anfänger-Fehler ich gemacht hab.

1. Verstehen wie die Statusline tickt

Claude Code ruft alle paar Sekunden ein Shell-Kommando auf und zeigt dessen Stdout-Ausgabe als Statusline. Das Kommando bekommt JSON auf Stdin, mit den wichtigsten Session-Daten. Modell, Context-Window, Working-Directory, Token-Counts. Alles was Du brauchst um was Sinnvolles anzuzeigen.

Das heißt: alles was Du in Bash oder mit jq machen kannst, kannst Du in der Statusline anzeigen. Modell-Name, Branch, Kosten, ein gruener Punkt wenn Tests gruen sind, was auch immer.

2. Den ersten Eintrag in settings.json

Mach Deine ~/.claude/settings.json auf und ergaenz den Block:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 2
  }
}

type ist immer command, anders gibt es nicht. command ist entweder ein Pfad zu einem Skript oder ein Inline-Shell-Kommando. padding packt horizontalen Abstand drumherum, optional. Es gibt noch refreshInterval (Millisekunden) wenn Du Dein Skript regelmäßig neu starten willst und hideVimModeIndicator falls Du den eingebauten Vim-Mode-Indicator ausblenden willst.

3. Das Minimal-Skript

Leg ~/.claude/statusline.sh an, ausfuehrbar machen, drei Zeilen rein:

#!/bin/bash
input=$(cat)
echo "$input" | jq -r '"[\(.model.display_name)] \(.workspace.current_dir | split("/") | last)"'
chmod +x ~/.claude/statusline.sh

Claude Code neu starten, Du siehst sowas wie [Opus 4.7] academy unten. Modell-Name und letzter Ordner-Name aus dem Working-Dir. Mehr nicht, aber der Bauplan steht.

4. Context-Auslastung dazumalen

Das ist der Eintrag den ich am meisten brauche. Wenn ich bei 80 Prozent Context bin, muss ich über Compact oder neuen Tab nachdenken. Dazu erweiterst Du die jq-Zeile:

#!/bin/bash
input=$(cat)
echo "$input" | jq -r '
  "[\(.model.display_name)] " +
  "\(.workspace.current_dir | split("/") | last) " +
  "ctx:\(.context_window.used_percentage // 0 | floor)%"
'

Resultat: [Opus 4.7] academy ctx:62%. Sobald die Zahl über 75 geht, sehe ich es. Bei der ersten Version hatte ich used_percentage ohne den Default-Operator // 0 benutzt, beim ersten Aufruf nach Start war das Feld noch null und die Statusline zeigte gar nichts an. Lehre: defensive Defaults setzen, das Stdin-JSON ist nicht immer komplett.

5. Git-Branch dazu

Wenn Du im Git-Repo arbeitest, ist der Branch ein no-brainer. Aber Achtung, Du bist nicht immer in einem Git-Verzeichnis, das Kommando muss das aushalten.

branch=$(cd "$(echo "$input" | jq -r '.workspace.current_dir')" 2>/dev/null && git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
[ -n "$branch" ] && branch=" git:$branch"

Dann an die echo-Zeile dranhaengen: ... ctx:62% git:main.

Stolperfalle hier: das cd muss in einer Subshell sein, sonst änderst Du das aktuelle Verzeichnis des Skripts. Mein erstes Skript hat das cd nicht in $(...) geklammert und ploetzlich gab es Folgefehler weil der nächste Befehl woanders ausgeführt wurde als gedacht.

6. Kosten-Ticker einbauen

Stdin liefert auch total_cost_usd falls Du es einblenden willst. Bei mir läuft das für Sessions die länger laufen.

cost=$(echo "$input" | jq -r '.total_cost_usd // 0 | . * 100 | floor / 100')
[ "$cost" != "0" ] && cost=" \$$cost"

Vorsicht: die genaue JSON-Struktur kann sich zwischen Claude Code Versionen unterscheiden. Wenn das Feld bei Dir anders heißt, lass Dir das volle Stdin einmal in eine Logdatei schreiben und schau nach. Ein echo "$input" >> /tmp/statusline-debug.log ist Dein Freund.

7. Inline statt Skript

Wenn Du das Skript-Drumherum sparen willst, kannst Du das Kommando auch direkt in die settings.json packen. Sieht so aus:

{
  "statusLine": {
    "type": "command",
    "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% ctx\"'"
  }
}

Funktioniert, ist aber bei laengeren Statuslines wegen JSON-Escaping ein Albtraum. Ab drei jq-Filtern lieber Skript-Datei nutzen, dann kannst Du auch syntax-highlighting im Editor haben.

8. Team-Setup mit Projekt-Statusline

Die Statusline kannst Du auch projektweit setzen, indem Du den Block in die .claude/settings.json im Repo legst statt in die globale unter ~/.claude/. Sinnvoll wenn das Team einheitliche Anzeige will, zum Beispiel "wir wollen alle die Test-Suite-Farbe sehen".

Wenn Du Skripte aus dem Repo aufrufst, denk dran, dass die Skripte ausfuehrbar im Git landen müssen. git update-index --chmod=+x .claude/statusline.sh setzt das Executable-Bit ein, sonst funktioniert es nach git clone bei den Kollegen nicht.

Bei mir wars: Skript-Datei eingecheckt, lokal lief alles. Kollege hat gepullt, hatte aber kein chmod-Bit drauf, Statusline blieb leer. Drei Slack-Nachrichten, dann gefunden. Seitdem immer mit update-index --chmod=+x.

9. Debuggen wenn nix kommt

Drei Sachen die mir passiert sind. Erstens, settings.json kaputt nach Edit, Claude Code lädt sie still nicht. Lösung: jq . ~/.claude/settings.json zeigt Syntax-Fehler. Zweitens, Skript hat keinen Executable-Bit, ls -la checkt das, chmod +x fixt es. Drittens, Skript läuft aber Stdout ist leer wegen jq-Fehler. Lösung: das Skript einmal manuell mit Beispiel-JSON pipen.

echo '{"model":{"display_name":"Opus 4.7"},"workspace":{"current_dir":"/tmp/test"}}' | ~/.claude/statusline.sh

Wenn das was Sinnvolles ausgibt, ist das Skript OK und der Fehler liegt am Eingangs-JSON von Claude Code. Dann hilft nur echo "$input" > /tmp/claude-statusline-input.log einbauen und schauen was wirklich reinkommt.

10. Was als nächstes

Wenn die Statusline läuft, schau Dir Context Window managen in Claude Code an, weil die Anzeige nur die halbe Miete ist, das Reagieren auf die Zahl ist die andere Hälfte. Wenn Du auch Kosten im Blick haben willst, Claude Code Cost Controls für Daily Driver hat die Mechanik. Und wenn Du den Style der Antworten dazu noch anpassen willst, das passende Playbook ist Output Styles für Claude Code.

Für den Lesson-Layer passt Hooks und Skills als Konzept-Refresher, weil Statusline ein lokaler Side-Effect ist und damit konzeptionell verwandt mit Hook-Pattern.

Source

Statusline offiziell: https://code.claude.com/docs/en/statusline