Produto
O que ele guarda e o que sai da sua máquina
Uma instalação padrão escuta só na sua máquina, remove segredos antes de gravar qualquer coisa e não tem telemetria. Todo caminho que manda dados para fora fica desligado até você ligar. Esta página também lista contra o que o projeto não protege.
O padrão é local.
Instale, rode, e a única coisa que consegue falar com ele é a sua própria máquina.
Só loopback
O servidor faz bind em 127.0.0.1:49374. Nenhum processo de fora da máquina chega nele, e é por isso que o padrão não pede senha.
Sem telemetria
O binário não tem analytics, relatório de crash nem rastreamento de uso. Captura e busca fazem zero chamadas de rede.
Um diretório que é seu
As páginas da wiki e o arquivo SQLite ficam dentro de um único diretório de dados. No Unix, diretórios novos são criados com 0700 e arquivos novos com 0600.
Sem criptografia em repouso
A versão 1 conta com as permissões do filesystem. Instalações já existentes não recebem chmod automático. Use criptografia de disco se o laptop precisar.
Nada é gravado antes de ser sanitizado.
Payloads de hook são texto não confiável. Eles chegam ao store por uma única função, e quem garante isso é o sistema de tipos.

Uma entrada só
O tipo gravado só pode ser construído por sanitize(). Código que pula a remoção de dados sensíveis não compila.
Segredos são substituídos
O que casa vira um marcador tipado, como [REDACTED:github_token] ou [REDACTED:jwt]. Isso cobre segredos dentro de JSON e caminhos de credenciais do Windows, e sequências de escape de terminal são removidas. A remoção é best effort.
Tamanhos têm teto
Trechos de ferramentas param em 2 KB e prompts em 16 KiB. Um limite final de 16 KiB vale para todo corpo gravado, depois da redação.
Inputs de ferramentas não ficam
Eventos PreToolUse nunca retêm comandos, argumentos, caminhos nem corpos de input. As observações são uma trilha de auditoria, nunca uma transcrição completa.
Deixe um caminho ou um repositório de fora
- Um bloco
[capture]no.ai-memory.tomllista os caminhos a ignorar. Os eventos que casam são descartados na sua máquina, antes do spool, da rede e dos logs. - O modo allowlist inverte a lógica: um repositório sem o arquivo não emite evento nenhum.
- Um conjunto de regras inválido cai para só metadados. Ele nunca aplica meia política.
- O matching é léxico. Symlinks não são resolvidos, e prompts e comandos de shell não têm como ser amarrados a um caminho. Isto é uma fronteira de captura. Não é DLP completo.
- A saída do assistente nunca é gravada por padrão. Para isso é preciso uma flag no servidor e outra no cliente, juntas.
# .ai-memory.toml no repositório
[capture]
ignore_paths = ["private/**", "~/personal-notes/**"]
# Ou capture só os repositórios que fizerem opt-in
ai-memory install-hooks --apply --capture-mode allowlist
Suba um degrau de cada vez.
Cada passo existe para uma situação específica. Pare no que corresponde à sua.
Uma pessoa, uma máquina
Loopback, sem autenticação
O padrão. Nada para configurar, porque nada mais consegue se conectar.
Uma máquina de homelab ou uma segunda máquina
Bearer token para a LAN
Crie um token com
ai-memory generate-auth-tokene definaAI_MEMORY_AUTH_TOKEN. Ele é comparado em tempo constante e protege/mcp,/hook,/handoffe as rotas de admin e de API. Defina tambémAI_MEMORY_ALLOWED_HOSTS; ele bloqueia DNS rebinding e não substitui o token.Mais de uma pessoa escreve
Contas e chaves de API
As senhas são guardadas como hashes Argon2id. Cada máquina recebe uma chave
aim_que é impressa uma vez e nunca mais aparece.ai-memory api-key rotate <id>faz a chave antiga passar a devolver 401 na hora. A primeira conta criada torna toda rota/admin/*exclusiva do root.Seu time já tem Keycloak, Okta ou Entra ID
Autenticação OIDC por device flow para os hooks
Os hooks nativos e a CLI podem carregar um token obtido com
ai-memory auth login oidc-device. O servidor não valida tokens OIDC, então isso exige um gateway que entenda OIDC na frente dele. É autenticação de hooks e de CLI através de um gateway, e o servidor não tem login SSO embutido.Qualquer coisa além do loopback
TLS com um proxy reverso
O ai-memory não termina TLS, e isso é decisão de projeto. Bearer tokens não trafegam criptografados, então coloque Caddy, nginx ou um Cloudflare Tunnel na frente. O repositório traz templates de compose para Caddy e cloudflared. Defina
AI_MEMORY_AUTH__SECURE_COOKIE=truequando as pessoas fizerem login a partir de outras máquinas.
O que sai da máquina, e quando.
Quatro caminhos podem mandar dados para fora. Os quatro vêm desligados por padrão.

| Caminho | O que é enviado | Como se liga | Padrão |
|---|---|---|---|
| Embeddings remotos | O texto completo de toda página gravada. Trocar depois também faz o backfill do corpus já existente. Este caminho não é sanitizado como os outros. | embedding_provider = openai | voyage | google | openai-compat | Desligado |
| Captura da saída do assistente | O texto do turno final do assistente, e só se você também tiver configurado um LLM na nuvem. Vale para a instalação inteira, só com Claude Code e Codex. | capture_assistant no servidor e install-hooks --capture-assistant no cliente | Desligado |
| Rerank por LLM | Cada consulta feita, mais até 30 títulos e trechos de página com tamanho limitado. A consulta não passa por redação, porque isso poderia mudar o sentido dela. | AI_MEMORY_RERANKER=llm | Desligado |
| Consolidação e lint por LLM | Prompts montados a partir das observações e páginas gravadas vão para o provedor que você escolheu. Aponte para um modelo local e nada sai. | AI_MEMORY_LLM_PROVIDER | Desligado |
Com nenhum deles ligado, não existe terceiro no caminho dos dados. Depois que você configura um provedor de nuvem, esse provedor é o seu operador de dados, nos termos do contrato que você tem com ele. O DATA_HANDLING.md cobre o enquadramento na GDPR. Não é aconselhamento jurídico.
Quem escreveu, e como remover.
Autoria e auditoria
- Com contas ligadas, cada escrita leva o seu autor. As páginas registram
author_ide um blocolast_modified_byno frontmatter. - Toda mutação vai para uma tabela
audit_log, com a identidade do usuário nas linhas que têm autoria. - A wiki é um repositório git, então toda mudança de página também é um commit que dá para comparar com diff e restaurar.
- Os webhooks de admissão recebem o ator e podem rejeitar uma operação.
- Ainda não existe uma tela para o log de auditoria. As linhas estão no SQLite.
O que um purge remove
O purge é uma deleção lógica, com escopo definido de modo que o projeto A nunca consiga remover arquivos do projeto B. Os dados não expiram, a não ser que uma página defina um prazo.
# Remover uma sessão
ai-memory purge-session --workspace default --project my-app --session-id <uuid> --confirm
# Remover um projeto inteiro
ai-memory purge-project --project experimental --confirm
| Depois de um purge | Padrão | Com --compact |
|---|---|---|
| Acessível pela API ou pelas ferramentas MCP | Não | Não |
| Devolvido pela busca | Não | Não |
| Arquivo markdown ativo na wiki | Não, best effort | Não, best effort |
| Bytes ainda dentro do memory.sqlite | Sim, em páginas livres | Não |
| Texto ainda no histórico git da wiki | Sim | Sim |
| Presente em backups feitos antes | Sim | Sim |
--compact não é apagamento forense. Para tirar texto do histórico, você mesmo reescreve o histórico git da wiki e rotaciona os seus backups. A página de operações de ciclo de vida tem o procedimento completo.
Onde ele para.
Como reportar uma vulnerabilidade
- Não abra uma issue pública. Abra um security advisory privado no GitHub.
- Você recebe uma resposta em até 7 dias. A meta para um patch é de 30 dias, com crédito no changelog, a não ser que você prefira ficar de fora.
- Só a release mais recente recebe correções de segurança.
- Os assets de release vêm com arquivos SHA-256, e as actions do CI são fixadas em commits revisados.
Perguntas e respostas
O ai-memory manda meu código ou meus prompts para algum lugar?
Não. Não existe telemetria, e captura e busca não fazem chamadas de rede. Os dados só saem da máquina se você ligar embeddings remotos, captura da saída do assistente com um LLM na nuvem, rerank por LLM ou um provedor de LLM na nuvem para a consolidação. Tudo isso vem desligado por padrão.
Uma instalação padrão faz alguma requisição de rede?
Uma. Desde a 2.0 o embedder local padrão baixa do Hugging Face, na primeira inicialização, o modelo all-MiniLM-L6-v2, de cerca de 87 MB. Nenhum dado de usuário é enviado. Para evitar, defina embedding_provider = "none" ou coloque você mesmo os arquivos do modelo.
Segredos ficam gravados?
Todo payload de hook passa por um sanitizador antes de ser gravado. Credenciais reconhecidas são substituídas por marcadores tipados [REDACTED:kind], e os corpos têm tamanho limitado. O sanitizador é uma remoção de credenciais best effort e não dá garantia nenhuma.
Dá para apagar uma sessão de vez?
O purge é uma deleção lógica. O conteúdo deixa de ser acessível e de aparecer na busca, mas o texto continua no histórico git da wiki e nos backups anteriores. A flag --compact limpa as páginas livres do SQLite e não é apagamento forense.
O ai-memory é multi-tenant?
Não. É um serviço single-tenant. As contas dão autoria, e todo usuário autenticado consegue ler todos os projetos daquele servidor. Rode servidores separados para pessoas que não podem ver os dados umas das outras.
Teste primeiro em loopback.
Sem conta e sem chave de API. Só a sua própria máquina chega nele.