LearningCircuit/local-deep-researchPublic

~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. Everything Local & Encrypted.

AI summary: Fully local, agentic AI assistant for deep web research with accurate citations on consumer hardware.

Stars
9.1K
Forks
833
Watchers
43
Open issues
815
Open PRs
231
Contributors
~87
Commits
8K
Branches
570

PythonMITCreated Feb 9, 2025Last push todayLatest release v1.10.7+18 stars this week+116 this month

Quick answers

What is local-deep-research?
Fully local, agentic AI assistant for deep web research with accurate citations on consumer hardware.
What does local-deep-research do?
Local Deep Research is a privacy-first research tool that autonomously utilizes local LLMs and search engines to investigate complex topics. Unlike cloud-based alternatives that may expose sensitive data, it executes entirely on local hardware, capable of achieving state-of-the-art results on a single consumer GPU like an RTX 3090 using Qwen3.6-27B. The AI agent iteratively queries search engines such as SearXNG, reads the extracted content, synthesizes findings, and dynamically builds a searchable knowledge base. It ensures all data safely remains on the user's machine while systematically providing highly accurate, comprehensively cited reports.
Who is local-deep-research for?
Academemics, privacy-conscious professionals, and local-LLM enthusiasts who need deep research capabilities without cloud data exposure.
How do I get started with local-deep-research?
docker run -d -p 11434:11434 --name ollama ollama/ollama
How popular is local-deep-research on GitHub?
LearningCircuit/local-deep-research has 9,149 stars and 833 forks on GitHub, and gained 18 stars in the last 7 days.
What license does local-deep-research use?
LearningCircuit/local-deep-research is released under the MIT license.

Star history

