SSD Nodes Learn 🎉 VPS desde $5.50/mes
Guías Matt ConnorPor Matt Connor · Actualizado 2026-08-12

Como funciona el cifrado local en Compartment

Analizamos la seguridad de Compartment para memoria de agentes offline. Entiende el modelo de amenazas, el cifrado en reposo y qué ocurre si pierdes tu clave de acceso.

En qué se diferencia Compartment

Compartment es un almacén de memoria para agentes que mantiene cada registro cifrado en la máquina que lo creó y nunca se comunica con un servicio de red. Dos opciones lo distinguen del resto del sector de memoria para agentes. El almacén es un único archivo sellado que solo se abre con su frase de contraseña, y el paso de incrustación se ejecuta localmente, por lo que el texto de una memoria nunca se envía a ninguna parte para convertirse en un vector. La versión 4.6.0 se publicó el 10 de agosto de 2026, la licencia es Apache-2.0 y se instala desde PyPI.

Esta es una declaración sobre el modelo de amenazas, por lo que esta guía la trata como tal. El cifrado en reposo junto con un diseño sin conexión protege una lista específica de elementos. Dejan otros aspectos expuestos, y esa brecha es donde residen los problemas del segundo día.

Esta guía sigue la propia documentación y las notas de lanzamiento del proyecto, leídas el 11 de agosto de 2026. Compartment distribuye una aplicación de escritorio, un elemento en la barra de menús en macOS y un icono en el área de notificación en Windows, junto a su herramienta de línea de comandos, y un prompt de frase de contraseña no puede ser gestionado desde un contenedor automatizado. Considere lo siguiente como comportamiento documentado, no como comportamiento medido aquí. Ejecútelo en una máquina de pruebas antes de confiarle cualquier dato real.

Qué protege realmente el cifrado en reposo

El almacén está sellado con XChaCha20-Poly1305, un cifrado AEAD (cifrado autenticado con datos asociados), y las ranuras de claves que contienen la clave maestra están protegidas con Argon2id, una función de hash de contraseñas diseñada para ser lenta y requerir mucha memoria. De esto se derivan dos consecuencias. Una copia del archivo en un disco robado, en una copia de seguridad antigua o adjunta a un ticket de soporte son solo bytes y nada más. Además, un solo bit alterado provoca un fallo de autenticación al abrir el archivo, por lo que la corrupción se convierte en un error evidente en lugar de un resultado incorrecto.

Los vectores de incrustación (embedding vectors) también están cifrados, lo cual es más importante de lo que parece. Una incrustación no es un hash. Las investigaciones sobre la inversión de incrustaciones han logrado recuperar fragmentos legibles del texto original a partir de su vector. Por tanto, un índice de vectores en texto plano junto a una base de datos cifrada equivale casi a dejar la base de datos abierta. Compartment no escribe ningún índice en texto plano en el disco.

El borrado es un borrado real. Cada registro lleva su propia clave y compartment forget --shred destruye esa clave, por lo que el texto cifrado resultante no puede ser descifrado por nadie, ni siquiera por usted. Compare esto con una fila eliminada de un archivo de base de datos, que normalmente permanece legible en las páginas libres hasta que algo la sobrescribe.

El funcionamiento sin conexión (offline) es la otra mitad de la ecuación. No se sube nada, por lo que no existe una cuenta de proveedor que almacene sus recuerdos ni una API key que pueda filtrarlos.

Lo que Compartment no protege

La protección termina en el límite del almacén, y ese límite está más cerca de lo que parece.

El agente lee texto plano. Recall descifra una memoria y entrega el texto al agente. Si ese agente es un modelo alojado, la memoria viaja al proveedor del modelo dentro del siguiente prompt, exactamente igual que todo lo demás en la ventana de contexto. El cifrado en reposo protege el archivo. No protege la recuperación. Por lo tanto, las reglas en mantener secretos fuera de los agentes de IA no se relajan porque el almacén esté cifrado: una contraseña guardada como memoria es una contraseña que usted ha configurado para pegarse automáticamente en un prompt.

Un almacén desbloqueado en una máquina en ejecución está abierto. Las notas de seguridad del proyecto lo indican claramente. Mientras el almacén está desbloqueado, la clave maestra y el conjunto de trabajo residen en la RAM, Python no puede garantizar que un búfer sea borrado, y el swap o una imagen de hibernación pueden escribir esa memoria en el disco. El malware que se ejecuta como su usuario nunca tiene que romper el cifrado, porque puede solicitar información al almacén ya desbloqueado.

