Turn any website into a portable, agent-ready Open Knowledge Format (OKF) bundle — build, sync, and chat, no LLM required to start.
Project description
okf-kit
Turn any website into a portable, agent-ready knowledge bundle — no LLM required to start.
okf-kit crawls a site into a
Google Open Knowledge Format (OKF)
bundle: a directory of markdown concept files with YAML frontmatter and
per-directory index.md listings that any agent can navigate with plain file
reads. Build it, keep it in sync as the site changes, publish it, and chat with
it — locally, with your own key, or fully offline via Ollama.
pip install okf-kit
okf build https://docs.example.com -o docs-okf # crawl → OKF bundle (no key, no browser)
okf chat docs-okf --provider ollama # chat offline, no key
Or zero-install with uv:
uvx --from okf-kit okf build https://docs.example.com -o docs-okf
Part of the calknowledge ecosystem — okf-kit is the lightweight, open library; calknowledge is the full platform (LLM enrichment, RAG export, retrieval evals, GUI) built on top of it.
Why
Everyone re-crawls and re-indexes the same docs privately and badly. okf-kit makes a website's knowledge a portable artifact:
- Agents can read an OKF bundle; they can't read your website. The bundle is navigable markdown — no scraping, no SDK, no runtime.
- Faithful markdown, not text soup. Real extraction (headings, code, tables), boilerplate filtered, JS-rendered when needed.
- Self-maintaining.
okf syncupdates only what changed, so a published bundle in git produces small delta commits and never goes stale. - Works with any LLM, or none. Chat via OpenAI, Ollama, vLLM, OpenRouter, or Claude — or get a zero-key retrieval answer with citations.
Install
pip install okf-kit # core: build / sync / validate / zip / list / get / visualize
pip install "okf-kit[chat]" # okf chat via OpenAI-compatible providers (OpenAI, Ollama, …)
pip install "okf-kit[anthropic]" # Claude as a chat provider
pip install "okf-kit[js]" # crawl JavaScript-rendered sites (pulls a Playwright Chromium)
pip install "okf-kit[mcp]" # serve bundles to Claude Code / Cursor over MCP
pip install "okf-kit[enrich]" # okf build --enrich (LLM descriptions + tags)
The default install has no browser and no LLM SDK — it installs in seconds.
Tip: install into a dedicated virtualenv so okf-kit's dependencies don't mix with your other projects:
python3 -m venv ~/okf && ~/okf/bin/pip install okf-kitThis also avoids clashes if an existing environment already pins packages like
lxml(e.g. a priorcrawl4aiinstall) — a plain install would otherwise bump them.
Commands
Build
okf build https://docs.example.com -o docs-okf --max-depth 3 --max-pages 200
Domain-restricted BFS crawl → an OKF bundle: pages/ mirror with frontmatter
concepts, a .okf-kit/state.json for sync, and an index.md in every directory
for agent navigation. Validated on exit. No API key needed.
By default the crawl is scoped to the seed's path section — okf build https://doc.rust-lang.org/book/ stays under /book/ and won't wander into the
rest of the host. Override with --path-prefix PATH (a narrower/different
scope) or --all-paths (the whole host). Other flags: --js (JS-rendered
sites — build hints when a site needs it), --no-robots, --enrich (add LLM
descriptions/tags — needs [enrich] + OPENAI_API_KEY).
Sync
okf sync docs-okf
Re-crawls the same site and updates only the delta — added pages written,
changed pages rewritten, removed pages deleted, unchanged pages left
byte-for-byte (stable git diffs). A safety valve aborts on a suspiciously empty
re-crawl (--force overrides).
Chat
okf chat docs-okf --provider ollama # offline, no key
okf chat docs-okf --provider openai --trace # any provider, with citations + a navigation trace
okf chat docs-okf # no provider → zero-key retrieval answer
okf chat docs-okf --resume # continue the last session (history is local)
The agent navigates the bundle (list_directory / read_concept) to the most
specific concept and answers only from what it read, citing the paths.
--provider |
Endpoint | Key |
|---|---|---|
openai |
OpenAI | OPENAI_API_KEY |
ollama |
localhost:11434 (local) |
none |
openrouter |
OpenRouter | OPENROUTER_API_KEY |
anthropic |
Claude | ANTHROPIC_API_KEY |
custom |
--base-url |
as configured |
Chat history is stored locally at ~/.okf/chats/<bundle>/.
Visualize
okf visualize docs-okf # -> docs-okf/graph.html
A self-contained interactive graph (nodes = concepts, edges = internal links);
no backend, no CDN — open the HTML from file://.
Serve over MCP
okf serve-mcp docs-okf # or --all for every downloaded bundle
Exposes list_bundles / list_directory / read_concept / search_bundle over
stdio MCP for Claude Code/Desktop, Cursor, and any MCP client.
Or run it as a container (the included Dockerfile bakes in the rust-book
bundle):
docker build -t okf-kit-mcp .
docker run -i --rm okf-kit-mcp # speaks MCP over stdio; serve another bundle: … okf-kit-mcp okf serve-mcp <name>
Serve a local API (for GUIs)
pip install "okf-kit[serve]"
okf serve # prints {"event":"ready","url":…,"token":…}
A loopback-only HTTP API that wraps registry / read / chat / settings, so a
desktop app or web UI can be pure UI over an API (no duplicated logic). Guarded
by a per-launch bearer token. Endpoints cover browsing the registry, installing/
removing books, reading (toc + concept with heading anchors), chat with saved
sessions and cited, deep-linkable sources, and settings (API key kept in the OS
keychain). Consume-only, so it stays light to bundle.
Registry
okf list --remote # browse published bundles
okf get backstage-docs # download, validate, install to ~/.okf/bundles/
okf list # your local bundles
Package for hand-off
okf zip docs-okf # -> docs-okf.zip, ready to publish or share
Publishing
See docs/PUBLISHING.md — build a bundle, ship it as a release zip with a weekly self-sync Action, and add it to the awesome-okf-kit registry. Publish only content you may redistribute.
Bundle layout
docs-okf/
index.md root directory listing (reserved, no frontmatter)
log.md build/sync history
pages/ one concept per page (frontmatter + body + citations)
index.md directory listing (every directory has one)
home.md
docs/…
.okf-kit/state.json crawl config, per-page content hashes, link edges
FAQ
Does okf-kit require an LLM or API key?
No. The entire build path — crawl, structure, validate — runs with zero API keys
and zero model calls. An LLM is optional: you only need one for synthesized
okf chat answers (use Ollama for fully offline) or the optional --enrich step.
With no model configured, okf chat still answers from a zero-key retrieval
fallback, with citations.
What is OKF, and is okf-kit official?
OKF (Open Knowledge Format) is an open, vendor-neutral spec for representing
knowledge as markdown files with a little YAML frontmatter (type, title,
description, resource, tags, timestamp), introduced by Google as part of
its Knowledge Catalog work. okf-kit is an independent, unofficial
implementation — and it interoperates: it validates and renders Google's own
reference bundles unchanged.
How is okf-kit different from Google's OKF tools? Google's reference implementation targets BigQuery / data-catalog metadata with an LLM enrichment agent. okf-kit targets any website with a deterministic crawler that needs no LLM, no cloud, and no API key — and adds incremental sync, offline chat, an MCP server, and a community registry. Same format, complementary mission.
Can I use it with Claude Code / Cursor?
Yes — okf serve-mcp <bundle> is a stdio MCP server exposing list_bundles,
list_directory, read_concept, and search_bundle, so any MCP client can read
a project's up-to-date docs locally. There's also a Docker image.
Does it work offline?
Yes. Building a bundle needs network only to crawl the site once; after that it's
all local files. okf chat runs fully offline with Ollama, or with the zero-key
retrieval fallback.
What sites can it crawl?
Any static or server-rendered HTML site (docs, wikis, blogs). It respects
robots.txt and scopes the crawl to the seed's path by default. JavaScript-rendered
SPAs need the optional [js] extra (a real browser); extraction quality varies by
site.
Development
pip install -e ".[dev]", then pytest -q (fully offline) and
ruff check okf_kit tests. See CONTRIBUTING.md and the
CHANGELOG.
License
Apache-2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file okf_kit-0.3.1.tar.gz.
File metadata
- Download URL: okf_kit-0.3.1.tar.gz
- Upload date:
- Size: 65.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3566e01a20f487740e070a8e36fd1e08aabea0761a3ac934f81e3f09ff8b05de
|
|
| MD5 |
9c9afee5b44833bc1c1a847b0f0ba436
|
|
| BLAKE2b-256 |
c80c54ab2a99a3dc3f99877a780a4524f00258531475901b3e4ad8ad469009c7
|
Provenance
The following attestation bundles were made for okf_kit-0.3.1.tar.gz:
Publisher:
release.yml on vinodborole/okf-kit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
okf_kit-0.3.1.tar.gz -
Subject digest:
3566e01a20f487740e070a8e36fd1e08aabea0761a3ac934f81e3f09ff8b05de - Sigstore transparency entry: 2124469013
- Sigstore integration time:
-
Permalink:
vinodborole/okf-kit@4ee481baa8e34c533917a3558131f3a4e1dd51c4 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/vinodborole
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4ee481baa8e34c533917a3558131f3a4e1dd51c4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file okf_kit-0.3.1-py3-none-any.whl.
File metadata
- Download URL: okf_kit-0.3.1-py3-none-any.whl
- Upload date:
- Size: 59.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7b5233037e1fb6f1dc06445e1bba94e31dcd94b6c682ec5db07fd3aa6302d87b
|
|
| MD5 |
2810ad8ea6795630696095e6054fa8ea
|
|
| BLAKE2b-256 |
989af3666e06188fc8795d58b3ec30633dca3d3ac759dd472eb6f4912844bbbc
|
Provenance
The following attestation bundles were made for okf_kit-0.3.1-py3-none-any.whl:
Publisher:
release.yml on vinodborole/okf-kit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
okf_kit-0.3.1-py3-none-any.whl -
Subject digest:
7b5233037e1fb6f1dc06445e1bba94e31dcd94b6c682ec5db07fd3aa6302d87b - Sigstore transparency entry: 2124469060
- Sigstore integration time:
-
Permalink:
vinodborole/okf-kit@4ee481baa8e34c533917a3558131f3a4e1dd51c4 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/vinodborole
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4ee481baa8e34c533917a3558131f3a4e1dd51c4 -
Trigger Event:
release
-
Statement type: