Blog

Claude Code usuwa historię po 30 dniach: jak ją zachować

Markdown

Gdzie przechowywane są sesje Claude Code, jak skonfigurować cleanupPeriodDays oraz jak zorganizować zewnętrzne archiwum za pomocą rsync, launchd lub cron.

Przeczytaj cały artykuł

Aby uzyskać pomoc w korzystaniu z usługi, zobacz dokumentację Ailoot.

Czy Claude Code naprawdę usuwa historię sesji?

Najważniejsze informacje

Tak. Przy każdym uruchomieniu Claude Code usuwa pliki sesji starsze niż 30 dni. Odpowiada za to ustawienie cleanupPeriodDays w pliku ~/.claude/settings.json; jego wartość domyślna to 30. Usuwanie odbywa się bez ostrzeżenia, bez pytania o zgodę i bez możliwości odzyskania plików.

Otwierasz Claude Code, żeby wrócić do sesji sprzed dwóch miesięcy — a jej nie ma. Plik został całkowicie usunięty z dysku. To nie usterka ani rzadki błąd: tak działa domyślny mechanizm czyszczenia.

Za czyszczenie odpowiada jedno ustawienie: cleanupPeriodDays. Jego wartość domyślna to 30. Przy każdym uruchomieniu Claude Code skanuje folder historii i usuwa wszystko, co jest starsze niż ten okres. W moim pliku ~/.claude/settings.json w ogóle nie było tego ustawienia, więc obowiązywała wartość domyślna, a część moich starszych sesji już zniknęła.

W repozytorium Anthropic otwartych jest kilka zgłoszeń błędów dotyczących tej sprawy i żadne z nich nie zostało naprawione.

Gdzie Claude Code przechowuje historię sesji?

Najważniejsze informacje

Historia każdej sesji jest przechowywana w pliku ~/.claude/projects/<project-path>/<session-id>.jsonl. Nazwą folderu jest bezwzględna ścieżka katalogu roboczego, w którym uruchomiono Claude Code, ze znakami ukośnika zastąpionymi łącznikami. Plik .jsonl zawiera całą rozmowę, linia po linii: Twoje prompty, odpowiedzi modelu, wywołania narzędzi i edycje plików. To właśnie te dane usuwa mechanizm czyszczenia.

Znalezienie historii jest proste. Otwórz terminal i wyświetl zawartość folderu:

ls ~/.claude/projects/

Każdy podfolder odpowiada osobnemu projektowi. Jego nazwa koduje ścieżkę: na przykład projekt w lokalizacji /Users/alex/dev/shop będzie miał folder -Users-alex-dev-shop. W środku znajdują się pliki sesji:

ls -lt ~/.claude/projects/-Users-alex-dev-shop/
# 3f8a1c2e-....jsonl   ← jedna sesja = jeden plik
# a91b7d40-....jsonl

Każdy plik .jsonl to dziennik zapisany linia po linii: jedna linia odpowiada jednemu zdarzeniu w sesji. Zawiera więcej niż sam tekst rozmowy. Przechowuje tok rozumowania stojący za Twoimi decyzjami: dlaczego wybrano określoną strukturę bazy danych, które opcje odrzucono, gdzie Claude popełnił błąd i jak go poprawiono.

W istocie jest to dziennik rozwoju projektu. Dlatego jego utrata boli: tracisz nie „czat”, lecz kontekst budowany przez wiele tygodni. O tym, jak jest zorganizowany, pisałem w poradniku „Claude Memory a CLAUDE.md”.

Dlaczego Anthropic usuwa transkrypcje po 30 dniach?

Najważniejsze informacje

Stanowisko Anthropic dotyczy prywatności i bezpieczeństwa. Pliki sesji są przechowywane na dysku w postaci zwykłego tekstu i mogą zawierać kod źródłowy, hasła oraz klucze API. Bezterminowe przechowywanie stanowi ryzyko: jeśli laptop zostanie skradziony lub ktoś uzyska dostęp do dysku, otrzyma wszystkie te wrażliwe dane. Okres 30 dni ma równoważyć „możliwość wznowienia niedawnej pracy” z „nieprzechowywaniem tajemnic na dysku dłużej, niż to konieczne”.