La identidad del llamador es declarativa. Los espacios de nombres pueden restringirse por llamador, pero el nombre del llamador proviene del proceso anfitrión, por lo que un anfitrión que miente sobre su nombre recibe los permisos que reclama. Los permisos de espacio de nombres son una organización, no un límite de seguridad contra un programa local hostil.

La destrucción de datos no alcanza a las copias. forget --shred destruye la clave dentro del archivo actual. Una copia de seguridad realizada antes de la destrucción aún contiene ese registro, y aún se abre con la frase de contraseña de ese día.

Una frase de contraseña débil termina la discusión. Argon2id hace que cada intento de adivinanza sea costoso. No protege una frase de contraseña que aparece en una lista de palabras.

Instalar Compartment desde una versión fijada

Compartment requiere Python 3.11 o superior. El proyecto evoluciona rápidamente, con treinta versiones en PyPI para el 10 de agosto de 2026, por lo que debe fijar la versión en lugar de instalar la que esté vigente en el momento.

python3 --version
pip install "compartment==4.6.0"
compartment --version
compartment init

compartment --version debería mostrar la versión que fijó. Si el shell responde compartment: command not found, el directorio de instalación no está en su PATH; en la mayoría de los sistemas, ese directorio es ~/.local/bin. pipx install compartment==4.6.0 y uv tool install compartment==4.6.0 evitan esto gestionando sus propias rutas.

compartment init solicita una frase de contraseña dos veces y no muestra ningún carácter. Esa frase de contraseña es la única clave. El proyecto no genera ninguna contraseña ni frase de recuperación, lo cual es intencional: no existe ninguna credencial que el software almacene y que usted no posea.

Verifique el resultado antes de conectar cualquier elemento a él.

compartment status

Un almacén (vault) en buen estado informa que está desbloqueado. Si informa que está bloqueado, ejecute compartment unlock e introduzca la frase de contraseña. Un reinicio lo bloquea de nuevo, ya que la credencial que lo mantiene abierto depende de un secreto generado en cada arranque. En macOS, compartment unlock --keychain permite persistir tras un reinicio almacenando dicha credencial en el llavero del sistema.

Dónde se almacena realmente la información

El almacén predeterminado es ~/.compartment/memory.vault. Apunte a otra ubicación con --vault PATH en cualquier comando, o mediante la variable de entorno COMPARTMENT_VAULT.

Ese único archivo constituye todo el almacenamiento. Se abre con una cabecera que contiene la versión del formato y los slots de claves Argon2id, seguidos de la carga útil cifrada y, finalmente, las entradas del diario que se añaden a medida que llegan nuevos recuerdos. Cada entrada del diario está delimitada por su longitud y un CRC (verificación de redundancia cíclica) de dicha longitud, de modo que una escritura interrumpida por un fallo se reconoce como una entrada truncada en lugar de leerse como datos. La compactación serializa el almacén, escribe un archivo temporal, ejecuta un fsync y luego lo renombra en su ubicación final; esto garantiza que un lector nunca vea un almacén escrito a medias.

La consecuencia útil: un script de copia de seguridad solo necesita copiar una ruta. La consecuencia incómoda: no puede usar grep sobre él ni repararlo en un editor de texto. Si desea recuerdos que pueda leer con cat y enviar a git, los archivos de memoria local en texto plano de Memmy representan el compromiso opuesto. Ambos son razonables, dependiendo de si su mayor temor es el robo de un portátil o una herramienta que se corrompe.

compartment uninstall elimina el software pero conserva el almacén. Utilice --purge solo cuando esté seguro de querer hacerlo.

Integración en un agente

Un solo comando integra un cliente compatible.

compartment integrate --list
compartment integrate claude

Para Claude Code, que escribe una entrada de servidor MCP (model context protocol) y un hook de PostToolUse en ~/.claude/settings.json, realizando primero una copia de seguridad del archivo, instala una skill de /compartmentalize bajo ~/.claude/skills/ y añade un bloque gestionado a ~/.claude/CLAUDE.md indicando al agente que Compartment reemplaza la memoria basada en archivos que utilizaba. Confirme ambas partes:

compartment hook status
compartment recent

Para registrar el servidor manualmente:

claude mcp add --scope user compartment -- \
    compartment --vault ~/.compartment/memory.vault --caller claude-code serve

Cualquier otro host compatible con MCP acepta el mismo servidor con su propio nombre de invocador.

{ "mcpServers": { "compartment": {
    "command": "compartment",
    "args": ["--vault", "/path/to/memory.vault",
             "--caller", "your-agent-name", "serve"] } } }

