relembra
Testar agoraTry it now

Seu agente temStop paying the memória de peixe.amnesia tax.

O relembra é o caderno que todos os seus agentes de IA leem ao acordar: um fato por linha, separado por projeto, e apagável de verdade.relembra is one memory every AI agent you run reads at startup: one fact per line, scoped per project, erasable for real.

Testar agoraTry it now

Anota aqui. Roda de verdade.Type a fact. It runs for real.

A guarda aceitaThe guard accepts it

28 / 280 bytes

<memory id="…" scope="projeto-a" rev="1" at="…" trust="agent">Os testes precisam de TZ=UTC</memory>

Por que uma linha só? Porque se não cabe num tweet, não é fato: é redação. São 280 bytes, não letras, então acento conta dois.Why one line? If it doesn't fit in a tweet, it's not a fact. It's an essay. The limit is 280 bytes, not letters, so accents count double.

Segunda você conta. Terça ele sabe.Tell it Monday. It knows Tuesday.

Hoje é assim: toda sessão nova, você explica de novo que a migração roda com bun run migrate, que os testes precisam de TZ=UTC, que deploy de sexta só depois das 14h. O agente faz direitinho. Amanhã, esquece tudo. Não é falta de inteligência. É falta de caderno.Here's the tax. Every new session you re-explain migrations, ports, test flags and deploy rules. If that costs five minutes a session and you open three sessions a day, that's 75 minutes a week. Every week. relembra charges it once.

  1. Primeiro, instale e ligue o gancho.First, install it and wire the hook.

    sh install.sh relembra-darwin-arm64 SHA256SUMS
    relembra init
    {
      "hooks": {
        "SessionStart": [
          {
            "matcher": "startup|resume|clear|compact|fork",
            "hooks": [
              {
                "type": "command",
                "command": "/usr/bin/env -i … /path/to/relembra hook"
              }
            ]
          }
        ]
      }
    }

    Cole em .claude/settings.json ou .codex/hooks.json.Paste into .claude/settings.json or .codex/hooks.json.

  2. Depois, deixe o agente anotar.Then let your agent take notes.

    relembra note "As migrações rodam com bun run migrate, nunca na mão."relembra note "Migrations run with bun run migrate, never by hand."
    5349d07d-13f7-4c6e-a9f9-d1f6a5af74dc
  3. Na sessão seguinte, ele acorda sabendo.Next session, it wakes up knowing.

    terça, 09:12, sessão novaTuesday 09:12, new session
    1. SessionStart: relembra hook
    2. <wake> <memory id="…" scope="projeto-a" rev="1" at="…" trust="owner">Nunca rode migração em produção sem backup.</memory> <memory id="…" scope="projeto-a" rev="1" at="…" trust="agent">As migrações rodam com bun run migrate, nunca na mão.</memory> </wake>
    3. vocêyouRoda as migrações pra mim?Run the migrations for me?
    4. agenteagentAntes, conferi o backup, como pede a regra fixada. Agora rodando bun run migrate, do jeito que está na memória do projeto, anotada na segunda.Checked the backup first, per the pinned rule. Now running bun run migrate, exactly as the project memory says, noted Monday.

Explica como se eu tivesse 12 anosExplain it like I'm 12

Sem jargão: cada ideia explicada como pra uma criança de dez anos. Se travar, a culpa é da explicação, não sua. Seis ideias, cada uma contada duas vezes, do jeito simples e do jeito técnico, e cada desenho ao lado roda a biblioteca de verdade.No jargon. Every idea explained like you're ten. If it doesn't click, that's on the explanation, not you. Six ideas, each told twice: the simple way, then the engineer's way. Every panel next to them runs the real library.

O filme, em 8 minutos, narrado em portuguêsThe 8-minute film, narrated in Portuguese with English captions

Uma linha por fatoOne line per fact

Pensa num post-it. Cabe uma frase. Se você precisa de mais espaço, provavelmente são duas ideias, ou é fofoca. O relembra só guarda o que cabe no post-it, e cada post-it diz quem escreveu, quando e o quanto dá pra confiar.Think sticky note. One sentence fits. Need more room? That's two ideas, or gossip. relembra keeps only what fits on the note, and every note says who wrote it, when, and how far to trust it.

