Local-first search and answers for your documents.
docq (short for document query) is a local, offline-ready RAG tool written in Rust. It indexes your personal document collections and lets you search or ask questions with cited answers — everything stays on your machine: indexes, models, and queries.
- Offline document search & Q&A engine — Search passages or ask natural-language questions; everything runs locally with cited answers.
- Hybrid retrieval — Combines BM25 keyword search, dense vector search, RRF fusion, and cross-encoder reranking.
- Single-file index — Everything lives in one SQLite database (
sqlite-vec+ FTS5). - Cited answers —
askreturns natural-language answers with inline[N]citations pointing back to source files. - Chinese-optimized — Sentence-level chunking and jieba word-level tokenization for BM25.
- Library-first workspace — Core traits live in
docq-core; heavy backends are isolated behind feature flags.
| Feature | docq | QMD | LlamaIndex | Chroma | Obsidian Smart Connections |
|---|---|---|---|---|---|
| Fully offline | ✅ | ✅ | ✅ | ❌ (uses OpenAI) | |
| Single-file index | ✅ SQLite | ❌ | ❌ | ❌ | |
| Hybrid retrieval (BM25 + vector + rerank) | ✅ | ✅ | ✅ plugins | ❌ vector only | ❌ |
| LLM query expansion | ❌ | ✅ | ✅ | ❌ | ❌ |
| MCP / agent integration | 🚧 roadmap | ✅ | ✅ | ❌ | ❌ |
| Local LLM answers | ✅ | ❌ | ✅ | ❌ | |
| Chinese-optimized BM25 | ✅ | ❌ | ❌ | ||
| Rust / native performance | ✅ | ❌ Node/Bun | ❌ Python | ❌ Python | ❌ JS |
| Rich output formats (JSON/CSV/XML/MD) | ❌ JSON only | ✅ | ✅ | ❌ | ❌ |
| PDF / Office extraction | ✅ | ❌ | ✅ plugins | ❌ | ❌ |
# Install from source
cargo install --path crates/docq
# Create a workspace (uses ~/.config/docq by default)
docq init
# Add a directory of documents
docq add ~/notes --name notes
# Build the index
docq index
# Search for passages
docq search "quarterly revenue"
# Ask a question and get a cited answer
docq ask "What was the revenue in Q2?"Run docq --help and docq <command> --help to discover all options.
- Markdown (
.md) and plain text (.txt) - PDF (
.pdf) — enabled by default via thepdffeature - Microsoft Word (
.docx) — enabled by default via thedocxfeature
You can disable optional format support at build time with --no-default-features.
The repository includes sample documents under testdata/ (excerpts from the public tutorial Distributed System Illustrated by codedump.info). Try it without preparing your own files:
docq init
docq add testdata/ --name notes
docq index
# Search
docq search "Multi-Paxos improvements"
# Ask with citations
docq ask "What are the improvements of Multi-Paxos over the Paxos algorithm?"
# See step-by-step timing
docq ask "What are the improvements of Multi-Paxos over the Paxos algorithm?" -vIt also works in Chinese:
docq ask "multi paxos 相比 paxos 算法的改进点?" cli (docq)
│
▼
docq (Engine facade)
╱ │ ╲
retrieve index synthesize
│ │ │
▼ ▼ ▼
storage + model backends
╲ │ ╱
core
docq-core— Shared types, traits, and errors. Zero heavy dependencies.docq-storage— SQLite implementation of theStoragetrait (sqlite-vec, FTS5).docq-indexer— File reading, chunking, and incremental indexing.docq-retrieve— BM25 + vector recall → RRF → rerank.docq-model— Local model backends: FastEmbed (embed/rerank) and llama.cpp (LLM).docq-synth— Prompt building, LLM completion, and citation parsing.docq— CLI andEnginefacade.
Every command accepts these flags:
--workspace <path>— Use a different workspace directory.--config <path>/-c <path>— Use a custom configuration file.--model-cache <path>— Store downloaded models in a custom location.
Examples:
docq --workspace ./project-kb init
docq --workspace ./project-kb --config ./project-kb/docq.toml add ./docs --name docs
docq --workspace ./project-kb search "deployment checklist" --jsonsearch, ask, and status support --json for machine-readable output:
docq search "budget approval" --json
docq ask "Who approved the budget?" --json
docq status --jsonUse --explain with search to see the score breakdown:
docq search "budget approval" --explainThe global configuration file is created automatically on first run:
- macOS / Linux:
~/.config/docq/config.toml - Windows:
%LOCALAPPDATA%\docq\config.toml
Override it with --config.
The first time you index, search, or ask, docq downloads the required local models to --model-cache (~/.cache/docq/models by default). After that, everything works offline.
The prebuilt binary uses the CPU backend. On macOS (Apple Silicon), Metal GPU acceleration is enabled automatically during compilation. On Windows and Linux, build from source:
Install the Vulkan SDK, then:
cargo install docq --features llama-cpp-2/vulkanInstall the CUDA Toolkit, then:
cargo install docq --features llama-cpp-2/cudaIf no GPU is available at runtime, docq automatically falls back to CPU.
- MCP server for agent integration
- LLM query expansion for hybrid retrieval
- xlsx / csv indexing
- File-watcher auto-indexing
-
docq modelsubcommand for model management - Customizable output formats (e.g. JSON, CSV, Markdown)
- Cited answers with source snippets and referenced content
- Prebuilt release binaries
Early development. The CLI and configuration may change before 1.0. Issues and PRs are welcome.
MIT OR Apache-2.0