Quickstart
Compile a folder of bundles, read the manifest, fetch one section.
Lay out the source
Point langonrock at a folder where every immediate subdirectory is one bundle.
sources/acme/
sales/
tables/orders.md
tables/customers.md
ops/
runbooks/deploy.mdsales and ops are bundles. orders, customers and deploy are concepts. A file with no
frontmatter is not a concept, so a cloned repository's README.md is skipped rather than indexed.
Compile it into the store
langonrock sync sources/acme --data ./data --tenant acmesnapshot eaf251169a59 (new), 2 bundles [ops sales], 3 concepts, 850 bytes on diskThat is the whole write path. sync reads every subdirectory as a bundle and writes one snapshot
for the tenant.
Read the manifest
langonrock manifest --data ./data --tenant acme# tenant: acme
# bundles: ops sales
id bundle kind status grain summary links
deploy ops runbook - - How to ship the orders service. -
customers sales bigquery_table deprecated customer_id Registered customers, including churned. -
orders sales bigquery_table - order_id One row per completed customer order. customersEverything an agent needs to plan its reads is in those rows. The links column carries the graph,
so it knows every id it will need before it fetches anything. A status cell other than - is the
concept telling you it is not current.
Fetch only what you chose
langonrock get orders --section schema --data ./data --tenant acmeSection names come from the concept's own Markdown headings, lowercased with non-alphanumerics
collapsed to underscores. A # Common query patterns heading becomes
--section common_query_patterns. Text before the first heading is the body section.
Drop --section for the whole concept, and pass several ids to fetch them in one call.
Keep it following your edits
Syncing by hand gets old. Run the watcher instead:
langonrock watch sources/acme --data ./data --tenant acmeAdd a bundle by creating a folder, remove one by deleting the folder, change one by saving a file. The watcher debounces filesystem events at 200 ms and runs a full rescan every 30 seconds as a backstop, because watch events are a hint on every platform and never the source of truth.
If you are going to run the daemon anyway, skip this command. serve starts the same
watcher itself, and running both would put two watchers on one
tenant.
Hand it to an agent
langonrock mcp "okf://$PWD/data?tenant=acme"For Claude Code, register it once:
claude mcp add langonrock -- langonrock mcp "okf:///abs/path/to/data?tenant=acme"Four tools, no more: manifest, search, get, snapshot. See MCP
server for what each one is for and why the count is capped.
Searching instead of reading everything
langonrock query "okf:///abs/path/to/data?tenant=acme" search ordersSearch returns manifest rows, never bodies, so the two-hop path holds. Narrow with search, then
fetch the ids you chose with get. Results include concepts one link away from the top matches,
which is usually where the join partner or the parent dataset lives.
Progress goes to stderr
Stdout stays clean for piping, and Bun paints anything written with console.error red. Those
lines are status, not failures.