Blog

Claude Code menghapus riwayat setelah 30 hari: cara menyimpannya

Markdown

Tempat sesi Claude Code disimpan, cara mengonfigurasi cleanupPeriodDays, dan cara mengatur arsip eksternal menggunakan rsync, launchd, atau cron.

Baca artikel lengkap

Untuk bantuan menggunakan layanan ini, lihat dokumentasi Ailoot.

Apakah Claude Code benar-benar menghapus riwayat sesi Anda?

Poin utama

Ya. Setiap kali Claude Code dimulai, aplikasi ini menghapus file sesi yang berusia lebih dari 30 hari. Pengaturan cleanupPeriodDays di ~/.claude/settings.json bertanggung jawab atas hal ini; nilai bawaannya adalah 30. Penghapusan terjadi tanpa peringatan, tanpa meminta persetujuan, dan tanpa cara untuk memulihkan file.

Anda membuka Claude Code untuk kembali ke sesi dari dua bulan lalu—tetapi sesi itu sudah hilang. Filenya telah dihapus sepenuhnya dari disk. Ini bukan gangguan atau bug langka: begitulah mekanisme pembersihan bawaan bekerja.

Satu pengaturan mengendalikan pembersihan: cleanupPeriodDays. Nilai bawaannya adalah 30. Setiap kali Claude Code dimulai, aplikasi ini memindai folder riwayat dan menghapus semua yang lebih lama dari periode tersebut. Pengaturan ini sama sekali tidak ada di ~/.claude/settings.json saya, yang berarti nilai bawaan berlaku dan beberapa sesi lama saya sudah telanjur hilang.

Beberapa laporan bug tentang hal ini masih terbuka di repositori Anthropic, dan belum ada yang diperbaiki.

Di mana Claude Code menyimpan riwayat sesi?

Poin utama

Riwayat setiap sesi disimpan di ~/.claude/projects/<project-path>/<session-id>.jsonl. Nama foldernya adalah jalur absolut direktori kerja tempat Anda menjalankan Claude Code, dengan garis miring diganti tanda hubung. File .jsonl berisi seluruh percakapan, satu baris pada satu waktu: prompt Anda, respons model, pemanggilan alat, dan penyuntingan file. Inilah memori yang dihapus oleh pembersihan.

Menemukan riwayat Anda mudah. Buka terminal dan lihat isi folder:

ls ~/.claude/projects/

Setiap subfolder adalah proyek terpisah. Namanya mengodekan jalurnya: misalnya, proyek di /Users/alex/dev/shop menjadi folder -Users-alex-dev-shop. Di dalamnya terdapat file sesi:

ls -lt ~/.claude/projects/-Users-alex-dev-shop/
# 3f8a1c2e-....jsonl   ← satu sesi = satu file
# a91b7d40-....jsonl

Setiap file .jsonl adalah log baris demi baris: satu baris sama dengan satu peristiwa sesi. Isinya lebih dari sekadar teks percakapan. File itu menyimpan logika di balik keputusan Anda: alasan Anda memilih struktur basis data tertentu, opsi yang Anda tolak, kesalahan yang dibuat Claude, dan cara Anda memperbaikinya.

Pada dasarnya, ini adalah jurnal pengembangan proyek. Itulah sebabnya kehilangannya terasa berat: yang hilang bukan sekadar “obrolan,” melainkan konteks yang telah Anda bangun selama berminggu-minggu. Saya membahas struktur konteks ini dalam panduan “Claude Memory vs. CLAUDE.md”.

Mengapa Anthropic menghapus transkrip setelah 30 hari?

Poin utama

Alasan Anthropic adalah privasi dan keamanan. File sesi disimpan di disk sebagai teks biasa dan mungkin berisi kode sumber, kata sandi, serta kunci API. Menyimpannya selamanya berisiko: jika laptop dicuri atau seseorang mendapatkan akses ke disk, mereka bisa memperoleh semua data sensitif itu. Periode 30 hari merupakan titik tengah antara “melanjutkan pekerjaan terbaru” dan “tidak menyimpan rahasia di disk lebih lama dari yang diperlukan.”

