ResearcherX builds a knowledge graph from your sources, then flags contradictions in your draft as you write them, with line-level provenance back to every claim.
Ingested sources become a typed, interconnected graph, not a soup of embeddings, so facts can be retrieved and contradicted deterministically.
Model-agnostic via LiteLLM, Ollama (local), Anthropic, Gemini, or Bedrock.
Two-hop graph walk gated at each step by a k-closest filter, then an LLM judges the retrieved context against the draft. Provenance ({document_id}:{page}:{line_start}-{line_end}) travels with every flag.
Your drafts and PDFs never leave your machine by default. Everything, source ingestion, the knowledge graph, embeddings, and your writing, runs locally. The backend is stateless: no user sessions, no document storage, no telemetry on your content. The full stack is self-hostable, and you choose whether the LLM is a local model or a cloud provider.
| Mode | Runs | Trade-off |
|---|---|---|
| Ollama | Fully local | Private, slower |
| Claude | Anthropic | Cloud, fast |
| Gemini | Cloud, fast | |
| Bedrock | AWS | Cloud, fast |
/lint · /ingest · /chat · /graph · /sources, SSE streaming where it matters.Neo4j holds graph structure only. All semantic data, embeddings, descriptions, provenance, lives in LanceDB. The split keeps graph walks fast and vector search independent.
| Table | Key Fields | Index |
|---|---|---|
| nodes | node_id, description, vector[300], sources[] | FTS + cosine |
| relationships | source_node_id → target_node_id, description, vector[300] | FTS + cosine |
| chunks | text, document_id, node_id, vector[300] | FTS + cosine |
Built into your writing workflow.