Copy the config.
Change two lines.
Working setups for the jobs people actually run Quire for. Each one is a real config plus the command, contributed by whoever built it first. All of them live in examples/ in the repo.
Fail the build when the docs go stale.
A GitHub Action that asks a set of questions your documentation is supposed to answer. --strict means an ungrounded answer exits non-zero, so a doc that quietly stopped being true fails the build before a customer finds it.
- Runs on a local model, so no API key in your Actions secrets
- About 40 seconds for a 1,200-file docs tree, cached index
- The question list is a plain text file reviewers can add to
- name: Index docs
run: quire index ./docs --quiet
- name: Answerability check
run: |
while read -r q; do
quire ask "$q" --strict --quiet \
|| { echo "::error::unanswerable: $q"; fail=1; }
done < docs/must-answer.txt
exit ${fail:-0}
name: monday-brief
schedule: "0 7 * * 1"
ask: |
What changed across these notes in 7 days?
Lead with anything that contradicts an
earlier note. Cite everything. Max 400 words.
sources: ["interviews/**", "calls/**", "decks/**"]
output: { to: "file", path: "briefs/{date}.md" }
conflicts: show
A Monday brief from six years of notes.
Point it at interview transcripts, call notes and old decks. The agent writes a diff: what moved, and what contradicts something written earlier.
The tuning that mattered: the first version had no word cap and nobody read it. max_words: 400 and "lead with contradictions" were the two changes that made it stick.
Compare a contract to your own precedent.
Index your executed agreements and your playbook, then ask about a new one clause by clause. Quire compares against what you have actually signed, not a generic idea of what a contract should say.
- Runs fully local: this is content you don't send anywhere
- Conflicts shown and left unresolved: two precedents, both quoted
- Output is Markdown a human reads, not an automated redline
Read this part. This recipe finds and quotes; it does not advise. Every published version of it has a human reviewing the exceptions, and you should keep that.
$ quire index ./executed ./playbook.md
$ quire ask "Does inbound/acme.pdf deviate from our
position on liability caps? Quote both." \
--strict
Yes. Acme §9.2 leaves liability uncapped for
data claims[1]. Our playbook requires a 12-month
fees cap[2], and 31 of 34 executed MSAs have one[3].
[1] inbound/acme.pdf p.11
[2] playbook.md:212
[3] executed/ — 31 matches
[model]
answer = "ollama/llama3.1:70b"
verify = "ollama/qwen2.5:3b"
embed = "bge-small-en-v1.5"
[network]
offline = true # hard fail on any outbound call
[index]
store = "sqlite://./archive.db"
ocr = "always"
$ quire index ./scans --workers 8
4,112,880 spans · 61h · resumable
Four million scanned pages, no network.
A public records archive running entirely offline. offline = true makes any outbound call a hard error where it used to fall back silently, which is the setting you want when the guarantee has to be provable.
- OCR forced on: everything is a scan
- Indexing is resumable; it ran over three weekends
- Postgres would be the usual advice at this size; SQLite held
Answer in Slack, with the source attached.
A small bot that calls quire serve and posts the answer with its citations as a thread reply. It never posts when the answer is ungrounded. It says it doesn't know and tags the channel owner.
- Roughly 60 lines against the HTTP API
- Silence is the designed behaviour for low confidence
- Runs on the same machine as the index; nothing is exposed
r = httpx.post("http://localhost:7777/v1/ask",
json={"question": text, "strict": True})
if r.status_code == 422:
say("Not in the index. cc @docs-owner")
else:
a = r.json()
say(a["answer"] + "\n" + "\n".join(
f"[{c['n']}] {c['locator']}"
for c in a["citations"]))
Built something? Add a recipe.
Drop a folder in examples/ with a config, a command and a paragraph on what broke first. That last part is the one people actually need.