Quarry
A config-driven knowledge-ingestion harness — a CLI that owns the deterministic half of turning a source (a YouTube video, a web page, …) into a linked article in a markdown knowledge wiki.
Quarry resolves a source adapter, fetches, writes immutable raw material, hands a machine-readable compile-spec to an LLM (or human) for the one irreducibly-generative step — writing the article — then verifies provenance, lints, and commits. It never calls a model, so it is runnable and testable without API keys.
You extract raw material from the world and refine it into something structured. That is the pipeline, and the name.
Why
The deterministic mechanics of disciplined knowledge ingestion — fetch, immutable raw, a verifiable manifest, provenance checking, structural lint, semantic link discovery — are worth doing the same way every time. Quarry packages exactly that machinery and nothing else: it is not an LLM wrapper, not a note-taking app, and not opinionated about your wiki's shape. Every convention is configuration.
Install
pip install quarry-kb[all] # all shipped adapters
pip install quarry-kb # core only (PyYAML); add adapters as extras
Adapters (each an extra): youtube (transcript + Whisper fallback), web,
github (gitingest), pdf (PyMuPDF4LLM + OCR), instagram, plus whisper for
local audio transcription. Adapters extract raw content deterministically — no LLM.
The core needs no API key; a few adapters take optional credentials (e.g. Instagram
cookies for private posts) — see each adapter's module docstring for setup.
No Reddit adapter (removed in 0.4.0). Reddit became a losing battle for a deterministic, no-auth fetcher: it fingerprint-blocks pure-Python clients via TLS/JA3 (so it needed
curl_cffiimpersonation just to get a200), throttles by IP reputation with noRetry-After(so back-off is guesswork), and its Nov-2025 Responsible Builder Policy gates all API apps — including read-only OAuth — behind manual approval. The net result was a fragile, perpetually-degrading path that violated Quarry's "runnable without keys, deterministically" principle. Rather than ship something that mostly doesn't work, it's gone. To ingest a Reddit thread, save the page (or its.json) and feed it through theweb/curl_cffilives on — the
Installed as
quarry-kbon PyPI (the bare name was taken); the command and import are bothquarry.
Requires Python 3.11+.
60-second quickstart
cd your-wiki-repo
quarry init # scaffold a documented quarry.toml + gitignore .quarry/
# edit quarry.toml to match your wiki's conventions
quarry ingest <url> # fetch -> raw/ + compile-manifest, then STOP
# ...now write the wiki article using the printed compile-spec...
quarry finish <slug> # verify provenance -> lint -> commit (no push unless --push)
Other commands: quarry lint, quarry adapters, quarry related <article>,
quarry densify [--apply], quarry doctor.
The two-call seam is deliberate: ingest and finish are separate processes, and the
generative step (writing the article) happens between them — done by you or your agent,
never by Quarry.
Configuration reference
Quarry is configured by a quarry.toml discovered by walking up from the current
directory (a [tool.quarry] table in pyproject.toml is a fallback). quarry init
writes a fully-commented default. Tables:
| Table | Key | Purpose |
|---|---|---|
[store] |
wiki, raw, manifest_dir |
directories (relative to the store root) |
raw_layout |
raw path template; tokens: {year} {month} {date} {slug} {kebab_title} {ext} {topic} {source_id} |
|
root |
explicit store root (defaults to the dir containing quarry.toml) |
|
[frontmatter] |
required, sources_field, related_field |
article frontmatter schema |
[ingest] |
default_ext, slug, on_duplicate |
slug template; on_duplicate = refuse | warn | allow |
related_candidates |
print N link candidates (existing articles) in the compile-spec | |
assets_layout |
where adapter media (frames, slides) is stored under raw/ |
|
[adapters] |
enabled |
allowlist of adapters to run |
[discovery] |
backend, mode, collection, dedup_threshold, densify_topk |
semantic-link backend (qmd or none) |
search, refresh |
qmd mode (query | search (BM25, instant) | vsearch); qmd update before ingest lookups |
|
[lint] |
broken_links, require_sources_on_disk, orphan_check, index_file, fail_on |
which checks run and which fail the build |
[finish] |
run_lint, auto_push, commit_template |
finish behaviour |
stage |
scoped (default: only this ingest's raw, assets, article, index and files linking to it) | all |
|
auto_index |
add the article to index_file under the heading that holds its folder's entries |
|
[youtube] |
comments, top_comments |
capture pinned + top comments into the raw |
[instagram] |
media, keep_video, frame_interval, max_frames, ocr |
save carousel slides / reel frames next to the raw and OCR them (tesseract) |
See examples/quarry.toml for the annotated default.
Authoring an adapter
A new source type is one small adapter discoverable via the quarry.adapters
entry-point group — no fork. See CONTRIBUTING.md for the contract,
the hermetic-test requirement, and a worked pdf example.
Status
Pre-1.0, but feature-complete for v1 and fully tested. See SPEC.md for the
design and ISA.md for the ideal-state criteria and build provenance.
License
MIT — see LICENSE.
Metadata
Release files for quarry-kb 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| quarry_kb-0.6.0.tar.gz | 89.9 kB | With provenance | Details for quarry_kb-0.6.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| quarry_kb-0.6.0-py3-none-any.whl | Python 3 | none | any | Details for quarry_kb-0.6.0-py3-none-any.whl |
Total release size: 140.0 kB
Release files / quarry_kb-0.6.0.tar.gz
| Download URL | quarry_kb-0.6.0.tar.gz |
|---|---|
| Size | 89.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9ad49ee51f56c7cb13ebffb2e5e46122c0c54ac648de3c3a6ea8ad6a4ea990f2
|
|
BLAKE2b-256 checksum How to use checksums |
ebee3e05f58ea314994963b307e9820164716a24ec0270d93bb1e8ac69534904
|
| 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 14, 2026.
Transparency logRelease files / quarry_kb-0.6.0-py3-none-any.whl
| Download URL | quarry_kb-0.6.0-py3-none-any.whl |
|---|---|
| Size | 50.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
63553b942a2a6bc403f6f804379ba37dd9751ccb7a91af91d5197008b56f244f
|
|
BLAKE2b-256 checksum How to use checksums |
6443f5bfb4f4238edcff827a58eb3a9d0bda7f30e62189e2dc4182b979cc49af
|
| 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 14, 2026.
Transparency logSecurity for quarry-kb 0.6.0
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for quarry_kb-0.6.0.tar.gz
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 14, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.