Produto
O que ele guarda e o que sai da sua máquina
Uma instalação padrão escuta só na sua máquina e não tem telemetria. Credenciais reconhecidas são ocultadas antes de armazenar o texto capturado, mas o filtro pode deixar passar informações sensíveis. Servidores remotos e provedores opcionais na nuvem mudam o destino dos dados.
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. Uma instalação nova ainda gera um bearer token num arquivo só do dono, que os hooks e a CLI leem, então nada fica aberto nem no loopback.
Sem telemetria
O binário do ai-memory não tem analytics, envio de relatórios de falha nem rastreamento de uso. A captura e a busca locais padrão não enviam conteúdo do projeto a provedores externos de modelos.
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
Os dados armazenados dependem das permissões do sistema de arquivos. Instalações existentes não recebem chmod automaticamente. Use criptografia de disco se precisar de proteção com a máquina desligada.
O texto capturado é filtrado antes de ser armazenado.
Payloads de hooks são texto não confiável. Eles passam por um sanitizador que oculta credenciais reconhecidas e limita seu tamanho. Ele pode deixar passar informações sensíveis.
Payload do hook
sanitize()
Segredos removidos
Armazenado
Tamanho limitado
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. O opcional
[ingest] index_file_pathsacrescenta um campo: o caminho relativo ao checkout do único arquivo nomeado por uma chamada de ferramenta mantida, nunca o conteúdo dele, e um caminho ignorado continua não enviando nada.
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.
- Caminhos de arquivos e argumentos de shell reconhecidos passam por análise lexical. Links simbólicos, variáveis de shell e scripts lidos de arquivos podem escapar; prompts não são filtrados por caminho. O filtro de captura tem limites e não oferece DLP completo.
- A saída do assistente nunca é gravada por padrão. Para isso é preciso uma flag no servidor e outra no cliente, juntas.
- O backfill e as importações de workstreams gerenciados aplicam as mesmas regras de captura a chamadas de ferramentas e seus resultados. Chamadas excluídas são omitidas; quando a política não consegue comprovar a segurança, só ficam metadados da família da ferramenta.
# .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
Proteja conforme sua implantação
Acesso remoto exige autenticação e TLS, inclusive na LAN. Aplique todos os requisitos da sua configuração antes de conectar clientes.
Uma pessoa, uma máquina
Loopback, token num arquivo
O
ai-memory initcria o token em<data_dir>/auth-tokens/default, e os hooks, a CLI e a ponte MCP leem dele. Uma instalação anterior à 3.0 continua rodando sem autenticação até você rodarai-memory auth enable, que gera o token e registra de novo todos os clientes.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.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.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.
O que sai da máquina, e quando.
Estas configurações podem enviar conteúdo da memória a um provedor de modelos; vêm desligadas. Hooks para servidor remoto, webhooks de admissão configurados e seus destinos de backup são caminhos separados de dados que também precisam de revisã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 |
Sua máquina
Hooks
Wiki e índice
Embedder local
Terceiros
Wiki e índice
Embeddings na nuvem
LLM na nuvem
Rerank por LLM
Opt-in, desligado por padrão
Captura e busca locais padrão não enviam conteúdo do projeto a provedores de modelos. Se escolher um provedor na nuvem, revise seus termos e tratamento de dados. Veja as notas de tratamento de dados do projeto.
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 faz a deleção lógica de dados do projeto selecionado. O histórico e backups anteriores podem manter cópias. Separadamente, regras de retenção podem remover páginas de sessões sem uso, e datas explícitas de expiração podem remover outras páginas. Sem --confirm, o purge só mostra o que removeria.
# 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?
Por padrão, o ai-memory mantém o conteúdo capturado do projeto na sua máquina. Se você conectar um servidor compartilhado, ele envia esse conteúdo para lá. Embeddings na nuvem ou recursos opcionais de modelos de linguagem enviam dados aos provedores configurados. Seu agente de código tem suas próprias configurações de dados e conexões com provedores.
O embedder local precisa de rede?
Na primeira inicialização, o embedder local baixa cerca de 87 MB de arquivos do modelo do Hugging Face e verifica seus checksums. Nenhum conteúdo do projeto é enviado nesse download. Defina embedding_provider = "none" ou forneça os arquivos do modelo para evitá-lo.
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. Permissões por projeto podem restringir contas de usuários do banco de dados, mas o serviço continua single-tenant. Root tem acesso a todos os projetos, e instalações com proxy confiável aplicam o controle de acesso no proxy. Use servidores separados para times que precisam de isolamento independente.
Teste primeiro em loopback.
Comece com um projeto local sem dados sensíveis. Revise o que é capturado antes de conectar um servidor compartilhado ou um provedor na nuvem.
