Producto
Qué guarda y qué sale de tu máquina
Una instalación por defecto escucha solo en tu máquina y no tiene telemetría. Oculta las credenciales reconocidas antes de almacenar el texto capturado, pero el filtro puede dejar pasar información sensible. Los servidores remotos y proveedores opcionales en la nube cambian el destino de los datos.
Por defecto, todo es local.
Instálalo, ejecútalo, y lo único que puede hablar con él es tu propia máquina.
Solo loopback
El servidor escucha en 127.0.0.1:49374. Ningún proceso de fuera de la máquina puede llegar a él. Una instalación nueva igualmente genera un bearer token en un archivo accesible solo para su dueño, que leen los hooks y la CLI, así que nada queda abierto ni siquiera en loopback.
Sin telemetría
El binario de ai-memory no tiene analítica, informes de fallos ni seguimiento de uso. La captura y búsqueda locales por defecto no envían contenido del proyecto a proveedores externos de modelos.
Un directorio que es tuyo
Las páginas de la wiki y el archivo SQLite viven en un solo directorio de datos. En Unix, los directorios nuevos se crean con 0700 y los archivos nuevos con 0600.
Sin cifrado en reposo
Los datos almacenados dependen de los permisos del sistema de archivos. Las instalaciones existentes no reciben chmod automáticamente. Usa cifrado de disco si necesitas protección con la máquina apagada.
El texto capturado se filtra antes de almacenarlo.
Los payloads de hooks son texto no confiable. Pasan por un sanitizer que oculta credenciales reconocidas y limita su tamaño. Puede dejar pasar información sensible.
Payload del hook
sanitize()
Secretos fuera
Guardado
Tamaño limitado
Una sola entrada
El tipo que se guarda solo lo puede construir sanitize(). El código que se salte la limpieza de privacidad no compila.
Los secretos se reemplazan
Las coincidencias se convierten en marcadores tipados como [REDACTED:github_token] o [REDACTED:jwt]. Eso cubre secretos dentro de JSON y rutas de credenciales de Windows, y se eliminan las secuencias de escape de terminal. La limpieza es best effort.
Los tamaños tienen tope
Los extractos de herramientas se cortan a 2 KB y los prompts a 16 KiB. Un tope final de 16 KiB se aplica a todo cuerpo guardado, después de la redacción.
Las entradas de herramientas no se conservan
Los eventos PreToolUse nunca retienen comandos, argumentos, rutas ni cuerpos de entrada. Las observaciones son un rastro de auditoría, nunca una transcripción completa. El opcional
[ingest] index_file_pathsañade un campo: la ruta relativa al checkout del único archivo que nombró una llamada de herramienta conservada, nunca su contenido, y una ruta ignorada sigue sin enviar nada.
Deja fuera una ruta o un repositorio
- Un bloque
[capture]en.ai-memory.tomllista las rutas a ignorar. Los eventos que coinciden se descartan en tu máquina, antes de la cola local, de la red y de los logs. - El modo allowlist lo invierte: un repositorio sin el archivo no emite ningún evento.
- Un conjunto de reglas inválido cae a solo metadatos. Nunca aplica media política.
- Las rutas de archivos y los argumentos de shell reconocidos se analizan léxicamente. Los enlaces simbólicos, las variables de shell y los scripts leídos de archivos pueden eludir el filtro; los prompts no se filtran por ruta. El filtro de captura tiene límites y no ofrece DLP completo.
- La salida del asistente nunca se guarda por defecto. Hacen falta un flag en el servidor y otro en el cliente, los dos a la vez.
- El backfill y las importaciones de workstreams gestionados aplican las mismas reglas de captura a las llamadas de herramientas y sus resultados. Las llamadas excluidas se omiten; si la política no puede comprobar que una llamada es segura, solo conserva metadatos de la familia de herramientas.
# .ai-memory.toml en el repositorio
[capture]
ignore_paths = ["private/**", "~/personal-notes/**"]
# O captura solo los repositorios que se apunten
ai-memory install-hooks --apply --capture-mode allowlist
Protege según tu despliegue
El acceso remoto necesita autenticación y TLS, también en la LAN. Aplica todos los requisitos de tu configuración antes de conectar clientes.
Una persona, una máquina
Loopback, un token en un archivo
ai-memory initcrea el token en<data_dir>/auth-tokens/defaulty los hooks, la CLI y el puente MCP lo leen de ahí. Una instalación anterior a la 3.0 sigue funcionando sin autenticación hasta que ejecutesai-memory auth enable, que genera el token y vuelve a registrar cada cliente.Un equipo de homelab o una segunda máquina
Bearer token para la LAN
Crea un token con
ai-memory generate-auth-tokeny defineAI_MEMORY_AUTH_TOKEN. Se compara en tiempo constante y protege/mcp,/hook,/handoffy las rutas de administración y de la API. Define tambiénAI_MEMORY_ALLOWED_HOSTS; bloquea el DNS rebinding y no sustituye al token.Cualquier cosa más allá de loopback
TLS con un proxy inverso
ai-memory no termina TLS, por diseño. Los bearer tokens viajan sin cifrar por la red, así que pon delante Caddy, nginx o un Cloudflare Tunnel. El repo trae plantillas de compose para Caddy y cloudflared. Define
AI_MEMORY_AUTH__SECURE_COOKIE=truecuando la gente inicie sesión desde otras máquinas.Escribe más de una persona
Cuentas y claves de API
Las contraseñas se guardan como hashes Argon2id. Cada máquina recibe una clave
aim_que se imprime una vez y no se vuelve a mostrar. Conai-memory api-key rotate <id>la clave antigua empieza a devolver 401 al instante. La primera cuenta deja todas las rutas/admin/*solo para root.Tu equipo ya tiene Keycloak, Okta o Entra ID
Autenticación OIDC por dispositivo para los hooks
Los hooks nativos y la CLI pueden llevar un token obtenido con
ai-memory auth login oidc-device. El servidor no valida tokens OIDC por sí mismo, así que esto necesita delante un gateway compatible con OIDC. Es autenticación de hooks y de CLI a través de un gateway, y el servidor no trae login SSO integrado.
Qué sale de la máquina, y cuándo.
Estas opciones pueden enviar contenido de memoria a un proveedor de modelos; están desactivadas por defecto. Los hooks hacia servidores remotos, los webhooks de admisión configurados y tus destinos de copia son otras rutas de datos que debes revisar.
| Ruta | Qué se envía | Cómo se activa | Por defecto |
|---|---|---|---|
| Embeddings remotos | El texto completo de cada página guardada. Si lo activas más tarde, también se procesa el corpus que ya existe. Esta ruta no se sanea como las demás. | embedding_provider = openai | voyage | google | openai-compat | Apagado |
| Captura de la salida del asistente | El texto del último turno del asistente, y solo si además has configurado un LLM en la nube. Es global a la instalación y solo para Claude Code y Codex. | capture_assistant en el servidor y install-hooks --capture-assistant en el cliente | Apagado |
| Rerank con LLM | Cada consulta en vivo, más hasta 30 títulos y fragmentos de página acotados. La consulta no se redacta, porque la redacción podría cambiar su significado. | AI_MEMORY_RERANKER=llm | Apagado |
| Consolidación y lint con LLM | Los prompts construidos con observaciones y páginas guardadas van al proveedor que hayas elegido. Apúntalo a un modelo local y no sale nada. | AI_MEMORY_LLM_PROVIDER | Apagado |
Tu máquina
Hooks
Wiki e índice
Embedder local
Terceros
Wiki e índice
Embeddings en la nube
LLM en la nube
Rerank con LLM
Opt-in, apagado de inicio
La captura y búsqueda locales predeterminadas no envían contenido del proyecto a proveedores de modelos. Si eliges un proveedor en la nube, revisa sus condiciones y tratamiento de datos. Consulta las notas de tratamiento de datos del proyecto.
Quién lo escribió y cómo quitarlo.
Atribución y auditoría
- Con las cuentas activadas, cada escritura lleva su autor. Las páginas registran
author_idy un bloquelast_modified_byen el frontmatter. - Cada mutación queda en una tabla
audit_log, con la identidad del usuario en las filas atribuidas. - La wiki es un repositorio git, así que cada cambio de página es también un commit al que puedes hacer diff y que puedes restaurar.
- Los webhooks de admisión reciben el actor y pueden rechazar una operación.
- Todavía no hay una pantalla para el registro de auditoría. Las filas están en SQLite.
Qué elimina un purge
Purge elimina lógicamente los datos del proyecto seleccionado. El historial y las copias de seguridad anteriores pueden conservar copias. Por separado, las reglas de retención pueden eliminar páginas de sesiones sin uso, y las fechas explícitas de caducidad pueden eliminar otras páginas. Sin --confirm, purge solo muestra lo que eliminaría.
# Elimina una sesión
ai-memory purge-session --workspace default --project my-app --session-id <uuid> --confirm
# Elimina un proyecto entero
ai-memory purge-project --project experimental --confirm
| Después de un purge | Por defecto | Con --compact |
|---|---|---|
| Accesible por la API o las herramientas MCP | No | No |
| Aparece en las búsquedas | No | No |
| Archivo markdown vivo en la wiki | No, best effort | No, best effort |
| Bytes que siguen dentro de memory.sqlite | Sí, en páginas libres | No |
| Texto que sigue en el historial git de la wiki | Sí | Sí |
| Presente en copias de seguridad anteriores | Sí | Sí |
--compact no es un borrado forense. Para quitar texto del historial tienes que reescribir el historial git de la wiki y rotar tus copias de seguridad por tu cuenta. Las operaciones de ciclo de vida tienen el procedimiento completo.
Hasta dónde llega.
Reportar una vulnerabilidad
- No abras un issue público. Abre un aviso de seguridad privado en GitHub.
- Recibes respuesta en un plazo de 7 días. El objetivo para el parche es de 30 días, con mención en el changelog salvo que prefieras que no.
- Solo la última versión recibe correcciones de seguridad.
- Los archivos de cada versión se publican con su SHA-256, y las actions de CI están fijadas a commits revisados.
Preguntas y respuestas
¿ai-memory envía mi código o mis prompts a algún sitio?
Por defecto, ai-memory mantiene el contenido capturado del proyecto en tu máquina. Si te conectas a un servidor compartido, lo envía allí. Los embeddings en la nube o las funciones opcionales de modelos de lenguaje envían datos a los proveedores que configures. Tu agente de programación tiene sus propios ajustes de datos y conexiones con proveedores.
¿El embedder local necesita red?
Al iniciarse por primera vez, el embedder local descarga unos 87 MB de archivos del modelo de Hugging Face y verifica sus checksums. No envía contenido del proyecto para esa descarga. Define embedding_provider = "none" o proporciona los archivos del modelo para evitarla.
¿Se guardan los secretos?
Todo payload de hook pasa por un sanitizer antes de guardarse. Las credenciales reconocidas se reemplazan por marcadores tipados [REDACTED:kind] y los cuerpos tienen tope de tamaño. El sanitizer es una limpieza de credenciales best effort y no da ninguna garantía.
¿Puedo borrar una sesión para siempre?
El purge es un borrado lógico. El contenido deja de ser accesible y de aparecer en las búsquedas, pero el texto sigue en el historial git de la wiki y en las copias de seguridad anteriores. El flag --compact limpia las páginas libres de SQLite y no es un borrado forense.
¿ai-memory es multi-tenant?
No. Los permisos por proyecto pueden restringir cuentas de usuarios de la base de datos, pero sigue siendo un servicio de un solo tenant. Root tiene acceso a todos los proyectos y los despliegues con proxy de confianza aplican el control de acceso en el proxy. Usa servidores separados para equipos que necesiten aislamiento independiente.
Pruébalo primero en loopback.
Empieza con un proyecto local sin datos sensibles. Revisa qué se captura antes de conectar un servidor compartido o un proveedor en la nube.
