LearningCircuit/local-deep-research

★ 9,109⑂ 824

~95% on SimpleQA (e.g. Qwen3.6-27B on a 3090). Supports all local and cloud LLMs (llama.cpp, Ollama, Google, ...). 10+ search engines - arXiv, PubMed, your private documents.

About LearningCircuit/local-deep-research

LearningCircuit/local-deep-research is an open-source project on GitHub, mainly written in Python. ~95% on SimpleQA (e.g. Qwen3.6-27B on a 3090). Supports all local and cloud LLMs (llama.cpp, Ollama, Google, ...). It currently holds 9,109 stars and 824 forks with 0 open issues, and was last pushed on an unknown date (repository created unknown).

Project Overview

AI Homed tracks it on the Local & On-Device AI board.

GitHub Repository Details

Repository LearningCircuit/local-deep-research · default branch - · size 0 KB · watchers 0 · source: GitHub REST API and repository README

README

Local Deep Research

GitHub stars Docker Pulls PyPI Downloads

Trendshift

Commits Last Commit

SimpleQA Accuracy SQLCipher

OpenSSF Scorecard CodeQL Semgrep

🔧 Pre-commit

🐳 Docker Publish 📦 PyPI Publish

Discord Reddit YouTube

AI-powered research assistant for deep, agentic research

Performs deep, agentic research using multiple LLMs and search engines with proper citations

🧪 First open-source project — fully-local on a single RTX 3090 (Qwen3.6-27B) — to report ~95% SimpleQA (n=500) and 77% xbench-DeepSearch (n=100) on local hardware. See the r/LocalLLaMA announcement and the benchmark dataset.

▶️ Watch Review by The Art Of The Terminal

🚀 What is Local Deep Research?

AI research assistant you control. Run locally for privacy, use any LLM and build your own searchable knowledge base. You own your data and see exactly how it works.

⚡ Quick Start

Option 1: Docker Run (Linux)

# Step 1: Pull and run Ollama
docker run -d -p 11434:11434 --name ollama ollama/ollama
docker exec ollama ollama pull gpt-oss:20b

Step 2: Pull and run SearXNG for optimal search results

docker run -d -p 8080:8080 --name searxng searxng/searxng

Step 3: Pull and run Local Deep Research

(the URL line pins SearXNG's address AND marks it operator-approved —

private/localhost engine URLs are otherwise blocked by default since

v1.10.3. The URL becomes read-only in the web UI; docs/SearXNG-Setup.md

lists the alternatives, e.g. an origin allowlist.)