Ada alasan untuk penghapusan ini, dan alasan tersebut patut dipahami sebelum Anda mematikannya sepenuhnya. Transkrip berupa teks biasa. Jika Claude membaca file .env selama sesi, memasukkan kunci ke dalam perintah, atau Anda menempelkan kata sandi ke prompt, semuanya tersimpan di .jsonl sebagai teks biasa. Semakin lama file semacam itu berada di disk, semakin besar kemungkinan suatu hari data tersebut bocor.

Anthropic mengatakannya dengan jelas: transkrip mungkin berisi kode sumber, kredensial, dan materi sensitif lainnya, dan menyimpannya di disk lebih lama dari yang diperlukan menimbulkan risiko privasi nyata. Periode 30 hari dipilih sebagai kompromi.

Keberatan komunitas berkenaan dengan tiga hal: penghapusan berlangsung diam-diam (tidak ada peringatan saat penyiapan atau saat mulai), tidak ada persetujuan (Anda tidak ditanya), dan tidak ada pemulihan (Trash tidak digunakan dan tidak ada rollback). Dalam issue #59248, para pengembang meminta satu hal: jadikan pembersihan lebih adil—berikan peringatan, masa pemulihan, dan periode bawaan yang tidak terlalu agresif.

Mengapa skrip pencadangan itu sendiri dapat memicu penghapusan?

Poin utama

Pembersihan menentukan file yang akan dihapus berdasarkan waktu modifikasi file (mtime). Pembersihan tidak memeriksa aktivitas terakhir yang sebenarnya dalam suatu sesi. Proses apa pun yang menyentuh file .jsonl—sinkronisasi cloud, rsync, editor, skrip—dapat menggeser mtime-nya sehingga sesi baru tampak usang. Saat Claude Code dimulai berikutnya, sesi itu akan dianggap lama dan dihapus. Paradoksnya: upaya naif untuk mencadangkan riwayat di dalam folder yang dikelola justru mempercepat kehilangannya.

Inilah bagian tersulit, dan bagian ini menjebak orang-orang yang mencoba melindungi data mereka sendiri. Pembersihan melihat mtime, yaitu stempel waktu terakhir file diubah. Pembersihan menganggap mtime mencerminkan kapan Anda terakhir bekerja dalam sesi tersebut. Dalam praktiknya, apa pun dapat mengubah mtime: klien sinkronisasi Dropbox atau iCloud, rsync, perangkat lunak antivirus, pengindeks, atau skrip pencadangan Anda sendiri.

Inilah jebakannya. Anda memutuskan untuk menyimpan riwayat dan menyiapkan sinkronisasi cloud untuk ~/.claude/projects/. Pada suatu saat, layanan sinkronisasi menulis ulang sebuah file dan menetapkan mtime-nya ke tanggal yang lebih awal (ini dapat terjadi saat memulihkan dari salinan cloud). Claude Code melihat file “lama” saat dimulai dan menghapusnya. Anda bermaksud menyimpannya, tetapi malah mempercepat penghapusannya.

Kesimpulannya hanya satu: cadangan harus berada di luar ~/.claude/projects/. Pembersihan hanya bekerja di dalam folder ini. Salinan yang disimpan di luarnya berada di luar jangkauan pembersihan. Saya akan menyusun solusinya berdasarkan prinsip ini.

Bagaimana cara menghentikan penghapusan riwayat sekarang juga?

Poin utama

Satu pengaturan. Buka ~/.claude/settings.json dan tetapkan cleanupPeriodDays ke angka besar—misalnya, 3650 (sepuluh tahun). Dalam praktiknya, ini menonaktifkan penghapusan otomatis: tidak ada yang akan lebih lama dari batas tersebut. Penting: pengaturan ini hanya melindungi yang belum dihapus. Riwayat yang sudah dihapus oleh pembersihan tidak dapat dipulihkan. Jadi langkah pertama adalah bertindak sebelum sesi lain hilang.

Hentikan penghapusan dalam tiga langkah:

  1. Buka file pengaturan: ~/.claude/settings.json (jika file tersebut tidak ada, buatlah).
  2. Tambahkan pengaturan cleanupPeriodDays dengan nilai besar:
{
  "cleanupPeriodDays": 3650
}
  1. Simpan file. Pengaturan ini akan berlaku saat Claude Code dimulai berikutnya.

