Show HN: Scribe, a CLI that builds AI agent memory from your repos and sessions

quatermain1 pts0 comments

scribe — your knowledge base, written by your tools

Skip to content

Install

GitHub

How it works<br>Features<br>Compare<br>Teams<br>Cost<br>CLI<br>Loop<br>FAQ<br>GitHub

Switch to dark mode<br>Switch to light mode

Install scribe

Single Go binary · runs on cron · self-hosted

Your knowledge base, written by your tools.

scribe reads your git history, your Claude Code & Codex sessions, and self-sent URLs, then writes the wiki for you — so the next agent session already knows what you decided and why. It&rsquo;s memory your agents read before they act, not a second brain you maintain and never reopen: plain markdown in git, cross-project, cron-driven, and able to run 100% locally on Ollama for zero API spend.

brew install oliver-kriska/scribe/scribe<br>copy<br>share

Install scribe

View on GitHub

7,472documents

maintainer's KB · zero typed by hand

$0/sync

verified on 100% Ollama path

~70s

weekly Dream cycle, gemma3:12b

~/projects/scriptorium — zsh

git<br>sessions<br>urls<br>drop files

BM25<br>triage

boilerplate · rejected · $0

absorb<br>pass 1 → 2

qmd index

agent reads<br>CLAUDE.md · AGENTS.md

1 Capture

Four streams, all on cron.

Git repos, Claude Code & Codex sessions, URLs you text yourself, and drop files from other projects. scribe auto-discovers every codebase you've ever opened in either CLI and keeps the manifest fresh.

gitclaude codecodeximessagedrop files

2 Triage & absorb

BM25 first, LLM second.

Keyword-density scoring rejects boilerplate sessions before any LLM call, so cheap sessions cost nothing. Survivors go through a two-pass absorb: pass 1 grounds atomic facts, pass 2 fans dense sources into multiple entity-first wiki pages.

BM25 triagetwo-passentity fan-out

3 Compile & index

A typed graph of plain markdown.

Auto-generated wikilinks, backlinks JSON, and retrieval-context paragraphs spliced into every article so embeddings catch implicit entities. qmd reindexes for semantic search, reachable from any terminal, in any directory, or from inside Claude Code via MCP.

qmdwikilinkstyped edges

agent handshake

Context-aware agents

scribe init writes a handshake block into both ~/.claude/CLAUDE.md and ~/.codex/AGENTS.md, so every session in every project queries your KB before recommending a library or proposing an architecture.

launchd · systemd

Runs itself on cron

Hourly auto-commits. Every 2 hours: project extraction. 3×/day: session mining. Every 30 minutes: queued URLs. Every 4 hours: self-iMessaged links. Sundays at 02:00: the full Dream consolidation, with a lighter hot-domain pass daily in between.

cross-project

Compounds across projects

One cross-project KB, not siloed per repo. Solve the oban idempotency bug in project A on Monday; the agent finds your fix on Friday when the same shape comes up in project B.

local · $0

100% Ollama-capable

Per-project extraction, two-pass absorb, Dream cycle, assess, deep, session-mine, relations migrate: every LLM op runs end-to-end against a local Ollama server. One line in scribe.yaml flips the whole pipeline. Zero API spend.

git · markdown

Plain markdown you own

File over app: the corpus has to outlive the pipeline. A git repo of plain markdown with YAML frontmatter. Push to your own GitHub, Gitea, or Forgejo; open in Obsidian, VS Code, vim, or mdbook. No SaaS, no vendor lock-in.

typed edges

Typed graph, not just tags

Articles connect via a closed 10-kind typed-edge schema: supersedes, contradicts, derived_from, specializes, extends, and five more. scribe relations migrate classifies existing related: links into it with an LLM.

wiki/decisions/ecto-multi.md

written by scribe · not typed by hand

type: decision<br>tags: [ecto, postgres, multi-tenancy]<br>supersedes: [[ecto-transaction]]

# Row-level tenancy over schema-per-tenant

Chose a tenant_id column with Postgres RLS over a schema<br>per tenant: migrations stay single-pass and the pool<br>doesn't fan out per tenant.

Why: schema-per-tenant broke oban job routing and made<br>advisory locks table-ambiguous under load.

## See also<br>- [[oban-idempotency]] · dedupe key includes tenant_id<br>- [[genserver-backpressure]] · per-tenant rate isolation

Not scribe running — scribe&rsquo;s output. A page it wrote to git: YAML frontmatter, prose, and typed [[wikilinks]]. Those links are the edges the graph below draws.

supersedes<br>derived_from<br>contradicts<br>specializes<br>extends<br>derived_from

ecto-transaction<br>oban-idempotency<br>advisory-lock<br>token-bucket<br>genserver-backpressure<br>liveview-streams<br>ecto-multi

A slice of a real scribe KB: entities linked by typed edges like supersedes and contradicts, not folders or tags, so an agent can follow why a decision was made, not just keyword-match it.

4 input streams<br>45 subcommands<br>10 typed-edge kinds<br>3 inference modes<br>7 providers<br>two-pass absorb<br>0 vector DBs<br>0 required API keys<br>1 self-contained binary

The whole surface, in numbers — every figure is checkable against scribe --help and scribe.yaml, not marketing. Local mode needs no key at all; the default Anthropic path signs in through your...

scribe typed project pass agent sessions

Related Articles