YC 대표 Garry Tan이 12일 만에 만들어 17,888페이지·4,383명·723개 회사를 자동 관리하는 Postgres 기반 개인 지식 두뇌.
왜 지금 이런 두뇌가 필요한가.
2024~2026년 사이 Claude·ChatGPT 같은 에이전트가 빠르게 똑똑해졌지만, 한 가지 약점이 남았다 — 잘 잊어버린다는 것. 세션이 끝나면 어제 얘기한 내용도, 1시간 전 받은 이메일도 사라진다. 그래서 사용자는 매번 같은 컨텍스트를 다시 붙여넣고 있다.
해결책은 보통 두 갈래다 — (1) 모델의 컨텍스트 윈도를 더 키우거나, (2) 외부 DB에 사실을 적어두고 그때그때 검색해서 끼워넣는 RAG. gbrain은 두 번째 길을 택하되, 거기에 "자기 배선 지식 그래프"를 더해 벡터 검색만으로는 닿지 못하는 답까지 끌어낸다.
invested_in, works_at 같은 엣지)로 표현된 데이터 구조. "Bob이 이번 분기에 어디에 투자했어?" 같은 다중 홉 사실 관계 질문에 강하다 — 벡터 검색은 이런 질문에 약하다.한 문장으로 줄이면.
gbrain은 마크다운 파일들을 Postgres에 동기화해두고, 하이브리드 검색(벡터+키워드)과 자기 배선 지식 그래프로 답을 찾아주는 CLI 겸 MCP 서버다. 핵심은 — 모든 페이지에 자동으로 [[wiki/people/bob]] 같은 위키링크를 추출해 그래프 엣지를 만들고, 그래프 탐색을 검색 파이프라인에 끼워 넣어 "벡터로만은 안 잡히던" 다중 홉 사실 관계 질문에 답한다.
YC 대표 Garry Tan이 자기 업무용으로 12일 만에 만들어 매일 돌리고 있다는 게 가장 큰 신뢰 포인트. "thin harness, fat skills"(코어는 얇게, 도메인 지식은 마크다운 스킬에) 철학을 가장 잘 보여주는 실전 사례다.
시대적 배경 + 경쟁 우위.
이 레포의 가장 큰 신뢰 포인트는 Garry Tan(현 Y Combinator 사장)이 본인 업무용으로 만들고 매일 돌리고 있다는 점이다. README에 적힌 운영 규모 (작성 시점 2026-05-20 기준):
일반적인 RAG는 "의미가 비슷한 문장"만 잘 찾아온다. 그래서 "Bob이 이번 분기에 어디에 투자했어?" 같은 사실 관계 질문엔 약하다. gbrain은 모든 페이지에 위키링크([[wiki/people/bob]])를 자동 추출해 그래프 엣지를 LLM 호출 없이 자라게 한다. tree-sitter로 마크다운을 파싱해 엔티티 참조를 패턴 매칭으로 뽑는 게 비밀.
자체 벤치마크(BrainBench, Opus가 생성한 240페이지 코퍼스)에서 P@5 49.1% / R@5 97.9%를 기록했고, 그래프를 끈 변형(vector-only RAG)보다 +31.4 포인트 더 정확했다. 같은 데이터셋에서 ripgrep+BM25 같은 키워드 검색도 비슷한 차이로 이김.
"Postgres 같은 서버 깔아라"부터 막힐 게 뻔하니까 PGLite(WASM으로 도는 임베디드 Postgres)를 기본으로 쓴다. 도커도, 서버도 필요 없이 2초 만에 DB가 뜨고, 그다음은 "API 키 묻는 질문에 답만 하면" 끝.
MCP 서버로 동작하므로 Claude Desktop, Claude Code, Cursor, Windsurf, ChatGPT, Perplexity, Cowork에서 그대로 사용할 수 있다. gbrain serve 한 줄.
| 비교 항목 | 일반 RAG (벡터 only) | gbrain (하이브리드 + 그래프) |
|---|---|---|
| 의미 검색 | 벡터 1종 | 벡터 + BM25 + 그래프 RRF |
| 다중 홉 질문 | 약함 | typed link로 강함 |
| DB 설치 | Pinecone·Qdrant 등 별도 | PGLite(WASM) 기본, 0 설치 |
| 외부 노출 | 직접 API 작성 | MCP 자동 (30+ 도구) |
| 밤 사이 정리 | 없음 | cron + dream cycle |
| 관리자 UI | 없음 | React SPA 임베드 |
런타임 · DB · 검색 · MCP · 잡 큐.
bun build --compile로 OS별 단일 바이너리 생성src/cli.ts가 gbrain init, gbrain doctor 등 모든 명령어 라우팅BrainEngine 인터페이스(약 47개 오퍼레이션)를 구현1/(k+rank) 공식으로 합치는 알고리즘@ai-sdk/anthropic · @ai-sdk/google · @ai-sdk/openai · @ai-sdk/openai-compatible · @anthropic-ai/sdk@modelcontextprotocol/sdk 1.29.0 — 표준 MCP 구현체cookie-parser + cors + express-rate-limitread / write / admin 스코프로 권한 통제gray-matter — 마크다운 프론트매터 파싱marked — 마크다운 → HTMLweb-tree-sitter + tree-sitter-wasms — 코드 청크 분할@dqbd/tiktoken — 토큰 카운트@jsquash/png · @jsquash/avif · heic-decode · exifr — 이미지 ingest@aws-sdk/client-s3 — Supabase Storage/S3 첨부파일zod — 런타임 스키마 검증admin/ 디렉토리에 별도 React SPAbuild:admin-embedded 스크립트가 빌드 결과물을 단일 바이너리에 임베드gbrain serve --http로 /admin 페이지 + SSE 라이브 피드 제공전체 루프 → 두 엔진 → 자기 배선 그래프 → 하이브리드 검색 → 잡 큐 → 보안.
signal → search → respond → write → auto-link → sync (every (brain-first (informed (page + (typed edges (cron message) retrieval) by context) timeline) + backlinks) keeps fresh)
비서가 메일을 받을 때 ① 일단 다이어리부터 펴고(brain-first 검색), ② 다이어리에 적힌 맥락으로 답장 쓰고, ③ 새 사실은 다이어리에 추가하면서, ④ "이 사람 = 그 사람"이라는 화살표를 그어두고, ⑤ 밤에 다이어리를 정리(cron)하는 흐름과 같다.
┌─────────────────────────────────────────────────────────────┐
│ src/core/engine.ts (BrainEngine 인터페이스) │
│ put_page · get_page · search · query · graph-query 등 │
│ 약 47개 오퍼레이션 │
└──────────┬──────────────────────────────────┬───────────────┘
│ │
PGLite 엔진(default) Postgres+pgvector 엔진
- WASM 임베디드 - Supabase / 셀프호스팅
- 서버/도커 불필요 - 다중 머신 공유
- ~50K페이지까지 권장 - 대규모 / 팀용
CLI와 MCP 서버는 단일 소스에서 생성된다. 같은 47개 오퍼레이션을 두 가지 방식(셸 명령 vs MCP 도구)으로 노출하므로 사람과 에이전트가 같은 기능을 공유한다.
| 축 | 의미 | 예 |
|---|---|---|
| Brain | "어느 데이터베이스인가" — 내 개인 두뇌 / 팀이 마운트한 두뇌 | ~/.gbrain, brain-host:3001 |
| Source | "두뇌 안의 어느 레포인가" — wiki, gstack, 에세이, 사내 KB | wiki, yc-media |
모든 페이지는 source_id 컬럼으로 태깅된다. .gbrain-source 닷파일이 라우팅을 결정하고, 6단계 우선순위 체인이 어디로 쓸지/읽을지 결정한다.
핵심 트릭 — 페이지를 쓸 때마다 마크다운에서 패턴 매칭만으로 엔티티 참조를 뽑아낸다.
# 페이지 본문 예시 오늘 [[wiki/people/bob]] 가 [[companies/acme-ai]] 에 100K USD를 invested_in. # 자동으로 만들어지는 그래프 엣지 people/bob --invested_in--> companies/acme-ai
LLM API 호출 = 0. 단순히 tree-sitter로 마크다운을 파싱해 위키링크 + typed link(attended/works_at/invested_in/founded/advises 등)를 추출한다. 이게 "Bob이 어디 투자했어?" 같은 다중 홉 질문에 답할 수 있는 비밀이다.
query
│
▼
query expansion / 의도 인식 재작성
│
├─→ Vector (HNSW on pgvector) ┐
├─→ BM25 keyword (pg_trgm) │── RRF (Reciprocal Rank Fusion)
└─→ Graph traversal (multi-hop) ┘
│
▼
Source-tier 가중치
│
▼
ZeroEntropy zerank-2 리랭커
│
▼
Top-K 결과
세 가지 모드(conservative / balanced / tokenmax)가 비용·품질의 다이얼을 미리 묶어둔다. 기본은 balanced.
durable subagent가 핵심 개념. LLM 도구 루프가 도중에 크래시가 나도 pending → done 2단계 상태로 회복한다. 셸 잡(쉘 명령 실행)에는 감사 로그가 붙고, 자식 잡엔 캐스케이딩 타임아웃이, 외부 호출엔 rate lease가 걸린다.
cron이 매시간/매일 돌리는 자율 정비 페이즈들:
valid_until 시간 마감gbrain doctor --remediate --yes --target-score 90 --max-usd 5 한 줄로 의존성 순서(sync → extract → embed → consolidate)를 자동 계산하고, 단계 사이마다 점수를 다시 측정하며, 정해진 비용($5)을 넘으면 거부한다. cron으로 unattended 실행 가능.
아주 중요한 설계 포인트. OperationContext.remote 플래그로 두 부류를 구분한다.
모든 도구를 똑같이 열어두면, MCP를 거쳐 들어온 외부 에이전트가 사용자 모르게 비용 큰 작업(synthesize/patterns/consolidate)을 실행할 수 있다. 한 번 실수에 수십 달러가 날아간다.
remote=false(src/cli.ts 직접 호출)는 신뢰됨 → 모든 명령 허용. remote=true(src/mcp/server.ts)는 파일시스템 제한 강화 + 비용 큰 작업 금지. 같은 47개 op라도 호출 경로에 따라 다르게 동작한다.
어디에 뭐가 있는지.
gbrain/ ├── src/ │ ├── cli.ts # gbrain 명령어 엔트리포인트 (신뢰된 호출자) │ ├── schema.sql # Postgres 스키마 (pages/sources/edges/etc.) │ ├── core/ │ │ ├── engine.ts # BrainEngine 인터페이스 (47개 op 계약) │ │ ├── engine-factory.ts # PGLite vs Postgres 선택 │ │ ├── pglite-engine.ts # WASM Postgres 구현체 │ │ ├── operations.ts # remote=true/false별 권한 정책 │ │ ├── embedding.ts # 14개 임베딩 공급자 추상화 │ │ ├── search/hybrid.ts # 벡터+BM25+그래프 RRF │ │ ├── link-extraction.ts # 위키링크 + typed link 파서 │ │ ├── ai/gateway.ts # LLM 호출 게이트 (비용/속도/리트라이) │ │ ├── minions/ # 잡 큐 (BullMQ-shaped, Postgres-native) │ │ ├── cycle/ # synthesize/patterns/consolidate 페이즈 │ │ ├── calibration/ # voice gate, SVG 차트 렌더러 │ │ └── ... # 50+ 모듈 │ ├── commands/ # gbrain init / doctor / sync / serve 등 │ ├── mcp/ # MCP 서버 (stdio + HTTP/OAuth) │ └── eval/ # LongMemEval, BrainBench, replay │ ├── skills/ # 총 43개 스킬 │ ├── RESOLVER.md # 스킬 디스패처 (에이전트가 먼저 읽음) │ ├── _AGENT_README.md │ ├── _brain-filing-rules.md │ ├── ingest/ # 회의/미디어/아이디어 ingest │ ├── enrich/ # 사람·회사 자동 보강 │ ├── citation-fixer/ # 깨진 인용 수리 │ ├── daily-task-manager/ # 매일 할일 사이클 │ ├── cron-scheduler/ # 21개 cron 정의 │ └── soul-audit/ # 모순 감지 │ ├── admin/ # React SPA 관리자 대시보드 ├── docs/ │ ├── architecture/ # topologies, brains-and-sources, RETRIEVAL │ ├── mcp/ # 각 MCP 클라이언트별 셋업 │ ├── integrations/ # 음성/이메일/임베딩 공급자별 레시피 │ └── ethos/ # "thin harness, fat skills" 철학 ├── recipes/ # twilio-voice-brain 등 통합 레시피 ├── evals/ # LongMemEval 실행/덤프 ├── examples/ # 샘플 브레인 레포 ├── templates/ # 사람/회사/딜 마크다운 템플릿 ├── test/ # 단위 + E2E ├── scripts/ # CI/검증/빌드 스크립트 │ ├── package.json # Bun + ai SDK + MCP SDK + pgvector ├── gbrain.yml # storage 정책 (db_tracked / db_only) ├── openclaw.plugin.json # OpenClaw 플러그인 매니페스트 ├── docker-compose.ci.yml # 로컬 CI Docker 스택 (pgvector) ├── llms.txt / llms-full.txt # LLM이 한 번에 빨아가는 문서 맵 ├── AGENTS.md # 비-Claude 에이전트용 진입점 ├── CLAUDE.md # Claude Code 전용 진입점 └── README.md
llms.txt / llms-full.txt는 최근 OSS에서 떠오르는 표준이다. "에이전트가 GitHub에서 한 번의 fetch로 문서 전체를 빨아갈 수 있게" 모든 마크다운을 인라인으로 합친 파일이다. gbrain의 llms-full.txt는 무려 533KB 짜리 단일 파일.
8개 영역에서 무엇을 가져갈지 + 실습 아이디어.
bun build --compile로 OS별 단일 실행 파일 만들기, postinstall 훅을 통한 마이그레이션 자동화, exports 필드로 라이브러리 동시 노출실습: 작은 CLI(메모 검색기 등)를 Bun으로 만들고 build:all로 darwin-arm64 + linux-x64 바이너리를 동시에 뽑아 GitHub Release에 올려보기
실습: @electric-sql/pglite로 토이 노트 앱을 만들고 같은 코드를 Supabase로 갈아끼우기 — "두 엔진, 하나의 계약" 패턴 직접 경험
1/(k+rank)의 합), 키워드와 벡터를 합칠 때의 정규화 문제, 리랭커가 top-1을 60% 뒤집는다는 측정 결과실습: 자신의 노트(또는 회사 위키)에 src/core/search/hybrid.ts의 RRF 로직을 옮겨붙여 "벡터만 vs 벡터+BM25"의 차이 직접 측정
@modelcontextprotocol/sdk의 stdio·HTTP 트랜스포트, OAuth 2.1 + DCR로 원격 에이전트를 안전하게 받기, scope-gated tool exposure실습: Express + MCP SDK로 "내 노션 검색해주는" MCP 서버를 띄우고 Claude Desktop에 연결
SKIP LOCKED, durable subagent 패턴실습: 10줄짜리 Postgres 큐를 직접 짜보고 "크래시 후 재시작 시 복구" 시나리오 시뮬레이션
db_tracked vs db_only 분리, soft-delete + 72시간 회복 윈도실습: Obsidian 보관함을 gbrain에 sync해보고, git에서 파일을 지웠을 때 DB가 어떻게 따라가는지 관찰
규모별 최소 / 권장 사양.
| 구성 | 최소 | 권장 |
|---|---|---|
| OS | macOS / Linux (x64, arm64) | macOS arm64 |
| 런타임 | Bun ≥ 1.3.10 | 최신 Bun |
| DB (소규모) | PGLite (WASM, 0추가 설치) | ~50K 페이지까지 OK |
| DB (대규모) | Supabase 무료 티어 | Supabase Pro 또는 셀프호스팅 Postgres + pgvector |
| RAM | 4GB | 8GB+ (PGLite WASM은 콜드 스타트가 무거움) |
| API 키 | Anthropic 또는 OpenAI 중 1개 | ZeroEntropy(임베딩/리랭커) + Anthropic(분석) + OpenAI(폴백) |
| 월 운영 비용 | $0 (로컬 임베딩) | $10~50/월 (search mode에 따라 25× 차이) |
| Docker | 불필요 (PGLite 모드) | bun run ci:local용으로만 |
검색 모드가 conservative/balanced/tokenmax 중 무엇이냐에 따라 "한 번 쿼리당 비용"이 25배까지 차이난다. 처음 설치할 때 에이전트가 9-cell 비용 매트릭스를 출력하는데, 반드시 사용자에게 보여주고 동의받기가 설치 프로토콜에 명시돼 있다.
난이도별 실습 — Easy → Hard.
1) curl -fsSL https://bun.sh/install | bash 2) bun install -g github:garrytan/gbrain 3) gbrain init --pglite 4) gbrain doctor로 헬스체크 5) 샘플 마크다운 1개 만들고 gbrain search "내가 적은 키워드"
배우는 것: PGLite 임베디드 DB, gbrain CLI 구조, 하이브리드 검색 첫 호출
gbrain serve(stdio)로 띄운 뒤 Claude Desktop의 MCP 설정에 등록 → 채팅창에서 "내 두뇌에서 X 검색해줘" 명령. 응답이 두뇌 페이지를 인용하는지 확인.
배우는 것: MCP stdio 트랜스포트, scope-gated tool 노출, 클라이언트-서버 연결 흐름
본인의 Obsidian Vault를 gbrain의 "brain repo"로 삼아 gbrain sync. 위키링크가 typed edge로 변환되는 양상을 관찰. gbrain graph-query people/me --depth 2로 그래프 탐색.
배우는 것: 마크다운 → 그래프 자동 변환, sync 파이프라인, graph traversal API
skills/skill-creator 디렉토리 구조를 베껴서 "일기 자동 정리" 스킬을 작성. RESOLVER.md에 트리거 키워드 등록 → 에이전트가 자동 디스패치.
배우는 것: "thin harness, fat skills" 철학, 스킬 디스패처 동작 원리
1) GBRAIN_CONTRIBUTOR_MODE=1 환경변수 켜기 2) gbrain eval export --since 7d > base.ndjson 3) conservative/balanced/tokenmax 각각으로 gbrain eval replay 4) 비용·재현율(R@5)·정밀도(P@5)를 표로 비교 → 자기 사용 패턴에 맞는 모드 선택의 근거 마련
배우는 것: eval replay 패턴, 정확도/비용 트레이드오프 측정, contributor mode
src/core/minions/를 읽고 동일한 패턴(two-phase pending/done + Postgres advisory lock)을 자신의 사이드 프로젝트에 옮겨붙이기. "Redis 없는 BullMQ"라는 좋은 학습 사례.
배우는 것: Postgres-native 큐, advisory lock + SKIP LOCKED, durable subagent
주차별로 따라가면 전체 스택 마스터.
pgvector 공식 README, CREATE EXTENSION vector;부터. HNSW vs IVFFlat 인덱스 비교. cosine vs L2 vs inner product. 직접 OpenAI 임베딩으로 100개 문서 검색 데모.
Microsoft GraphRAG 논문 읽기. gbrain의 link-extraction 모듈 정독. 위키링크/typed link로 LLM 호출 없이 엣지 만드는 패턴 직접 구현.
Anthropic MCP 스펙 문서 → @modelcontextprotocol/sdk stdio·HTTP 두 트랜스포트 차이. OAuth 2.1 + DCR 흐름. src/mcp/server.ts의 scope-gated tool exposure 구현체 정독.
BullMQ 공식 문서 → src/core/minions/ 코드 정독. SKIP LOCKED·advisory lock·two-phase commit. 크래시 후 회복 시나리오 시뮬레이션.
LongMemEval 데이터셋 다운로드 → gbrain eval longmemeval 직접 실행. 자신의 시스템에서 P@5/R@5 측정 코드 작성. cross-modal eval(서로 다른 모델 3개로 교차 채점) 구현.
bun build --compile로 OS별 단일 실행 파일 만들기. GitHub Actions 매트릭스 빌드. postinstall 훅으로 DB 마이그레이션 자동화.
gbrain의 43개 스킬, mattpocock/skills, obra/superpowers 비교. "thin harness, fat skills" 철학. 자신의 도메인(회계·법률·의료 등)에 맞는 스킬셋 직접 설계.
위 7주의 모든 컴포넌트를 합쳐 "내 분야 전용 두뇌" 출시. 예: 독서 노트 두뇌, 음악 라이브러리 두뇌, 코드 리뷰 두뇌. README + llms.txt 작성.
자주 마주칠 단어들.
1/(k+rank) 점수로 더해 합치는 단순·강력한 앙상블 기법.read/write/admin 같은 스코프로 API 호출 권한을 통제하는 방식.공식 · 관련 표준 · 학습 리소스.
https://raw.githubusercontent.com/garrytan/gbrain/main/llms.txt (LLMs documentation map)bun install -g github:garrytan/gbrain → gbrain init --pglite → gbrain doctor로 헬스체크. PGLite 모드라 서버·도커 0개로 진짜 Postgres가 뜬다.[[wiki/people/bob]] 같은 위키링크 하나 넣어보기. gbrain search와 gbrain graph-query로 같은 데이터를 두 가지 방식으로 꺼내보며 "벡터 vs 그래프"의 직관을 잡기.gbrain serve로 stdio MCP 서버를 띄우고 Claude Desktop 설정에 등록. 채팅창에서 "내 두뇌에서 X 검색해줘"가 실제로 두뇌 페이지를 인용하는지 확인.gbrain sync. 위키링크가 typed edge로 자동 변환되는 모습을 관찰. LLM 호출 없이 그래프가 자라는 게 핵심.gbrain doctor --remediate 한 줄. 비용 한도($5)와 목표 점수(90)를 주고 자율 자가 진료를 돌려보기. 의존성 순서(sync → extract → embed → consolidate)를 자동 계산해서 단계별로 점수를 다시 측정하는 동작을 직접 확인.