since Jul 28, 2026
02.5K5K7.5KJul 2026Aug 2026Sep 2026Oct 2026
9.1K stars as of Oct 3, 2026. Measured daily since Jul 28, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-10-05: 11 commits2025-10-06: 6 commits2025-10-07: 2 commits2025-10-08: 1 commit2025-10-09: 0 commits2025-10-10: 5 commits2025-10-11: 0 commits2025-10-12: 3 commits2025-10-13: 1 commit2025-10-14: 1 commit2025-10-15: 2 commits2025-10-16: 5 commits2025-10-17: 3 commits2025-10-18: 3 commits2025-10-19: 23 commits2025-10-20: 13 commits2025-10-21: 0 commits2025-10-22: 20 commits2025-10-23: 14 commits2025-10-24: 13 commits2025-10-25: 22 commits2025-10-26: 13 commits2025-10-27: 6 commits2025-10-28: 2 commits2025-10-29: 2 commits2025-10-30: 2 commits2025-10-31: 9 commits2025-11-01: 16 commits2025-11-02: 32 commits2025-11-03: 10 commits2025-11-04: 3 commits2025-11-05: 6 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 14 commits2025-11-10: 9 commits2025-11-11: 30 commits2025-11-12: 14 commits2025-11-13: 14 commits2025-11-14: 11 commits2025-11-15: 12 commits2025-11-16: 13 commits2025-11-17: 0 commits2025-11-18: 1 commit2025-11-19: 4 commits2025-11-20: 6 commits2025-11-21: 9 commits2025-11-22: 14 commits2025-11-23: 33 commits2025-11-24: 25 commits2025-11-25: 29 commits2025-11-26: 26 commits2025-11-27: 16 commits2025-11-28: 20 commits2025-11-29: 9 commits2025-11-30: 8 commits2025-12-01: 11 commits2025-12-02: 9 commits2025-12-03: 45 commits2025-12-04: 27 commits2025-12-05: 38 commits2025-12-06: 25 commits2025-12-07: 33 commits2025-12-08: 31 commits2025-12-09: 15 commits2025-12-10: 6 commits2025-12-11: 1 commit2025-12-12: 8 commits2025-12-13: 10 commits2025-12-14: 12 commits2025-12-15: 7 commits2025-12-16: 10 commits2025-12-17: 11 commits2025-12-18: 16 commits2025-12-19: 18 commits2025-12-20: 22 commits2025-12-21: 16 commits2025-12-22: 11 commits2025-12-23: 4 commits2025-12-24: 26 commits2025-12-25: 7 commits2025-12-26: 8 commits2025-12-27: 6 commits2025-12-28: 4 commits2025-12-29: 15 commits2025-12-30: 8 commits2025-12-31: 11 commits2026-01-01: 27 commits2026-01-02: 8 commits2026-01-03: 14 commits2026-01-04: 26 commits2026-01-05: 7 commits2026-01-06: 12 commits2026-01-07: 1 commit2026-01-08: 5 commits2026-01-09: 3 commits2026-01-10: 20 commits2026-01-11: 41 commits2026-01-12: 10 commits2026-01-13: 15 commits2026-01-14: 15 commits2026-01-15: 3 commits2026-01-16: 1 commit2026-01-17: 0 commits2026-01-18: 8 commits2026-01-19: 22 commits2026-01-20: 18 commits2026-01-21: 17 commits2026-01-22: 14 commits2026-01-23: 22 commits2026-01-24: 20 commits2026-01-25: 44 commits2026-01-26: 17 commits2026-01-27: 2 commits2026-01-28: 16 commits2026-01-29: 10 commits2026-01-30: 12 commits2026-01-31: 28 commits2026-02-01: 32 commits2026-02-02: 19 commits2026-02-03: 10 commits2026-02-04: 8 commits2026-02-05: 20 commits2026-02-06: 20 commits2026-02-07: 13 commits2026-02-08: 25 commits2026-02-09: 15 commits2026-02-10: 16 commits2026-02-11: 8 commits2026-02-12: 6 commits2026-02-13: 7 commits2026-02-14: 28 commits2026-02-15: 30 commits2026-02-16: 24 commits2026-02-17: 11 commits2026-02-18: 5 commits2026-02-19: 8 commits2026-02-20: 6 commits2026-02-21: 25 commits2026-02-22: 33 commits2026-02-23: 26 commits2026-02-24: 10 commits2026-02-25: 9 commits2026-02-26: 14 commits2026-02-27: 7 commits2026-02-28: 29 commits2026-03-01: 26 commits2026-03-02: 16 commits2026-03-03: 7 commits2026-03-04: 5 commits2026-03-05: 13 commits2026-03-06: 30 commits2026-03-07: 7 commits2026-03-08: 27 commits2026-03-09: 37 commits2026-03-10: 20 commits2026-03-11: 14 commits2026-03-12: 2 commits2026-03-13: 3 commits2026-03-14: 22 commits2026-03-15: 39 commits2026-03-16: 1 commit2026-03-17: 12 commits2026-03-18: 18 commits2026-03-19: 17 commits2026-03-20: 42 commits2026-03-21: 21 commits2026-03-22: 13 commits2026-03-23: 21 commits2026-03-24: 6 commits2026-03-25: 41 commits2026-03-26: 27 commits2026-03-27: 17 commits2026-03-28: 57 commits2026-03-29: 17 commits2026-03-30: 26 commits2026-03-31: 6 commits2026-04-01: 9 commits2026-04-02: 11 commits2026-04-03: 9 commits2026-04-04: 20 commits2026-04-05: 11 commits2026-04-06: 5 commits2026-04-07: 1 commit2026-04-08: 1 commit2026-04-09: 5 commits2026-04-10: 1 commit2026-04-11: 1 commit2026-04-12: 9 commits2026-04-13: 11 commits2026-04-14: 11 commits2026-04-15: 4 commits2026-04-16: 19 commits2026-04-17: 8 commits2026-04-18: 14 commits2026-04-19: 18 commits2026-04-20: 8 commits2026-04-21: 17 commits2026-04-22: 11 commits2026-04-23: 11 commits2026-04-24: 20 commits2026-04-25: 36 commits2026-04-26: 28 commits2026-04-27: 19 commits2026-04-28: 11 commits2026-04-29: 10 commits2026-04-30: 3 commits2026-05-01: 23 commits2026-05-02: 14 commits2026-05-03: 2 commits2026-05-04: 1 commit2026-05-05: 0 commits2026-05-06: 2 commits2026-05-07: 2 commits2026-05-08: 9 commits2026-05-09: 64 commits2026-05-10: 38 commits2026-05-11: 11 commits2026-05-12: 10 commits2026-05-13: 4 commits2026-05-14: 15 commits2026-05-15: 4 commits2026-05-16: 10 commits2026-05-17: 22 commits2026-05-18: 28 commits2026-05-19: 10 commits2026-05-20: 8 commits2026-05-21: 6 commits2026-05-22: 9 commits2026-05-23: 29 commits2026-05-24: 36 commits2026-05-25: 41 commits2026-05-26: 15 commits2026-05-27: 13 commits2026-05-28: 4 commits2026-05-29: 1 commit2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 15 commits2026-06-03: 11 commits2026-06-04: 17 commits2026-06-05: 5 commits2026-06-06: 11 commits2026-06-07: 13 commits2026-06-08: 4 commits2026-06-09: 3 commits2026-06-10: 6 commits2026-06-11: 24 commits2026-06-12: 4 commits2026-06-13: 37 commits2026-06-14: 39 commits2026-06-15: 16 commits2026-06-16: 13 commits2026-06-17: 5 commits2026-06-18: 6 commits2026-06-19: 11 commits2026-06-20: 23 commits2026-06-21: 51 commits2026-06-22: 8 commits2026-06-23: 8 commits2026-06-24: 10 commits2026-06-25: 21 commits2026-06-26: 4 commits2026-06-27: 35 commits2026-06-28: 27 commits2026-06-29: 8 commits2026-06-30: 2 commits2026-07-01: 8 commits2026-07-02: 22 commits2026-07-03: 6 commits2026-07-04: 15 commits2026-07-05: 1 commit2026-07-06: 9 commits2026-07-07: 8 commits2026-07-08: 6 commits2026-07-09: 6 commits2026-07-10: 4 commits2026-07-11: 27 commits2026-07-12: 3 commits2026-07-13: 11 commits2026-07-14: 7 commits2026-07-15: 10 commits2026-07-16: 12 commits2026-07-17: 8 commits2026-07-18: 5 commits2026-07-19: 13 commits2026-07-20: 13 commits2026-07-21: 1 commit2026-07-22: 2 commits2026-07-23: 1 commit2026-07-24: 7 commits2026-07-25: 19 commits2026-07-26: 5 commits2026-07-27: 9 commits2026-07-28: 1 commit2026-07-29: 9 commits2026-07-30: 6 commits2026-07-31: 7 commits2026-08-01: 8 commits2026-08-02: 11 commits2026-08-03: 12 commits2026-08-04: 6 commits2026-08-05: 11 commits2026-08-06: 18 commits2026-08-07: 22 commits2026-08-08: 20 commits2026-08-09: 7 commits2026-08-10: 12 commits2026-08-11: 1 commit2026-08-12: 0 commits2026-08-13: 8 commits2026-08-14: 17 commits2026-08-15: 11 commits2026-08-16: 10 commits2026-08-17: 7 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 3 commits2026-08-21: 6 commits2026-08-22: 3 commits2026-08-23: 3 commits2026-08-24: 6 commits2026-08-25: 7 commits2026-08-26: 8 commits2026-08-27: 11 commits2026-08-28: 15 commits2026-08-29: 2 commits2026-08-30: 0 commits2026-08-31: 5 commits2026-09-01: 0 commits2026-09-02: 4 commits2026-09-03: 21 commits2026-09-04: 17 commits2026-09-05: 10 commits2026-09-06: 17 commits2026-09-07: 9 commits2026-09-08: 7 commits2026-09-09: 4 commits2026-09-10: 2 commits2026-09-11: 0 commits2026-09-12: 28 commits2026-09-13: 17 commits2026-09-14: 5 commits2026-09-15: 11 commits2026-09-16: 13 commits2026-09-17: 33 commits2026-09-18: 18 commits2026-09-19: 22 commits2026-09-20: 11 commits2026-09-21: 4 commits2026-09-22: 3 commits2026-09-23: 0 commits2026-09-24: 1 commit2026-09-25: 32 commits2026-09-26: 29 commits2026-09-27: 30 commits2026-09-28: 0 commits2026-09-29: 0 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
4,638 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Very active

    4,638 commits in 52 weeks

  • Well documented

    High community health score

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

