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 plugin 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 interrumpió el trabajo. Un resumidor local escrito en Python genera ambos archivos en la máquina donde trabaja, por lo que la memoria no consume tokens de la API.
Cubre una necesidad pequeña pero constante. El martes cierra una sesión en su VPS. El miércoles, una sesión nueva no carga automáticamente la conversación del martes, aunque la memoria automática integrada de Claude Code puede conservar notas entre sesiones. Si esas notas no indican dónde se detuvo, debe 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, publicada el 18 de julio de 2026, sigue siendo la versión más reciente en octubre de 2026, y el proyecto usa la licencia MIT. Es un plugin. 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 o 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 volver a generar 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 siguientes pasos, los archivos modificados, los comandos ejecutados y el contexto de git.
Después de una sesión real, revise el directorio.
ls -la .recall/Con la captura habilitada, sin un marcador de pausa y con una transcripción disponible, debería ver history.md con contenido. Es posible que no vea ningún context.md, y ese es el comportamiento predeterminado, no un error. auto_save_context es off, a menos que lo establezca, por lo que el resumen sólo se escribe cuando lo solicita:
/recall:saveEse comando ejecuta el resumidor local sobre history.md y vuelve a escribir context.md. El algoritmo usa una puntuación TF-IDF (frecuencia de términos, frecuencia inversa de documentos) que alimenta una clasificación de oraciones TextRank. Es determinista y extractivo, lo que significa que selecciona oraciones que ya existen en el registro. No se llama a ningún modelo, por lo que este paso es gratuito y funciona sin conexión en la máquina.
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 registrohistory.md.auto_save_contextaceptaoffoon_endy usaoffde forma predeterminada.summary_sentencesdefine cuántas frases se conservan encontext.md. Al aumentarlo, el resumen es más largo y la carga al iniciar la sesión es ligeramente mayor.redactelimina patrones comunes de secretos antes de escribir cualquier dato en disco.include_gitañade al resumen las estadísticas del diff actual y las confirmaciones recientes.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 y no una garantía. El mismo razonamiento se aplica a mantener los secretos fuera de los agentes de IA en general: el secreto seguro es el que el agente nunca ve.
¿Cuántos tokens ahorra Recall?
Depende de cuál fuera la alternativa. Cargar un resumen al iniciar la sesión es barato. Lo que sustituye puede ser costoso, porque un modelo que no conoce el proyecto lo redescubre leyendo archivos.
Los datos de este gráfico
[
{
"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 proyecto. 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 que ocurrió anoche.
Mida sus propios valores. Un token equivale aproximadamente a cuatro caracteres de prosa en inglés y a algo menos en el caso del 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 la longitud de contexto predeterminada de Ollama depende de la VRAM disponible.
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 disponible y compare los resultados. Para obtener una visión completa de 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 mantiene válida esta afirmación. 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 de su valor predeterminado, salvo que sus sesiones sean largas. Una sesión con menos actividad ayuda en el otro lado del balance, porque un agente orientado a aplicar 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. Compruebe si la captura está deshabilitada, si el directorio de salida está configurado en otra ubicación o si no se encontró ninguna transcripción antes de concluir que 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 lo que un sistema que no tenga ninguno de los dos devuelve stderr y el estado de salida 127. Claude Code muestra un aviso de error no bloqueante del hook con la primera línea de stderr.
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 haga el hook SessionEnd.
Los archivos aparecen bajo el proyecto equivocado. Recall escribe rutas relativas al directorio desde el que se inició Claude Code, por lo que iniciar una sesión desde el directorio personal guarda allí la memoria. Inicie la sesión desde la raíz del proyecto y use ls -la .recall/ para encontrar 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 sigue funcionando.
El resumen es escaso 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.mdEjecute después una sesión breve y vuelva a comprobar ls -la .recall/ para confirmar que se creó un history.md nuevo.
Dónde termina Recall
Recall es un registro con un resumidor. Conviene dejar claro qué queda fuera.
El resumidor es extractivo. TextRank selecciona frases que ya están en history.md, por lo que nunca determina si una decisión fue correcta. Una decisión equivocada registrada el martes se lee exactamente igual que una buena decisión registrada el miércoles. Cuando hay consecuencias reales, lea context.md y corríjalo manualmente. Es un archivo Markdown y puede editarlo sin restricciones.
No hay búsqueda. Cada proyecto tiene un resumen actual y un registro que crece, pero no hay una memoria consultable entre proyectos. Si quiere saber qué decidió sobre la base de datos hace tres semanas, debe buscar con grep en history.md. Recall no proporciona coordinación en tiempo real: dos sesiones del mismo proyecto comparten el archivo de registro, pero Recall no incorpora las nuevas entradas del registro al contexto de la otra sesión. Cuando una sesión 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. La gestión de la ventana de contexto dentro de una sesión es el artículo complementario de esta guía.
El resumen se trata deliberadamente como una 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/ confirmado en el repositorio es un lugar donde cualquier persona con acceso de escritura puede introducir texto que el agente leerá. El grado en que el agente se detiene para preguntar sobre lo que lee depende del modo de permisos con el que se inicia la sesión. Con Claude Code v2.1.283 o posterior, el modo automático ya es el modo de inicio integrado para las sesiones interactivas en el terminal y en VS Code, en todos los planes y proveedores. Por tanto, un clasificador revisa la mayoría de las acciones en lugar de usted. Las organizaciones con la configuración HIPAA siguen iniciando las sesiones en modo Manual. Decida una sola vez si .recall/ es personal o compartido: añádalo a .gitignore para usarlo como memoria personal, o confírmelo en el repositorio y revíselo como cualquier otra contribución. Si el agente se ejecuta sin supervisión, la ejecución segura de Claude Code en un VPS cubre el límite de seguridad más amplio.
La redacción es de mejor esfuerzo. Busca patrones habituales, como claves de API, tokens, bloques PEM y asignaciones .env. Lea .recall/ antes de confirmarlo en el repositorio.
El número de versión refleja con honestidad el nivel de madurez. En la versión 0.4.0, que sigue siendo la versión más reciente en octubre de 2026, las claves de configuración y la estructura de archivos todavía pueden cambiar entre versiones. Lea el registro de cambios 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 llamadas de red. El resumen utiliza TF-IDF y TextRank en lugar de un modelo, por lo que este paso no tiene coste y funciona sin conexión. 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 tiene off de forma predeterminada, por lo que el resumen sólo se regenera cuando ejecuta /recall:save. Defina "auto_save_context": "on_end" en recall.config.json para que se reescriba al terminar cada sesión. Si history.md también falta, compruebe capture_history, el marcador .capture-paused y si hay una transcripción de sesión disponible: en esos casos, los hooks en ejecución omiten la escritura del historial. Confirme que el plugin esté cargado con /recall:show y, después, confirme que python3 -V responde en ese equipo, porque los hooks son scripts de Python.
¿Cuánto ahorra Recall por sesión?
Cargar un resumen cuesta alrededor de 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 habituales. 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 expresamente: 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. Mantenga ambos.
¿Puede un mismo 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 siguen el directorio de trabajo y no la cuenta de usuario.