docker run -d --network host \ --name local-deep-research \ --volume "deep-research:/data" \ -e LDR_DATA_DIR=/data \ -e LDR_SEARCH_ENGINE_WEB_SEARXNG_DEFAULT_PARAMS_INSTANCE_URL=http://localhost:8080 \ localdeepresearch/local-deep-research
Mac / Windows / WSL2 users: --network host only works on native Linux. On Docker Desktop it silently fails to publish port 5000 and leaves localhost pointing at the LDR container itself (so it can't reach Ollama/SearXNG). Use Option 2 below, or see the Windows/WSL2 FAQ entry for a working docker run recipe.

Option 2: Docker Compose

CPU-only (all platforms):

curl -O https://raw.githubusercontent.com/LearningCircuit/local-deep-research/main/docker-compose.yml && docker compose up -d

With NVIDIA GPU (Linux):

curl -O https://raw.githubusercontent.com/LearningCircuit/local-deep-research/main/docker-compose.yml && \
curl -O https://raw.githubusercontent.com/LearningCircuit/local-deep-research/main/docker-compose.gpu.override.yml && \
docker compose -f docker-compose.yml -f docker-compose.gpu.override.yml up -d

Open http://localhost:5000 after ~30 seconds. For GPU setup, environment variables, and more, see the Docker Compose Guide.

Option 3: pip install

pip install local-deep-research
python -m local_deep_research.web.app   # starts the web UI on http://localhost:5000
You'll also need Ollama (or any OpenAI-compatible LLM endpoint) and SearXNG running — see the pip install guide for the full recipe.
Works on Windows, macOS, and Linux. SQLCipher encryption is included via pre-built wheels — no compilation needed.
PDF export on Windows requires Pango (setup guide).
If you encounter issues with encryption, set export LDR_BOOTSTRAP_ALLOW_UNENCRYPTED=true to use standard SQLite instead.

Detailed install guides: Docker · Docker Compose · pip · Unraid · full install reference

Older CPU (x86-64)? LDR needs an AVX-capable CPU — Intel Sandy Bridge / AMD Bulldozer (2011) or newer. Several scientific Python dependencies (pandas, scikit-learn) ship wheels that crash with Illegal instruction on older CPUs. ARM64 (aarch64) is fully supported. Every release is smoke-tested against this floor, including AVX-without-AVX2 CPUs (#4480).

🏗️ How It Works

Research

You ask a complex question. Local Deep Research (LDR):

Choose the research strategy that fits: quick pipeline modes for fast facts, or fully agentic deep research for complex analysis and academic work.

LangGraph Agent Strategy — An autonomous agentic research mode where the LLM decides what to search, which specialized engines to use (arXiv, PubMed, Semantic Scholar, etc.), and when to synthesize. It adaptively switches between search engines based on what it finds and collects significantly more sources than pipeline-based strategies — this is the strategy behind the ~95% SimpleQA result above. Select langgraph-agent in Settings.

Build Your Knowledge Base

flowchart LR
    R[Research] --> D[Download Sources]
    D --> L[(Library)]
    L --> I[Index & Embed]
    I --> S[Search Your Docs]
    S -.-> R

Every research session finds valuable sources. Download them directly into your encrypted library — academic papers from ArXiv, PubMed articles, web pages. LDR extracts text, indexes everything, and makes it searchable. Next time you research, ask questions across your own documents and the live web together. Your knowledge compounds over time.

🛡️ Security

DevSkim Bearer

OSV-Scanner npm-audit Retire.js

Container Security Dockle Hadolint Checkov

Zizmor OWASP ZAP Security Tests

flowchart LR
    U1[User A] --> D1[(Encrypted DB)]
    U2[User B] --> D2[(Encrypted DB)]

Your data stays yours. Each user gets their own isolated SQLCipher database encrypted with AES-256, with the key derived from your password. Your password is never stored — login works by attempting to decrypt your database, so the database files on their own are unusable to anyone who obtains them. Per-user LLM API keys live encrypted inside the same personal database rather than in a shared server-level store.

The Docker setup ships with cap_drop: ALL, no-new-privileges, and a non-root runtime, with the bundled Ollama and SearXNG images pinned by digest. Or run fully local with Ollama + SearXNG and nothing ever leaves your machine.

In-memory credentials: Like any application that uses secrets at runtime, credentials are held in process memory during active sessions — mitigated with session-scoped credential lifetimes and core dump exclusion. See the Security Policy for the full threat model.

Supply Chain Security: Docker images are signed with Cosign using GitHub's keyless OIDC flow, include SLSA provenance attestations, and ship with attested SPDX SBOMs. See Verifying images and SBOMs for the step-by-step verification commands.

Security Transparency: Scanner suppressions are documented with justifications in Security Alerts Assessment, Scorecard Compliance, Container CVE Suppressions, and SAST Rule Rationale. Some alerts (Dependabot, code scanning) can only be dismissed or are very difficult to suppress outside the GitHub Security tab, so the files above do not cover every dismissed finding.

Detailed Architecture → | Security Policy → | Security Review Process →

🔒 Privacy & Data

Local Deep Research contains no telemetry, no analytics, and no tracking. We do not collect, transmit, or store any data about you or your usage. No analytics SDKs, no phone-home calls, no crash reporting, no external scripts. Usage metrics stay in your local encrypted database.

The only network calls LDR makes are ones you initiate: search queries (to engines you configure), LLM API calls (to your chosen provider), and notifications (only if you set up Apprise).

Since we don't collect any usage data, we rely on you to tell us what works, what's broken, and what you'd like to see next — bug reports, feature ideas, and even which features you love or never use all help us improve LDR.

📊 Benchmarks

Headline results from the community benchmarks using the langgraph-agent strategy with Serper search, fully local via Ollama:

| Model | SimpleQA | xbench-DeepSearch | |---|---|---| | Qwen3.6-27B | 95.7% (287/300) | 77.0% (77/100) | | Qwen3.5-9B | 91.2% (182/200) | 59.0% (59/100) | | gpt-oss-20B | 85.4% (295/346) | – |

Caveats: small samples, LLM-grader noise, and SimpleQA contamination risk on newer base models.

Picking a local model? The same community-maintained dataset tracks accuracy across models, search engines, and research strategies — the fastest way to see which Ollama / LM Studio / llama.cpp models actually work well for deep research before you download multi-GB weights. Browse the full leaderboard on Hugging Face →

Submit your own results → (contributors are listed in CONTRIBUTORS.md), or run benchmarks locally →.

✨ Key Features

🔍 Research Modes

🛠️ Advanced Capabilities

📰 News & Research Subscriptions

🌐 Search Sources

Free Search Engines

Premium Search Engines

Custom Sources

LDR respects robots.txt and identifies itself honestly when fetching web pages — no stealth or anti-detection techniques. In rare cases this means a page that blocks automated access won't be fetched, which we consider the right trade-off.

Full Search Engines Guide →

💻 Usage Examples

Python API

from local_deep_research.api import LDRClient, quick_query

Option 1: Simplest - one line research

summary = quick_query("username", "password", "What is quantum computing?") print(summary)

Option 2: Client for multiple operations

client = LDRClient() client.login("username", "password") result = client.quick_research("What are the latest advances in quantum computing?") print(result["summary"])

HTTP API

The code example below shows the basic API structure - for working examples, see the link below

import requests
from bs4 import BeautifulSoup

Create session and authenticate

session = requests.Session() login_page = session.get("http://localhost:5000/auth/login") soup = BeautifulSoup(login_page.text, "html.parser") login_csrf = soup.find("input", {"name": "csrf_token"}).get("value")

Login and get API CSRF token

session.post("http://localhost:5000/auth/login", data={"username": "user", "password": "pass", "csrf_token": login_csrf}) csrf = session.get("http://localhost:5000/auth/csrf-token").json()["csrf_token"]

Make API request

response = session.post("http://localhost:5000/api/start_research", json={"query": "Your research question"}, headers={"X-CSRF-Token": csrf})

🚀 Ready-to-use HTTP API Examples → examples/api_usage/http/

Command Line Tools

# Run benchmarks from CLI
python -m local_deep_research.benchmarks.cli.benchmark_commands simpleqa --examples 50

See the Command Line Tools guide for the full reference.

🔗 Bring Your Own Knowledge Base

Connect LDR to your existing knowledge base. Unlike the HTTP client above, quick_summary() runs LDR in-process — no server needed — so you can pass it live Python objects such as LangChain retrievers:

from local_deep_research.api import quick_summary

Use your existing LangChain retriever

result = quick_summary( query="What are our deployment procedures?", retrievers={"company_kb": your_retriever}, search_tool="company_kb" )

Works with: FAISS, Chroma, Pinecone, Weaviate, Elasticsearch, and any LangChain-compatible retriever.

Integration Guide →

🔌 MCP Server (Claude Integration)

LDR provides an MCP (Model Context Protocol) server that allows AI assistants like Claude Desktop and Claude Code to perform deep research. Full setup details in the MCP Server guide.

⚠️ Security Note: This MCP server is designed for local use only via STDIO transport (e.g., Claude Desktop). It has no built-in authentication or rate limiting. Do not expose over a network without implementing proper security controls. See the MCP Security Best Practices for network deployment requirements.

Installation

# Install with MCP extras
pip install "local-deep-research[mcp]"

Claude Desktop Configuration

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "local-deep-research": {
      "command": "ldr-mcp",
      "env": {
        "LDR_LLM_PROVIDER": "openai",
        "LDR_LLM_OPENAI_API_KEY": "sk-..."
      }
    }
  }
}

