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’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’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...