{"id":1457,"date":"2026-09-08T16:40:55","date_gmt":"2026-09-08T19:40:55","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2026\/09\/engram-memoria-persistente-para-agentes-no-linux\/"},"modified":"2026-09-08T17:05:11","modified_gmt":"2026-09-08T20:05:11","slug":"engram-memoria-persistente-para-agentes-no-linux","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2026\/09\/engram-memoria-persistente-para-agentes-no-linux\/","title":{"rendered":"Engram: persistent memory for agents on Linux"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro encaixando um cartucho de mem\u00f3ria no SQLite, com o elefante do Engram na bancada\" src=\"\/wp-content\/uploads\/2026\/09\/engram-memoria-v1.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<p>O agente de terminal \u00e9 \u00f3timo at\u00e9 a sess\u00e3o acabar. Na seguinte, ele redescobre o mesmo bug, rel\u00ea o mesmo README e pergunta de novo se a API usa JWT. O <a href=\"https:\/\/github.com\/Gentleman-Programming\/engram\">Engram<\/a> \u00e9 um c\u00e9rebro local para isso: um bin\u00e1rio em <a href=\"\/2026\/09\/a-historia-da-linguagem-go\/\">Go<\/a>, um SQLite com FTS5 em <code>~\/.engram\/engram.db<\/code>, e o mesmo banco para Claude Code, Codex, Cursor, Grok e qualquer outro cliente MCP.<\/p>\n<p><!-- more --><\/p>\n<p>N\u00e3o \u00e9 lixeira de transcript. O agente decide o que vale a pena lembrar \u2014 decis\u00e3o, bug, conven\u00e7\u00e3o \u2014 e grava com <code>mem_save<\/code>. Na sess\u00e3o seguinte, <code>mem_search<\/code> e <code>mem_context<\/code> devolvem o peda\u00e7o certo. O mapa das alternativas (mnemo, Leteo, Subcog\u2026) est\u00e1 em <a href=\"\/2026\/09\/alternativas-claude-mem-go-rust-c\/\">Alternativas ao Claude-Mem em Go, Rust e C<\/a>; o mapa dos agentes no terminal, em <a href=\"\/2026\/09\/assistentes-de-ia-no-terminal-linux\/\">Assistentes de IA no terminal Linux<\/a>. Este post \u00e9 o passo a passo do Engram no Linux: instalar, ligar nos agentes, acertar o nome do projeto e deixar o daemon no boot.<\/p>\n<h2>O que \u00e9 \u2014 e o que n\u00e3o \u00e9<\/h2>\n<p>Engram (<code>\/\u02c8en.\u0261r\u00e6m\/<\/code>, o tra\u00e7o f\u00edsico de uma mem\u00f3ria no c\u00e9rebro) \u00e9 um bin\u00e1rio Go com SQLite embutido via <code>modernc.org\/sqlite<\/code> \u2014 puro Go, sem CGO, sem Node, sem Python, sem Docker para o uso di\u00e1rio. Licen\u00e7a MIT. A linha est\u00e1vel em julho de 2026 \u00e9 a <strong>v1.20.0<\/strong>.<\/p>\n<p>Quatro portas para o mesmo banco:<\/p>\n<table>\n<thead>\n<tr>\n<th>Porta<\/th>\n<th>Comando<\/th>\n<th>Para qu\u00ea<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>MCP stdio<\/td>\n<td><code>engram mcp --tools=agent<\/code><\/td>\n<td>O agente fala com a mem\u00f3ria (Claude, Grok, Codex\u2026)<\/td>\n<\/tr>\n<tr>\n<td>CLI<\/td>\n<td><code>engram search<\/code>, <code>save<\/code>, <code>context<\/code><\/td>\n<td>Voc\u00ea consulta e grava na m\u00e3o<\/td>\n<\/tr>\n<tr>\n<td>TUI<\/td>\n<td><code>engram tui<\/code><\/td>\n<td>Navegar sess\u00f5es e observa\u00e7\u00f5es no terminal<\/td>\n<\/tr>\n<tr>\n<td>HTTP local<\/td>\n<td><code>engram serve<\/code> (porta 7437)<\/td>\n<td>API JSON. <strong>N\u00e3o<\/strong> \u00e9 p\u00e1gina de navegador<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>O dashboard HTML (<code>\/dashboard<\/code>) \u00e9 o <strong>Engram Cloud<\/strong> \u2014 outro processo, Postgres, opcional. Sem Cloud, o visualizador local \u00e9 o TUI.<\/p>\n<p>A filosofia, expl\u00edcita no README: o agente j\u00e1 tem o LLM e o contexto. Em vez de capturar cada tool call e comprimir depois (o modelo do claude-mem), o Engram pede que o agente grave s\u00f3 o que dura. Resultado: busca FTS5 limpa, zero chamada extra de API, um arquivo que voc\u00ea controla.<\/p>\n<h2>Instalar no Ubuntu\/Linux<\/h2>\n<p>N\u00e3o existe pacote <code>apt<\/code> nem <code>.deb<\/code> nas <a href=\"https:\/\/github.com\/Gentleman-Programming\/engram\/releases\">releases<\/a>. O que a documenta\u00e7\u00e3o de produ\u00e7\u00e3o pede \u00e9 o bin\u00e1rio. Um arquivo, zero runtime: sem Node, sem Python, sem Docker. A linha est\u00e1vel em julho de 2026 \u00e9 a <strong>v1.20.0<\/strong>.<\/p>\n<p>Os releases oferecem bin\u00e1rios Linux prontos para <code>amd64<\/code> e <code>arm64<\/code>. O execut\u00e1vel oficial \u00e9 estaticamente ligado, sem depend\u00eancias de runtime; escolha apenas o arquivo da arquitetura da m\u00e1quina. Para compilar do c\u00f3digo-fonte, o requisito \u00e9 Go 1.24+.<\/p>\n<h3>Ubuntu amd64 e arm64<\/h3>\n<pre><code class=\"language-bash\">sudo apt-get update\nsudo apt-get install -y curl ca-certificates\n\nVER=1.20.0\ncase \"$(dpkg --print-architecture)\" in\n  amd64) FILE=engram_${VER}_linux_amd64.tar.gz ;;\n  arm64) FILE=engram_${VER}_linux_arm64.tar.gz ;;\n  *) echo \"sem bin\u00e1rio pronto para $(dpkg --print-architecture)\"; exit 1 ;;\nesac\n\ncd \/tmp\ncurl -fsSL -O \"https:\/\/github.com\/Gentleman-Programming\/engram\/releases\/download\/v${VER}\/${FILE}\"\ncurl -fsSL -O \"https:\/\/github.com\/Gentleman-Programming\/engram\/releases\/download\/v${VER}\/checksums.txt\"\nsha256sum -c checksums.txt --ignore-missing\n\nmkdir -p ~\/.local\/bin\ntar -xzf \"$FILE\" engram\ninstall -m 755 engram ~\/.local\/bin\/engram\n\n# o ~\/.profile do Ubuntu s\u00f3 acrescenta ~\/.local\/bin no pr\u00f3ximo login,\n# e s\u00f3 se o diret\u00f3rio j\u00e1 existir\nexport PATH=\"$HOME\/.local\/bin:$PATH\"\nhash -r\nengram version<\/code><\/pre>\n<p>A sa\u00edda esperada \u00e9 <code>engram 1.20.0<\/code>. O tarball traz o execut\u00e1vel na raiz, mais README, LICENSE e CHANGELOG. Banco padr\u00e3o: <code>~\/.engram\/engram.db<\/code>.<\/p>\n<p>Para o PATH ficar permanente, abra um terminal novo depois da instala\u00e7\u00e3o. O <code>~\/.profile<\/code> padr\u00e3o do Ubuntu j\u00e1 tem o bloco <code>if [ -d \"$HOME\/.local\/bin\" ]<\/code> \u2014 por isso o <code>mkdir<\/code> vem antes do <code>install<\/code>.<\/p>\n<h3>go install<\/h3>\n<p>Se voc\u00ea j\u00e1 tem Go 1.24+ (o da documenta\u00e7\u00e3o). O pacote <code>golang-go<\/code> do Ubuntu 24.04 \u00e9 1.22 e o do 22.04 \u00e9 1.18 \u2014 n\u00e3o d\u00e1 para <code>go install<\/code> por a\u00ed; use o bin\u00e1rio da release ou instale o Go pelo site:<\/p>\n<pre><code class=\"language-bash\">go install github.com\/Gentleman-Programming\/engram\/cmd\/engram@latest\n# cai em $(go env GOPATH)\/bin \u2014 em geral ~\/go\/bin\/<\/code><\/pre>\n<p><code>go install<\/code> carimba a vers\u00e3o como <code>dev<\/code>. Se quiser o git-describe no <code>engram version<\/code>, clone e passe <code>-ldflags<\/code> \u2014 um <code>go install<\/code> e um <code>go build<\/code> no mesmo PATH deixam dois bin\u00e1rios e a vers\u00e3o \u201cdev\u201d ganha. H\u00e1 uma linha v2 (<code>github.com\/Gentleman-Programming\/engram\/v2\/cmd\/engram<\/code>) para release candidates; produ\u00e7\u00e3o continua na v1.<\/p>\n<h3>Homebrew no Linux<\/h3>\n<pre><code class=\"language-bash\">brew install gentleman-programming\/tap\/engram<\/code><\/pre>\n<p>O tap cobre a linha est\u00e1vel v1.20.0. Upgrade: <code>brew update &amp;&amp; brew upgrade engram<\/code>. Trocar o bin\u00e1rio mata um <code>engram serve<\/code> solto \u2014 por isso o servi\u00e7o systemd, mais abaixo.<\/p>\n<h2>Primeiro contato<\/h2>\n<pre><code class=\"language-bash\">engram version\nengram stats\nengram projects list\nengram tui<\/code><\/pre>\n<p>Banco padr\u00e3o: <code>~\/.engram\/engram.db<\/code>. Override: <code>ENGRAM_DATA_DIR<\/code>. No TUI, <code>j<\/code>\/<code>k<\/code> navega, <code>Enter<\/code> abre, <code>\/<\/code> busca, <code>Esc<\/code> volta. Tema Catppuccin Mocha.<\/p>\n<p>A API local, se voc\u00ea subir o daemon:<\/p>\n<pre><code class=\"language-bash\">engram serve          # 127.0.0.1:7437\ncurl -s http:\/\/127.0.0.1:7437\/health\n# {\"service\":\"engram\",\"status\":\"ok\",\"version\":\"0.1.0\"}<\/code><\/pre>\n<p><code>\/<\/code> e <code>\/dashboard<\/code> nessa porta devolvem 404. \u00c9 JSON, n\u00e3o site. <code>GET \/project\/current<\/code> usa o <strong>cwd do processo do serve<\/strong> \u2014 no systemd com <code>WorkingDirectory=%h<\/code>, isso vira o basename da home, n\u00e3o o repo em que voc\u00ea est\u00e1 editando.<\/p>\n<h2>Ligar nos agentes<\/h2>\n<p><code>engram setup &lt;agente&gt;<\/code> escreve o MCP no formato de cada cliente. N\u00e3o configura Cloud. Reinicie o agente depois.<\/p>\n<table>\n<thead>\n<tr>\n<th>Agente<\/th>\n<th>Comando<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Claude Code<\/td>\n<td><code>claude plugin marketplace add Gentleman-Programming\/engram<\/code> e <code>claude plugin install engram<\/code> \u2014 ou <code>engram setup claude-code<\/code><\/td>\n<\/tr>\n<tr>\n<td>Codex<\/td>\n<td><code>engram setup codex<\/code><\/td>\n<\/tr>\n<tr>\n<td>OpenCode<\/td>\n<td><code>engram setup opencode<\/code><\/td>\n<\/tr>\n<tr>\n<td>Cursor<\/td>\n<td><code>engram setup cursor<\/code><\/td>\n<\/tr>\n<tr>\n<td>Gemini CLI<\/td>\n<td><code>engram setup gemini-cli<\/code><\/td>\n<\/tr>\n<tr>\n<td>VS Code Copilot<\/td>\n<td><code>engram setup vscode-copilot<\/code><\/td>\n<\/tr>\n<tr>\n<td>Windsurf, Qwen, Kiro, Kilo, Pi, Antigravity<\/td>\n<td><code>engram setup &lt;nome&gt;<\/code> \u2014 lista em <code>engram --help<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Perfis MCP: <code>agent<\/code> (o conjunto que o agente usa no dia a dia), <code>admin<\/code>, ou <code>all<\/code>. O default do <code>engram mcp<\/code> sem flag \u00e9 <code>all<\/code>. Para o agente, use <code>--tools=agent<\/code>.<\/p>\n<h3>Grok Build (manual)<\/h3>\n<p>N\u00e3o h\u00e1 <code>engram setup grok<\/code>. Em <code>~\/.grok\/config.toml<\/code>:<\/p>\n<pre><code class=\"language-toml\">[mcp_servers.engram]\ncommand = \"\/home\/SEU_USER\/.local\/bin\/engram\"\nargs = [\"mcp\", \"--tools=agent\"]\nenabled = true<\/code><\/pre>\n<p>Confira com <code>grok mcp doctor engram<\/code> \u2014 handshake ok e as tools do perfil <code>agent<\/code>. Recarregue a sess\u00e3o do Grok: o MCP s\u00f3 entra na que sobe <em>depois<\/em> da config. O banco \u00e9 o mesmo do Claude. O nome do <em>projeto<\/em>, n\u00e3o: cada processo detecta pelo pr\u00f3prio cwd.<\/p>\n<h3>Qualquer cliente MCP<\/h3>\n<pre><code class=\"language-json\">{\n  \"mcpServers\": {\n    \"engram\": {\n      \"command\": \"engram\",\n      \"args\": [\"mcp\", \"--tools=agent\"]\n    }\n  }\n}<\/code><\/pre>\n<p>O cliente dispara um processo stdio por sess\u00e3o. Isso <em>n\u00e3o<\/em> substitui o <code>engram serve<\/code> do systemd \u2014 s\u00e3o coisas diferentes. MCP l\u00ea e grava o SQLite direto; o serve \u00e9 a API HTTP (e o autosync Cloud, se voc\u00ea ligar).<\/p>\n<h2>Como o Engram escolhe o projeto<\/h2>\n<p>Ele n\u00e3o indexa o path. Resolve um <strong>nome<\/strong> e filtra o SQLite por esse nome. Preced\u00eancia:<\/p>\n<ol>\n<li>argumento expl\u00edcito (<code>mem_context<\/code> com <code>project<\/code>, <code>engram context teste<\/code>);<\/li>\n<li>override de processo (<code>engram mcp --project \u2026<\/code> ou <code>ENGRAM_PROJECT<\/code>);<\/li>\n<li>detec\u00e7\u00e3o pelo cwd.<\/li>\n<\/ol>\n<p>A detec\u00e7\u00e3o do diret\u00f3rio, em ordem:<\/p>\n<table>\n<thead>\n<tr>\n<th>#<\/th>\n<th>source<\/th>\n<th>O que usa<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>0<\/td>\n<td><code>config<\/code><\/td>\n<td><code>.engram\/config.json<\/code> com <code>project_name<\/code><\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td><code>git_remote<\/code><\/td>\n<td>repo com <code>origin<\/code> \u2014 nome do remote, gravado num binding privado do clone<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td><code>git_root<\/code><\/td>\n<td>git sem origin \u2014 basename da raiz<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td><code>git_child<\/code><\/td>\n<td>cwd tem exatamente um filho git \u2014 promove esse<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td><code>ambiguous<\/code><\/td>\n<td>v\u00e1rios filhos git \u2014 n\u00e3o escolhe sozinho<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td><code>dir_basename<\/code><\/td>\n<td>\u00faltimo recurso: <code>filepath.Base(cwd)<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Pasta sem git vira o basename. Claude gravando em <code>\/home\/voc\u00ea\/teste<\/code> e Grok em <code>\u2026\/site-linuxpro<\/code> s\u00e3o dois projetos. A mem\u00f3ria n\u00e3o aparece \u201cdo outro lado\u201d at\u00e9 voc\u00ea buscar com o nome certo ou <code>all_projects=true<\/code>.<\/p>\n<p>Lock est\u00e1vel na raiz do repo:<\/p>\n<pre><code class=\"language-json\">{\n  \"project_name\": \"site-linuxpro\"\n}<\/code><\/pre>\n<p>O Engram usa o config <strong>mais pr\u00f3ximo<\/strong> abaixo da raiz git \u2014 d\u00e1 para ter <code>backend\/.engram\/config.json<\/code> e <code>frontend\/.engram\/config.json<\/code> no monorepo. Fora de git, s\u00f3 vale o config do diret\u00f3rio atual: <code>~\/.engram\/config.json<\/code> <em>n\u00e3o<\/em> vaza para os filhos. Primeira chamada \u00fatil de qualquer sess\u00e3o: <code>mem_current_project<\/code> \u2014 devolve <code>project<\/code>, <code>project_source<\/code> e, se for o caso, <code>available_projects<\/code>.<\/p>\n<p>Se a escrita voltar <code>ambiguous_project<\/code>, o agente n\u00e3o pode chutar. Voc\u00ea escolhe um nome da lista e a tool retenta com <code>project_choice_reason=user_selected_after_ambiguous_project<\/code>.<\/p>\n<h2>Subir o serve no boot<\/h2>\n<p>Esta se\u00e7\u00e3o \u00e9 opcional. Claude Code, Codex e os demais clientes MCP via stdio usam <code>engram mcp<\/code> e n\u00e3o precisam de <code>engram serve<\/code>. Suba o servi\u00e7o se precisar da API HTTP local, do autosync do Cloud ou de integra\u00e7\u00f5es HTTP, como OpenCode e Pi.<\/p>\n<p>Quando ele for necess\u00e1rio, um supervisor evita que <code>engram serve<\/code> morra no reboot ou durante a troca do bin\u00e1rio.<\/p>\n<p>Unit de usu\u00e1rio, no template oficial:<\/p>\n<pre><code class=\"language-ini\"># ~\/.config\/systemd\/user\/engram.service\n[Unit]\nDescription=Engram Memory Server\nAfter=network.target\n\n[Service]\nWorkingDirectory=%h\nExecStart=%h\/.local\/bin\/engram serve\nRestart=always\nRestartSec=3\nEnvironment=ENGRAM_DATA_DIR=%h\/.engram\nStandardOutput=journal\nStandardError=journal\n\n[Install]\nWantedBy=default.target<\/code><\/pre>\n<pre><code class=\"language-bash\">mkdir -p ~\/.engram ~\/.config\/systemd\/user\nsystemctl --user daemon-reload\nsystemctl --user enable --now engram.service\ncurl -s http:\/\/127.0.0.1:7437\/health\njournalctl --user -u engram -f<\/code><\/pre>\n<p><code>enable<\/code> amarra no login. Para subir no boot <em>sem<\/em> sess\u00e3o gr\u00e1fica, o usu\u00e1rio precisa de linger:<\/p>\n<pre><code class=\"language-bash\">loginctl enable-linger \"$USER\"\nloginctl show-user \"$USER\" -p Linger<\/code><\/pre>\n<p>Se a 7437 j\u00e1 estiver ocupada por um serve \u00f3rf\u00e3o, a unit falha no bind. Mate o processo antigo (<code>ss -tlnp | grep 7437<\/code>) e <code>systemctl --user restart engram<\/code>.<\/p>\n<h2>O contrato de mem\u00f3ria<\/h2>\n<p>O README trata o Engram como mem\u00f3ria curada, n\u00e3o como dump. O ciclo:<\/p>\n<ol>\n<li><strong>Orientar<\/strong> \u2014 <code>mem_current_project<\/code>, depois <code>mem_context<\/code> \/ <code>mem_search<\/code>.<\/li>\n<li><strong>Buscar antes de repetir<\/strong> \u2014 decis\u00e3o, bug, conven\u00e7\u00e3o que j\u00e1 podem estar no banco.<\/li>\n<li><strong>Revelar por camadas<\/strong> \u2014 <code>mem_search<\/code> devolve preview (~300 caracteres); <code>mem_get_observation<\/code> traz o texto inteiro; <code>mem_timeline<\/code> mostra o antes\/depois na sess\u00e3o.<\/li>\n<li><strong>Gravar o que dura<\/strong> \u2014 <code>mem_save<\/code> com t\u00edtulo curto, tipo (<code>decision<\/code>, <code>bugfix<\/code>, <code>config<\/code>, <code>architecture<\/code>\u2026) e corpo What \/ Why \/ Where \/ Learned. N\u00e3o grave sa\u00edda crua de ferramenta.<\/li>\n<li><strong>Assunto que evolui<\/strong> \u2014 <code>topic_key<\/code> est\u00e1vel (<code>architecture\/auth-model<\/code>). Mesmo projeto + scope + topic vira upsert, n\u00e3o uma linha nova.<\/li>\n<li><strong>Fechar a sess\u00e3o<\/strong> \u2014 <code>mem_session_summary<\/code> com Goal, Discoveries, Accomplished, Next Steps, Files.<\/li>\n<\/ol>\n<p>Scope: <code>project<\/code> (default), <code>personal<\/code> ou <code>global<\/code>. Um <code>personal<\/code> no mesmo <code>topic_key<\/code> n\u00e3o sobrescreve o de projeto.<\/p>\n<p>O que <em>n\u00e3o<\/em> vai para o SQLite: senha, token, dump de <code>journalctl<\/code>. O git continua sendo o registro \u2014 a hist\u00f3ria est\u00e1 em <a href=\"\/2026\/09\/a-historia-do-git\/\">A hist\u00f3ria do Git<\/a>. Tags <code>&lt;private&gt;<\/code> s\u00e3o removidas em duas camadas no Engram; mesmo assim, n\u00e3o grave o que n\u00e3o pode vazar.<\/p>\n<h2>Cloud e dashboard no navegador<\/h2>\n<p>O Cloud \u00e9 replica\u00e7\u00e3o opcional + UI. SQLite local continua autoritativo. Caminho smoke com Docker, no clone do reposit\u00f3rio:<\/p>\n<pre><code class=\"language-bash\">docker compose -f docker-compose.cloud.yml up -d\nengram cloud config --server http:\/\/127.0.0.1:18080\nengram cloud enroll meu-projeto\nengram sync --cloud --project meu-projeto<\/code><\/pre>\n<p>Dashboard local: <code>http:\/\/127.0.0.1:18080\/dashboard<\/code>. No compose smoke, <code>\/dashboard\/login<\/code> redireciona sem pedir token. Rotas \u00fateis: <code>\/dashboard\/browser<\/code>, <code>\/dashboard\/projects<\/code>, <code>\/dashboard\/activity<\/code>.<\/p>\n<p>Para o dia a dia num laptop, Cloud \u00e9 extra. TUI + MCP bastam.<\/p>\n<h2>Dicas que evitam dor<\/h2>\n<ul>\n<li><strong>Um c\u00e9rebro, nomes certos.<\/strong> Claude, Grok e Codex s\u00f3 compartilham mem\u00f3ria se o <code>project<\/code> for o mesmo. Coloque <code>.engram\/config.json<\/code> no repo no primeiro dia.<\/li>\n<li><strong>N\u00e3o instale tr\u00eas servidores de mem\u00f3ria no mesmo agente.<\/strong> Eles competem pelo contexto. Um de sess\u00e3o (Engram) + o grafo do c\u00f3digo (<a href=\"\/2026\/09\/alternativas-claude-mem-go-rust-c\/\">codebase-memory-mcp<\/a>) j\u00e1 \u00e9 o teto \u00fatil \u2014 o encaixe no fluxo est\u00e1 em <a href=\"\/2026\/09\/vibe-coding-linux-skills-ia-cli\/\">Vibe coding no Linux<\/a>.<\/li>\n<li><strong>MCP \u2260 serve.<\/strong> O Grok\/Claude sobe <code>engram mcp<\/code> via stdio. O systemd sobe <code>engram serve<\/code> na 7437. Os dois podem coexistir; um n\u00e3o substitui o outro.<\/li>\n<li><strong>Cwd do serve.<\/strong> Unit com <code>WorkingDirectory=%h<\/code> faz <code>\/project\/current<\/code> responder o basename da home. Para leitura de projeto, use o MCP do agente (cwd do repo) ou passe <code>--project<\/code>.<\/li>\n<li><strong>Busca FTS5 \u00e9 AND por padr\u00e3o.<\/strong> <code>match_mode=any<\/code> alarga. Preview n\u00e3o \u00e9 o registro completo \u2014 abra o id.<\/li>\n<li><strong>Doctor.<\/strong> <code>engram doctor<\/code> (ou <code>mem_doctor<\/code>) checa lock do SQLite, mismatch de sess\u00e3o e binding. Quatro checks ok \u00e9 o estado saud\u00e1vel.<\/li>\n<li><strong>Linger.<\/strong> Sem <code>loginctl enable-linger<\/code>, a unit de usu\u00e1rio s\u00f3 vive enquanto houver sess\u00e3o. Com linger, sobrevive ao reboot headless.<\/li>\n<li><strong>Upgrade do bin\u00e1rio.<\/strong> Homebrew ou um <code>install<\/code> por cima mata o processo se n\u00e3o houver systemd com <code>Restart=always<\/code>.<\/li>\n<li><strong>N\u00e3o misture autosync nativo e wrappers de cron.<\/strong> A documenta\u00e7\u00e3o pede um modo s\u00f3.<\/li>\n<li><strong>HTTP token.<\/strong> <code>ENGRAM_HTTP_TOKEN<\/code> protege delete\/export\/import na API local. Sem ele, essas rotas ficam abertas em 127.0.0.1 \u2014 ok no laptop, ruim se voc\u00ea publicar a 7437 na LAN.<\/li>\n<\/ul>\n<h2>Engram ou claude-mem?<\/h2>\n<p>O Engram nasceu inspirado no <a href=\"https:\/\/github.com\/thedotmack\/claude-mem\">claude-mem<\/a>, com decis\u00f5es opostas: bin\u00e1rio \u00fanico, qualquer agente MCP, FTS5 em vez de worker + ChromaDB, o agente comprime na hora em vez de um pipeline \u00e0 parte. Se a sua vida \u00e9 s\u00f3 Claude Code e voc\u00ea j\u00e1 est\u00e1 no ecossistema de hooks dele, o original continua v\u00e1lido. Se Claude, Codex e Grok precisam lembrar a <em>mesma<\/em> decis\u00e3o, comece pelo Engram. Compara\u00e7\u00e3o lado a lado e as outras op\u00e7\u00f5es em Go\/Rust\/C: <a href=\"\/2026\/09\/alternativas-claude-mem-go-rust-c\/\">Alternativas ao Claude-Mem<\/a>.<\/p>\n<h2>Fechando<\/h2>\n<p>Instale o bin\u00e1rio da release, trave o nome do projeto num <code>.engram\/config.json<\/code>, ligue o MCP em cada agente e deixe o <code>engram serve<\/code> no systemd de usu\u00e1rio. O resto \u00e9 disciplina: gravar o que dura, buscar antes de repetir, fechar a sess\u00e3o com um resumo. O agente da manh\u00e3 seguinte j\u00e1 sabe que a autentica\u00e7\u00e3o \u00e9 JWT \u2014 e voc\u00ea n\u00e3o paga um segundo modelo s\u00f3 para lembrar disso.<\/p>\n<p>Para continuar: <a href=\"\/2026\/09\/assistentes-de-ia-no-terminal-linux\/\">assistentes de IA no terminal<\/a>, <a href=\"\/2026\/09\/rodando-ia-local-no-linux-com-ollama\/\">Ollama<\/a> se a infer\u00eancia tamb\u00e9m for local, e a <a href=\"\/2026\/09\/a-historia-da-linguagem-go\/\">hist\u00f3ria do Go<\/a> \u2014 a l\u00edngua em que o Engram \u00e9 um arquivo s\u00f3.<\/p>\n<p><strong>Links oficiais:<\/strong> <a href=\"https:\/\/github.com\/Gentleman-Programming\/engram\">github.com\/Gentleman-Programming\/engram<\/a> \u00b7 <a href=\"https:\/\/github.com\/Gentleman-Programming\/engram\/releases\">releases<\/a> \u00b7 <a href=\"https:\/\/engram.gentlemanprogramming.com\/\">engram.gentlemanprogramming.com<\/a> \u00b7 <a href=\"https:\/\/github.com\/Gentleman-Programming\/engram\/blob\/main\/docs\/INSTALLATION.md\">Installation<\/a> \u00b7 <a href=\"https:\/\/github.com\/Gentleman-Programming\/engram\/blob\/main\/docs\/AGENT-SETUP.md\">Agent Setup<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>One Go binary, one SQLite database, the same brain for Claude, Codex, and Grok. How to install Engram on Linux, connect it to agents, set the project name correctly, and start the daemon at boot.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45,28,115,2,3],"tags":[394,425,31,116,4,311,421,407],"class_list":["post-1457","post","type-post","status-publish","format-standard","hentry","category-desenv","category-dicas","category-ia","category-linux","category-ubuntu","tag-agentes","tag-engram","tag-golang","tag-ia","tag-linux","tag-mcp","tag-memoria","tag-sqlite"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/1457","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=1457"}],"version-history":[{"count":3,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/1457\/revisions"}],"predecessor-version":[{"id":1461,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/1457\/revisions\/1461"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=1457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=1457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=1457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}