Asigne a cada host un valor de --caller distinto. Es la etiqueta que registra el log de auditoría y la clave bajo la cual se otorgan los permisos de namespace, por lo que un nombre compartido inutiliza ambos.

Si Claude Code ya ha estado escribiendo hechos en sus propios archivos de memoria, compartment import-claude --dry-run muestra qué se movería antes de realizar cualquier cambio. Lea qué guarda Claude Code en sus archivos de memoria primero, ya que importar un año de notas a un vault nuevo es la forma en que un almacén de memoria se llena de elementos que nadie pretendía conservar.

¿Qué tan rápido es un vault local?

Estas son las cifras que el proyecto publica para un vault de tamaño personal. Provienen de su documentación, no de una ejecución realizada aquí.

ChartCompartment published local latency, milliseconds
The data behind this chart
[
  {
    "label": "Store one memory, end to end",
    "latency_ms": 40
  },
  {
    "label": "Embed one memory, bundled model",
    "latency_ms": 25
  },
  {
    "label": "Hybrid search, median",
    "latency_ms": 11.6
  },
  {
    "label": "Vector search at 20k records, p95",
    "latency_ms": 0.68
  }
]

El almacenamiento de una memoria se estima en 40 ms, y una búsqueda vectorial en veinte mil registros en 0.68 ms para el percentil 95. El argumento del proyecto para mantener la memoria local es aritmético: un solo viaje de ida y vuelta a través de la red hacia una API de memoria alojada a menudo cuesta más que la mediana de 11.6 ms de una búsqueda híbrida completa aquí.

Dos detalles de diseño explican las cifras de búsqueda. Por debajo de veinte mil registros, Compartment compara la consulta contra cada vector, por lo que la recuperación es exacta por construcción en lugar de aproximada. Por encima de esa cifra, cambia a HNSW (hierarchical navigable small world), un índice aproximado que sacrifica un poco de precisión por velocidad. El vault también registra el hash SHA-256 del modelo de embedding y se niega a abrirse bajo uno diferente, ya que los vectores de dos modelos distintos pueden compararse sin que aparezca ningún error, y las puntuaciones resultantes no tienen significado alguno.

Copias de seguridad y la copia que podrá abrir el próximo año

Una caja fuerte bloqueada es un único archivo portátil, por lo que moverla es simplemente copiarla.

compartment lock
scp ~/.compartment/memory.vault other-machine:
compartment --vault memory.vault unlock

Bloquéela primero. Copiar mientras el agente está escribiendo puede capturar una entrada del diario a mitad de su escritura y, aunque el marco CRC permite al lector omitir ese fragmento final, la memoria contenida en él se pierde. compartment lock --sign sella el archivo con un manifiesto Ed25519, de modo que la máquina receptora puede verificar que la copia llegó intacta sin necesidad de poseer la contraseña.

Debido a que el archivo ya está sellado, el almacenamiento en la nube convencional es un lugar aceptable para guardarlo. Ese es el punto donde el cifrado en reposo le compensa directamente: el destino de la copia de seguridad nunca ve una memoria.

Dos advertencias. El borrado seguro (shredding) no llega a las copias de seguridad, por lo que un registro que usted destruyó criptográficamente hoy sigue siendo legible en la copia de la semana pasada para cualquiera que tenga la contraseña de esa semana. Además, compartment export --plaintext escribe toda la caja fuerte sin cifrar, lo cual es la herramienta correcta para migrar a otro sistema, pero es el archivo incorrecto para dejar en ~/Downloads.

Mantenga pocas copias y asígneles una fecha. Un almacén de memoria se convierte en un riesgo una vez que nadie lo depura, que es el argumento en por qué las memorias obsoletas del agente corrompen silenciosamente la recuperación.

Gestión, rotación y segundo factor de claves

compartment rekey
compartment 2fa enable
compartment 2fa status

rekey cambia la frase de contraseña volviendo a cifrar la clave maestra en el keyslot del archivo actual. Las copias antiguas conservan la contraseña anterior, ya que esos bytes se sellaron antes del cambio y no es posible editarlos retrospectivamente. Rote también las copias o acepte que una contraseña retirada sigue abriendo el archivo.

2fa enable añade un archivo de clave como segundo factor, combinado con la frase de contraseña durante la derivación de la clave, por lo que ambos son necesarios para abrir el almacén. Esto también duplica la cantidad de elementos que puede perder. Mantenga el archivo de clave fuera de la máquina que contiene el almacén.

