Recall: thêm memory local cho Claude Code trên VPS
Recall 0.4.0 ghi log và tạo tóm tắt Markdown local cho từng project, không gọi network hay tốn API token. Cài trên VPS và đo phần token tiết kiệm.
Recall làm gì cho memory của Claude Code
Recall là một plugin cho Claude Code, giúp mỗi project có memory dùng xuyên suốt các session. Plugin ghi 2 file markdown vào thư mục .recall/ trong project: một log chỉ ghi thêm về những gì đã xảy ra và một bản tóm tắt ngắn về trạng thái công việc hiện tại. Cả 2 file đều được tạo trên máy bạn đang làm việc bằng một trình tóm tắt Python local, nên memory không tốn API token.
Recall giải quyết một khoảng trống nhỏ nhưng luôn xuất hiện. Bạn đóng một session trên VPS vào thứ Ba. Đến thứ Tư, Claude Code không biết gì về thứ Ba. Bạn phải tự giải thích lại project, hoặc để model đọc lại một nửa repository để tự tìm hiểu. Cả 2 cách đều tốn token, và cách thứ hai tốn rất nhiều token.
Recall version 0.4.0 là bản hiện tại tính đến tháng 7 năm 2026, và project được cấp phép theo MIT. Đây là một plugin. Plugin không thực hiện network call nào.
Bạn cần gì trên VPS
Các capture hook của Recall là những script Python đi kèm với plugin. Chúng không có dependency bên thứ ba, nên yêu cầu thực tế duy nhất là một interpreter.
python3 -VUbuntu 24.04 đáp ứng Python 3.12.3. Recall hỗ trợ Python 3.9 trở lên. Một số container image tối giản hoàn toàn không có interpreter, khi đó shell trả về python3: command not found. Hãy cài một interpreter trước khi tiếp tục.
sudo apt update && sudo apt install -y python3NumPy là accelerator tùy chọn cho một bước trong summarizer. Bạn không cần cài nó.
python3 -c "import numpy"ModuleNotFoundError: No module named 'numpy' là câu trả lời chấp nhận được ở đây. Summarizer có một đường xử lý bằng pure Python, và test suite của dự án kiểm tra để bảo đảm cả hai đường xử lý đều chọn cùng các câu.
Session memory quan trọng trên server hơn trên laptop, vì công việc trên server thường diễn ra trong những lần truy cập ngắn, cách nhau nhiều ngày. Nếu bạn đã có Claude Code chạy trong tmux trên VPS, Recall là thành phần đưa session của ngày hôm qua vào ngày hôm nay.
Cài đặt Recall từ marketplace của plugin
Hai lệnh được nhập trong một phiên Claude Code:
/plugin marketplace add raiyanyahya/recall
/plugin install recall@recallLệnh thứ hai đọc plugin@marketplace. Cả hai tên đều là recall ở đây. Điều này trông giống lỗi copy-paste nhưng thực ra không phải.
Kiểm tra cài đặt bằng một trong các lệnh của chính plugin:
/recall:show/recall:show in bản tóm tắt hiện tại. Với một project hoàn toàn mới, chưa có gì để in, nên điều bạn thực sự kiểm tra là lệnh có tồn tại hay không. Nếu Claude Code không nhận diện /recall:show, plugin chưa được load và không có hook nào chạy.
Nếu muốn chạy từ một checkout, hãy clone repository rồi kiểm tra trước:
git clone https://github.com/raiyanyahya/recall ~/recall
cd ~/recall && claude plugin validate .claude plugin validate . đọc manifest trong .claude-plugin/ và báo plugin có đúng cấu trúc hay không. Sau đó khởi động Claude Code từ thư mục project bằng claude --plugin-dir ~/recall.
Các hook ghi gì và chạy khi nào
Recall đăng ký 3 hook cho Claude Code. Mỗi hook chạy một Python script từ thư mục plugin.
SessionStartchạy khi khởi động, resume và clear. Nó hiển thịcontext.mdđể session mở ra với phần tóm tắt ngay trước mắt.Stopchạy mỗi khi Claude hoàn tất một response. Nó nối lượt đó vào log.SessionEndchạy khi session đóng và có thể tạo lại phần tóm tắt.
Các hook này tạo ra 2 file, đều nằm trong .recall/.
history.mdlà bản ghi chỉ ghi thêm: prompt, response, các file đã xử lý và các command đã chạy.context.mdlà bản tóm tắt được tạo tự động: mục tiêu, phần tóm tắt, bước tiếp theo, các file đã xử lý, các command đã chạy và ngữ cảnh git.
Sau một session thực tế, hãy xem thư mục này.
ls -la .recall/Bạn sẽ thấy history.md có nội dung. Có thể bạn không thấy context.md nào, và đó là hành vi mặc định chứ không phải lỗi. auto_save_context là off nếu bạn không thiết lập nó, nên phần tóm tắt chỉ được ghi khi bạn yêu cầu:
/recall:saveCommand đó chạy trình tóm tắt local trên history.md và ghi lại context.md. Thuật toán sử dụng điểm TF-IDF (tần suất thuật ngữ, tần suất nghịch đảo của tài liệu), sau đó xếp hạng câu bằng TextRank. Thuật toán có tính xác định và mang tính trích xuất, nghĩa là nó chọn các câu đã có sẵn trong log. Không có model nào được gọi, nên bước này miễn phí và hoạt động được khi máy offline.
Cấu hình Recall cho một project
Cấu hình nằm trong file recall.config.json tại thư mục gốc của project. Đây là các giá trị mặc định được phát hành:
{
"output_dir": ".recall",
"capture_history": true,
"summary_sentences": 8,
"redact": true,
"include_git": true,
"max_input_chars": 200000
}output_dirđặt vị trí của 2 file. Hãy giữ chúng trong project.capture_historybật hoặc tắt loghistory.md.auto_save_contextchấp nhậnoffhoặcon_endvà mặc định làoff.summary_sentencesđặt số câu được giữ lại trongcontext.md. Tăng giá trị này sẽ tạo bản tóm tắt dài hơn và làm tăng nhẹ tải khi bắt đầu session.redactloại bỏ các mẫu secret phổ biến trước khi ghi bất kỳ dữ liệu nào vào disk.include_gitthêm diff hiện tại và các commit gần đây vào bản tóm tắt.max_input_charsgiới hạn lượng dữ liệu từhistory.mdmà summarizer đọc trong một lần.
Với project chạy trên VPS, thay đổi hữu ích là bật tính năng tự động lưu. Session trên server thường kết thúc khi terminal bị đóng hoặc mất kết nối, thay vì khi bạn chủ động dừng.
{
"auto_save_context": "on_end",
"summary_sentences": 12
}Để tạm dừng capture mà không sửa config, hãy tạo pause marker. Xóa marker này để bắt đầu capture lại.
touch .recall/.capture-pausedHãy làm việc này trước session xử lý credential của production, vì redaction chỉ là một filter, không phải cơ chế bảo đảm. Cùng lý do đó, nguyên tắc không để secret xuất hiện trong AI agent cũng áp dụng nói chung: secret an toàn là secret mà agent không bao giờ nhìn thấy.
Recall tiết kiệm bao nhiêu token?
Điều này phụ thuộc vào phương án thay thế. Nạp một bản tóm tắt khi bắt đầu session khá rẻ. Phần mà nó thay thế có thể tốn nhiều hơn, vì model không biết gì về project sẽ phải đọc các file để tìm hiểu lại project.
The data behind this chart
[
{
"label": "Recall context.md",
"char_count": "4,800",
"est_tokens": "1,200"
},
{
"label": "Hand-written CLAUDE.md",
"char_count": "3,200",
"est_tokens": "800"
},
{
"label": "Re-reading the repo",
"char_count": "120,000",
"est_tokens": "30,000"
},
{
"label": "Full transcript replay",
"char_count": "340,000",
"est_tokens": "85,000"
}
]Đây là các con số điển hình cho một project cỡ vừa, không phải số đo của hệ thống của bạn. Một bản tóm tắt Recall được nạp với khoảng 1,200 token. Con số này phù hợp với tuyên bố được công bố của project là 1 đến 2 nghìn token cho một lần resume. Phát lại toàn bộ transcript trước đó sẽ nạp lại cả cuộc hội thoại, ở mức khoảng 85,000 token. Để model tự tìm hiểu lại project bằng cách đọc các file nằm ở khoảng giữa hai mức này, gần 30,000 token, và con số đó tăng theo kích thước repository. Dòng CLAUDE.md dùng để làm mốc so sánh: nó rẻ hơn vì ngắn và tĩnh, đồng thời cho model biết các quy tắc cố định của bạn thay vì những gì đã xảy ra tối qua.
Hãy tự đo các con số của bạn. Một token tương đương khoảng 4 ký tự trong văn bản tiếng Anh, và ít hơn một chút đối với code. Nếu bạn cũng đưa bản tóm tắt vào một local model trên cùng VPS, hãy kiểm tra context window mà bản tóm tắt được nạp vào trước khi tin tưởng resume, vì Ollama cắt bớt prompt dài tại context length mặc định khá nhỏ thay vì báo rằng nó đã bỏ phần cuối.
wc -c .recall/context.md .recall/history.md
echo $(( $(wc -c < .recall/context.md) / 4 ))Trong một session, /context cho biết hiện đang được nạp gì vào context window, còn /cost báo cáo tổng số token của session. Hãy bắt đầu một session mới hoàn toàn, sau đó bắt đầu session tiếp theo với bản tóm tắt có sẵn và so sánh. Để xem đầy đủ token của session thực sự được dùng vào đâu, cách Claude Code sử dụng token có phần phân tích chi tiết.
Có một điểm cần lưu ý để đánh giá đúng nhận định này. Bản tóm tắt được nạp khi bắt đầu mọi session, vì vậy bản tóm tắt mà bạn không dùng đến chỉ là một khoản chi phí nhỏ chứ không phải khoản tiết kiệm. Giữ summary_sentences gần giá trị mặc định, trừ khi các session của bạn chạy lâu. Session ít hoạt động hơn giúp giảm chi phí ở phía còn lại, vì một agent được hướng đến thay đổi nhỏ nhất nhưng vẫn hoạt động sẽ tạo ra log ngắn hơn để trình tóm tắt xếp hạng.
Dựng lại bản tóm tắt mà không cần session
Nếu bạn đã clone repository, summarizer có entry point riêng trên command line. Tính năng này hữu ích trên VPS khi session kết thúc cùng terminal nhưng bạn vẫn muốn có bản digest.
python3 ~/recall/scripts/make_context.py --helpPhần output trợ giúp liệt kê các flag mà nó chấp nhận: --cwd để chỉ định project root, --transcript để chỉ định rõ file transcript, --quiet để ẩn output và --harness để chọn giữa claude và opencode. Trỏ nó vào một project:
python3 ~/recall/scripts/make_context.py --cwd /srv/projects/apiNó đọc transcript của session và history.md, sau đó ghi context.md vào directory bạn đã truyền vào. Nếu cài qua marketplace, plugin nằm trong directory do Claude Code quản lý, và /recall:save là cách được hỗ trợ để thực hiện cùng công việc.
Vì sao không có gì được ghi
Không có thư mục .recall/ sau một session đầy đủ. Các hook chưa bao giờ chạy. Nhập /recall:show để xác nhận plugin đã được load, sau đó chạy python3 -V. Lệnh hook thử python3 trước và python sau, vì vậy máy không có cả hai lệnh này sẽ không ghi gì và cũng không báo lỗi.
history.md tăng nhưng context.md không bao giờ thay đổi. Mặc định, auto_save_context là off. Chạy /recall:save, hoặc đặt key thành on_end rồi để hook SessionEnd xử lý.
Các file xuất hiện trong project không đúng. Claude Code ghi theo đường dẫn tương đối từ thư mục nơi bạn khởi động, vì vậy nếu bắt đầu session từ thư mục home thì memory sẽ được ghi ở đó. Hãy khởi động từ thư mục gốc của project và dùng ls -la .recall/ để tìm vị trí thực tế của các file.
Quá trình capture dừng nhưng không có cảnh báo. Kiểm tra pause marker bằng ls -a .recall/. File .capture-paused bạn tạo từ tuần trước vẫn đang có hiệu lực.
Bản tóm tắt quá sơ sài sau một session dài. max_input_chars giới hạn input của summarizer ở 200000 ký tự, nên log quá dài sẽ bị cắt. Hãy rotate log.
mv .recall/history.md .recall/history-2026-07-30.mdSau đó chạy một session ngắn và kiểm tra lại ls -la .recall/ để xác nhận một history.md mới đã xuất hiện.
Recall dừng ở đâu
Recall là một log kèm trình tóm tắt. Cần nói rõ những gì cách này không bao gồm.
Trình tóm tắt dùng phương pháp trích xuất. TextRank chọn các câu đã có sẵn trong history.md, nên không bao giờ đánh giá một quyết định có đúng hay không. Một hướng xử lý sai được ghi lại vào thứ Ba sẽ trông y hệt một quyết định đúng vào thứ Tư. Khi vấn đề có ảnh hưởng thực tế, hãy đọc context.md và sửa thủ công. Đây là một file markdown, và không có gì ngăn bạn chỉnh sửa nó.
Không có tính năng search. Mỗi project chỉ có một bản tóm tắt hiện tại và một log tiếp tục phát triển, không phải một bộ nhớ có thể query trên nhiều project. Nếu câu hỏi là bạn đã quyết định gì về database ba tuần trước, bạn phải grep history.md. Recall cũng không truyền thông tin giữa các session: hai session cùng mở trên một VPS không thể xem log của nhau. Khi một session cần biết session kia đang làm gì, các session có thể truyền text trực tiếp cho nhau trong lúc chạy.
Recall không hỗ trợ bên trong một session. Context window đầy giữa session là một vấn đề khác, với cách xử lý khác; quản lý context window trong một session là bài viết đi kèm với hướng dẫn này.
Theo thiết kế, summary được xem là input không đáng tin cậy. context.md được inject trong fenced block và gắn nhãn rõ ràng, còn Claude sẽ hỏi trước khi dựa vào nội dung đó. Thiết kế này cần thiết vì một thư mục .recall/ đã commit là nơi bất kỳ ai có quyền commit cũng có thể ghi text mà agent của bạn sẽ đọc. Agent sẽ dừng lại hỏi bao nhiêu về nội dung nó đọc phụ thuộc vào permission mode mà session khởi động. auto mode trở thành mặc định của Claude Code vào ngày 14 August 2026. Hãy quyết định một lần xem .recall/ là dữ liệu cá nhân hay dùng chung: thêm nó vào .gitignore để lưu memory cá nhân, hoặc commit nó rồi review như mọi contribution khác. Nếu agent chạy unattended, chạy Claude Code an toàn trên VPS trình bày phạm vi rộng hơn.
Redaction chỉ mang tính best effort. Tính năng này nhắm đến các pattern phổ biến như API key, token, PEM block và các assignment .env. Hãy đọc .recall/ trước khi commit file đó.
Version number phản ánh đúng mức độ hoàn thiện. Ở version 0.4.0 vào July 2026, các config key và layout của file vẫn có thể thay đổi giữa các release. Vì vậy, hãy đọc changelog trước khi upgrade một setup mà bạn đang phụ thuộc vào.
FAQ
Recall có gửi code hoặc transcript của tôi đi đâu không?
Không. Các capture hook và summarizer là những Python script chạy trên máy của bạn, plugin không giữ API key và không thực hiện network call nào. Tính năng tóm tắt dùng TF-IDF và TextRank thay vì model, nên bước này không tốn chi phí và vẫn hoạt động khi máy offline. Đổi lại, bản tóm tắt mang tính trích xuất: nó chọn các câu từ log của bạn thay vì tự viết câu mới.
Vì sao .recall/context.md bị thiếu hoặc không được cập nhật?
auto_save_context mặc định là off, nên bản tóm tắt chỉ được tạo lại khi bạn chạy /recall:save. Đặt "auto_save_context": "on_end" trong recall.config.json để bản tóm tắt được viết lại khi mỗi session kết thúc. Nếu history.md cũng bị thiếu thì các hook hoàn toàn không chạy: xác nhận plugin đã được load bằng /recall:show, sau đó xác nhận python3 -V trả lời trên máy đó, vì các hook là Python script.
Recall tiết kiệm bao nhiêu cho mỗi session?
Việc load bản tóm tắt tốn khoảng 1,200 token, so với khoảng 30,000 token đối với model phải đọc lại repository để xác định đang ở đâu. Đây là các con số điển hình. Hãy đo trên hệ thống của bạn bằng wc -c .recall/context.md và command /context bên trong một session, rồi so sánh lần khởi động cold start với lần resume từ bản tóm tắt.
Tôi vẫn cần file CLAUDE.md chứ?
Có, và hai file này có hai nhiệm vụ khác nhau. CLAUDE.md là nội dung bạn chủ động viết: các quy tắc áp dụng lâu dài và các build command. context.md được tạo từ những gì thực sự xảy ra trong session trước, nên nó chứa cả migration đang làm dở mà bạn sẽ không bao giờ nghĩ đến việc ghi lại. Hãy giữ cả hai.
Một VPS có thể lưu memory cho nhiều project không?
Có. Recall lưu memory trong .recall/ bên trong thư mục của từng project, nên hai project trên cùng một server vẫn giữ log và bản tóm tắt riêng biệt. Mỗi lần hãy khởi động Claude Code từ project root, vì các file đi theo working directory chứ không đi theo user account.