{"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\/es\/2026\/09\/engram-memoria-persistente-para-agentes-no-linux\/","title":{"rendered":"Engram: mem\u00f3ria persistente para agentes no 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>Um bin\u00e1rio Go, um SQLite, o mesmo c\u00e9rebro para Claude, Codex e Grok. Como instalar o Engram no Linux, ligar nos agentes, acertar o nome do projeto e subir o daemon no 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\/es\/wp-json\/wp\/v2\/posts\/1457","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=1457"}],"version-history":[{"count":3,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1457\/revisions"}],"predecessor-version":[{"id":1461,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1457\/revisions\/1461"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=1457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=1457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=1457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}