Para scripts y CI (integración continua), la frase de contraseña puede recibirse a través de la variable de entorno COMPARTMENT_PASSPHRASE, y unlock --passphrase-stdin la lee desde una tubería (pipe). Prefiera la tubería. Una variable de entorno puede ser leída por otros procesos propiedad del mismo usuario y suele terminar en los registros de los trabajos.

El historial de auditoría está encadenado mediante hashes, y compartment audit verify lo recorre e informa del primer enlace roto. Ejecútelo después de cualquier restauración, ya que es el momento en que un archivo truncado silenciosamente se hace evidente.

Qué sucede cuando se pierde la frase de contraseña

No sucede nada, y ese es el diseño. No existe restablecimiento, ni frase de recuperación, ni dirección a la cual escribir, porque no hay ninguna copia de la clave fuera de su memoria y su archivo de clave opcional. El vault sigue siendo un archivo de bytes que parecen aleatorios.

Por lo tanto, el plan de recuperación no es un plan para el vault. Es un plan para la frase de contraseña. Regístrela en un gestor de contraseñas el día que ejecute compartment init. Luego pruébela: bloquee el vault, desbloquéelo usando solo lo que anotó y deje que un agente comience a llenarlo después de que eso funcione.

Compartment o un servidor de memoria

Compartment está diseñado para funcionar en una sola máquina. Compartir implica copiar el archivo bloqueado o realizar procesos de exportación e importación; no existe un sistema de escritura concurrente, por lo que si un portátil y una estación de trabajo apuntan al mismo archivo, sobrescribirán el trabajo del otro.

Cuando varias máquinas necesitan acceder a la misma memoria simultáneamente, se trata de un problema de servidor. Un servidor de memoria Mem0 autohospedado en un VPS resuelve esto: un punto de conexión, múltiples clientes y una memoria que persiste más allá del portátil. El coste debe exponerse con claridad. Ese servidor ejecuta un proceso que puede leer los datos que almacena, por lo que su modelo de amenazas ahora incluye al VPS y a cualquier persona que pueda acceder a su API.

Elija según la pérdida que realmente teme. Si le preocupa el robo de un portátil o que un proveedor lea sus notas, la bóveda local cifrada es la solución más robusta. Si el problema es un agente que olvida todo en el momento en que cambia de máquina, la solución es el servidor.

FAQ

¿Qué protege realmente el cifrado de Compartment?

Protege el archivo. El almacén (vault) está sellado con XChaCha20-Poly1305, sus ranuras de claves (keyslots) están cifradas con Argon2id y los vectores de incrustación (embedding vectors) también están cifrados. Por lo tanto, un disco robado o una copia de seguridad antigua solo contienen bytes sin información legible. Esto no protege un almacén desbloqueado en una máquina en ejecución, ya que la clave maestra reside en la memoria RAM mientras el almacén está abierto, y no controla lo que un agente hace con una memoria después de que la función de recuperación (recall) la devuelve como texto plano.

Si Compartment está desconectado, ¿mis memorias están protegidas frente a mi proveedor de modelos?

Solo hasta que se recuperan. El almacenamiento y la búsqueda se realizan sin red y el modelo de incrustación se ejecuta localmente, por lo que nada sale de la máquina durante la escritura. En el momento de la lectura, el agente recibe texto plano; si ese agente es un modelo alojado en la nube, la memoria se integra en el prompt y viaja al proveedor como el resto de la ventana de contexto. Nunca almacene credenciales como memorias.

¿Qué ocurre si pierdo mi contraseña de Compartment?

El almacén es irrecuperable, por diseño. Compartment no genera ninguna semilla ni frase de recuperación, y no almacena ninguna credencial que usted no posea, por lo que no hay nada que restablecer. Guarde la contraseña en un gestor de contraseñas, mantenga cualquier archivo de clave 2FA fuera de la máquina que almacena el archivo del almacén y confirme que puede desbloquear una copia antes de guardar en el almacén cualquier información que no pueda permitirse perder.

¿Pueden dos máquinas compartir un mismo almacén de Compartment?

No al mismo tiempo. Un almacén bloqueado es un único archivo portátil, y el procedimiento documentado consiste en bloquearlo, copiarlo y luego desbloquearlo en la otra máquina con --vault. No existe acceso concurrente, por lo que si dos máquinas escriben en el mismo archivo, se perderán memorias. Ejecute un servidor de memoria cuando necesite esa funcionalidad.

#agent-memory#compartment#encryption#offline#privacy