Cómo dar memoria a Claude Code en un VPS con Recall
Instala Recall 0.4.0 en un VPS para guardar sesiones de Claude Code en Markdown, resumirlas localmente con Python y reanudar el trabajo sin llamadas de red.
Qué hace Recall para 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 anexado con lo que ocurrió y un resumen breve del punto en el que se detuvo 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 API.
Resuelve una necesidad pequeña y constante. El martes cierra una sesión en su VPS. El miércoles, Claude Code no sabe nada de lo ocurrido el martes. Debe volver a explicar el proyecto manualmente o permitir que el modelo lea de nuevo la mitad del repositorio para reconstruir el contexto. 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.
Lo que necesitas en el VPS
Los hooks de captura de Recall son scripts de Python incluidos con el plugin. No hay dependencias de terceros, por lo que el único requisito real es un intérprete.
python3 -VUbuntu 24.04 responde Python 3.12.3. Recall admite Python 3.9 y versiones posteriores. Las imágenes de contenedor mínimas a veces no incluyen ningún intérprete, y entonces el shell responde python3: command not found. Instala uno antes de continuar.
sudo apt update && sudo apt install -y python3NumPy es un acelerador opcional para un paso del resumidor. No lo necesitas.
python3 -c "import numpy"ModuleNotFoundError: No module named 'numpy' es una respuesta válida aquí. El resumidor tiene una ruta basada únicamente 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 del servidor llega en visitas breves distribuidas durante varios días. Si ya tienes Claude Code ejecutándose en tmux en un VPS, Recall es el componente que lleva 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 al copiar y pegar, 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 completamente nuevo todavía no hay nada que mostrar. Por tanto, lo que realmente se comprueba es que el comando exista. Si Claude Code no reconoce /recall:show, el plugin no está cargado y ningún hook se ejecutará.
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 de .claude-plugin/ e informa de si el plugin tiene una estructura válida. 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. 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.
De aquí se obtienen 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, comprueba el directorio.
ls -la .recall/Deberías ver history.md con contenido. Es posible que no veas context.md, y ese es el comportamiento predeterminado, no un error. auto_save_context es off si no lo configuras, por lo que el resumen solo se escribe cuando lo solicitas:
/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érminos, frecuencia inversa de documentos) que alimenta una clasificación de frases mediante TextRank. Es determinista y extractivo, lo que significa que selecciona frases que ya existen en el registro. No se llama a ningún modelo, por lo que este paso es gratuito y funciona con la máquina sin conexión.
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 o 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 inicio de la sesión aumenta ligeramente.redactelimina patrones comunes de secretos antes de escribir cualquier dato en el disco.include_gitañade el diff actual y los commits recientes al resumen.max_input_charslimita la cantidad dehistory.mdque el resumidor lee en una sola pasada.
Para un proyecto 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 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 gestione credenciales de producción, porque la redacción es un filtro y no una garantía. El mismo criterio justifica 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 inicio de la sesión tiene un costo bajo. Lo que reemplaza puede ser costoso, porque un modelo sin conocimiento previo del 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 del suyo. Un resumen de Recall se carga con aproximadamente 1,200 tokens, lo que coincide con la afirmación publicada por el 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. Si el modelo redescubre el proyecto leyendo archivos, el consumo queda entre ambos valores, cerca de 30,000 tokens, y aumenta con el repositorio. La fila CLAUDE.md sirve como referencia de escala: es más barata porque es breve y estática, y le indica al modelo sus reglas permanentes en lugar de lo que ocurrió la noche anterior.
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.
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 en la ventana de contexto, y /cost informa de los totales de la sesión. Inicie una sesión en frío y, en la siguiente, cargue un resumen desde el principio; después, compare los resultados. Para conocer el detalle completo de cómo se distribuyen los tokens de una sesión, consulte cómo usa Claude Code los tokens.
Hay una salvedad importante. El resumen se carga al inicio de cada sesión, por lo que un resumen que nunca se utiliza supone un pequeño costo en lugar de un ahorro. Mantenga summary_sentences cerca de su valor predeterminado, salvo que sus sesiones sean largas.
Reconstruir el resumen sin una sesión
Si clonó el repositorio, el resumidor tiene su propio punto de entrada de línea de comandos. Esto resulta útil en un VPS cuando una 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 las opciones 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 luego escribe context.md en el directorio que indicó. Si realizó la instalación desde el marketplace, el complemento se encuentra en un directorio que administra Claude Code, y /recall:save es la forma compatible 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 lo que un equipo que no tenga ninguno de los dos no escribe nada y no muestra ningún aviso.
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 el hook SessionEnd lo haga.
Los archivos aparecen bajo el proyecto equivocado. Recall escribe mediante rutas relativas al directorio desde el que se inició Claude Code, por lo que iniciar una sesión desde el directorio personal coloca allí la memoria. Inicie la sesión desde la raíz del proyecto y use ls -la .recall/ para averiguar dónde se crearon 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 haya creado la semana pasada sigue funcionando.
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.mdEjecute después una sesión breve y compruebe de nuevo ls -la .recall/ para confirmar que apareció un history.md nuevo.
Donde Recall deja de funcionar
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. Un error registrado el martes se lee exactamente igual que una buena decisión tomada el miércoles. Cuando hay consecuencias reales, lee context.md y corrígelo manualmente. Es un archivo Markdown y puedes editarlo.
No hay búsqueda. Tienes un resumen actual y un registro que crece por proyecto, no una memoria consultable entre proyectos. Si la pregunta es qué decidiste sobre la base de datos hace tres semanas, tienes que buscar con grep en history.md.
No ayuda dentro de una sesión. Que la ventana de contexto se llene durante una sesión es un problema diferente, con soluciones diferentes. administrar 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 inserta dentro de un bloque de código delimitado y etiquetado, 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 confirmación puede escribir texto que el agente leerá. Decide una vez si .recall/ es personal o compartido: añádelo a .gitignore para usarlo como memoria personal, o confírmalo en el repositorio y revísalo 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 de seguridad más amplio.
La redacción de datos confidenciales se realiza con las mejores garantías posibles, pero no es infalible. Busca patrones comunes, como claves de API, tokens, bloques PEM y asignaciones de .env. Lee .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, en julio de 2026, las claves de configuración y la estructura de archivos todavía pueden cambiar entre versiones. Lee el registro de cambios antes de actualizar una instalación de la que dependas.
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 tiene ningún coste y funciona con la máquina sin conexión. La desventaja es que el resumen es extractivo: selecciona frases de su registro en lugar de redactar otras nuevas.
¿Por qué falta .recall/context.md o está desactualizado?
auto_save_context tiene off de forma predeterminada, por lo que el resumen solo se vuelve a generar cuando ejecuta /recall:save. Establezca "auto_save_context": "on_end" en recall.config.json para que se reescriba cuando finalice 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 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 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 reanuda la sesión desde un resumen.
¿Sigo necesitando un archivo CLAUDE.md?
Sí, y cada uno cumple una función distinta. CLAUDE.md es lo que escribe deliberadamente: las reglas permanentes y los comandos de compilación. context.md se genera a partir de lo que ocurrió realmente en la última sesión, por lo que contiene la migración a medio terminar que nunca se le ocurriría documentar. Conserve ambos.
¿Puede un VPS almacenar la memoria de varios proyectos?
Sí. Recall guarda 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 al directorio de trabajo y no a la cuenta de usuario.