Nilai 3650 berarti sepuluh tahun: dalam praktiknya, penghapusan tidak akan berlangsung lagi. Jika Anda ingin pembersihan tetap aktif tetapi memberi lebih banyak waktu, tetapkan nilainya ke 365 (satu tahun); hanya sesi yang lebih lama dari setahun yang akan hilang. Anda dapat memeriksa apakah pengaturan sudah diterapkan dengan perintah ini:

grep cleanupPeriodDays ~/.claude/settings.json

Satu catatan yang mudah terlewat: memperpanjang periode TIDAK memulihkan apa yang sudah dihapus. Pembersihan berjalan saat mulai, dan apa pun yang terhapus dalam proses sebelumnya sudah hilang selamanya. Karena itu, Anda harus menetapkan ini terlebih dahulu—pengaturan ini mencegah kehilangan di kemudian hari, tetapi tidak mengembalikan apa yang sudah dihapus. Jika Anda ingin menghindari kehilangan riwayat Claude Code sekaligus proyek Anda akibat perintah yang tidak disengaja, lihat panduan “Cara Mengonfigurasi Claude Code Agar Tidak Merusak Proyek Anda”.

Riwayat sesi Anda adalah bagian dari otak kedua proyek Anda: riwayat itu berisi logika keputusan yang belum Anda catat di tempat lain. cleanupPeriodDays menyimpan file, tetapi tidak mengubahnya menjadi sistem yang memungkinkan Anda mengambil hal yang diperlukan enam bulan dari sekarang.

Bagaimana mengarsipkan riwayat otomatis di luar folder pembersihan?

Poin utama

Salin sesi ke dalam arsip DI LUAR ~/.claude/projects/, tempat pembersihan tidak berlaku. rsync -a sederhana ke direktori terpisah sekali sehari sudah cukup: file baru ditambahkan, dan file lama tetap ada. Karena arsip berada di luar, baik cleanupPeriodDays maupun bug mtime tidak memengaruhinya. Otomatiskan proses ini dengan launchd (macOS) atau cron (Linux), dan riwayat Anda akan terus bertambah dengan sendirinya.

Idenya sederhana: biarkan Claude Code melakukan apa pun yang dikehendakinya dengan foldernya, sementara Anda menyimpan arsip terpisah di luar folder itu. Arsip dilindungi dari mekanisme pembersihan tersebut, tetapi masih dapat hilang akibat kerusakan disk, penghapusan tidak sengaja, atau penyalinan gagal. Siapkan seperti ini:

  1. Buat folder arsip di luar direktori yang dikelola:
mkdir -p ~/claude-history-archive
  1. Salin riwayat Anda saat ini ke sana. Tanda -a mempertahankan struktur dan stempel waktu; --ignore-existing membiarkan file yang sudah disalin tetap utuh:
rsync -a ~/.claude/projects/ ~/claude-history-archive/
  1. Otomatiskan proses ini sekali sehari. Di macOS, gunakan launchd. Buat file ~/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. Muat agen agar berjalan di latar belakang:
launchctl load ~/Library/LaunchAgents/com.example.claudearchive.plist

Di Linux, hal yang sama dilakukan dengan satu baris di crontab (crontab -e):

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

Mengapa cara ini berhasil sementara sinkronisasi di bagian sebelumnya gagal? Arsip berada DI LUAR ~/.claude/projects/, sehingga pembersihan tidak dapat melihatnya sama sekali. Penyalinan berlangsung satu arah (dari folder aktif ke arsip), dan kita tidak menyentuh mtime file aktif—jadi bug mtime tidak terjadi. Sekalipun Claude Code menghapus sebuah sesi dari foldernya sendiri besok, salinannya akan tetap ada di arsip.

Bagaimana cara mengubah arsip sesi menjadi otak kedua yang dapat ditelusuri?

Poin utama

Taruh arsip di bawah git, dan Anda akan mendapatkan basis data berversi yang sepenuhnya dapat ditelusuri dari semua sesi Anda. Jalankan git init di folder arsip, lalu jalankan git add -A && git commit setiap hari untuk memperoleh riwayat perubahan dan perlindungan dari penimpaan yang tidak disengaja. Anda dapat mencari sesi lama dengan grep biasa dan mengekstrak konten terstruktur dengan jq, karena .jsonl adalah JSON yang dipisahkan baris. Dengan begitu, arsip menjadi alat yang praktis.