Usuwanie ma swoje uzasadnienie i warto je zrozumieć, zanim całkowicie je wyłączysz. Transkrypcja to zwykły tekst. Jeśli Claude odczytał podczas sesji plik .env, wstawił klucz do polecenia albo wkleiłeś hasło do promptu, wszystko to znalazło się w pliku .jsonl w postaci zwykłego tekstu. Im dłużej taki plik pozostaje na dysku, tym większe ryzyko, że kiedyś wycieknie.

Anthropic jasno stwierdza, że transkrypcje mogą zawierać kod źródłowy, dane uwierzytelniające i inne wrażliwe materiały, a przechowywanie ich na dysku dłużej, niż to konieczne, stwarza realne zagrożenie dla prywatności. Okres 30 dni wybrano jako kompromis.

Zastrzeżenia społeczności dotyczą trzech kwestii: usuwanie odbywa się po cichu (podczas konfiguracji ani uruchamiania nie pojawia się ostrzeżenie), użytkownik nie wyraża zgody (nikt go o nią nie pyta), a plików nie można odzyskać (nie trafiają do Kosza i nie ma możliwości cofnięcia operacji). W issue #59248 programiści proszą o jedną rzecz: sprawiedliwsze czyszczenie — ostrzeżenie, okres umożliwiający odzyskanie oraz mniej restrykcyjny domyślny czas przechowywania.

Dlaczego skrypt kopii zapasowej może sam wywołać usuwanie?

Najważniejsze informacje

Mechanizm czyszczenia decyduje, co usunąć, na podstawie czasu modyfikacji pliku (mtime). Nie sprawdza faktycznej ostatniej aktywności w sesji. Każdy proces, który dotknie pliku .jsonl — synchronizacja z chmurą, rsync, edytor czy skrypt — może zmienić jego mtime i sprawić, że świeża sesja będzie wyglądać na przestarzałą. Przy następnym uruchomieniu Claude Code uzna ją za starą i usunie. Paradoks polega na tym, że nieprzemyślana próba utworzenia kopii historii w zarządzanym folderze przyspiesza jej utratę.

To najbardziej podstępny problem i właśnie na nim potykają się osoby, które próbują samodzielnie chronić swoje dane. Mechanizm czyszczenia sprawdza mtime, czyli znacznik czasu ostatniej modyfikacji pliku. Zakłada, że mtime odzwierciedla czas ostatniej pracy w sesji. W praktyce może go zmienić niemal wszystko: klient synchronizacji Dropbox lub iCloud, rsync, oprogramowanie antywirusowe, indeksator albo własny skrypt kopii zapasowej.

Oto pułapka. Postanawiasz zachować historię i konfigurujesz synchronizację z chmurą dla ~/.claude/projects/. W pewnym momencie usługa synchronizacji ponownie zapisuje plik i ustawia jego mtime na wcześniejszą datę (może się tak zdarzyć podczas przywracania z kopii w chmurze). Claude Code widzi przy uruchomieniu „stary” plik i go usuwa. Chcesz go zachować, ale przyspieszasz jego usunięcie.

Wniosek jest tylko jeden: kopia zapasowa musi znajdować się poza ~/.claude/projects/. Mechanizm czyszczenia działa wyłącznie w tym folderze. Kopia przechowywana poza nim jest poza jego zasięgiem. Na tej zasadzie oprę rozwiązanie.

Jak natychmiast zatrzymać usuwanie historii?

Najważniejsze informacje

Wystarczy jedno ustawienie. Otwórz ~/.claude/settings.json i ustaw cleanupPeriodDays na dużą wartość, na przykład 3650 (dziesięć lat). W praktyce wyłącza to automatyczne usuwanie: nic nie będzie starsze niż ten limit. Ważne: to ustawienie chroni tylko to, co nie zostało jeszcze usunięte. Historii skasowanej przez mechanizm czyszczenia nie da się przywrócić. Dlatego pierwszym krokiem jest działanie, zanim stracisz kolejną sesję.

Zatrzymaj usuwanie w trzech krokach:

  1. Otwórz plik ustawień: ~/.claude/settings.json (jeśli plik nie istnieje, utwórz go).
  2. Dodaj ustawienie cleanupPeriodDays z dużą wartością:
{
  "cleanupPeriodDays": 3650
}
  1. Zapisz plik. Ustawienie zacznie obowiązywać przy następnym uruchomieniu Claude Code.

