حافظه محلی برای Claude Code روی VPS با Recall
با Recall، هر جلسه Claude Code به گزارش و خلاصهای قابل ادامه تبدیل میشود. راهاندازی روی VPS، نیازمندیهای Python و صرفهجویی واقعی توکن را بررسی کنید.
Recall برای حافظه Claude Code چه کاری انجام میدهد
Recall یک افزونه برای Claude Code است که برای هر پروژه، حافظهای میان جلسههای مختلف ایجاد میکند. این افزونه دو فایل Markdown را در پوشه .recall/ داخل پروژه مینویسد: یک گزارش فقطالحاقی از رویدادهای رخداده و یک خلاصه کوتاه از وضعیت کار در زمان توقف. هر دو فایل را یک خلاصهساز محلی Python روی همان ماشینی تولید میکند که روی آن کار میکنید؛ بنابراین خود حافظه هیچگونه توکن API مصرف نمیکند.
این افزونه یک مشکل کوچک اما همیشگی را برطرف میکند. سهشنبه جلسهای را روی VPS خود میبندید. چهارشنبه، Claude Code هیچ اطلاعی از رویدادهای سهشنبه ندارد. باید پروژه را دستی دوباره توضیح دهید، یا اجازه دهید مدل برای درک وضعیت پروژه دوباره نیمی از مخزن را بخواند. هر دو روش توکن مصرف میکنند و روش دوم توکن زیادی مصرف میکند.
نسخه 0.4.0 Recall در ژوئیه 2026 نسخه فعلی است و پروژه تحت مجوز MIT منتشر میشود. Recall یک افزونه است. هیچ بخشی از آن اتصال شبکه برقرار نمیکند.
VPS به چه چیزهایی نیاز دارد
قلابهای ثبت Recall اسکریپتهای Python هستند که همراه این افزونه منتشر میشوند. هیچ وابستگی شخص ثالثی وجود ندارد؛ بنابراین تنها نیاز واقعی، یک مفسر است.
python3 -VUbuntu 24.04 به Python 3.12.3 پاسخ میدهد. Recall از Python 3.9 و نسخههای جدیدتر پشتیبانی میکند. تصاویر کانتینری حداقلی گاهی اصلاً مفسر ندارند و در این حالت shell به python3: command not found پاسخ میدهد. پیش از ادامه، یک مفسر نصب کنید.
sudo apt update && sudo apt install -y python3NumPy برای یکی از مراحل خلاصهساز، یک شتابدهنده اختیاری است. به آن نیاز ندارید.
python3 -c "import numpy"ModuleNotFoundError: No module named 'numpy' در اینجا پاسخ قابلقبولی است. خلاصهساز یک مسیر pure-Python دارد و مجموعهآزمون پروژه بررسی میکند که هر دو مسیر، جملات یکسانی را انتخاب کنند.
حافظه نشست در سرور مهمتر از لپتاپ است، زیرا کارهای سروری در بازدیدهای کوتاه و طی چند روز انجام میشوند. اگر از قبل Claude Code را در tmux روی یک VPS اجرا میکنید، Recall بخشی است که نشست دیروز را به امروز منتقل میکند.
نصب Recall از marketplace افزونه
دو command را داخل یک session از Claude Code وارد کنید:
/plugin marketplace add raiyanyahya/recall
/plugin install recall@recallcommand دوم plugin@marketplace را میخواند. هر دو نام در اینجا recall هستند؛ این وضعیت شبیه خطای copy-paste است، اما خطا نیست.
با اجرای یکی از commandهای خود افزونه، نصب را بررسی کنید:
/recall:show/recall:show خلاصه فعلی را چاپ میکند. در یک پروژه کاملاً جدید، هنوز چیزی برای چاپ وجود ندارد؛ بنابراین در عمل بررسی میکنید که command وجود دارد. اگر Claude Code، /recall:show را تشخیص ندهد، افزونه بارگذاری نشده است و هیچ hookای اجرا نخواهد شد.
برای اجرا از یک checkout، ابتدا repository را clone و سپس آن را اعتبارسنجی کنید:
git clone https://github.com/raiyanyahya/recall ~/recall
cd ~/recall && claude plugin validate .claude plugin validate . manifest موجود در .claude-plugin/ را میخواند و اعلام میکند که آیا افزونه ساختار معتبر دارد یا خیر. سپس Claude Code را از دایرکتوری پروژه، با claude --plugin-dir ~/recall، اجرا کنید.
هوکها چه چیزی را و چه زمانی مینویسند
Recall سه هوک Claude Code را ثبت میکند. هر هوک یک اسکریپت Python را از دایرکتوری plugin اجرا میکند.
SessionStartهنگام راهاندازی، ازسرگیری و پاکسازی اجرا میشود.context.mdرا نمایش میدهد تا جلسه با خلاصه شما در نمای فعلی باز شود.Stopهر بار که Claude پاسخگویی را تمام میکند اجرا میشود. این هوک آن نوبت را به لاگ اضافه میکند.SessionEndهنگام بستهشدن جلسه اجرا میشود و میتواند خلاصه را دوباره تولید کند.
در نتیجه، دو فایل ایجاد میشود که هر دو داخل .recall/ قرار دارند.
history.mdسابقهای است که فقط به آن افزوده میشود: promptها، پاسخها، فایلهای تغییریافته و فرمانهای اجراشده.context.mdخلاصه تولیدشده است: هدف، خلاصه، گامهای بعدی، فایلهای تغییریافته، فرمانهای اجراشده و زمینه git.
پس از یک جلسه واقعی، دایرکتوری را بررسی کنید.
ls -la .recall/باید history.md را همراه با محتوا ببینید. ممکن است اصلاً context.md را نبینید؛ این رفتار پیشفرض است و خطا محسوب نمیشود. مقدار auto_save_context برابر با off است، مگر اینکه آن را تنظیم کنید. بنابراین، خلاصه فقط زمانی نوشته میشود که آن را درخواست کنید:
/recall:saveاین فرمان خلاصهساز محلی را روی history.md اجرا میکند و context.md را بازنویسی میکند. الگوریتم از امتیازدهی TF-IDF (بسآمد اصطلاح، بسآمد معکوس سند) استفاده میکند و سپس رتبهبندی جملهها را با TextRank انجام میدهد. این فرایند قطعی و استخراجی است؛ یعنی جملههایی را انتخاب میکند که از قبل در لاگ وجود دارند. هیچ modelی فراخوانی نمیشود؛ بنابراین این مرحله رایگان است و بدون اتصال به شبکه نیز روی ماشین اجرا میشود.
پیکربندی Recall برای یک پروژه
پیکربندی در یک فایل recall.config.json در ریشه پروژه قرار دارد. این موارد، تنظیمات پیشفرض ارائهشده هستند:
{
"output_dir": ".recall",
"capture_history": true,
"summary_sentences": 8,
"redact": true,
"include_git": true,
"max_input_chars": 200000
}output_dirمحل قرارگیری دو فایل را تعیین میکند. این محل را داخل پروژه نگه دارید.capture_historyگزارشhistory.mdرا فعال یا غیرفعال میکند.auto_save_contextمقدارoffیاon_endرا میپذیرد و مقدار پیشفرض آنoffاست.summary_sentencesتعداد جملههایی را تعیین میکند که درcontext.mdباقی میمانند. افزایش این مقدار خلاصه طولانیتری ایجاد میکند و بار هنگام شروع نشست را اندکی افزایش میدهد.redactالگوهای رایج اسرار را پیش از نوشتن هر چیزی روی دیسک حذف میکند.include_gitتفاوت فعلی و commitهای اخیر را به خلاصه اضافه میکند.max_input_charsحداکثر مقدارhistory.mdرا که خلاصهساز در هر نوبت میخواند تعیین میکند.
برای پروژهای روی یک VPS، تغییر مفید ذخیرهسازی خودکار است؛ زیرا نشست روی سرور اغلب زمانی پایان مییابد که ترمینال قطع میشود، نه زمانی که خودتان تصمیم میگیرید آن را متوقف کنید.
{
"auto_save_context": "on_end",
"summary_sentences": 12
}برای توقف موقت ثبت، بدون تغییر پیکربندی، نشانگر توقف را ایجاد کنید. برای شروع دوباره ثبت، آن را حذف کنید.
touch .recall/.capture-pausedاین کار را پیش از نشستی انجام دهید که در آن با اعتبارنامههای production کار میکنید؛ زیرا حذف اطلاعات حساس یک فیلتر است و تضمین محسوب نمیشود. همین منطق، بهطور کلی، بر دور نگهداشتن اسرار از عاملهای هوش مصنوعی نیز حاکم است: راز امن، رازی است که عامل هرگز آن را نمیبیند.
Recall چه مقدار در مصرف token صرفهجویی میکند؟
این موضوع به گزینه جایگزین بستگی دارد. بارگذاری یک خلاصه هنگام شروع session کمهزینه است. گزینهای که خلاصه جایگزین آن میشود ممکن است پرهزینه باشد، زیرا مدلی که پروژه شما را به خاطر ندارد، با خواندن فایلها دوباره آن را کشف میکند.
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"
}
]این اعداد برای یک پروژه با اندازه متوسط معمول هستند و اندازهگیری پروژه شما نیستند. یک خلاصه Recall تقریباً با 1,200 token بارگذاری میشود. این مقدار با ادعای منتشرشده پروژه، یعنی 1 تا 2 هزار token برای resume، همخوانی دارد. بازپخش کامل transcript قبلی، کل مکالمه را دوباره بارگذاری میکند و حدود 85,000 token مصرف دارد. اگر مدل با خواندن فایلها پروژه را دوباره کشف کند، مصرف بین این دو مقدار و نزدیک به 30,000 token خواهد بود. این عدد با بزرگتر شدن repository افزایش مییابد. ردیف CLAUDE.md برای مقایسه درج شده است: این ردیف ارزانتر است، زیرا کوتاه و ثابت است و قوانین همیشگی شما را به مدل اعلام میکند، نه رویدادهای شب گذشته را.
اعداد مربوط به خودتان را اندازهگیری کنید. هر token تقریباً معادل 4 نویسه از نثر انگلیسی است و برای کد کمی کمتر است.
wc -c .recall/context.md .recall/history.md
echo $(( $(wc -c < .recall/context.md) / 4 ))در یک session، /context محتوایی را نشان میدهد که اکنون در context window بارگذاری شده است و /cost مجموع مصرف session را گزارش میکند. یک session را بدون اطلاعات قبلی شروع کنید، session بعدی را با یک خلاصه آغاز کنید و نتایج را مقایسه کنید. برای مشاهده تصویر کامل محل مصرف tokenهای session، Claude Code چگونه tokenها را مصرف میکند جزئیات را ارائه میدهد.
یک نکته احتیاطی، این ادعا را دقیق نگه میدارد. خلاصه در شروع هر session بارگذاری میشود؛ بنابراین خلاصهای که هرگز از آن استفاده نمیکنید، بهجای صرفهجویی، هزینهای اندک ایجاد میکند. مقدار summary_sentences را نزدیک مقدار پیشفرض نگه دارید، مگر اینکه sessionهای شما طولانی باشند.
بازسازی خلاصه بدون نشست
اگر مخزن را clone کردهاید، ابزار خلاصهساز نقطه ورود خط فرمان مستقل خود را دارد. این قابلیت در یک VPS زمانی مفید است که نشست همراه با ترمینال قطع شده باشد و همچنان به خلاصه نیاز داشته باشید.
python3 ~/recall/scripts/make_context.py --helpخروجی راهنما flagهای قابلپذیرش را فهرست میکند: --cwd برای ریشه پروژه، --transcript برای یک فایل transcript مشخص، --quiet برای جلوگیری از تولید خروجی، و --harness برای انتخاب بین claude و opencode. آن را به یک پروژه هدایت کنید:
python3 ~/recall/scripts/make_context.py --cwd /srv/projects/apiاین ابزار transcript نشست را میخواند و history.md، سپس context.md را در زیرشاخهای که مشخص کردهاید مینویسد. اگر آن را از طریق marketplace نصب کردهاید، plugin در یک directory مدیریتشده توسط Claude Code قرار دارد و /recall:save روش پشتیبانیشده برای انجام همین کار است.
چرا چیزی نوشته نمیشود
پس از یک نشست کامل، هیچ پوشه .recall/ ایجاد نمیشود. hookها هرگز اجرا نشدهاند. برای تأیید بارگذاری plugin، /recall:show را وارد کنید، سپس python3 -V را اجرا کنید. فرمان hook ابتدا python3 و سپس python را امتحان میکند؛ بنابراین سیستمی که هیچکدام را نداشته باشد، چیزی نمینویسد و درباره آن نیز هشداری نمیدهد.
history.md رشد میکند، اما context.md هرگز تغییر نمیکند. مقدار پیشفرض auto_save_context، off است. /recall:save را اجرا کنید، یا کلید را روی on_end تنظیم کنید تا hook مربوط به SessionEnd این کار را انجام دهد.
فایلها زیر پروژه نادرست ظاهر میشوند. Recall مسیرهای نسبی را نسبت به پوشهای در نظر میگیرد که Claude Code از آنجا شروع شده است؛ بنابراین اگر نشست را از پوشه home خود آغاز کنید، حافظه در همانجا قرار میگیرد. نشست را از ریشه پروژه آغاز کنید و برای یافتن محل واقعی ایجاد فایلها از ls -la .recall/ استفاده کنید.
ذخیرهسازی متوقف شده است و هشداری نیز دریافت نکردهاید. وجود نشانگر توقف را با ls -a .recall/ بررسی کنید. فایلی از نوع .capture-paused که هفته گذشته ایجاد کردهاید، همچنان فعال است.
پس از یک نشست طولانی، خلاصه ناقص است. max_input_chars ورودی خلاصهساز را به 200000 نویسه محدود میکند؛ بنابراین گزارش بسیار طولانی بریده میشود. آن را چرخش دهید.
mv .recall/history.md .recall/history-2026-07-30.mdپس از آن، یک نشست کوتاه اجرا کنید و دوباره ls -la .recall/ را بررسی کنید تا از ایجاد یک history.md جدید مطمئن شوید.
جایی که Recall متوقف میشود
Recall شامل یک لاگ و یک خلاصهساز است. بنابراین، باید روشن باشد که چه مواردی را پوشش نمیدهد.
خلاصهساز از روش استخراجی استفاده میکند. TextRank جملاتی را انتخاب میکند که از قبل در history.md وجود دارند؛ بنابراین هرگز بررسی نمیکند که یک تصمیم درست بوده است یا نه. یک تصمیم اشتباه که سهشنبه ثبت شده است، دقیقاً مانند یک تصمیم درست که چهارشنبه گرفته شده است، نمایش داده میشود. وقتی پیامدها مهم هستند، context.md را بخوانید و آن را بهصورت دستی اصلاح کنید. این فایل از نوع markdown است و ویرایش آن مانعی ندارد.
قابلیت جستوجو وجود ندارد. برای هر پروژه، یک خلاصه فعلی و یک لاگ در حال رشد دارید؛ نه یک حافظه قابلپرسوجو در میان پروژهها. اگر میخواهید بدانید سه هفته پیش درباره پایگاهداده چه تصمیمی گرفتید، باید در history.md جستوجو کنید.
این ابزار درون یک session کمکی نمیکند. پر شدن context window در میانه یک session مسئله متفاوتی است و راهکارهای متفاوتی دارد. مدیریت context window در یک session مطلب مکمل این راهنما است.
خلاصه، عمداً بهعنوان ورودی غیرقابلاعتماد در نظر گرفته میشود. context.md بهصورت fenced و برچسبگذاریشده تزریق میشود و Claude پیش از اتکا به آن سؤال میپرسد. دلیل این طراحی آن است که یک دایرکتوری .recall/ که commit شده باشد، محلی است که هر فرد دارای دسترسی commit میتواند در آن متنی بنویسد که agent شما آن را خواهد خواند. یکبار تصمیم بگیرید که .recall/ شخصی است یا مشترک: برای حافظه شخصی آن را به .gitignore اضافه کنید، یا آن را commit کنید و مانند هر contribution دیگری بررسی کنید. اگر agent بدون نظارت اجرا میشود، اجرای ایمن Claude Code روی یک VPS مرزهای گستردهتر این موضوع را پوشش میدهد.
حذف اطلاعات حساس با بهترین تلاش انجام میشود. این فرایند الگوهای رایجی مانند API keyها، tokenها، بلوکهای PEM و assignmentهای .env را هدف میگیرد. پیش از commit کردن .recall/، آن را بخوانید.
شماره نسخه، سطح بلوغ پروژه را صادقانه نشان میدهد. در نسخه 0.4.0 در July 2026، کلیدهای پیکربندی و ساختار فایلها هنوز ممکن است بین releaseها تغییر کنند. بنابراین، پیش از upgrade کردن setupای که به آن وابسته هستید، changelog را بخوانید.
FAQ
آیا Recall کد یا رونوشتهای من را به جایی ارسال میکند؟
خیر. قلابهای ثبت و خلاصهساز، اسکریپتهای Python هستند که روی دستگاه خودتان اجرا میشوند. این افزونه هیچ API key ندارد و هیچ تماس شبکهای برقرار نمیکند. خلاصهسازی بهجای model از TF-IDF و TextRank استفاده میکند؛ بنابراین این مرحله هزینهای ندارد و در حالت آفلاین نیز کار میکند. در مقابل، خلاصه بهصورت استخراجی تولید میشود: جملهها از log شما انتخاب میشوند و جملههای جدیدی نوشته نمیشوند.
چرا .recall/context.md وجود ندارد یا بهروز نیست؟
auto_save_context بهطور پیشفرض روی off تنظیم است؛ بنابراین خلاصه فقط زمانی بازتولید میشود که /recall:save را اجرا کنید. برای اینکه خلاصه در پایان هر session بازنویسی شود، "auto_save_context": "on_end" را در recall.config.json تنظیم کنید. اگر history.md نیز وجود ندارد، قلابها اصلاً اجرا نمیشوند. با /recall:show بررسی کنید که افزونه بارگذاری شده باشد. سپس بررسی کنید که python3 -V روی آن سیستم پاسخ میدهد، زیرا قلابها اسکریپتهای Python هستند.
Recall در هر session چه مقدار صرفهجویی میکند؟
بارگذاری یک خلاصه حدود 1,200 token هزینه دارد؛ در مقابل، مدلی که برای یافتن محل فعلی کار باید دوباره repository شما را بخواند، معمولاً به 30,000 token نیاز دارد. اینها ارقام معمول هستند. مقدار مربوط به خودتان را با wc -c .recall/context.md و فرمان /context در یک session اندازهگیری کنید و یک شروع سرد را با sessionای که از خلاصه ادامه پیدا میکند مقایسه کنید.
آیا همچنان به فایل CLAUDE.md نیاز دارم؟
بله؛ این دو وظیفه متفاوتی دارند. CLAUDE.md چیزی است که عمداً مینویسید: قوانین دائمی و فرمانهای build. context.md بر اساس آنچه در session قبلی واقعاً رخ داده تولید میشود؛ بنابراین migration نیمهتمامی را در خود نگه میدارد که هرگز به فکر ثبت آن نمیافتادید. هر دو را نگه دارید.
آیا یک VPS میتواند حافظه چند پروژه را نگه دارد؟
بله. Recall حافظه را در .recall/ داخل پوشه هر پروژه نگه میدارد؛ بنابراین دو پروژه روی یک server، logها و خلاصههای جداگانهای خواهند داشت. هر بار Claude Code را از root پروژه شروع کنید، زیرا فایلها از working directory پیروی میکنند، نه از حساب کاربری.