Sekadar mengumpulkan file tidak cukup—Anda perlu dapat mengaksesnya. Dua langkah mengubah arsip menjadi alat yang dapat digunakan.

Pertama, beri versi dengan git. Inisialisasi repositori di folder arsip:

cd ~/claude-history-archive
git init
git add -A && git commit -m "Cuplikan pertama riwayat Claude Code"

Tambahkan git add -A && git commit ke proses harian yang sama dengan rsync. Kini Anda memiliki riwayat versi: Anda dapat melihat apa yang muncul dan kapan, serta membatalkan penimpaan yang tidak disengaja dengan satu perintah.

Kedua, lakukan pencarian. File .jsonl adalah JSON yang dipisahkan baris, jadi Anda dapat menggunakan alat yang sudah dikenal. Temukan sesi yang membahas topik tertentu:

grep -rl "migrasi basis data" ~/claude-history-archive/

Ekstrak hanya teks prompt Anda dari suatu sesi (menggunakan jq, karena formatnya JSON):

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

Pada titik ini, riwayat sesi Anda mulai berfungsi sebagai otak kedua proyek: sebuah basis data yang memungkinkan Anda mengambil “bagaimana kita memutuskan ini pada bulan Maret” dalam hitungan detik. Untuk penjelasan terpisah tentang ke mana konteks ditempatkan dalam sesi dan cara mengelolanya, lihat “Ke Mana Token Pergi di Claude Code”.

Dapatkah Anda memulihkan sesi yang sudah dihapus?

Poin utama

Tidak ada metode bawaan. Claude Code tidak memasukkan file yang dihapus ke Trash atau menyimpan rollback; file itu terhapus selamanya. Satu-satunya peluang adalah salinan eksternal yang dibuat SEBELUM penghapusan: snapshot Time Machine di macOS, riwayat versi OneDrive atau Dropbox, atau cadangan manual. Jika semua ini tidak ada, sesi tersebut hilang. Itulah sebabnya perlindungan harus disiapkan sebelumnya—sebelum ada yang hilang.

Jawaban jujurnya: mungkin tidak. Claude Code tidak memiliki fitur pemulihan, Trash, atau log pembatalan untuk transkrip yang dihapus. File itu begitu saja menghilang dari disk.

Ada satu pilihan: cadangan sistem, jika sudah diaktifkan sebelumnya:

  1. macOS Time Machine—jika sebuah snapshot menangkap ~/.claude/projects/ sebelum penghapusan, Anda dapat mengambil file dari cadangan untuk tanggal yang diperlukan.
  2. Riwayat versi OneDrive / Dropbox—jika folder disinkronkan dengan pembuatan versi aktif, cari file tersebut di riwayat versi cloud (tetapi ingat jebakan mtime: sinkronisasi mungkin juga memicu penghapusan).
  3. Salinan manual—setiap rsync/cp yang Anda jalankan secara manual ke lokasi di luar folder yang dikelola.

Jika semua ini tidak ada, sesi tersebut hilang. Dan ini bukan kejadian langka: seorang penulis bug di repositori Anthropic mengalami kerusakan pada 26 dari 38 catatan, yang mewakili pekerjaan selama berbulan-bulan. Satu-satunya perlindungan yang dapat diandalkan adalah perlindungan yang sudah ada SEBELUM kehilangan terjadi. Tetapkan cleanupPeriodDays dan pengarsipan otomatis hari ini, selagi masih ada sesuatu yang bisa diselamatkan.

Nilai apa yang sebaiknya dipilih untuk cleanupPeriodDays?

Poin utama

Bagi kebanyakan orang, gunakan 3650 (sepuluh tahun, yang secara efektif menonaktifkan penghapusan) ditambah arsip otomatis eksternal. Pertahankan nilai bawaan 30 hanya jika Anda tidak membutuhkan riwayat dan menghindari penyimpanan rahasia di disk lebih penting. Nilai 365 adalah jalan tengah yang wajar, dengan pembersihan tahunan. Pilihan lainnya adalah tidak menulis riwayat sama sekali: gunakan variabel lingkungan CLAUDE_CODE_SKIP_PROMPT_HISTORY atau flag --no-session-persistence, tetapi itu memiliki tujuan yang berlawanan.