Wartość 3650 oznacza dziesięć lat: w praktyce usuwanie przestanie się odbywać. Jeśli chcesz zachować czyszczenie, ale dać sobie więcej czasu, ustaw 365 (jeden rok); wtedy znikną tylko sesje starsze niż rok. Za pomocą tego polecenia możesz sprawdzić, czy ustawienie zostało odczytane:

grep cleanupPeriodDays ~/.claude/settings.json

Łatwo przeoczyć jedno zastrzeżenie: wydłużenie okresu NIE przywróci tego, co już usunięto. Czyszczenie uruchamia się przy starcie, a wszystko skasowane podczas wcześniejszych uruchomień przepadło na zawsze. Dlatego najpierw należy zmienić to ustawienie — zapobiega przyszłym stratom, ale nie przywraca tego, co już zostało usunięte. Jeśli chcesz chronić nie tylko historię Claude Code, lecz także projekt przed przypadkowym poleceniem, zobacz poradnik „Jak skonfigurować Claude Code, żeby nie uszkodził projektu”.

Historia sesji to część drugiego mózgu projektu: zawiera tok rozumowania, którego nie zapisałeś nigdzie indziej. cleanupPeriodDays zachowuje pliki, ale nie zmienia ich w system, który pozwoli Ci odnaleźć potrzebne informacje za sześć miesięcy.

Jak automatycznie archiwizować historię poza folderem czyszczenia?

Najważniejsze informacje

Kopiuj sesje do archiwum znajdującego się POZA ~/.claude/projects/, gdzie czyszczenie nie obowiązuje. Wystarczy raz dziennie skopiować pliki do osobnego katalogu za pomocą rsync -a: nowe pliki zostaną dodane, a stare pozostaną. Ponieważ archiwum znajduje się poza tym folderem, nie wpływają na nie ani cleanupPeriodDays, ani problem mtime. Zautomatyzuj działanie za pomocą launchd (macOS) lub cron (Linux), a historia będzie gromadzić się samoczynnie.

Pomysł jest prosty: pozwól Claude Code robić z jego folderem, co zechce, a sam przechowuj osobne archiwum poza nim. Chroni je to przed tym mechanizmem czyszczenia, lecz nadal można je utracić wskutek awarii dysku, przypadkowego usunięcia lub nieudanej kopii. Skonfiguruj je tak:

  1. Utwórz folder archiwum poza zarządzanym katalogiem:
mkdir -p ~/claude-history-archive
  1. Skopiuj tam bieżącą historię. Flaga -a zachowuje strukturę i znaczniki czasu; --ignore-existing pozostawia bez zmian pliki, które już skopiowano:
rsync -a ~/.claude/projects/ ~/claude-history-archive/
  1. Zautomatyzuj codzienne uruchamianie. W systemie macOS użyj launchd. Utwórz plik ~/Library/LaunchAgents/com.example.claudearchive.plist:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.example.claudearchive</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/bin/rsync</string>
    <string>-a</string>
    <string>/Users/YOUR_NAME/.claude/projects/</string>
    <string>/Users/YOUR_NAME/claude-history-archive/</string>
  </array>
  <key>StartInterval</key>
  <integer>86400</integer>
</dict>
</plist>
  1. Załaduj agenta, aby działał w tle:
launchctl load ~/Library/LaunchAgents/com.example.claudearchive.plist

W systemie Linux to samo można zrobić, dodając jeden wiersz do crontab (crontab -e):

0 3 * * * rsync -a ~/.claude/projects/ ~/claude-history-archive/

Dlaczego to działa, skoro synchronizacja opisana w poprzedniej sekcji zawodzi? Archiwum znajduje się POZA ~/.claude/projects/, więc mechanizm czyszczenia w ogóle go nie widzi. Kopiowanie odbywa się w jednym kierunku (z aktywnego folderu do archiwum) i nie zmieniamy mtime aktywnych plików, więc problem mtime nie występuje. Nawet jeśli jutro Claude Code usunie sesję ze swojego folderu, jej kopia pozostanie w archiwum.

Jak zmienić archiwum sesji w przeszukiwalny drugi mózg?

Najważniejsze informacje

