dkb - Developer Knowledge Base
Local documentation manager for vibe coding with Claude Code.
Local .md files > MCP
Install
# Install with uv
uv tool install dkb
# Or with pipx
pipx install dkb
Usage
$ dkb add tailwindlabs/tailwindcss.com/src/docs --version-url tailwindlabs/tailwindcss
✓ tailwindcss 4.3.3 → ~/.local/share/dkb/tailwindcss
$ dkb add colinhacks/zod/packages/docs/content
✓ zod 4.6.7 → ~/.local/share/dkb/zod
$ dkb # alone: the status
┏━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ Name ┃ Version ┃ Source ┃ Version from ┃ Docs changed ┃ Checked ┃
┡━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ tailwindcss │ 4.3.3 │ tailwindlabs/tailwindcss.com │ tailwindlabs/tailwindcss │ 35d ago │ 2m ago │
│ zod │ 4.6.7 │ colinhacks/zod │ - │ 1d ago │ 2m ago │
└─────────────┴─────────┴──────────────────────────────┴──────────────────────────┴──────────────┴─────────┘
$ dkb update # parallel, skips what did not move upstream
- tailwindcss unchanged
✓ zod updated
$ dkb update zdo
Error: not in the catalogue: 'zdo' (did you mean 'zod'?); `dkb status` lists it
$ dkb add n0-computer/iroh-ffi/IrohLib/Docs
Error: path 'IrohLib/Docs' not found; 'IrohLib/' has: .swiftpm/, Sources/, Tests/, .gitignore, README.md
Piped (dkb status | grep zod, an agent's shell), status prints one plain line per repo with a header and the docs location; dkb status --json prints everything. dkb -h lists the files dkb owns and more add examples.
Configuration
Two files, two owners:
| File | Holds | Changes on |
|---|---|---|
$XDG_CONFIG_HOME/dkb/config.json (~/.config/dkb/config.json) |
the catalogue: one entry per repo, of the kinds below | dkb add / dkb remove |
$XDG_DATA_HOME/dkb/ (~/.local/share/dkb/) |
the clones, one directory per repo, plus state.json (description, version, commit, what the clone was made from, when docs last changed and when upstream was last checked) |
dkb update |
The catalogue is the declaration and is meant to be tracked in a dotfiles repo. dkb update reconciles the cache with it: clones anything declared that is missing, re-clones anything whose upstream commit or declaration changed, re-reads every version and description, prunes clones nobody declares, and regenerates the skill; it exits 1 if any repo failed. A failed fetch keeps the previous clone and version: new content is assembled beside the old and swapped in only when complete. Without a declared branch, a repo follows its remote's default branch, whatever it is called. Metadata comes from gh when it is logged in, else from GitHub's public API (60 requests/hour). A fresh machine is one dkb update away from the same knowledge base. dkb status exits 1 while a declared repo has no clone, so it doubles as a drift check.
Three kinds of entry:
| Kind | Added with | Catalogue keys | On disk | Version |
|---|---|---|---|---|
| following | dkb add owner/repo/path |
url, paths, branch?, version_url? |
a clone, re-fetched when the branch moves | latest release (of version_url if set) |
| pinned | dkb add owner/repo --pin v3.24.0 |
url, paths, pin |
a clone of that tag or full commit, never re-fetched | the pin |
| local | dkb add ~/Developer/my-lib |
local |
a symlink to the working copy, always current | its latest git tag |
A pin is for the docs of the version a project uses: zod (following) and zod-3 (pinned) can sit side by side. A local entry is stored as ~/..., so one catalogue serves every machine; on a machine without that directory, dkb update says so and exits 1.
// ~/.config/dkb/config.json
{
"repositories": {
"next.js": { "url": "https://github.com/vercel/next.js.git", "paths": ["docs"] },
"zod-3": { "url": "https://github.com/colinhacks/zod.git", "paths": [], "pin": "v3.24.0" },
"my-lib": { "local": "~/Developer/my-lib" }
}
}
Upgrading from dkb 2: the catalogue used to live in the data dir as one file with the state mixed in. dkb 3 refuses to run while that file exists and prints where each half goes.
Features
- ✨ Auto-naming - No need to specify names, automatically derived from repositories
- 🎯 Path-specific URLs - Add only the docs you need:
dkb add owner/repo/path - 🔗 Multiple URL formats:
- Full URLs:
https://github.com/astral-sh/uv/tree/main/docs - Shorthand:
tailwindlabs/tailwindcss.com/src/docs - Classic:
https://github.com/denoland/docs.git
- Full URLs:
- 🏠 Gitea/Forgejo support - Works with codeberg.org and self-hosted forges:
dkb add https://code.haverbeke.berlin/wordgard/website/src/branch/main/site/docs - 📦 Version tracking - Track versions from a different repository with
--version-url - 📌 Pinned versions -
--pin <tag|commit>caches the docs of the version you actually use - 🔗 Local repos -
dkb add ~/Developer/my-liblinks your working copy, so your own libraries are in the skill and never stale - 🚀 Parallel updates - All repos update concurrently with live progress spinners
- ⚡ Smart skip - Unchanged repos detected via
git ls-remotewithout cloning - 📂 Sparse checkout - Repos with paths only fetch the files they need
- 🧭 Errors that say what to do - typo suggestions, the real contents of a mistyped path, git's own message instead of its command line
- 🤖 Claude Code skill - Maintains
~/.claude/skills/dkb/SKILL.md; the always-visible description indexes the catalogue so the agent knows what's cached without running anything. The description stays within the Agent Skills spec's 1024 characters (names that don't fit become "+N more, all listed in the skill"); the body, loaded in full on invocation, carries every entry's version, source, location and layout
Metadata
Release files for dkb 3.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dkb-3.3.2.tar.gz | 20.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dkb-3.3.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 44.2 kB
Release files / dkb-3.3.2.tar.gz
| Download URL | dkb-3.3.2.tar.gz |
|---|---|
| Size | 20.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
badb930c54498ad9d2797467318b9c1016ad7b2fa0856e56769ec13bf626c835
|
|
BLAKE2b-256 checksum How to use checksums |
eb533cc74df0699d9d576cc8f4647b1e3df7f6a1f0f795e0d07cc42c9d7f01cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / dkb-3.3.2-py3-none-any.whl
| Download URL | dkb-3.3.2-py3-none-any.whl |
|---|---|
| Size | 23.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aa6f30b33f3082e72025ecc437b985c84eefcd36331fc509aa6b312c6beb132a
|
|
BLAKE2b-256 checksum How to use checksums |
1f4b940691f440a270b939aad5e58f88e4952103b6389446cd9525755651feb1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log