GBrain's README graph-recall figure is an upper bound, not production search performance
In the developer's own controlled test of GBrain's production search pipeline, enabling the relationship retrieval stage raised recall from 0.66 to 0.72. We rechecked our June 2026 note against the code, docs and eval reports for version 0.60.78.0
On this page
GBrain is a long-term memory server for AI agents that Garry Tan, President and CEO of Y Combinator, published on GitHub on April 5, 2026. It keeps a folder of Markdown files as the source, indexes their content in an embedded database, and exposes keyword search, semantic search, knowledge-graph traversal and synthesized answers with citations through a command-line tool and MCP tools. This blog published an introductory note on GBrain on June 16, 2026, but that note largely restated the README and did not trace each figure back to its source. This report rewrites that note by checking it against the repository as of 2026-10-06 (commit a08578c, version 0.60.78.0), its documentation, and the reports in gbrain-evals, the evaluation repository the developer maintains. It asks two questions: how the README's headline figures were produced, and which claims from the June note no longer hold.
Key findings
The first is the upper bound of an adapter that knows the question templates in advance; both are developer measurements
196 CHANGELOG entries in between
Developer measurement, re-run after fixing a leak of answer-identifying session IDs found on September 28
Terms used in this report
- MCP (Model Context Protocol) is an open protocol that agents such as Claude Code and Codex use to call external tools. GBrain exposes its features as MCP tools, and agents read and write memory through them.
- PGLite is an embedded database that compiles Postgres to WebAssembly so it runs inside a single process with no separate server. It is GBrain's default engine; for shared or large deployments GBrain uses Postgres with the pgvector extension.
- Hybrid search combines keyword search with semantic search (comparing embeddings, which turn text into numeric vectors). GBrain merges the two ranked lists with RRF (Reciprocal Rank Fusion, which sums the reciprocals of each result's ranks).
- A reranker is a separate model that re-reads search candidates together with the query and reorders them. The candidates and the query are sent to an external API.
- R@5 (recall) is the share of pages labeled as relevant that appear in the top five results; P@5 (precision) is the share of the top five results that are relevant. The developer's report always uses five as the P@5 denominator.
- An adapter is the code an evaluation repository uses to run the same questions against each system being compared. Two adapters with the same name can differ in whether they call the product's own search or a separate path built for the evaluation.
- Compiled truth and timeline are the two parts GBrain splits a page body into. The first is the current overall judgment and is rewritten when new evidence arrives. The second is a dated record of evidence and is only appended to.
What GBrain is — facts checked on 2026-10-06
The GitHub repository description reads "Garry's Opinionated OpenClaw/Hermes Agent Brain." The README says Garry Tan built it as the memory store for his own agents (personal assistants running on OpenClaw and Hermes) and then generalized it. We checked the values below in the repository and through the GitHub API.
| Item | Value | Where we checked |
|---|---|---|
| Release and license | Repository created 2026-04-05, version 0.1.0 the same day. MIT | GitHub API, CHANGELOG, LICENSE |
| Current version | 0.60.78.0 (VERSION, 2026-10-06). The latest GitHub release is v0.60.77.0, out of 174 releases in total | Repository, GitHub API |
| Pace of development | 472 version entries in the CHANGELOG; 3,090 commits on the master branch (git rev-list --count at commit a08578c). 196 entries since June 16 alone | CHANGELOG, git rev-list |
| Interest | 30,578 stars, 4,589 forks, 136 contributor accounts | GitHub API, as of 2026-10-06 |
| Issues and PRs | 199 open issues (2,458 total), 154 open PRs (3,651 total) | GitHub search API, as of 2026-10-06 |
| Runtime | Bun 1.4.0 or newer, TypeScript. Engine is PGLite (@electric-sql/pglite 0.4.3) or Postgres + pgvector | package.json, README |
| Size | 2,331 TypeScript files under src/ (about 540,000 lines), 3,552 test files, 75 bundled skills | File counts in the repository |
| Installation | bun install -g github:garrytan/gbrain, or clone the repository and install from source. The gbrain package on npm is a different project registered in 2018 (a JavaScript machine-learning library for the GPU) | README, npm registry |
The read/write flow works like this. When an agent calls remember or put_page over MCP, GBrain writes a Markdown page and indexes it in the database. Retrieval is split into gbrain search (returns a list of result pages) and gbrain think (generates a synthesized answer from the results, with citations and a note on what is missing). The overnight maintenance job, the "dream cycle," consists of 26 phases in the current code (link cleanup, fact extraction, contradiction detection, embedding and others).
We covered the broader trend of keeping agent memory in a Markdown folder in Agent memory is moving to files, and the cost structure of a memory benchmark in our DolphinBench report (Korean only). This report looks only at GBrain's claims and code.
What the June note said and what the repository says now
We checked each statement in the June note against the current code and docs. Some things changed after June; some were not accurate even in June.
| June note | Repository as of 2026-10-06 | Verdict |
|---|---|---|
Install with gbrain init --pglite, then claude mcp add gbrain -- gbrain serve | In the current code, init --pglite fails in a non-interactive environment when no embedding API key is set; to start without a key you add --no-embedding (added in 0.37.10.0, 2026-05-21). The README now leads with a serve --surface verbs connection that exposes only seven tools | Changed |
Knowledge-model example: === COMPILED TRUTH === / === TIMELINE === | That notation comes from docs/GBRAIN_V0.md, which is now marked as a historical design doc. The current parser splits the body at a <!-- timeline --> marker. The concept is unchanged, and retrieval gives compiled-truth chunks a 2.0x weight | Outdated notation |
| The Markdown git repository is kept as the system of record | This applies only to knowledge kept in files. The docs say DB-only pages and facts, page revision history, withdrawal records and credentials cannot be restored from Markdown and need a separate database backup | Needs scoping |
| Saving a page creates entity references and typed relationships | Only trusted local writes extract them, by pattern matching without an LLM. Pages written over MCP are not extracted at write time; after commit, only untyped mentions links to pages that already exist are added. serve --http does not run maintenance on its own | Needs scoping |
| Vector + keyword + RRF + reranker retrieval | Still in the code (RRF constant 60). In the default balanced mode the reranker (Voyage rerank-2.5) is on; without an API key, only keyword search is used. The default embedding model for new installs changed from ZeroEntropy zembed-1 in June to Voyage voyage-4 (1,024 dimensions) on 2026-08-15 | Defaults changed |
| The number of MCP tools may change | The code defines 159 operations. On 2026-08-09 a verbs surface was added that exposes only seven memory operations (recall, remember, entity, synthesize, forget, context_pack, delta); the starter surface, which adds everyday operations, has 40 in the code. The docs variously describe the starter surface as about 20, 27 or 40 operations | New structure |
| A team brain separates permissions by source and OAuth | This applies only to authenticated remote clients. Callers that share the same local files or database credentials are not isolated by source. The README says the authorization tests cover specific access paths and are "not a universal no-leak guarantee" | Needs scoping |
| Reference: "ADR-001 hybrid memory architecture," issue #669 | A proposal issue opened by an outside user on 2026-05-06 and closed eight minutes later. It is not a GBrain design-decision record | Dropped as a source |
| MIT license, built on Bun and TypeScript | Unchanged | Correct |
The verdicts are this report's classification. "Needs scoping" does not mean the June statement was wrong; it means the current docs state a narrower scope.
The README's graph figure — the eval report classifies it as an upper bound
In the paragraph describing its knowledge graph, the README says that "on BrainBench relationship questions a graph adapter scored P@5 0.3421, R@5 0.9791 vs 0.1917 / 0.6874 plain hybrid," and links to the 2026-09-09 report in gbrain-evals as the source. The README itself adds a caveat: these are "whole systems, not a graph-only lift or a general guarantee."
The linked report carries one more caveat. A note added on September 28 says that, "because it knows the four question forms in advance," the adapter has been renamed graph-oracle-parse and is treated as an upper bound. The body of the report also describes this adapter as "a useful specialized system … different from the production hybrid pipeline exercised below." The same report separately publishes a controlled comparison on the production search pipeline in which only the relationship retrieval stage (search.relational_retrieval) is switched off and on.
| Comparison | Conditions | R@5 | Source |
|---|---|---|---|
Specialized adapter (now named graph-oracle-parse) | Follows the graph with a parser that knows the four question templates in advance. The figure the README cites | 0.9791 | gbrain-evals report, 2026-09-09 |
| Reference hybrid | A hybrid implementation in the eval repository, used for comparison | 0.6874 | Same report |
| Production search, relationship stage off | GBrain 0.48.4.0, reranker and query expansion off, five chunks | 0.6626 | Same report |
| Production search, relationship stage on | Same index and same query vectors as above, traversal depth 2 | 0.7241 | Same report |
Here is what the controlled comparison found. Across 435 pairs (145 relationship questions repeated under three data-ingestion orders), turning the relationship stage on raised recall on 45 pairs and lowered it on none. The effect varied by question template. For "Who invested in X?", the share of questions with a correct first result rose from 9/39 to 21/39; for "Who attended X?", recall stayed at 0.38. For the attendance questions, the report notes that the evaluation data links meetings to people, while the product follows links from people to meetings. It also states that the three ingestion orders repeat the same questions, so the 435 pairs are not independent samples; that the answer key gives credit only to person pages; and that answer accuracy was not measured.
In short, in the developer's measurement the relationship stage raised recall on some questions without lowering it on any. But the 0.9791 the README cites comes from an adapter that knows the question templates in advance; the production pipeline scored 0.7241. Both figures come from the version evaluated at the time (0.48.4.0), and we found no re-measurement on the current version.
Other developer evaluations — unfavorable results and corrections are included
gbrain-evals is a separate repository under Garry Tan's account, so these are developer measurements, not independent evaluations. The reports do include comparisons in which GBrain came out behind, along with correction notes.
| Evaluation | Result | Caveat stated in the report |
|---|---|---|
| LongMemEval (arXiv 2410.10813, a benchmark that asks questions about long histories of past conversations), 470 answerable questions | With the default release configuration (balanced, reranker on, autocut off), every needed conversation was in the top five for 451 questions (95.96%) | On September 28 the developer found that every labeled evidence conversation had an ID starting with answer_ and that this ID reached both the search and the answering model. Re-measured on October 4 at 0.60.37.0 (commit 109b992) with the IDs hidden, the count was 451; the previously published value, measured with the leak, was 449 |
| Answer accuracy on the same benchmark, 500 questions | Using the conversations GBrain retrieved, GPT-4o answered 430 correctly and gpt-5.4 answered 447 (89.4%) | The earlier figure of 433, measured with the leak, was marked as pending a re-run. The score changes with the answering model, so it is not a score for the memory system alone |
| PrecisionMemBench, 77 cases (each requires finding one small memory precisely) | Hybrid search returning many candidates passed every check on 7 cases, fewer than keyword search (34). A setting that keeps a single result, plus the reranker, passed 41 | Returning fewer results raises precision but misses questions that need several facts |
| Concept search, 181 questions not used for tuning settings | nDCG@5 (higher when relevant pages rank nearer the top): vector search alone 0.6054, GBrain without reranker 0.5780, GBrain with reranker 0.6619 | Without the reranker, vector search alone scored higher. A September 28 note adds that 302 of the 548 questions copy words straight from the target page |
| Source-weighting test, 30 questions | Times a curated note was ranked first: vector search alone 29, GBrain 27, GBrain with source weights off 26 | The report says the result "does not support a general claim that hybrid retrieval beats vectors" |
What these reports show is not that "GBrain is always better" but that you should decide which settings to enable by testing them on the questions you actually expect to ask. The report's own conclusion recommends comparing simple search with GBrain on the same questions and holding back questions you did not use to choose settings. In the sources we checked, we found no reproduction of these evaluations by an independent party.
Sharing and backup — limits the docs state themselves
Of the material missing from the June note, the most important for an adoption decision is the set of boundaries described in docs/guides/memory-boundaries.md and docs/architecture/system-of-record.md. Where the code could confirm a point, we checked it too.
- By default, memories an agent saves are readable by every connected agent. The default visibility of the
rememberoperation isworldin the code (src/core/verbs.ts). The README says you must passvisibility: "private"to keep a memory to one agent. - A Markdown export is not a full backup. DB-only facts and pages, revision history, withdrawal state, the job queue, settings and authentication records may not be recoverable from Markdown, so the docs recommend using the engine's full backup and restore path and testing a restore into a separate location.
- Local storage does not mean local processing. Keyword search and link extraction without an API key use no model API, but once embeddings, the reranker, query expansion or synthesis are turned on, the relevant text is sent to the configured provider. The connected agent's own model receives recalled memories even when GBrain runs without an API key.
- With default settings, each save adds one fact-extraction call. For pages of extraction-eligible types such as notes, meetings and email, a queued job calls a fact-extraction model once after the save; the docs say
gbrain config set facts.extraction_enabled falseturns this off. - A source organizes content; it does not isolate access. Remote clients are restricted by per-source grants and visibility filters, but local callers that use the same files or database credentials are not. The docs advise keeping content that must be fully inaccessible in a source that has not been granted.
Developer claims we could not verify
The README also makes claims that cannot be checked from outside the repository. This report records them only as developer claims, not as facts.
| README claim | Can it be verified? |
|---|---|
| Garry Tan's production brain holds 155,795 pages, 24,589 people, 5,340 companies and runs 66 cron jobs | Personal data; it cannot be checked from outside |
| PGLite suits personal brains up to about 50,000 pages | We found no measurement in the repository behind this threshold |
| Installs in 30 minutes; the personal-agent bootstrap takes about 15 minutes | Depends on the environment; we did not install it |
| Every major MCP client is supported | Per-client setup docs exist. Only some state a version they were verified against, such as Grok Build v1.0.4 and opencode v1.18.18 |
Checklist
| What to do | Why |
|---|---|
Install with bun install -g github:garrytan/gbrain, and do not use npm install -g gbrain | The gbrain package on npm is unrelated, and the README carries the same warning. Bun 1.4.0 or newer is required |
Start with gbrain init --pglite --no-embedding and serve --surface verbs | No API key is needed; only keyword search and the seven memory operations are exposed. No text leaves the machine, and the agent sees a small number of tools |
Save personal memories with visibility: "private" | With the default world, every agent connected to the same brain can read them |
| Keep a database backup separate from the git repository, and test restoring it elsewhere | DB-only pages, revision history and withdrawal records cannot be restored from Markdown |
| If agents write to the brain over MCP, schedule link maintenance yourself | Remote writes do not create typed relationships at write time, and serve --http does not run maintenance on its own |
| Compare settings such as the reranker or relationship retrieval on and off with 20–50 of your own questions | Even in the developer's evaluations, each setting brought both gains and losses, and in some evaluations vector search alone scored higher |
| Pin a version before upgrading and read the CHANGELOG's "To take advantage of" sections | Several versions can ship in a single day, and some versions come with upgrade steps, such as the notice that brains indexed before 0.48.3.0 must rebuild their search chunks |
What is not settled
- This report is a rewrite, on 2026-10-06, of an initial note published on 2026-06-16. The June note was an overview restating the README, with no per-figure source checks and no limitations section. Its use-case scenarios and staged adoption plan were removed because they had no supporting evidence.
- This report contains no new performance measurements. We did not install or run GBrain. What we did was read the code and load the repository's code to count the defined operations and phases. All performance figures are developer measurements taken from the gbrain-evals reports.
- The evaluated versions differ from the current one. The relationship comparison was run on 0.48.4.0 and the LongMemEval re-measurement on 0.60.37.0. We did not confirm whether 0.60.78.0 produces the same values.
- The evaluation data is not real usage data. The report says the concept-search results come from a synthetic corpus, and a September 28 correction says the "externally authored" question set is 50 AI-written placeholder questions. These evaluations cannot tell you how GBrain performs on real personal or company data.
- We checked the permission boundaries against the docs and only part of the code. We confirmed the default visibility and the operation-exposure rules in the code, but did not verify that source isolation holds on every path. The developer also says it does not guarantee this.
- It changes quickly. The CHANGELOG gained 196 entries after June 16 alone. Statements about the code in this report refer to commit a08578c, and repository figures are from the GitHub API as of 2026-10-06.
References
All sources were retrieved and checked on 2026-10-06.
| Source | What this report takes from it | Type |
|---|---|---|
| garrytan/gbrain README (commit a08578c) | Product description, the cited graph figures, install and connection instructions, claims about the personal brain's size and install time, wording on sharing boundaries | Developer claim |
Code in the same repository: src/core/search/hybrid.ts, src/core/search/mode.ts, src/core/link-extraction.ts, src/core/verbs.ts, src/mcp/surface.ts, src/core/cycle.ts, src/commands/init.ts, src/core/ai/defaults.ts, package.json | RRF constant and weights, search modes and reranker default, no LLM in link extraction, default visibility, 159 operations and the count per surface, 26 maintenance phases, keyless initialization, default embedding model | Primary (developer source) |
Docs in the same repository: system-of-record.md, memory-boundaries.md, brains-and-sources.md, GBRAIN_V0.md, CHANGELOG.md | Backup scope, graph behavior per write path, where text is sent, limits of source isolation, the historical-design-doc label, version history | Primary (developer source) |
| gbrain-evals retrieval report, 2026-09-09 | P@5 and R@5 per adapter on relationship questions, the upper-bound reclassification note, the controlled relationship-stage comparison, PrecisionMemBench, concept-search and source-weighting results | Developer measurement |
| gbrain-evals LongMemEval follow-up report, 2026-10-04 | Discovery of the leaked answer-identifying session IDs and the re-measurement, 451/470, correct answers per answering model | Developer measurement |
| arXiv 2410.10813 (LongMemEval) | Benchmark name and origin | Primary (paper) |
| GitHub API: repository, releases, contributors, search; issue #669 | Creation date, stars and forks, release count, issue and PR counts, the author and closing time of #669 | Primary |
The gbrain package on npm | That it is an unrelated package with the same name (registered 2018, a GPU machine-learning library) | Primary |
| Agent memory is moving to files · DolphinBench report (Korean) | The file-based memory trend, the cost structure of a memory benchmark | This blog |
We rewrote the initial note of 2026-06-16 to current standards on 2026-10-06. The introductions on GeekNews (a Korean developer news aggregator) and Zenn (a Japanese developer blogging platform) cited in the June note are secondary sources and are not used as evidence in this version. If the README's graph figure or the eval reports change, we will update this report and note the revision date.