Umieść archiwum pod kontrolą git, a otrzymasz wersjonowaną, w pełni przeszukiwalną bazę danych wszystkich sesji. Uruchom git init w folderze archiwum, a następnie codziennie wykonuj git add -A && git commit, aby uzyskać historię zmian i ochronę przed przypadkowym nadpisaniem. Dawne sesje możesz przeszukiwać za pomocą zwykłego grep, a uporządkowane dane wyodrębniać przy użyciu jq, ponieważ .jsonl zawiera JSON rozdzielony na linie. Dzięki temu archiwum staje się praktycznym narzędziem.

Samo gromadzenie plików nie wystarczy — musisz mieć do nich dostęp. Dwa kroki zamienią archiwum w działające narzędzie.

Po pierwsze, zarządzaj jego wersjami za pomocą git. Zainicjuj repozytorium w folderze archiwum:

cd ~/claude-history-archive
git init
git add -A && git commit -m "First snapshot of Claude Code history"

Dodaj git add -A && git commit do tego samego codziennego zadania co rsync. W ten sposób zyskasz historię wersji: zobaczysz, co i kiedy się pojawiło, a przypadkowe nadpisanie cofniesz jednym poleceniem.

Po drugie, przeszukuj archiwum. Pliki .jsonl zawierają JSON rozdzielony na linie, więc możesz użyć znanych narzędzi. Znajdź sesje, w których omawiano konkretny temat:

grep -rl "database migration" ~/claude-history-archive/

Wyodrębnij z sesji sam tekst promptów za pomocą jq, ponieważ plik zawiera dane JSON:

jq -r 'select(.type=="user") | .message.content' session.jsonl

Na tym etapie historia sesji zaczyna działać jak drugi mózg projektu: baza danych, w której w kilka sekund odnajdziesz odpowiedź na pytanie „jak zdecydowaliśmy o tym w marcu”. Osobny opis tego, gdzie trafia kontekst podczas sesji i jak nim zarządzać, znajdziesz w poradniku „Dokąd trafiają tokeny w Claude Code”.

Czy można odzyskać sesje, które zostały już usunięte?

Najważniejsze informacje

Nie ma wbudowanej metody. Claude Code nie przenosi usuniętych plików do Kosza ani nie przechowuje możliwości cofnięcia operacji; plik zostaje skasowany na zawsze. Jedyną szansą są zewnętrzne kopie utworzone PRZED usunięciem: migawka Time Machine w systemie macOS, historia wersji OneDrive lub Dropbox albo ręczna kopia zapasowa. Jeśli żadna z nich nie istnieje, sesja przepadła. Dlatego ochronę trzeba skonfigurować z wyprzedzeniem — zanim pojawi się coś, co można stracić.

Uczciwa odpowiedź brzmi: prawdopodobnie nie. Claude Code nie ma funkcji odzyskiwania, Kosza ani dziennika cofania usuniętych transkrypcji. Plik po prostu znika z dysku.

Jest jedna możliwość: kopie zapasowe systemu, jeśli zostały wcześniej włączone:

  1. macOS Time Machine — jeśli migawka wykonana przed usunięciem zawierała ~/.claude/projects/, możesz pobrać plik z kopii zapasowej z wybranej daty.
  2. Historia wersji OneDrive / Dropbox — jeśli folder był synchronizowany z włączonym przechowywaniem wersji, poszukaj pliku w historii wersji chmury (pamiętaj jednak o pułapce mtime: synchronizacja mogła również wywołać usunięcie).
  3. Kopie ręczne — dowolne pliki skopiowane za pomocą ręcznie uruchomionego rsync lub cp poza zarządzany folder.

Jeśli żadna z tych kopii nie istniała, sesja przepadła. I wcale nie jest to rzadkie: autor jednego zgłoszenia błędu w repozytorium Anthropic stracił 26 z 38 zapisów, obejmujących miesiące pracy. Jedyną niezawodną ochroną jest ta, która działa PRZED utratą danych. Skonfiguruj dziś cleanupPeriodDays i automatyczne archiwizowanie, póki jest jeszcze co zachować.

Jaką wartość wybrać dla cleanupPeriodDays?

Najważniejsze informacje

Większości osób polecam 3650 (dziesięć lat, co praktycznie wyłącza usuwanie) oraz zewnętrzne automatyczne archiwum. Wartość domyślną 30 pozostaw tylko wtedy, gdy nie potrzebujesz historii i ważniejsze jest dla Ciebie nieprzechowywanie tajemnic na dysku. Wartość 365 to rozsądny kompromis z corocznym czyszczeniem. Możesz też w ogóle nie zapisywać historii: użyj zmiennej środowiskowej CLAUDE_CODE_SKIP_PROMPT_HISTORY lub flagi --no-session-persistence, ale służy to przeciwnemu celowi.