Claude Code Configuration

Add to your .mcp.json (project-level) or ~/.claude/mcp.json (global):

{
  "mcpServers": {
    "local-deep-research": {
      "command": "ldr-mcp",
      "env": {
        "LDR_LLM_PROVIDER": "ollama",
        "LDR_LLM_OLLAMA_URL": "http://localhost:11434"
      }
    }
  }
}

Any LDR setting can be passed in env as an LDR_* variable — see the auto-generated Full Configuration Reference for the complete list.

Available Tools

| Tool | Description | Duration | LLM Cost | |------|-------------|----------|----------| | search | Raw results from a specific engine (arxiv, pubmed, wikipedia, ...) | 5-30s | None | | quick_research | Fast research summary | 1-5 min | Yes | | detailed_research | Comprehensive analysis | 5-15 min | Yes | | generate_report | Full markdown report | 10-30 min | Yes | | analyze_documents | Search local collections | 30s-2 min | Yes | | list_search_engines | List available search engines | instant | None | | list_strategies | List research strategies | instant | None | | get_configuration | Get current config | instant | None |

Individual Search Engines

The search tool lets you query specific search engines directly and get raw results (title, link, snippet) — no LLM processing, no cost, fast. This is especially useful for monitoring and subscriptions where you want to check for new content regularly without burning LLM tokens.

# Search arXiv for recent papers
search(query="transformer architecture improvements", engine="arxiv")

Search PubMed for medical literature

search(query="CRISPR clinical trials 2024", engine="pubmed")

Search Wikipedia for quick facts

search(query="quantum error correction", engine="wikipedia")

Search GitHub for code and repositories

search(query="agentic research frameworks", engine="github")

Use list_search_engines() to see all available engines

Example Usage

GitHub Stars & Activity

9,109Stars
824Forks
0Open issues
PythonLanguage

GitHub Popularity

GitHub stars9,109
Forks824
Open issues0
Primary languagePython
License-
Stars gained today0
Created-
Last pushed-

Trending History

Trending statusnot on today's boards

Related AI Projects

1

open-webui / open-webui

Python★ 152,601⑂ 22,332
2

HKUDS / nanobot

Python★ 48,395⑂ 8,551
3

chatchat-space / Langchain-Chatchat

Python★ 38,648⑂ 6,265
4

1Panel-dev / MaxKB

Python★ 22,844⑂ 3,157
5

lss233 / kirara-ai

Python★ 19,027⑂ 1,836
6

AsyncFuncAI / deepwiki-open

Python★ 18,018⑂ 2,003
7

langbot-app / LangBot

Python★ 17,926⑂ 1,602
8

MODSetter / SurfSense

Python★ 16,169⑂ 1,538

More AI Rankings