Cómo dar memoria a Claude Code en un VPS con Recall
Recall guarda cada sesión de Claude Code y crea un resumen local reanudable. Instálalo en un VPS sin llamadas de red y mide el ahorro de tokens.
Qué hace Recall con la memoria de Claude Code
Recall es un complemento de Claude Code que proporciona memoria a cada proyecto entre sesiones. Escribe dos archivos Markdown en una carpeta .recall/ dentro del proyecto: un registro de solo adición con lo ocurrido y un resumen breve del punto en el que se dejó el trabajo. Un resumidor local escrito en Python genera ambos archivos en la máquina en la que se trabaja, por lo que la memoria no consume tokens de API.
La carencia que resuelve es pequeña y constante. El martes se cierra una sesión en el VPS. El miércoles, Claude Code no sabe nada de lo ocurrido el martes. Hay que volver a explicar el proyecto manualmente o dejar que el modelo lea de nuevo la mitad del repositorio para deducirlo. Ambas opciones consumen tokens, y la segunda consume muchos.
La versión 0.4.0 de Recall es la actual en julio de 2026 y el proyecto usa la licencia MIT. Es un complemento. No realiza ninguna llamada de red.
Qué necesita en el VPS
Los hooks de captura de Recall son scripts de Python que se incluyen con el plugin. No hay dependencias de terceros, por lo que el único requisito real es tener un intérprete.
python3 -VUbuntu 24.04 responde Python 3.12.3. Recall admite Python 3.9 y versiones posteriores. Algunas imágenes de contenedor mínimas no incluyen ningún intérprete, y entonces el shell responde python3: command not found. Instale uno antes de continuar.
sudo apt update && sudo apt install -y python3NumPy es un acelerador opcional para un paso del resumidor. No lo necesita.
python3 -c "import numpy"ModuleNotFoundError: No module named 'numpy' es una respuesta válida en este caso. El resumidor tiene una ruta basada sólo en Python, y el conjunto de pruebas del proyecto comprueba que ambas rutas seleccionen las mismas frases.
La memoria de sesión es más importante en un servidor que en un portátil, porque el trabajo de administración llega en visitas breves distribuidas a lo largo de varios días. Si ya tiene Claude Code ejecutándose en tmux en un VPS, Recall es el componente que transfiere la sesión de ayer a la de hoy.
Instalar Recall desde el marketplace de plugins
Dos comandos escritos dentro de una sesión de Claude Code:
/plugin marketplace add raiyanyahya/recall
/plugin install recall@recallEl segundo comando lee plugin@marketplace. Ambos nombres son recall aquí. Parece un error de copia y pegado, pero no lo es.
Compruebe la instalación ejecutando uno de los comandos propios del plugin:
/recall:show/recall:show muestra el resumen actual. En un proyecto nuevo todavía no hay nada que mostrar, así que lo que realmente se comprueba es que el comando exista. Si Claude Code no reconoce /recall:show, el plugin no está cargado y no se ejecutará ningún hook.
Para ejecutarlo desde un checkout, clone primero el repositorio y valídelo:
git clone https://github.com/raiyanyahya/recall ~/recall
cd ~/recall && claude plugin validate .claude plugin validate . lee el manifiesto en .claude-plugin/ e informa de si el plugin está bien formado. Después, inicie Claude Code desde el directorio del proyecto con claude --plugin-dir ~/recall.
Qué escriben los hooks y cuándo
Recall registra tres hooks de Claude Code. Cada uno ejecuta un script de Python desde el directorio del plugin.
SessionStartse ejecuta al iniciar, reanudar y borrar la sesión. Muestracontext.mdpara que la sesión se abra con el resumen visible.Stopse ejecuta cada vez que Claude termina una respuesta. Añade ese turno al registro.SessionEndse ejecuta cuando se cierra la sesión y puede regenerar el resumen.
Como resultado se generan dos archivos, ambos dentro de .recall/.
history.mdes el registro de solo anexado: prompts, respuestas, archivos modificados y comandos ejecutados.context.mdes el resumen generado: el objetivo, un resumen, los pasos siguientes, los archivos modificados, los comandos ejecutados y el contexto de git.
Después de una sesión real, revise el directorio.
ls -la .recall/Debería ver history.md con contenido. Es posible que no exista context.md, y ese es el comportamiento predeterminado, no un error. auto_save_context es off si no lo establece, por lo que el resumen sólo se escribe cuando se solicita:
/recall:saveEse comando ejecuta el resumidor local sobre history.md y vuelve a escribir context.md. El algoritmo utiliza una puntuación TF-IDF (frecuencia de término, frecuencia inversa de documento) que alimenta una clasificación de oraciones con TextRank. Es determinista y extractivo, lo que significa que selecciona oraciones que ya existen en el registro. No se utiliza ningún modelo, por lo que este paso es gratuito y funciona sin conexión en el equipo.
Configurar Recall para un proyecto
La configuración se encuentra en un archivo recall.config.json en la raíz del proyecto. Estos son los valores predeterminados incluidos:
{
"output_dir": ".recall",
"capture_history": true,
"summary_sentences": 8,
"redact": true,
"include_git": true,
"max_input_chars": 200000
}output_dirdefine dónde se almacenan los dos archivos. Manténgalos dentro del proyecto.capture_historyactiva y desactiva el registro dehistory.md.auto_save_contextaceptaoffoon_endy usaoffde forma predeterminada.summary_sentencesdefine cuántas frases se conservan encontext.md. Al aumentarlo, se obtiene un resumen más largo y se incrementa ligeramente la carga al inicio de la sesión.redactelimina los patrones habituales de secretos antes de escribir cualquier dato en el disco.include_gitañade el diff actual y las confirmaciones recientes al resumen.max_input_charslimita la cantidad dehistory.mdque el resumidor lee en cada pasada.
En un proyecto alojado en un VPS, el cambio más útil es activar el guardado automático, porque una sesión en un servidor suele terminar cuando se cierra el terminal y no cuando usted decide detenerla.
{
"auto_save_context": "on_end",
"summary_sentences": 12
}Para detener temporalmente la captura sin modificar la configuración, cree el marcador de pausa. Elimínelo para volver a iniciar la captura.
touch .recall/.capture-pausedHágalo antes de una sesión en la que vaya a manejar credenciales de producción, porque la redacción es un filtro, no una garantía. El mismo razonamiento se aplica a mantener los secretos fuera de los agentes de IA en general: un secreto es seguro cuando el agente nunca lo ve.
¿Cuántos tokens ahorra Recall?
Depende de cuál fuera la alternativa. Cargar un resumen al inicio de la sesión es barato. Lo que sustituye puede ser costoso, porque un modelo que no conoce el proyecto lo redescubre leyendo archivos.
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"
}
]Estas son cifras habituales para un proyecto de tamaño medio, no una medición de su caso. Un resumen de Recall se carga con aproximadamente 1,200 tokens, lo que coincide con la afirmación publicada del proyecto de que un resumen de reanudación usa entre mil y dos mil tokens. Reproducir una transcripción anterior completa vuelve a cargar toda la conversación, en torno a 85,000 tokens. Dejar que el modelo redescubra el proyecto leyendo archivos queda entre ambos valores, cerca de 30,000 tokens, y esa cifra aumenta con el repositorio. La fila CLAUDE.md sirve como referencia de escala: es más barata porque es breve y estática, y comunica al modelo sus reglas permanentes en lugar de lo ocurrido la noche anterior.
Mida sus propias cifras. Un token equivale aproximadamente a cuatro caracteres de prosa en inglés y a algo menos en código. Si también proporciona el resumen a un modelo local en el mismo VPS, compruebe la ventana en la que se carga antes de confiar en la reanudación, porque Ollama trunca las solicitudes largas con una longitud de contexto predeterminada pequeña en lugar de indicar que descartó el final.
wc -c .recall/context.md .recall/history.md
echo $(( $(wc -c < .recall/context.md) / 4 ))Dentro de una sesión, /context muestra lo que está cargado ahora mismo en la ventana de contexto y /cost informa de los totales de la sesión. Inicie una sesión sin contexto, inicie la siguiente con un resumen preparado y compare los resultados. Para conocer con detalle cómo se distribuyen realmente los tokens de una sesión, cómo Claude Code consume los tokens incluye el desglose.
Hay una salvedad que permite mantener esta afirmación ajustada a la realidad. El resumen se carga al inicio de cada sesión, por lo que un resumen que nunca utiliza supone un pequeño coste en lugar de un ahorro. Mantenga summary_sentences cerca del valor predeterminado, salvo que sus sesiones sean largas. Una sesión más breve también ayuda en el otro lado del balance, porque un agente orientado a realizar el cambio mínimo que funciona deja un registro más corto para que el resumidor lo clasifique.
Reconstruir el resumen sin una sesión
Si clonó el repositorio, el resumidor tiene su propio punto de entrada de línea de comandos. Resulta útil en un VPS cuando la sesión terminó junto con el terminal y necesita el resumen de todos modos.
python3 ~/recall/scripts/make_context.py --helpLa salida de ayuda muestra los indicadores que acepta: --cwd para la raíz del proyecto, --transcript para un archivo de transcripción explícito, --quiet para suprimir la salida y --harness para elegir entre claude y opencode. Indique un proyecto:
python3 ~/recall/scripts/make_context.py --cwd /srv/projects/apiLee la transcripción de la sesión y history.md, y después escribe context.md en el directorio que indicó. Si realizó la instalación desde el marketplace, el plugin se encuentra en un directorio que administra Claude Code, y /recall:save es la forma admitida de realizar la misma tarea.
Por qué no se escribe nada
No hay ningún directorio .recall/ después de una sesión completa. Los hooks nunca se ejecutaron. Escriba /recall:show para confirmar que el plugin está cargado y, después, ejecute python3 -V. El comando del hook prueba primero python3 y después python. Por tanto, un equipo que no tenga ninguno de los dos no escribe nada ni informa de ello.
history.md aumenta, pero context.md nunca cambia. auto_save_context es off de forma predeterminada. Ejecute /recall:save o establezca la clave en on_end y deje que lo ejecute el hook SessionEnd.
Los archivos aparecen bajo el proyecto equivocado. Claude Code escribe mediante rutas relativas al directorio desde el que se inició. Por tanto, si inicia una sesión desde su directorio personal, la memoria se guarda allí. Inicie la sesión desde la raíz del proyecto y use ls -la .recall/ para localizar dónde se guardaron realmente los archivos.
La captura se detuvo y no recibió ningún aviso. Compruebe si existe el marcador de pausa con ls -a .recall/. Un archivo .capture-paused que creó la semana pasada todavía sigue activo.
El resumen es demasiado breve después de una sesión larga. max_input_chars limita la entrada del resumidor a 200000 caracteres, por lo que un registro muy largo se trunca. Rótelo.
mv .recall/history.md .recall/history-2026-07-30.mdDespués, ejecute una sesión breve y vuelva a comprobar ls -la .recall/ para confirmar que se ha creado un history.md nuevo.
Qué deja fuera Recall
Recall combina un registro con un resumen. Conviene dejar claro qué queda fuera.
El resumidor es extractivo. TextRank selecciona frases que ya están en history.md, por lo que nunca evalúa si una decisión fue correcta. Un error registrado el martes se lee exactamente igual que una buena decisión tomada el miércoles. Cuando hay consecuencias reales, lea context.md y corríjalo manualmente. Es un archivo Markdown y nada impide editarlo.
No hay búsqueda. Tiene un resumen actual y un registro acumulativo por proyecto, no una memoria consultable entre proyectos. Si la pregunta es qué decidió sobre la base de datos hace tres semanas, debe buscar en history.md con grep. Tampoco comparte información lateralmente: dos sesiones abiertas a la vez en el mismo VPS no pueden ver los registros de la otra. Cuando una necesita saber qué está haciendo la otra, las sesiones pueden pasarse texto directamente mientras se ejecutan.
No ayuda dentro de una sesión. Que la ventana de contexto se llene durante una sesión es un problema distinto, con soluciones diferentes, y gestionar la ventana de contexto dentro de una sesión es el artículo complementario de esta guía.
El resumen se trata deliberadamente como entrada no confiable. context.md se inyecta dentro de un bloque delimitado y con una etiqueta, y Claude pregunta antes de basarse en él. Este diseño existe porque un directorio .recall/ versionado es un lugar donde cualquiera con acceso de commit puede escribir texto que el agente leerá. El nivel de confirmación que el agente exige sobre lo que lee lo determina el modo de permisos con el que se inicia la sesión, y el modo automático se convierte en el modo predeterminado de Claude Code el 14 de agosto de 2026. Decida una vez si .recall/ es personal o compartido: añádalo a .gitignore para usarlo como memoria personal, o haga commit y revíselo como cualquier otra contribución. Si el agente se ejecuta sin supervisión, ejecutar Claude Code de forma segura en un VPS cubre el límite más amplio.
La redacción de datos sensibles es de mejor esfuerzo. Busca patrones comunes, como claves de API, tokens, bloques PEM y asignaciones de .env. Lea .recall/ antes de hacer commit.
El número de versión refleja su grado de madurez. En la versión 0.4.0, publicada en julio de 2026, las claves de configuración y la estructura de archivos todavía pueden cambiar entre releases. Lea el changelog antes de actualizar una instalación de la que dependa.
FAQ
¿Recall envía mi código o las transcripciones a algún sitio?
No. Los hooks de captura y el resumidor son scripts de Python que se ejecutan en su propia máquina, el plugin no contiene ninguna clave de API y no realiza ninguna llamada de red. El resumen usa TF-IDF y TextRank en lugar de un modelo, por lo que este paso no cuesta nada y funciona con la máquina desconectada. La contrapartida es que el resumen es extractivo: selecciona frases de su registro en lugar de redactar otras nuevas.
¿Por qué falta mi .recall/context.md o está desactualizado?
auto_save_context usa off de forma predeterminada, por lo que el resumen sólo se regenera cuando ejecuta /recall:save. Establezca "auto_save_context": "on_end" en recall.config.json para que se reescriba al finalizar cada sesión. Si history.md también falta, los hooks no se están ejecutando: confirme que el plugin esté cargado con /recall:show y, después, confirme que python3 -V responda en ese equipo, porque los hooks son scripts de Python.
¿Cuánto ahorra Recall por sesión?
Cargar un resumen cuesta aproximadamente 1,200 tokens, frente a los 30,000 tokens habituales que necesita un modelo para volver a leer el repositorio y determinar en qué punto se encuentra. Son cifras orientativas. Mida sus propios valores con wc -c .recall/context.md y el comando /context dentro de una sesión, comparando un inicio en frío con otro que reanude el trabajo desde un resumen.
¿Sigo necesitando un archivo CLAUDE.md?
Sí, y cumplen funciones distintas. CLAUDE.md contiene lo que usted escribe de forma deliberada: las reglas permanentes y los comandos de compilación. context.md se genera a partir de lo que ocurrió realmente en la sesión anterior, por lo que contiene la migración a medio terminar que nunca se le ocurriría anotar. Conserve ambos.
¿Puede un solo VPS conservar la memoria de varios proyectos?
Sí. Recall conserva la memoria en .recall/ dentro del directorio de cada proyecto, por lo que dos proyectos del mismo servidor mantienen registros y resúmenes separados. Inicie Claude Code desde la raíz del proyecto cada vez, porque los archivos dependen del directorio de trabajo y no de la cuenta de usuario.