Jest jedno ustawienie, ale może oznaczać kilka różnych rzeczy. Porównaj opcje i wybierz odpowiednią do swojego zastosowania:

WartośćDziałanieDla kogo
30 (wartość domyślna)Przy uruchomieniu usuwa sesje starsze niż 30 dniNie potrzebujesz historii; ważniejsze jest unikanie przechowywania wrażliwych danych na dysku
365Zachowuje roczną historię, a potem czyści ją raz w rokuPotrzebujesz niedawnej historii, ale nie bezterminowego archiwum
3650Praktycznie wyłącza usuwanieChcesz zachować wszystko i mieć zewnętrzne archiwum (zalecane)
CLAUDE_CODE_SKIP_PROMPT_HISTORYW ogóle nie zapisuje historii na dyskuMaksymalna prywatność; nie potrzebujesz żadnej historii

Ważne zastrzeżenie dotyczące bezpieczeństwa: ustawiając 3650 i zachowując wszystko, zgadzasz się na przechowywanie na dysku transkrypcji, które mogą zawierać klucze i kod. To świadomy kompromis między wygodą archiwum a ryzykiem. Ogranicz ryzyko: przechowuj archiwum na szyfrowanym dysku (FileVault w systemie macOS), nie umieszczaj go w publicznej chmurze i nie przesyłaj go do publicznego repozytorium git. Przygotowałem osobny poradnik o danych, które mogą wyciec przez Claude Code: „Bezpieczeństwo danych w Claude Code”.

Co zrobić dziś: lista kontrolna

Najważniejsze informacje

Te kroki ograniczają utratę historii: wydłuż retencję przez cleanupPeriodDays: 3650, kopiuj sesje poza ~/.claude/projects/ i wersjonuj archiwum. Tylko poprawnie skopiowane pliki są chronione przed czyszczeniem Claude Code. Dzienny harmonogram pozostawia do jednego dnia nowych zmian poza archiwum, gdy kopie się udają; nieudane lub pominięte uruchomienia wydłużają tę lukę. Kopia na tym samym dysku nie chroni przed jego awarią.

Skonfiguruj ochronę krok po kroku:

  1. Ustaw cleanupPeriodDays: 3650 w pliku ~/.claude/settings.json — zatrzymasz usuwanie.
  2. Utwórz ~/claude-history-archive poza zarządzanym folderem i uruchom pierwsze rsync -a.
  3. Zaplanuj codzienne uruchamianie za pomocą launchd (macOS) lub cron (Linux).
  4. Zainicjuj git w archiwum i dodaj git add -A && git commit do tego samego zadania.
  5. Sprawdź, czy archiwum znajduje się na szyfrowanym dysku i nie jest synchronizowane z publiczną chmurą.
  6. Przy każdym zaplanowanym uruchomieniu sprawdź udane kopiowanie, potem obejrzyj najnowszą sesję w archiwum i okresowo odtwórz próbkę w osobnym folderze tymczasowym, aby potwierdzić czytelność.
  7. Jeśli zakładasz utratę urządzenia lub dysku, zachowuj niezależnie przechowywaną kopię z właściwą kontrolą dostępu i również testuj odtwarzanie. Historia Git na tym samym dysku nie jest niezależną kopią.

Historia sesji to tylko jedna warstwa kontekstu, która sprawia, że Claude działa niezawodnie.

Poznaj Ailoot.

Więcej szczegółów

Pytania i odpowiedzi

Czy dzienne archiwum gwarantuje zachowanie każdej sesji?

Nie. Chroni poprawnie skopiowane pliki przed czyszczeniem folderu zarządzanego. Przy udanych dziennych kopiach może brakować do jednego dnia nowych zmian; błędy wydłużają lukę, a kopia na tym samym dysku może zginąć wraz z oryginałem.

Jak sprawdzić użyteczność archiwum?

Potwierdzaj powodzenie zaplanowanych kopii, obejrzyj niedawno zarchiwizowaną sesję i okresowo odtwórz próbkę w osobnym folderze tymczasowym. Dla ochrony przed utratą urządzenia lub dysku przetestuj też kopię przechowywaną niezależnie od oryginału.

Wszystkie artykuły