Your docs stay home. Your AI still reads them.
-
1. You have a pile of Word, Excel and PDF files.
-
2. Roost sits on them and answers over MCP and REST.
-
3. Nothing leaves. We traced it: 0 connections.
1. You have a pile of Word, Excel and PDF files.
2. Roost sits on them and answers over MCP and REST.
3. Nothing leaves. We traced it: 0 connections.
Don’t take a cartoon bird’s word for it. Here’s a toy to play with, and the real test to run.
Go on. Try to send it.
This toy is a joke. The strace test next to it isn’t.
egress_test.go fails if our code makes outbound calls anywhere outside one opt-in package.make e2e runs the real thing under strace through indexing, serving and stdio. It made 0 network connections, across 52 passing checks.make e2e # needs strace, curl, openssl, python3The one exception: semantic search sends document text to an embeddings service you choose. It’s off by default and only connects to private addresses unless you override that. Read SECURITY.md.
50,000 files, 300,000 chunks, one ordinary 6-core i5. These are median times.
That’s the worst case. We show it anyway.
The whole corpus indexed in 1m58s, peaking at 46 MB of memory. It was plain text, so real Office and PDF files will take longer. Search time grows with the number of matching chunks.
2 passages found.
Acquisition timeline: due diligence closes in March and signing is targeted for April.
Acquisitions over five million need board approval before the term sheet.
All invented, and this toy runs in your browser. The real thing is BM25 with stemming, phrases and prefixes, and it names the page, slide, sheet or heading too.
Same token, same access rules and same audit log either way. Every tool is read-only, so an agent can look but can’t touch.
list_collectionsWhat can this token read?search_documentsRanked snippets, filtered by collection, type, path or date.list_documentsBrowse files, including ones Roost couldn’t read, and why.get_document_infoMetadata and an outline of sections.read_documentA whole document or one section, in pages.For quack, a terminal coding agent from the same author.
# ~/.config/quack/mcp.d/roost.tomlurl = "https://roost.internal:8484/mcp"headers = { Authorization = { env = "ROOST_TOKEN", format = "Bearer {}" } }[tools]auto_approve = ["list_*", "search_*", "get_*", "read_*"]You might! These are good projects, built for individual developers and their code and notes. Roost is for office files and a roomful of people.
| Feature | Roost | ctxd | alcove |
|---|---|---|---|
| Outbound calls | None by default, traced with strace | None mentioned; local by default | Optional model download at setup |
| Word, Excel, PowerPoint | Yes | No, text files only | Not listed |
| Yes, built in | No, binaries are excluded | Yes, best with pdftotext installed | |
| Separate access per user | Yes, per token and collection | Scoped tokens, not multi-tenant | On its roadmap |
| Log of every access | Yes | Not listed | Not listed |
| MCP | HTTP and stdio | Yes, HTTP and a stdio bridge | Yes, HTTP API is now its main route |
| What you run | One static binary | Python 3.11 or 3.12, plus ripgrep | A Rust binary |
| Semantic search | Opt-in, needs your own embeddings service | No, by design | Built in, after a model download of about 90 MB |
| Indexes source code | No | Some: .py, .ts and .tsx only | Yes, with tree-sitter |
| Pulls from URLs on request | No | Not listed | Not listed |
Checked against each project’s README and docs in November 2026. “Not listed” means they don’t mention it, not that it can’t be done.
Anything Roost can’t read shows up in roost status. It never drops a file silently.
No installer, no sign-up, no account. One file on a machine inside your network.
SHA-256 checksums · Full docs · Air-gapped? make offline-bundle packages the source with every dependency.
mv roost-* roost && chmod +x roostcp roost.example.toml roost.toml# set data_dir and collections in roost.toml./roost token create --name alice --collections legal,hr./roost serveDownload roost.example.toml first, it isn’t inside the binary. Save the token, it’s shown only once.