What local-deep-research does

Local Deep Research is a privacy-first research tool that autonomously utilizes local LLMs and search engines to investigate complex topics. Unlike cloud-based alternatives that may expose sensitive data, it executes entirely on local hardware, capable of achieving state-of-the-art results on a single consumer GPU like an RTX 3090 using Qwen3.6-27B. The AI agent iteratively queries search engines such as SearXNG, reads the extracted content, synthesizes findings, and dynamically builds a searchable knowledge base. It ensures all data safely remains on the user's machine while systematically providing highly accurate, comprehensively cited reports.

Academemics, privacy-conscious professionals, and local-LLM enthusiasts who need deep research capabilities without cloud data exposure.

  • Autonomous Deep Search: Conducts iterative deep web research autonomously on complex user queries with extensive synthesis.
  • Local Execution: Runs entirely locally without external API calls, ensuring complete data privacy and data ownership.
  • High Accuracy Architecture: Achieves impressive high accuracy like 95% SimpleQA on standard consumer-grade hardware.
  • SearXNG Integration: Connects directly with SearXNG for optimal, unbiased search result retrieval across multiple engines.
  • Citation Generation: Synthesizes comprehensive final reports featuring strict academic-style source citations for verifiable research.

Where teams use it

Academic Literature Review

Researchers can deploy the agent to systematically search PubMed or arXiv and summarize findings without sharing their hypothesis with cloud providers.

Competitive Analysis

Businesses can use the tool to quietly investigate competitors' public documentation and marketing materials to generate private synthesis reports.

Personal Knowledge Base Generation

Hobbyists can instruct the agent to deep-dive into niche topics and populate a local, searchable database for future reference.

Offline Data Processing

Journalists operating in disconnected or sensitive environments can synthesize massive amounts of cached information securely.

Getting started: docker run -d -p 11434:11434 --name ollama ollama/ollama

README

main branch

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):

  • Does the research for you automatically
  • Searches across web, academic papers, and your own documents
  • Synthesizes everything into a report with proper citations

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
Loading

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)]
Loading

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

  • Quick Summary - Get answers in 30 seconds to 3 minutes with citations
  • Detailed Research - Comprehensive analysis with structured findings
  • Report Generation - Professional reports with sections and table of contents
  • Document Analysis - Search your private documents with AI

