Most problems are already solved somewhere. The catch is there’s no safe way to ask across a boundary and get back exactly what the owner is willing to share, so everyone just ends up redoing the work. That’s the gap Beacon goes after. You ask a question once, it fans out to a pool of independent parties, and each one searches only its own private knowledge and decides, right at its own boundary, what it’ll let cross. That’s either the full answer, a redacted “this exists but it’s locked” stub, or nothing at all. Everything that does cross gets verified against its source, and you get back one synthesized, cited answer.
The gate
The hard part was never the search, it was the gate. Making sharing safe is the thing that unlocks everything else, so instead of trusting ourselves to remember to filter restricted stuff out, we built the no-leak in by shape. The object that crosses a boundary is a frozen record that physically has no field to hold raw restricted text, so a leak isn’t something you catch, it’s something that’s impossible to even express. Two independent checks decide what crosses, visibility and capability, and both the redaction and the grounding-check run as Claude calls inside each party. Verification fails closed, so if an answer can’t be grounded it never shows up as verified, which also means made-up citations get caught instead of passed along.
Retrieval
Each party keeps its own isolated index of just its own chunks. The search is hybrid, BM25 on the lexical side fused with static CPU embeddings (model2vec) through Reciprocal Rank Fusion, and it runs over about 4,300 real document chunks in roughly 10 to 18 ms with no GPU at all.
Spine & MCP
A router fans out to every party, streams the answer back token by token as it gets synthesized, and when you ask for access to something that came back locked, it re-streams just that one card live instead of re-running everything. Beacon also exposes itself as an MCP server, so you can query the whole network straight from Claude Desktop or Claude Code, and the gate comes along with it.
Stack
Python on the backend, FastAPI with asyncio and websockets, rank-bm25 and model2vec and NumPy handling retrieval, the Anthropic API for redaction, verification, and synthesis, and FastMCP for the MCP layer. React and Vite on the front end. We built it at a hackathon.