Uma memória é uma linha de até 280 bytes UTF-8 com proveniência: agente, harness, modelo, host, fonte, confiança e op id. As revisões contam a partir de 1. A guarda recusa quebra de linha, caracteres invisíveis, bidi e de controle, e formatos de credencial, sem nunca repetir o texto recusado. Na saída, cada memória vira evidência atribuída, escapada para não forjar a moldura.A memory is one line, at most 280 UTF-8 bytes, with provenance: agent, harness, model, host, source, trust and op id. Revisions count from 1. The guard refuses line breaks, invisible, bidi and control characters and credential shapes, and never echoes the refused text. On the way out, each memory renders as attributed evidence, escaped so it cannot forge its frame.

A última memória do projeto A, desmontadaProject A's latest memory, taken apart

Cada projeto, sua gavetaEvery project gets a drawer

Cada projeto tem uma gaveta com chave. O agente do Projeto A tem a chave da gaveta A e da gaveta comum. A gaveta B? Ele nem sabe que existe. E quem entrega as chaves é você, nunca o agente.Each project gets a locked drawer. Project A's agent holds the key to drawer A and to the shared drawer. Drawer B? It doesn't know it exists. You hand out the keys. Never the agent.

Escopo é uma chave opaca que o host define. A política do host transforma o contexto autenticado num principal com os escopos que ele pode ler, escrever, fixar, promover e ser dono. O filtro vem antes da busca: o que está fora do escopo nem entra no ranking, e o modelo nunca escolhe onde lê. Na CLI, RELEMBRA_GLOBAL_SCOPE soma uma gaveta comum que toda sessão lê; as escritas ficam no projeto.A scope is an opaque key your host defines. The host's policy turns its authenticated context into a principal with the scopes it may read, write, pin, promote and own. Filtering comes before ranking: out-of-scope memories never enter the score, and the model never picks where it reads. In the CLI, RELEMBRA_GLOBAL_SCOPE adds a shared drawer every session reads; writes stay in the project.

Três gavetas, dois agentes, uma busca de verdadeThree drawers, two agents, one real search

O bilhete da manhãThe morning briefing

Todo dia o agente acorda zerado e recebe um bilhete. O bilhete tem tamanho fixo. Primeiro vai o que você fixou, depois o mais novo, depois os resumos. O que não cabe entra no rodapé só com o número dele, pra buscar depois; se nem isso cabe, fica de fora. Nunca estoura. Arrasta a régua e vê.Every morning your agent wakes up blank and gets a note. The note has a fixed size. Pinned stuff first, then the newest, then the summaries. Whatever doesn't fit goes at the bottom as just its ID, to look up later; if even that won't fit, it's left out. It never overflows. Drag the slider.

O wake é o bloco com que a sessão começa, dentro de um orçamento de bytes UTF-8 com moldura (9.500 por padrão). Ordem: fixadas, recentes que nenhum resumo cobre, resumos, as memórias que eles cobrem e um índice de ids. Memória não-confiável vem depois de toda confiável. Na CLI, com escopo global, cada parte reserva metade do orçamento e passa à outra o que sobrar.Wake is the block a session starts with, inside a UTF-8 byte budget, frame included (9,500 by default). Order: pinned, recent memories no summary covers, summaries, the memories they cover, then an index of ids. Untrusted memories come after every trusted one. In the CLI, with a global scope, each part reserves half the budget and hands the other whatever it leaves.