🛠️ Advanced Capabilities

  • LangChain Integration - Use any vector store as a search engine
  • REST API - Authenticated HTTP access with per-user databases
  • Benchmarking - Test and optimize your configuration
  • Analytics Dashboard - Track costs, performance, and usage metrics
  • Journal Quality System - Automatic journal reputation scoring with 212K+ indexed sources, predatory detection, and quality dashboard. Powered by OpenAlex (CC0), DOAJ (CC0), and Stop Predatory Journals (MIT). See the v1.6.0 announcement.
  • Real-time Updates - WebSocket support for live research progress
  • Chat Mode - Multi-turn research conversations with streaming progress and accumulated context across turns
  • Export Options - Download results as PDF or Markdown
  • Research History - Save, search, and revisit past research
  • Adaptive Rate Limiting - Intelligent retry system that learns optimal wait times
  • Keyboard Shortcuts - Navigate efficiently (ESC, Ctrl+Shift+1-4)

📰 News & Research Subscriptions

  • Automated Research Digests - Subscribe to topics or specific queries; AI filters and summarizes only the most relevant developments
  • Customizable Delivery - Daily, weekly, or custom schedules, as markdown reports or structured summaries

🌐 Search Sources

Free Search Engines
  • Academic: arXiv, PubMed, Semantic Scholar
  • General: Wikipedia, SearXNG
  • Technical: GitHub, Elasticsearch
  • Historical: Wayback Machine
  • News: The Guardian, Wikinews
Premium Search Engines
  • Tavily - AI-powered search
  • Google - Via SerpAPI or Programmable Search Engine
  • Brave Search - Privacy-focused web search
Custom Sources
  • Local Documents - Search your files with AI
  • LangChain Retrievers - Any vector store or database
  • Meta Search - Combine multiple engines intelligently

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/

  • ✅ Automatic user creation - works out of the box
  • ✅ Complete authentication with CSRF handling
  • ✅ Result retry logic - waits until research completes
  • ✅ Progress monitoring and error handling

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

"Use quick_research to find information about quantum computing applications"
"Search arxiv for recent papers on diffusion models"
"Generate a detailed research report on renewable energy trends"

🤖 Supported LLMs

