// 2026-04-24 · 4 min

cc-slim-statusline: branch w pasku i live mirror w PWA

cc-slim-statusline: branch w pasku i live mirror w PWA

TL;DR

Do cc-slim-statusline doszedł segment git brancha (⎇ main) — pojawia się tylko w repo, poza git segment znika bez śladu. Przy okazji jeden (…) &statusline.sh zrobił z pasek terminala drugi ekran dla voice-inboxa: PWA na iPhonie pokazuje teraz ten sam bar co terminal, więc wiem gdzie jest Claude Code nawet wtedy, gdy nie siedzę przy biurku.

To jest krótki update z pola, nie tutorial. Piszę bo pomyliłem branch i kosztowało mnie to godzinę — może komuś oszczędzę tę godzinę.

Jak się pomyliłem

Typowy freelancerski poniedziałek: trzy projekty klienckie otwarte w trzech oknach, Claude Code w każdym. W jednym z nich robiłem rebase feature brancha na main, przeszedłem do terminala, odpaliłem krótką poprawkę przez CC, /commit, git push.

Push poleciał na main. Bo rebase mnie tam przerzucił, a ja byłem pewien że nadal jestem na fix/notifications.

Godzina na odkręcenie: git reset --hard na mainie, force push (ostrożnie, nikt jeszcze nie pulowal), rebase feature’a od nowa. Niekrytyczne. Irytujące. I całkowicie do uniknięcia, gdyby branch był cały czas w moim polu widzenia.

Stary pasek nie miał brancha:

◧ 51k/1M 5% | ⏱ 15% → 3h9m | ⚡ medium | $0.81 | ◆ Opus 4.7 | ▸ my-project

Bo kiedy pisałem pierwszą wersję cc-slim-statusline, pracowałem głównie w jednym branchu na projekt. Branch nie był informacją — był szumem. Dziś, przy kilku feature branchach dziennie, brak brancha jest szumem.

Nowy pasek:

◧ 51k/1M 5% | ⏱ 15% → 3h9m | ⚡ medium | $0.81 | ◆ Opus 4.7 | ▸ my-project ⎇ main

Dlaczego akurat tak to napisałem

Dwie linijki:

branch=$(git -C "$cwd" symbolic-ref --quiet --short HEAD 2>/dev/null) [ -z "$branch" ] && branch=$(git -C "$cwd" rev-parse --short HEAD 2>/dev/null)

Świadome decyzje, a nie przypadek:

symbolic-ref zamiast branch --show-current. Ta druga polecana przez większość tutoriali milcząco zwraca pusty string w detached HEAD — czyli akurat wtedy, kiedy najbardziej chcesz wiedzieć, że wylądowałeś gdzie indziej niż myślisz. symbolic-ref --quiet zwraca błąd (exit 1), łapię go przez 2>/dev/null i fallbackuję na short SHA. Detached HEAD = widzisz SHA, nie pustkę.

git -C "$cwd" zamiast [ -e "$cwd/.git" ] guard. Druga wersja wydaje się czystsza — „sprawdź czy to repo zanim odpalisz gita”. Problem: matchuje tylko root repo. Gdy Claude Code startuje w tools/voice-inbox/ wewnątrz monorepo stroniarz.pl/, .git jest piętro wyżej i guard zwraca false. Branch znika tam, gdzie najbardziej mi zależy. git -C po prostu deleguje wykrywanie repo do gita — który robi to poprawnie od lat.

Brak brancha = brak segmentu. Nie „no branch”, nie -, nie pusty nawias. Jeśli nie jestem w repo, statusline nie udaje że jestem. To jest ta sama zasada co reszta paska: niedostępna wartość znika, a nie wyświetla śmieci.

Koszt: jeden fork git na render (~1ms), raz na turę CC. Niemierzalne.

Bonus: mirror w PWA

Mam lokalną appkę na Maca, voice-inbox, która głosowo czyta mi powiadomienia z Slacka/Gmaila/Linear. Do tego ma prosty PWA do podglądu na telefonie. Pomyślałem: skoro i tak mam ten pasek w terminalu, czemu nie wysłać go też do PWA?

Cały kod po stronie statusline’a:

(   printf '%s' "$input" | curl -sS -X POST      -H 'content-type: application/json'      --data-binary @-      -m 1 "$VOICE_INBOX_URL" > /dev/null 2>&1 ) &

Nawias + & = fire-and-forget w tle. -m 1 = max sekunda na cały request. Voice-inbox może być offline, ja mogę być w samolocie, terminalowy statusline nigdy nie czeka dłużej niż ułamek sekundy. Payload to surowy JSON od CC — serwer po swojej stronie dorabia branch ze ścieżki i wrzuca do statsów.

Efekt: Claude Code pracuje w tle nad długim taskiem (deep research z NotebookLM, 25-minutowy crawl), ja idę po kawę, zaglądam na PWA na iPhonie — widzę dokładnie ten sam pasek co w terminalu. Wiem czy skończył, ile zjadł, w którym projekcie/branchu jest.

Nie jest to rewolucja. Jest to 5 linijek bash, które znikają frykcję „muszę wrócić do biurka żeby sprawdzić”.

Co chcę przekazać

Dwie rzeczy, jeśli piszesz własny statusline (albo cokolwiek co ma git pod spodem):

  1. symbolic-ref > branch --show-current. Zawsze. Jedyna kombinacja, która poprawnie obsługuje detached HEAD bez dodatkowej logiki.
  2. Jeśli myślisz „dodam X tylko na wszelki wypadek” — nie dodawaj. Ja dodałem brancha wtedy, kiedy zacząłem go realnie potrzebować. Wcześniej byłby szumem. Pasek statusu to nie gablota trofeów, to sygnał.

Koszt update’a: 30 minut kodu, godzina testów na własnej konsoli, commit. Zero breaking changes dla osób, które mają już cc-slim-statusline zainstalowany — curl install.sh | bash jeszcze raz i gotowe.

Linki