SSD Nodes Learn 8GB RAM — $66/yr
How to do am Matt ConnorBy Matt Connor · Updated 2026-08-02

How to Give Claude Code Memory on VPS with Recall

Recall logs every Claude Code session locally, then condenses am into resumable summaries. See how to install Recall 0.4.0 on VPS and measure token savings.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

Wetin Recall dey do for Claude Code memory

Recall na Claude Code plugin wey dey give each project memory across sessions. E dey write two markdown files inside .recall/ folder for your project: one append-only log of wetin happen, and one short summary of where you stop. Local Python summarizer dey produce both files for the machine wey you dey work on, so the memory itself no dey use any API tokens.

The gap wey e dey fill small but e dey happen every time. You close session for your VPS on Tuesday. On Wednesday, Claude Code no know anything about Tuesday. You go explain the project again by hand, or you allow the model read half the repository again make e understand am. Both options dey use tokens, and the second one dey use plenty tokens.

Recall version 0.4.0 na the current version as of July 2026, and the project get MIT license. E na plugin. Nothing inside am dey make network call.

VPS dey Need Wetin

Recall capture hooks na Python scripts wey come with the plugin. E no get third-party dependencies, so na interpreter be the only real requirement.

python3 -V

Ubuntu 24.04 answer Python 3.12.3. Recall support Python 3.9 and newer versions. Minimal container images sometimes no get interpreter at all, then shell go answer python3: command not found. Install one before you continue.

sudo apt update && sudo apt install -y python3

NumPy na optional accelerator for one step of the summarizer. You no need am.

python3 -c "import numpy"

ModuleNotFoundError: No module named 'numpy' na acceptable answer here. Summarizer get pure-Python path, and the project's test suite dey check say both paths select the same sentences.

Session memory matter pass for server than laptop, because server work dey come for short visits wey spread across days. If you already get Claude Code wey dey run inside tmux for VPS, Recall na the part wey carry yesterday session enter today own.

Install Recall from the plugin marketplace

Na inside Claude Code session you go type two commands:

/plugin marketplace add raiyanyahya/recall
/plugin install recall@recall

The second command dey read plugin@marketplace. Both names na recall for here. E fit look like say na copy-paste mistake, but e no be mistake.

Check the install by running one of the plugin own commands:

/recall:show

/recall:show dey print the current summary. For brand-new project, nothing dey to print yet. So wetin you really dey check na whether the command dey exist at all. If Claude Code no recognise /recall:show, the plugin no load, and no hook go run.

To run am from checkout instead, clone the repository and validate am first:

git clone https://github.com/raiyanyahya/recall ~/recall
cd ~/recall && claude plugin validate .

claude plugin validate . dey read the manifest for .claude-plugin/ and report whether the plugin dey well formed. Then start Claude Code from your project directory with claude --plugin-dir ~/recall.

Wetin the hooks dey write, and when

Recall register three Claude Code hooks. Each one dey run a Python script from the plugin directory.

  • SessionStart dey run for startup, resume and clear. E dey show context.md so the session go open with your summary for view.
  • Stop dey run every time Claude finish one response. E dey append that turn to the log.
  • SessionEnd dey run when the session close, and e fit generate the summary again.

Two files dey come from this, both inside .recall/.

  • history.md na the append-only record: prompts, responses, files wey dem touch, and commands wey dem run.
  • context.md na the generated digest: the goal, summary, next steps, files wey dem touch, commands wey dem run, and git context.

After one real session, check the directory.

ls -la .recall/

You suppose see history.md with content inside am. You fit no see context.md at all, and na the default behaviour be that, no be fault. auto_save_context na off unless you set am, so e go write the summary only when you ask for am:

/recall:save

That command dey run the local summarizer over history.md and rewrite context.md. The algorithm na TF-IDF (term frequency, inverse document frequency) scoring wey dey feed TextRank sentence ranking. E dey deterministic and extractive, meaning say e dey select sentences wey already dey inside your log. No model dey run, so the step free and e work when the machine dey offline.

Configure Recall for one project

Configuration dey inside one recall.config.json file for the project root. Na these defaults wey dem ship be:

{
  "output_dir": ".recall",
  "capture_history": true,
  "summary_sentences": 8,
  "redact": true,
  "include_git": true,
  "max_input_chars": 200000
}
  • output_dir dey set where the two files go dey. Keep am inside the project.
  • capture_history dey turn the history.md log on and off.
  • auto_save_context dey accept off or on_end, and e dey default to off.
  • summary_sentences na how many sentences go remain inside context.md. If you increase am, the summary go longer and the load for session start go increase small.
  • redact dey remove common secret patterns before anything enter disk.
  • include_git dey add the current diff and recent commits to the summary.
  • max_input_chars dey limit how much of history.md the summarizer go read for one pass.

For project wey dey run for VPS, the useful change na automatic saving, because session for server fit end when terminal disappear, instead of when you decide to stop.

{
  "auto_save_context": "on_end",
  "summary_sentences": 12
}

To pause capture for some time without touching the config, create the pause marker. Delete am to start capture again.

touch .recall/.capture-paused

Do this before session wey you go handle production credentials, because redaction na filter and e no be guarantee. Na the same reason make secrets staying out of AI agents important generally: the safe secret na the one wey the agent never see.

Recall tokens dik savings?

E depend on wetin di alternative be. Loading summary when session start cheap. Wetin e dey replace fit cost plenty, because model wey no remember your project go rediscover am by reading files.

ChartTypical cost of resuming work, per 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"
  }
]