Local Models

  • Ollama — connect to its native API (default http://localhost:11434)
  • LM Studio — connect to its OpenAI-compatible server (default http://localhost:1234/v1)
  • llama.cpp — connect to llama-server's OpenAI-compatible endpoint (default http://localhost:8080/v1); start with llama-server -m <model.gguf>
  • Common models: Llama, Mistral, Gemma, DeepSeek, Qwen
  • LLM processing stays local (search queries still go to web). No API costs.

💡 Which local model should I pick? See the community benchmarks — community-submitted accuracy numbers across local and cloud models, so you can compare before downloading.

Cloud Models

  • OpenAI
  • Anthropic Claude
  • Google Gemini
  • 100+ models via OpenRouter
  • 100+ models via Requesty

Custom Endpoints

  • OpenAI-Compatible Endpoint — any service speaking the OpenAI chat-completions API (vLLM, llama.cpp, gateways)
  • Anthropic-Compatible Endpoint — a self-hosted service speaking the Anthropic Messages API (/v1/messages); set llm.anthropic_endpoint.url

Model Setup →

🔄 Upgrading from Earlier Versions

  • llm.model no longer has a default. Pre-1.6.3 installs auto-filled gemma3:12b (Ollama) when no model was configured, which silently downloaded a multi-GB binary. The field is now empty by default — pick a model in Settings → LLM, or research will fail loudly with a clear error.
  • The auto and parallel meta search engines were removed. The default langgraph-agent strategy selects engines dynamically per query, which replaces them. Stored settings are migrated automatically (removed values become searxng); update any explicit search_tool="auto" API calls or LDR_SEARCH_TOOL=auto env overrides to a concrete engine such as searxng.
  • The llamacpp provider now uses HTTP instead of in-process loading. If you previously set llm.llamacpp_model_path to a local .gguf file, that setting is no longer read. Instead, run llama-server -m <your-model.gguf> (it ships with every modern llama.cpp build) and the default llm.llamacpp.url of http://localhost:8080/v1 will pick it up. Optional API key support is available via llm.llamacpp.api_key if you put llama-server behind an auth proxy.

📚 Documentation

Getting Started

Core Features

Advanced Features

Development

Examples & Tutorials

📰 Featured In

"Local Deep Research deserves special mention for those who prioritize privacy... tuned to use open-source LLMs that can run on consumer GPUs or even CPUs. Journalists, researchers, or companies with sensitive topics can investigate information without queries ever hitting an external server."

— Medium: Open-Source Deep Research AI Assistants

News & Articles

Community Discussions

International Coverage

🇨🇳 Chinese
🇯🇵 Japanese
🇰🇷 Korean

Reviews & Analysis

Related Projects

Note: Third-party projects and articles are independently maintained. We link to them as useful resources but cannot guarantee their code quality or security.

🤝 Community & Support

🧑‍💻 Contributing

We welcome contributions of all sizes — from typo fixes to new features. The key rule: keep PRs small and atomic (one change per PR). For larger changes, please open an issue or start a discussion first — we want to protect your time and make sure your effort leads to a successful merge rather than a misaligned PR. See our Contributing Guide to get started.

Acknowledgements

Local Deep Research is built on the work of many open-access initiatives, academic databases, and open-source projects. We are grateful to:

Academic & Research Data

Source What It Provides License
OpenAlex Academic metadata for ~280K sources and ~120K institutions, including DOAJ status CC0
DOAJ Directory of Open Access Journals — open-access verification (via OpenAlex) CC0
arXiv Preprints in physics, mathematics, CS, and more Various (see arXiv license)
PubMed / NCBI Biomedical and life sciences literature Public domain (US Gov)
Semantic Scholar Cross-discipline academic search with citation data Terms
NASA ADS Astrophysics, physics, and astronomy papers Terms
Zenodo Open research data, datasets, and software Various per record
PubChem Chemistry and biochemistry database Public domain (US Gov)
Stop Predatory Journals Predatory journal/publisher blacklist MIT
JabRef Journal abbreviation database CC0

Knowledge & Content Sources

Wikipedia • OpenLibrary • Project Gutenberg • GitHub • Stack Exchange • The Guardian • Wayback Machine

Infrastructure & Frameworks

LangChain • Ollama • SearXNG • FAISS

Support Open Access

These projects run on donations and grants, not paywalls. If Local Deep Research is useful to you, consider giving back to the open-access ecosystem that makes it possible:

📄 License

MIT License - see LICENSE file.

Dependencies: All third-party packages use permissive licenses (MIT, Apache-2.0, BSD, etc.) - see allowlist

View on GitHub

Recent activity

commits and pull requests

Discussions

all 20

Releases and announcements

172 total
  1. Release 1.10.7v1.10.7Aug 28, 202678 downloads

    ## Security hardening for notification URLs and the news subscription API This is a security release. It closes several server-side request forgery (SSRF) and local-file-read holes in outbound notifications and the news subscription API. If you have notifications enabled or use news subscriptions with a custom LLM endpoint, update promptly. ### Notification URL validation Three related fixes tighten what a notification URL is allowed to do: - **Unsafe Apprise query options are now rejected** before any hostname parsing or DNS lookup (#5085). Options like `template`, `redirect`, and mail-specific SMTP/PGP/WKD parameters could select a second, unvalidated destination or resource — for example, `discord://id/token?template=/etc/passwd` previously made the server read a local file and send it to the webhook. The dependency floor is now `apprise>=1.12.0,<2`, with a test that fails CI if Apprise's query-parsing semantics ever drift from what the validator mirrors. - **The test-notification endpoint now validates every URL in a multi-URL string individually** (#5120, via #5132). Commas are legal URL characters, so previously only the leading entry was checked while Apprise still notif

  2. Release 1.10.6v1.10.6Aug 28, 202621 downloads

    ## Cross-user isolation fixes and a reworked citation pipeline This release is strongly recommended for multi-user deployments: it closes several ways one signed-in user could touch another user's benchmark runs, research runs, and live progress events. It also contains one small **breaking API change** for external programmatic users of `SearchResultsCollector` — see the first section below. ### Breaking change: `SearchResultsCollector.add_results()` return type If you use LDR's search collector from your own code, `add_results()` now returns `(start, indexed)` instead of just the start index. Migrate `start = collector.add_results(results)` to `start, indexed = collector.add_results(results)` and pass `indexed` to `_format_results()` so deduped `[N]` citation markers stay aligned with the collector. All internal call sites were already updated. (#5381) ### Security: per-user isolation and hardening - **Benchmark runs** were keyed by the per-user integer run id alone, so two users owning the same id (both "run 1") could cancel each other's runs, leak each other's results and credentials, and receive each other's live progress events in the browser. The run registry and Socket

  3. Release 1.10.5v1.10.5Aug 16, 202653 downloads

    ## Making the SearXNG private-URL guard livable This release smooths out the private-URL protection introduced in v1.10.3, which blocked self-hosted SearXNG instances on localhost/LAN by default but made the failure hard to diagnose and the fix hard to apply. ### If your self-hosted SearXNG stopped returning results The research form now shows a dismissible warning banner when SearXNG is active but its private/localhost instance URL hasn't been approved by the server operator — the situation that previously caused the engine to silently self-disable and return no results. The banner includes the exact environment line needed to fix it. The runtime log message was also upgraded from WARNING to ERROR and now names all three remedies, as does the rejection message when saving such a URL in settings. To approve a self-hosted instance, the server operator picks **one** of these in the server environment, then restarts: - **New in this release (recommended):** `LDR_SEARCH_PRIVATE_ENGINE_URL_ALLOWLIST=http://localhost:8080` — a comma-separated list of exact URL origins that may be private. Finer-grained than the blanket flag: only listed origins get private access. Matching is exact

  4. Release 1.10.4v1.10.4Aug 16, 202626 downloads

    ## Critical login security fix and notification URL parsing **This release fixes a serious authentication bypass — upgrade promptly.** While a user's encrypted database was open (the normal state whenever that user is signed in anywhere, and for up to 30 days afterward with "remember me"), the login route accepted **any password** for that account: knowing only the username was enough to sign in from another session, browser, or IP and read or write their data. The attempt also counted as a successful login, so it never tripped account lockout or rate limiting. The fix (#5596) records which password opened each cached connection and re-verifies it on every login, falling back to a real key-validating open on mismatch. Accounts that had never been opened were not affected, and the cold-open path always validated passwords correctly — but any currently-open account was exposed, so updating is strongly recommended. Also in this release, notification service URLs are parsed more carefully (#5394): commas inside a single Apprise URL — such as multi-recipient `mailto:` destinations or webhook query parameters — are now preserved instead of being split into bogus entries, while configur

  5. Release 1.10.3v1.10.3Aug 16, 202628 downloads

    ## Security hardening across sessions, SSRF, and multi-tenant isolation — plus a search time-period default change This is a security-focused release with one breaking behavior change and several operator action items. If you self-host SearXNG on localhost/LAN, run a shared library directory, or rely on year-restricted search, read the upgrade notes below before upgrading. ### 💥 Breaking: default search time period is now "All time" `search.time_period` previously defaulted to "Past year", silently restricting every default search to the last twelve months. The default is now **All time** (no filter), and a migration rewrites every stored "Past year" value — including deliberately chosen ones, since they're indistinguishable from the old default. **If you want year-restricted results, re-select "Past year" in Settings after upgrading** (Past 24 hours / week / month choices are preserved). The setting now actually reaches Tavily, serpapi, and Wikinews on every search path — including the default `langgraph-agent` strategy and the MCP server, which previously bypassed it — and Tavily finally forwards it to the API as `time_range` instead of ignoring it (#4978). ### 🔒 Security —

Code frequency

additions and deletions
+293.8K-293.8KWeek of 2025-10-05: +5,078 linesWeek of 2025-10-05: -773 linesWeek of 2025-10-12: +12,985 linesWeek of 2025-10-12: -2,942 linesWeek of 2025-10-19: +27,910 linesWeek of 2025-10-19: -22,972 linesWeek of 2025-10-26: +9,601 linesWeek of 2025-10-26: -4,112 linesWeek of 2025-11-02: +2,867 linesWeek of 2025-11-02: -2,538 linesWeek of 2025-11-09: +8,180 linesWeek of 2025-11-09: -1,940 linesWeek of 2025-11-16: +3,667 linesWeek of 2025-11-16: -3,012 linesWeek of 2025-11-23: +9,207 linesWeek of 2025-11-23: -5,563 linesWeek of 2025-11-30: +22,265 linesWeek of 2025-11-30: -5,488 linesWeek of 2025-12-07: +33,839 linesWeek of 2025-12-07: -1,577 linesWeek of 2025-12-14: +15,974 linesWeek of 2025-12-14: -1,383 linesWeek of 2025-12-21: +10,107 linesWeek of 2025-12-21: -1,085 linesWeek of 2025-12-28: +10,979 linesWeek of 2025-12-28: -2,533 linesWeek of 2026-01-04: +21,138 linesWeek of 2026-01-04: -3,124 linesWeek of 2026-01-11: +83,062 linesWeek of 2026-01-11: -7,276 linesWeek of 2026-01-18: +72,733 linesWeek of 2026-01-18: -11,420 linesWeek of 2026-01-25: +50,221 linesWeek of 2026-01-25: -4,044 linesWeek of 2026-02-01: +171,421 linesWeek of 2026-02-01: -15,385 linesWeek of 2026-02-08: +23,790 linesWeek of 2026-02-08: -11,509 linesWeek of 2026-02-15: +31,055 linesWeek of 2026-02-15: -6,810 linesWeek of 2026-02-22: +39,854 linesWeek of 2026-02-22: -19,281 linesWeek of 2026-03-01: +57,950 linesWeek of 2026-03-01: -6,681 linesWeek of 2026-03-08: +66,384 linesWeek of 2026-03-08: -9,316 linesWeek of 2026-03-15: +105,853 linesWeek of 2026-03-15: -12,829 linesWeek of 2026-03-22: +47,366 linesWeek of 2026-03-22: -18,242 linesWeek of 2026-03-29: +9,125 linesWeek of 2026-03-29: -6,924 linesWeek of 2026-04-05: +11,118 linesWeek of 2026-04-05: -2,427 linesWeek of 2026-04-12: +16,507 linesWeek of 2026-04-12: -8,996 linesWeek of 2026-04-19: +30,818 linesWeek of 2026-04-19: -20,999 linesWeek of 2026-04-26: +10,132 linesWeek of 2026-04-26: -7,097 linesWeek of 2026-05-03: +11,566 linesWeek of 2026-05-03: -4,450 linesWeek of 2026-05-10: +16,035 linesWeek of 2026-05-10: -4,085 linesWeek of 2026-05-17: +10,408 linesWeek of 2026-05-17: -25,915 linesWeek of 2026-05-24: +35,495 linesWeek of 2026-05-24: -49,071 linesWeek of 2026-05-31: +5,388 linesWeek of 2026-05-31: -44,064 linesWeek of 2026-06-07: +34,072 linesWeek of 2026-06-07: -16,108 linesWeek of 2026-06-14: +17,733 linesWeek of 2026-06-14: -27,018 linesWeek of 2026-06-21: +21,677 linesWeek of 2026-06-21: -16,085 linesWeek of 2026-06-28: +24,492 linesWeek of 2026-06-28: -5,617 linesWeek of 2026-07-05: +12,595 linesWeek of 2026-07-05: -3,134 linesWeek of 2026-07-12: +76,793 linesWeek of 2026-07-12: -2,532 linesWeek of 2026-07-19: +31,569 linesWeek of 2026-07-19: -7,633 linesWeek of 2026-07-26: +12,488 linesWeek of 2026-07-26: -2,085 linesWeek of 2026-08-02: +24,664 linesWeek of 2026-08-02: -3,005 linesWeek of 2026-08-09: +23,725 linesWeek of 2026-08-09: -3,431 linesWeek of 2026-08-16: +6,673 linesWeek of 2026-08-16: -1,582 linesWeek of 2026-08-23: +24,517 linesWeek of 2026-08-23: -4,776 linesWeek of 2026-08-30: +293,767 linesWeek of 2026-08-30: -152,895 linesWeek of 2026-09-06: +65,552 linesWeek of 2026-09-06: -4,952 linesWeek of 2026-09-13: +68,143 linesWeek of 2026-09-13: -6,288 linesWeek of 2026-09-20: +45,717 linesWeek of 2026-09-20: -4,196 linesWeek of 2026-09-27: +8,960 linesWeek of 2026-09-27: -799 linesOct 5, 2025Sep 27, 2026
+1.9M lines added, -618K removed over the last year.

Commits per week

last 52 weeks
1820Week of 2025-10-05: 25 commitsWeek of 2025-10-12: 18 commitsWeek of 2025-10-19: 105 commitsWeek of 2025-10-26: 50 commitsWeek of 2025-11-02: 51 commitsWeek of 2025-11-09: 104 commitsWeek of 2025-11-16: 47 commitsWeek of 2025-11-23: 158 commitsWeek of 2025-11-30: 163 commitsWeek of 2025-12-07: 104 commitsWeek of 2025-12-14: 96 commitsWeek of 2025-12-21: 78 commitsWeek of 2025-12-28: 87 commitsWeek of 2026-01-04: 74 commitsWeek of 2026-01-11: 85 commitsWeek of 2026-01-18: 121 commitsWeek of 2026-01-25: 129 commitsWeek of 2026-02-01: 122 commitsWeek of 2026-02-08: 105 commitsWeek of 2026-02-15: 109 commitsWeek of 2026-02-22: 128 commitsWeek of 2026-03-01: 104 commitsWeek of 2026-03-08: 125 commitsWeek of 2026-03-15: 150 commitsWeek of 2026-03-22: 182 commitsWeek of 2026-03-29: 98 commitsWeek of 2026-04-05: 25 commitsWeek of 2026-04-12: 76 commitsWeek of 2026-04-19: 121 commitsWeek of 2026-04-26: 108 commitsWeek of 2026-05-03: 80 commitsWeek of 2026-05-10: 92 commitsWeek of 2026-05-17: 112 commitsWeek of 2026-05-24: 110 commitsWeek of 2026-05-31: 59 commitsWeek of 2026-06-07: 91 commitsWeek of 2026-06-14: 113 commitsWeek of 2026-06-21: 137 commitsWeek of 2026-06-28: 88 commitsWeek of 2026-07-05: 61 commitsWeek of 2026-07-12: 56 commitsWeek of 2026-07-19: 56 commitsWeek of 2026-07-26: 45 commitsWeek of 2026-08-02: 100 commitsWeek of 2026-08-09: 56 commitsWeek of 2026-08-16: 29 commitsWeek of 2026-08-23: 52 commitsWeek of 2026-08-30: 57 commitsWeek of 2026-09-06: 67 commitsWeek of 2026-09-13: 119 commitsWeek of 2026-09-20: 80 commitsWeek of 2026-09-27: 30 commitsOct 5, 2025Sep 27, 2026
4.6K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 67 commitsSun 1:00 — 40 commitsSun 2:00 — 46 commitsSun 3:00 — 3 commitsSun 4:00 — 2 commitsSun 5:00 — 4 commitsSun 6:00 — 2 commitsSun 7:00 — 3 commitsSun 8:00 — 42 commitsSun 9:00 — 65 commitsSun 10:00 — 60 commitsSun 11:00 — 74 commitsSun 12:00 — 84 commitsSun 13:00 — 84 commitsSun 14:00 — 73 commitsSun 15:00 — 81 commitsSun 16:00 — 108 commitsSun 17:00 — 70 commitsSun 18:00 — 93 commitsSun 19:00 — 59 commitsSun 20:00 — 62 commitsSun 21:00 — 83 commitsSun 22:00 — 106 commitsSun 23:00 — 104 commitsMon 0:00 — 88 commitsMon 1:00 — 45 commitsMon 2:00 — 17 commitsMon 3:00 — 19 commitsMon 4:00 — 41 commitsMon 5:00 — 5 commitsMon 6:00 — 8 commitsMon 7:00 — 14 commitsMon 8:00 — 41 commitsMon 9:00 — 34 commitsMon 10:00 — 25 commitsMon 11:00 — 17 commitsMon 12:00 — 21 commitsMon 13:00 — 17 commitsMon 14:00 — 13 commitsMon 15:00 — 12 commitsMon 16:00 — 24 commitsMon 17:00 — 33 commitsMon 18:00 — 72 commitsMon 19:00 — 50 commitsMon 20:00 — 76 commitsMon 21:00 — 48 commitsMon 22:00 — 55 commitsMon 23:00 — 75 commitsTue 0:00 — 94 commitsTue 1:00 — 40 commitsTue 2:00 — 12 commitsTue 3:00 — 7 commitsTue 4:00 — 0 commitsTue 5:00 — 5 commitsTue 6:00 — 1 commitsTue 7:00 — 15 commitsTue 8:00 — 16 commitsTue 9:00 — 4 commitsTue 10:00 — 1 commitsTue 11:00 — 9 commitsTue 12:00 — 9 commitsTue 13:00 — 1 commitsTue 14:00 — 18 commitsTue 15:00 — 9 commitsTue 16:00 — 10 commitsTue 17:00 — 14 commitsTue 18:00 — 50 commitsTue 19:00 — 39 commitsTue 20:00 — 69 commitsTue 21:00 — 57 commitsTue 22:00 — 52 commitsTue 23:00 — 80 commitsWed 0:00 — 80 commitsWed 1:00 — 37 commitsWed 2:00 — 12 commitsWed 3:00 — 15 commitsWed 4:00 — 6 commitsWed 5:00 — 6 commitsWed 6:00 — 5 commitsWed 7:00 — 21 commitsWed 8:00 — 17 commitsWed 9:00 — 13 commitsWed 10:00 — 11 commitsWed 11:00 — 16 commitsWed 12:00 — 23 commitsWed 13:00 — 17 commitsWed 14:00 — 8 commitsWed 15:00 — 17 commitsWed 16:00 — 30 commitsWed 17:00 — 24 commitsWed 18:00 — 29 commitsWed 19:00 — 68 commitsWed 20:00 — 63 commitsWed 21:00 — 49 commitsWed 22:00 — 41 commitsWed 23:00 — 88 commitsThu 0:00 — 69 commitsThu 1:00 — 49 commitsThu 2:00 — 27 commitsThu 3:00 — 4 commitsThu 4:00 — 5 commitsThu 5:00 — 3 commitsThu 6:00 — 6 commitsThu 7:00 — 19 commitsThu 8:00 — 23 commitsThu 9:00 — 20 commitsThu 10:00 — 18 commitsThu 11:00 — 17 commitsThu 12:00 — 19 commitsThu 13:00 — 11 commitsThu 14:00 — 14 commitsThu 15:00 — 20 commitsThu 16:00 — 17 commitsThu 17:00 — 33 commitsThu 18:00 — 32 commitsThu 19:00 — 47 commitsThu 20:00 — 54 commitsThu 21:00 — 44 commitsThu 22:00 — 92 commitsThu 23:00 — 98 commitsFri 0:00 — 76 commitsFri 1:00 — 59 commitsFri 2:00 — 25 commitsFri 3:00 — 13 commitsFri 4:00 — 13 commitsFri 5:00 — 8 commitsFri 6:00 — 6 commitsFri 7:00 — 11 commitsFri 8:00 — 26 commitsFri 9:00 — 30 commitsFri 10:00 — 22 commitsFri 11:00 — 30 commitsFri 12:00 — 21 commitsFri 13:00 — 15 commitsFri 14:00 — 19 commitsFri 15:00 — 18 commitsFri 16:00 — 26 commitsFri 17:00 — 47 commitsFri 18:00 — 34 commitsFri 19:00 — 62 commitsFri 20:00 — 62 commitsFri 21:00 — 36 commitsFri 22:00 — 34 commitsFri 23:00 — 76 commitsSat 0:00 — 90 commitsSat 1:00 — 82 commitsSat 2:00 — 36 commitsSat 3:00 — 14 commitsSat 4:00 — 9 commitsSat 5:00 — 3 commitsSat 6:00 — 9 commitsSat 7:00 — 7 commitsSat 8:00 — 23 commitsSat 9:00 — 47 commitsSat 10:00 — 80 commitsSat 11:00 — 92 commitsSat 12:00 — 61 commitsSat 13:00 — 82 commitsSat 14:00 — 101 commitsSat 15:00 — 80 commitsSat 16:00 — 96 commitsSat 17:00 — 49 commitsSat 18:00 — 33 commitsSat 19:00 — 37 commitsSat 20:00 — 34 commitsSat 21:00 — 35 commitsSat 22:00 — 42 commitsSat 23:00 — 53 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits4,591 (80%)
Community commits1,174 (20%)

5,765 commits in total over the last year.

DateListRankStars gained
May 7, 2026daily#25+46