O wake do projeto A, montado agoraProject A's wake, composed right now
600 bytes

    Caneta preta de verdadeA real black marker

    Dois jeitos de sumir com uma anotação. Esconder: vai pra gaveta de baixo, só o dono vê. Tarjar: caneta preta por cima, inclusive nas cópias e nos resumos. E se alguém levou uma cópia pra casa, o relembra te entrega a lista de quem levou. Ele não finge que sumiu.Two ways to make a note disappear. Hide it: bottom drawer, only the owner sees it. Redact it: black marker over it, copies and summaries included. And if someone took a copy home, relembra hands you the list of who did. It doesn't pretend it vanished.

    Retirar esconde a memória dos agentes; o dono ainda a vê, os resumos derivados saem junto e as cópias promovidas ficam. Tarjar troca o texto por uma lápide em todo lugar, resumos e cópias promovidas incluídos, e depois limpa o WAL do SQLite. Cada renderização pode registrar um portador; deliverErasures entrega ao host o que precisa ser apagado lá fora, até ele responder reconhecido ou sem suporte. Nunca “apagado”.Retract hides a memory from agents; its owner still sees it, derived summaries go with it, promoted copies stay. Redact replaces the text with a tombstone everywhere, summaries and promoted copies included, then scrubs the SQLite WAL. Each rendering can record a carrier; deliverErasures hands the host what to erase out there until it answers acknowledged or unsupported. Never “erased”.

    Uma memória que não devia estar aliA memory that shouldn't be there

      Quem já recebeu esse textoWho already received this text

        Caiu a luz? Nada duplicaPower cut? Nothing doubles

        Você tá anotando e a luz cai. Quando volta, anota de novo. Num caderno comum ficam duas linhas iguais. No relembra, cada anotação leva um número de protocolo: se ela chega duas vezes, ele devolve a primeira.You're writing a note and the power cuts out. When it's back, you write it again. A normal notebook now has two copies. relembra gives every note a receipt number: if it arrives twice, you get the first one back.

        Todo evento vai para um log append-only com um op id. Repetir uma escrita com o mesmo op id e o mesmo conteúdo devolve o resultado gravado, com o mesmo id e o mesmo horário; o mesmo op id com outro conteúdo é recusado (OpConflictError). Uma cerca de autoridade, chave e época, faz um escritor atrasado gravar nada. O SQLite roda em WAL com synchronous=FULL, arquivo 0600.Every event lands in an append-only log with an op id. Retry a write with the same op id and payload and you get the recorded result: same id, same timestamp. Same op id, different payload: refused (OpConflictError). An authority fence, key plus epoch, makes a stale writer commit nothing. SQLite runs in WAL with synchronous=FULL, file mode 0600.

        Uma escrita, uma queda, uma repetiçãoOne write, one outage, one retry

        Memórias gravadas:Memories stored: 0

        Prova com pegadinhaA test with planted cheaters

        Antes de confiar num aluno, ele faz prova. Só que essa prova tem aluno-pegadinha: um entrega em branco, um cola a resposta errada, um vaza a gaveta dos outros. Se algum deles passar, quem reprova é a prova.Before you trust a student, they take a test. This test has planted cheaters: one hands in a blank sheet, one copies a wrong answer, one leaks other kids' drawers. If any of them passes, the test is what fails.

        O harness de eval faz as mesmas perguntas ao relembra e a candidatos de controle, num conjunto sintético com semente fixa, e conta vazamentos, negação de escopo, hit@5, MRR, abstenção, cobertura do wake, violações de rótulo e superadas servidas. Em 31/10/2026, o relembra passou em todas as metas nas duas lojas; o candidato perfeito passou; os 17 controles negativos reprovaram. Sem juiz LLM.The eval harness asks relembra and a set of control candidates the same questions on a seeded synthetic set, and counts leaks, scope denial, hit@5, MRR, abstention, wake coverage, label violations and superseded memories served. On 2026-10-31 relembra passed every gate on both stores; the perfect candidate passed; all 17 negative controls failed. No LLM judge.

        A prova de 31/10/2026, candidato por candidatoThe 2026-10-31 run, candidate by candidate
        CandidatoCandidateEsperadoExpectedResultadoResult
        relembra-sqlitePASSPASS
        relembra-memoryPASSPASS
        perfectPASSPASS
        emptyFAILFAIL
        leakyFAILFAIL
        hollow-empty-briefFAILFAIL
        hollow-empty-textFAILFAIL
        hollow-wrong-textFAILFAIL
        hollow-wrong-scopeFAILFAIL
        hollow-duplicate-conflictFAILFAIL
        hollow-indented-conflictFAILFAIL
        hollow-index-textFAILFAIL
        hollow-wrapped-textFAILFAIL
        hollow-encoded-duplicateFAILFAIL
        hollow-extra-rawFAILFAIL
        hollow-extra-wrappedFAILFAIL
        hollow-appended-rawFAILFAIL
        hollow-appended-wrappedFAILFAIL
        hollow-error-rawFAILFAIL
        hollow-error-wrappedFAILFAIL

        Nada em runtime além do Node 24.14+ ou do Bun 1.4+. A biblioteca é TypeScript puro e a loja padrão usa o node:sqlite que já vem no runtime. Menos coisa pra atualizar, menos coisa pra quebrar.Nothing at runtime but Node 24.14+ or Bun 1.4+. Plain TypeScript, and the default store uses the node:sqlite your runtime already ships. Nothing new to audit.

        ZeroZerodependênciasdependencies

        A CLI é um binário só. relembra init imprime o gancho de início de sessão pro Claude Code e pro Codex. Você cola uma vez e o wake chega antes da sua primeira pergunta.The CLI is one binary. relembra init prints the session-start hook for Claude Code and Codex. Paste it once; the wake lands before your first prompt.

        Um binário.One binary.Um gancho.One hook.

        relembra mcp é um servidor MCP em stdio, revisão 2026-07-28, com note, find, brief, wake e retract. Escopo e principal vêm do ambiente, nunca de um argumento que o modelo inventou.relembra mcp is a stdio MCP server, revision 2026-07-28: note, find, brief, wake, retract. Scope and principal come from the environment, never from an argument the model made up.

        FalaSpeaksMCPMCP

        Numa máquina, SQLite em WAL com synchronous=FULL. Em várias, você passa o seu cliente Postgres e o relembra não instala driver nenhum. As duas lojas passam pela mesma bateria de conformidade.One machine: SQLite in WAL with synchronous=FULL. Many: hand it your own Postgres client; relembra installs no driver. Both stores pass the same conformance suite.

        SQLite ouSQLite orPostgresPostgres

        Medido,Measured,não prometidonot promised

        Resultados medidos em 31/10/2026Results measured on 2026-10-31
        O quêWhatResultadoResult
        Vazamentos no evalLeaks in the evalconjunto sintético, lojas SQLite e em memóriasynthetic set, SQLite and in-memory stores0
        Negação de escopoScope denialperguntas a escopos sem acessoquestions aimed at scopes without access100%
        hit@5 e MRRhit@5 and MRRa resposta certa entre as cinco primeiras, e em que posiçãothe right answer in the top five, and at which rank1,00 e 1,001.00 and 1.00
        Controles negativos reprovadosNegative controls failedvazio, vazador e 15 ocosempty, leaky and 15 hollow17 de 17of 17
        find a quente, p95, BunWarm find, p95, Bun20.000 memórias, 500 buscas, máquina carregada20,000 memories, 500 queries, loaded machine9,83 ms9.83 ms
        find a quente, p95, NodeWarm find, p95, Nodeo mesmo corpus no Node 26the same corpus on Node 2642,1 ms42.1 ms
        Dependências em runtimeRuntime dependencieso que o package.json pede para rodarwhat package.json needs at run time0

        Medido em 31/10/2026 num Apple M5 Pro de 18 núcleos, com Bun 1.4.4 e Node 26.12.1. Fonte: docs/eval e docs/bench do repositório.Measured on 2026-10-31 on an 18-core Apple M5 Pro, Bun 1.4.4 and Node 26.12.1. Source: the repository's docs/eval and docs/bench.

        Tudo que vem na caixaEverything you get

        BibliotecaLibrary

        • note, find, wake, brief, recall, zoomTypeScript
        • Guarda de escrita com 10 regrasA write guard with 10 rulesantes de gravarbefore any write
        • Retirar, tarjar, superar, promoverRetract, redact, supersede, promotecom préviawith preview
        • Retenção por escopoPer-scope retentiono host agendayour host schedules it
        • Entrega de apagamento aos portadoresErasure delivery to carriersdeliverErasures

        LojasStores

        • SQLite (node:sqlite)WAL, synchronous=FULL
        • Postgreso seu cliente, sem driveryour client, no driver
        • Em memória e suíte de conformidadeIn-memory store and conformance suitepra testar adaptadoresto test adapters

        IntegraçõesIntegrations

        • CLI em binário únicoSingle-binary CLIBun
        • Gancho de início de sessãoSession-start hookClaude Code, Codex
        • Servidor MCPMCP serverstdio, 2026-07-28
        • pi-durable1.4.0

        ProvaProof

        • Harness de eval com controlesEval harness with controls17 negativos, 1 positivo17 negative, 1 positive
        • Benchmark de latênciaLatency benchmark20.000 memórias20,000 memories
        • Exportar e importarExport and importformato documentadodocumented format

        O preçoThe price

        • Licença do códigoCode licenceMIT
        • Quanto custaWhat it costsR$ 0$0

        Total: zero real. O único preço é uma linha na config do seu gancho, e a vergonha de ter explicado a mesma coisa 40 vezes.Total: $0. The only cost is one line in your hook config. The alternative costs you every session.

        Perguntas justasFair questions

        Precisa de servidor rodando?Do I need a server running?

        Não. A CLI abre um arquivo SQLite, responde e sai. Sem daemon, sem porta aberta, sem conta na nuvem. Quer dividir entre máquinas? Aí você liga o Postgres que já tem.No. The CLI opens a SQLite file, answers, and exits. No daemon, no open port, no cloud account. Want to share across machines? Point it at the Postgres you already run.

        Meus dados vão pra algum lugar?Does my data go anywhere?

        Na CLI, ficam num arquivo na sua máquina, com permissão 0600. O relembra não faz chamada de rede. O que chega no modelo é o wake que você ligou no gancho, e só ele.With the CLI, they stay in one file on your machine, mode 0600. relembra makes no network calls. What reaches the model is the wake you wired into the hook. Nothing else.

        E se o agente anotar besteira?What if the agent writes garbage?

        Acontece. Por isso toda memória diz quem escreveu e o quanto confiar: owner, agent ou untrusted. O que o agente escreve entra como agent, no máximo, e chega no modelo como evidência com nome e data, não como ordem. Errou? Você supera com a versão certa ou retira.It will. So every memory carries who wrote it and how far to trust it: owner, agent or untrusted. Agent writes cap at agent, and they reach the model as attributed evidence, not instructions. Wrong? Supersede it or retract it.

        Colei uma senha sem querer. E agora?I pasted a password. Now what?

        Provavelmente a guarda nem deixou entrar: ela recusa os formatos de credencial conhecidos. Se algo sensível entrou, tarje. O texto vira lápide, nos resumos também, e o WAL é limpo. Testa lá em cima.The guard most likely refused it: it blocks known credential shapes. If something sensitive got in, redact it. The text becomes a tombstone, summaries included, and the WAL gets scrubbed. Try it above.

        Funciona com qual agente?Which agents does it work with?

        Com qualquer um que rode um gancho de início de sessão (Claude Code e Codex estão documentados), que fale MCP, ou que rode o seu código TypeScript no Node ou no Bun.Anything that runs a session-start hook (Claude Code and Codex are documented), speaks MCP, or runs your TypeScript on Node or Bun.

        Por que não usa embeddings?Why no embeddings?

        Porque ainda não precisou. A busca é BM25 com um tokenizador próprio de português e inglês, e o eval mede se ela acha o que os agentes perguntam. Embeddings só entram no dia em que o eval mostrar a busca lexical falhando.Because it hasn't needed them. Search is BM25 with its own Portuguese and English tokenizer, and the eval measures whether it finds what agents ask. Embeddings come in the day the eval shows lexical search failing. Not before.

        Dá pra usar hoje?Can I use it today?

        Dá. É a versão 1.0.0-beta.5, pública, licença MIT. A biblioteca tá no npm (npm i relembra@beta) e o CLI vem na release do GitHub: macOS arm64, Linux e Windows, em x64 e arm64. Beta quer dizer o seguinte: a API ainda pode mudar antes da 1.0. Se mudar, tá no CHANGELOG, com o caminho da migração.Yes. Version 1.0.0-beta.5, public, MIT. The library is on npm (npm i relembra@beta). The CLI ships on the GitHub release: macOS arm64, plus Linux and Windows on x64 and arm64. Beta means the API can still change before 1.0. If it does, the changelog tells you how to migrate.

        Anota um fato e vê a guarda, o wake e a tarja rodando aqui, no seu navegador.Write one fact. Watch the guard, the wake and the redaction run right here, in your browser. TestarTry it