These figures na typical ones for mid-size project; dem no be measurement of your own project. Recall summary loads with about 1,200 tokens. This match di project published claim of one to two thousand tokens for resume. Replaying full previous transcript reloads di whole conversation, around 85,000 tokens. If model rediscover di project by reading files, e dey between both options, near 30,000 tokens. This number dey increase as repository dey grow. Di CLAUDE.md row dey show scale: e cheaper because e short and static, and e tells di model your standing rules instead of wetin happen last night.

Measure your own numbers. One token na roughly four characters for English prose, and small pass that for code.

wc -c .recall/context.md .recall/history.md
echo $(( $(wc -c < .recall/context.md) / 4 ))

Inside session, /context dey show wetin load into context window now, while /cost dey report session totals. Start one session cold. Start di next one with summary already in place, then compare dem. For complete picture of where session tokens really dey go, how Claude Code dey spend tokens get di breakdown.

One thing dey limit this claim. Di summary loads every time session start. So, summary wey you no use na small tax instead of saving. Keep summary_sentences near di default unless your sessions dey run long.

Rebuild di summary without session

If you clone the repository, summarizer get im own command line entry point. Dis one dey useful for VPS when session die together with terminal and you still want the digest.

python3 ~/recall/scripts/make_context.py --help

The help output dey list the flags wey e accept: --cwd for project root, --transcript for one transcript file wey you specify, --quiet to stop output, and --harness to choose between claude and opencode. Point am to one project:

python3 ~/recall/scripts/make_context.py --cwd /srv/projects/api

E reads the session transcript and history.md, then e writes context.md inside the directory wey you pass. If you install am through the marketplace, plugin dey inside directory wey Claude Code dey manage, and /recall:save na the supported way to do the same work.

Why nothing dey write

No .recall/ directory after one full session. The hooks no run. Type /recall:show to confirm say the plugin dey loaded, then run python3 -V. The hook command dey try python3 first and python second, so a box wey no get either one no go write anything and e no go report am.

history.md dey grow but context.md never change. auto_save_context na off by default. Run /recall:save, or set the key to on_end and make the SessionEnd hook handle am.

The files dey show under the wrong project. Recall dey write relative to the directory wey Claude Code start from, so if you start session from your home directory, e go put the memory there. Start from the project root, and use ls -la .recall/ to find where the files really land.

Capture stop and nothing warn you. Check for the pause marker with ls -a .recall/. Any .capture-paused file wey you create last week still dey do the same work.

The summary thin after long session. max_input_chars dey limit the summarizer input to 200000 characters, so e go cut very long log. Rotate am.

mv .recall/history.md .recall/history-2026-07-30.md

Run one short session after that and check ls -la .recall/ again to confirm say fresh history.md don appear.

Where Recall stop

Recall na be log plus summarizer, and e good make we clear wetin e no cover.

The summarizer na extractive. TextRank dey pick sentences wey already dey inside history.md, so e no dey judge whether decision correct. Wrong turn wey dem record on Tuesday go read exactly like good decision on Wednesday. When matter serious, read context.md and correct am by hand. Na markdown file, and nothing stop you from editing am.

No search dey. You get one current summary and one growing log for each project, no be memory wey you fit query across projects. If question na wetin you decide about database three weeks ago, you dey grep history.md.

E no help inside one session. Context window wey full up for middle of session na different problem with different fixes, and how to manage context window inside one session na companion piece for this guide.

By design, dem dey treat summary as untrusted input. context.md dey injected inside fenced block with label, and Claude dey ask before e rely on am. This design dey exist because committed .recall/ directory na place wey anybody wey get commit access fit write text wey your agent go read. Decide once whether .recall/ na personal or shared: add am to .gitignore for personal memory, or commit am and review am like any other contribution. If agent dey run unattended, how to run Claude Code safely on a VPS cover the wider boundary.

Redaction na best effort. E dey target common patterns like API keys, tokens, PEM blocks and .env assignments. Read .recall/ before you commit am.

The version number dey honestly show the maturity level. For 0.4.0 in July 2026, the config keys and file layout fit still change between releases, so read changelog before you upgrade setup wey you depend on.

FAQ

Recall dey send my code or transcripts go anywhere?

No. The capture hooks and the summarizer na Python scripts wey dey run for your own machine. The plugin no hold any API key, and e no make any network call. Summarising dey use TF-IDF and TextRank instead of model, so the step no cost anything and e work when machine dey offline. The trade-off be say the summary na extractive: e dey select sentences from your log instead of writing new ones.

Why my .recall/context.md dey miss or e no dey up to date?

auto_save_context default na off, so the summary go regenerate only when you run /recall:save. Set "auto_save_context": "on_end" inside recall.config.json make e rewrite when each session end. If history.md dey miss too, the hooks no dey run at all: confirm say plugin load with /recall:show, then confirm say python3 -V answer for that box, because the hooks na Python scripts.

How much Recall dey save for each session?

Loading summary dey cost around 1,200 tokens, compared with typical 30,000 tokens for model wey must read your repository again to know where e dey. Those na typical figures. Measure your own with wc -c .recall/context.md and the /context command inside session, compare cold start with one wey resume from summary.

I still need CLAUDE.md file?

Yes, and the two get different jobs. CLAUDE.md na wetin you write deliberately: the standing rules and the build commands. context.md dey generate from wetin really happen for last session, so e hold the migration wey never finish and wey you for no remember to write down. Keep both.

One VPS fit hold memory for several projects?

Yes. Recall dey keep memory for .recall/ inside each project directory, so two projects for the same server go keep separate logs and separate summaries. Start Claude Code from the project root every time, because the files dey follow the working directory, no be the user account.