Hanya ada satu pengaturan, tetapi maknanya bisa berbeda-beda. Bandingkan pilihan berikut dan pilih yang sesuai dengan kebutuhan Anda:

NilaiFungsinyaCocok untuk
30 (bawaan)Menghapus sesi yang berusia lebih dari 30 hari saat mulaiAnda tidak membutuhkan riwayat; menghindari penyimpanan data sensitif di disk lebih penting
365Menyimpan riwayat selama setahun, lalu membersihkannya setahun sekaliAnda membutuhkan riwayat terbaru, tetapi tidak memerlukan arsip tanpa batas waktu
3650Secara efektif menonaktifkan penghapusanAnda ingin menyimpan semuanya + arsip eksternal (disarankan)
CLAUDE_CODE_SKIP_PROMPT_HISTORYSama sekali tidak menulis riwayat ke diskPrivasi maksimum; Anda sama sekali tidak membutuhkan riwayat

Satu catatan keamanan penting: jika Anda menetapkan 3650 dan menyimpan semuanya, berarti Anda setuju menyimpan transkrip yang mungkin berisi kunci dan kode di disk. Ini adalah kompromi yang disengaja: kemudahan arsip versus risiko. Kurangi risikonya: simpan arsip di disk terenkripsi (FileVault di macOS), jangan letakkan di cloud publik, dan jangan masukkan ke repositori git publik. Saya telah menyusun panduan terpisah tentang data yang mungkin bocor melalui Claude Code: “Keamanan Data di Claude Code”.

Yang perlu dilakukan hari ini: daftar periksa

Poin utama

Langkah-langkah ini mengurangi kehilangan riwayat: perpanjang retensi dengan cleanupPeriodDays: 3650, salin sesi ke luar ~/.claude/projects/, dan kelola versi arsip. Hanya file yang berhasil disalin terlindungi dari pembersihan Claude Code. Jadwal harian meninggalkan hingga satu hari perubahan terbaru yang belum diarsipkan saat proses berhasil; proses gagal atau terlewat memperpanjang celah itu. Salinan pada disk yang sama bukan perlindungan terhadap kegagalan disk.

Siapkan perlindungan langkah demi langkah:

  1. Tetapkan cleanupPeriodDays: 3650 di ~/.claude/settings.json—penghapusan sudah dihentikan.
  2. Buat ~/claude-history-archive di luar folder yang dikelola dan jalankan rsync -a pertama.
  3. Jadwalkan proses harian menggunakan launchd (macOS) atau cron (Linux).
  4. Inisialisasi git di arsip dan tambahkan git add -A && git commit ke proses yang sama.
  5. Pastikan arsip berada di disk terenkripsi dan tidak disinkronkan ke cloud publik.
  6. Periksa setiap proses terjadwal untuk memastikan penyalinan berhasil, lalu tinjau sesi arsip terbaru dan pulihkan sampel secara berkala ke folder sementara terpisah untuk memverifikasi keterbacaannya.
  7. Jika kehilangan perangkat atau disk termasuk risiko yang ditangani, simpan cadangan independen dengan kontrol akses yang sesuai dan uji pemulihannya juga. Riwayat Git pada disk yang sama bukan cadangan independen.

Riwayat sesi hanyalah satu lapisan konteks yang membuat Claude dapat diandalkan.

Kenali Ailoot.

Rincian selengkapnya

Pertanyaan tentang Claude Code menghapus riwayat setelah 30 hari: cara menyimpannya

Apakah arsip harian menjamin tidak ada sesi yang dapat hilang?

Tidak. Arsip melindungi file yang berhasil disalin dari pembersihan folder terkelola. Dengan proses harian yang berhasil, perubahan terbaru hingga satu hari masih mungkin belum tersalin; kegagalan memperlebar celah itu, dan salinan pada disk yang sama dapat gagal bersama aslinya.

Bagaimana memeriksa apakah arsip dapat digunakan?

Pastikan penyalinan terjadwal berhasil, periksa sesi arsip terbaru, dan secara berkala pulihkan sampel ke folder sementara terpisah. Untuk perlindungan terhadap kehilangan perangkat atau disk, uji juga cadangan yang disimpan independen dari aslinya.

Semua artikel