One index, and three ways to ask it something.
The index is the product. Everything below is a different way of putting a question to it, and all three return the same rows in the same order, because there is only ever one answer to find.
Indexing
What a folder turns into.
Point Quarry at a folder and everything under it is indexed unless a rule file says otherwise. What that means depends on the file.
- Text, Markdown, source files
- Read line by line and indexed in full, including the ones with no extension.
- PDF and .docx
- The text layer, where a text layer exists. Nothing is rendered and nothing is put through OCR, so a scan of a page stays a picture of a page.
- Images, audio, binaries
- The name and the path only, which is enough for a filter like ext:png to find them.
- Anything a rule file excludes
- Skipped before the file is opened. A .quarryignore uses the syntax you already write in .gitignore, one per folder.
40,000 files in about four minutes on a 2021 laptop · 180 MB of index for that folder · only what changed is re-read afterwards
Querying
A grammar small enough to hold in your head.
Three operators and four filters. It is written once, in the query syntax reference, and the app, the command line and the endpoint all parse the identical string.
invoice AND ext:mdTwo terms and a filter. Bare words are AND by default; the operator is for reading.
"release notes" NOT path:archive/A quoted phrase matches in order. NOT takes a term, a phrase or a filter.
modified:>2026-06-01 AND path:invoices/Dates compare with > and <. A path filter matches any segment, not just the start.
A query you keep typing gets a name with quarry saved add, and the app then keeps a live count beside it as files change under you.
Surfaces
Whichever one is already open.
- The app
- Results as you type, the matching line with the two around it, and saved searches in the sidebar with a count that follows the index.
- quarry, on the command line
- The same grammar, --json for a machine, and exit codes a script can branch on: 0 for matches, 1 for none, 2 for a query it could not parse.
- The loopback endpoint
- JSON in and out on 127.0.0.1:7433, which is how the editor plugins ask and how anything else you write can ask too.
The editors that speak to the endpoint, and what a script of your own would send it, are on the integrations page.
Limits
Four things it will not do.
Each of these is a decision rather than a gap, and each one is the reason something else on this page is as simple as it is.
There is no Windows build.
The file watcher is the part that has not been written. It is the most requested item in the issue tracker and it is not scheduled.
Nothing syncs between machines.
Two laptops build two indexes. The licence covers both; the index is not a thing that travels, because travelling would mean a server.
A network drive is slower than it looks.
The watcher falls back to polling every 60 seconds and the first pass takes several times longer. A local mirror is the better arrangement if you have one.
The index is not encrypted at rest.
It sits under your user account with your file permissions and inherits whatever full-disk encryption the machine already has.
What does and does not leave the machine is set out on the security page.
Most of this is in the free build.
The ceiling is 20,000 files, one index, and three saved searches. The endpoint and the editor plugins are the parts that need a licence.