Skip to content

Local Deep Research

v1.8.0 Security

This release includes 1 security fix for security teams reviewing exposed deployments.

Published 25d LLM Frameworks
โœ“ No known CVEs patched
Read the diff โ†’ Tool health โ†’ What is this tool? โ†’
This release patches 1 known CVE

Topics

academia anthropic arxiv brave deep-research encryption
+14 more
home-automation homeserver local local-deep-research local-llm mistral ollama openai pubmed research research-tool retrieval-augmented-generation searxng self-hosted

Affected surfaces

rce_ssrf auth breaking_upgrade

Summary

AI summary

Broad release touches ๐Ÿ› Bug Fixes, ๐Ÿ”’ Security Updates, โฌ†๏ธ Dependencies, and ui-tests.

Full changelog

Highlights

1.8.0 is a large release weighted toward security hardening โ€” 36 security changes, 65 bug fixes, 17 new features, 4 breaking changes, and 7 removals.

Most of the security work falls into two areas:

  • Egress policy. LDR controls where research traffic is allowed to go โ€” via PRIVATE_ONLY / PUBLIC_ONLY / ADAPTIVE scopes, explicit per-call policy checks, and a process-wide PEP-578 socket.connect audit-hook backstop for paths the explicit checks don't cover. Snapshot-less programmatic callers now fail closed instead of constructing a cloud client, cloud-metadata/SSRF endpoints are blocked more thoroughly (including alternate IP encodings and metadata.* hostnames), and operator-supplied endpoint URLs are SSRF-validated before the SDK runs. Note: the scope model is being reworked into a two-axis classification (see #4882 / ADR-0006), so expect refinements in a later release.
  • Credential leaks. The unrecoverable SQLCipher master password is now scrubbed from tracebacks and kept out of every durable or shipped log sink; the settings endpoints redact API keys; and the settings form no longer pre-fills stored secrets. Separately, a FAISS pickle-deserialization RCE is closed and WebSocket connections default to same-origin.

Breaking changes to check before upgrading:

  • The mcp / agentic (ReAct) and auto / parallel search strategies are removed; existing selections migrate automatically to langgraph-agent.
  • Programmatic get_llm(provider=โ€ฆ) / get_embeddings(provider=โ€ฆ) fail closed without a settings snapshot (raise PolicyDeniedError).
  • The default egress scope is now adaptive; set Egress Scope to Both to keep the previous "any engine, cloud inference" behavior.

Full list below โ€” each item links to its PR.


What's Changed

๐Ÿ”’ Security Updates

  • fix(settings): scope settings_changed WebSocket event to the owning user (cross-user leak) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4437
  • fix(search): stop broadcasting search socket events to all connected users by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4446
  • feat(security)!: egress policy module + search/LLM/embeddings PEPs by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4300
  • fix(security): detect URL-encoded and unicode-traversal attacks in PathValidator by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4291
  • fix(security): green main (TestQuickSummary) + clear egress block messages + quick_summary settings opt-in by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4456
  • ci(release): add three cheap sanity checks (twine, tag-on-main, SBOM) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4225
  • fix(security): arm egress audit net for direct MCP searches; fix library engine settings reads by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4517
  • fix(security): bump base image to python:3.14.6-slim, refresh .grype.yaml by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4523
  • ci(puppeteer): install test deps with npm ci instead of npm install by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4524
  • fix(policy): align egress scope fallbacks with registered default by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4465
  • fix(policy): use static engine class flags for egress scope decisions by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4471
  • fix(security): redact SQLCipher password in encrypted_db, scheduler, and queue failure logging by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4530
  • fix(security): add runtime egress scope verification in BaseSearchEngine by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4472
  • fix(history): pass username explicitly to get_research_strategy (follow-up to #3661) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4526
  • feat!: remove the auto and parallel meta search engines by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4534
  • docs(egress): add runtime backstop + MCP audit net to enforcement map by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4543
  • test(history): lock username as required keyword-only on strategy functions (follow-up to #4526) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4541
  • test(security): AST invariant โ€” no traceback logs with password in scope by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4540
  • fix(security): redact + break chain on DatabaseInitializationError re-raise (#4182) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4542
  • fix(security): redact password leak in DatabaseInitializationError consumers (#4182) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4550
  • fix(security): redact password leak in ThreadSafeMetricsWriter.get_session (#4182) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4553
  • fix(security): parse LDR_TEST_MODE as a boolean for the KDF floor by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4564
  • fix(security): close password frame-locals leak class at the sink + targeted sweep (#4182) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4555
  • test(db): lock in LDR_TEST_MODE boolean parsing for the KDF floor by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4565
  • fix(security): force diagnose=False on the file sink too (#4182) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4568
  • fix(security): extract sanitize_error_message to standalone function + strengthen patterns by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4466
  • feat(benchmark): record LDR version + redacted settings snapshot at benchmark start by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3844
  • feat(security): validate LLM provider base_url against SSRF rules by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3929
  • refactor(rag): categorize /test-embedding errors instead of guessing (#4208 follow-up) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4220
  • chore(security): SSRF housekeeping cleanups by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3931
  • fix(llm): address audit findings from PR #3670 by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3767
  • fix(search): strip URLs before the _is_valid_search_result gate (searxng + mojeek) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4573
  • fix(settings): close password-input HTML leak + protect against [REDACTED] write-back by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3954
  • fix(chat): guard chat research against missing DB password (#4457) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4571
  • refactor(security): centralize error scrubbing in BaseSearchEngine._scrub_error helper by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4572
  • fix(settings): redact remaining GET endpoints + extend empty-password guard to /save_settings by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3988
  • fix(benchmark): gate evaluator endpoint_url behind the settings opt-in by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4579
  • fix(benchmark): quote + escape free-form string fields in YAML export by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4583
  • security: add rel=noopener noreferrer to external target=_blank links by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4142
  • fix(security): resolve open code-scanning alerts (pypdf DoS, exception exposure, migration SQL, Actions injection, devskim FP) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4601
  • fix(deps): patch js-yaml + @babel/core Dependabot alerts in test tooling by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4614
  • security: enforce rel=noopener noreferrer via pre-commit hook by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4144
  • fix(security): bound the RAG auto-index queue to prevent OOM under burst by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3939
  • chore: remove dead SearchCache utility, deprecate orphaned table by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4621
  • fix(library): clamp documents API limit/offset to prevent unbounded load (#4560) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4596
  • security: flag dynamic target=_blank links in check-target-blank-rel hook by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4626
  • fix(history): paginate /api/history to bound memory (#4560) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4597
  • fix(library): scrub credentials from download-service errors before they reach the client by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4625
  • feat(llm): Anthropic-compatible (Messages API) custom endpoint provider (#4559) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4581
  • fix(security): scrub credentials from search/fetch/agent tool errors (follow-up to #4625) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4633
  • fix(deps): patch cryptography (HIGH) + aiohttp CVEs (Trivy #7877-#7885) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4634
  • fix(deps): patch crawl4ai/langchain/starlette/python-multipart CVEs (Trivy/Grype wave) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4642
  • refactor(settings): drop dead hand-rolled model-listing, single discovery path (H7) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4646
  • fix(security): widen credential-scrub patterns (OAuth/Azure/Google keys, auth headers) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4640
  • fix(security): close FAISS pickle-deserialization RCE with a restricted unpickler by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4632
  • security: harden backup SQL injection guard and validate glob results by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3098
  • fix(ci): allowlist unfixable js-yaml DoS in the npm-audit release gate by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4651
  • security: apply glob hardening to backup-status API route (follow-up to #3098) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4663
  • test(db): fix encrypted-DB test that silently skipped in CI (wrong package name) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4674
  • fix(deps): patch crawl4ai RCE (CRITICAL x2) + langsmith/pydantic-settings/pypdf CVEs by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4681
  • security: harden warning_checks backup glob + make is_safe_glob_result shared by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4682
  • fix(security): scrub GitHub/AWS/Slack/Google-OAuth tokens + JWTs from error text by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4664
  • fix(security): escape innerHTML injections across analytics pages by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3095
  • chore(gitleaks): move password_utils + search_engines_config to path allowlist by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4733
  • chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4738
  • fix(egress): single source of truth for a run's primary engine (fixes mid-run scope_mismatch crash) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4745
  • fix(langgraph): propagate search context (DB password) into subagent pool by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4751
  • fix(egress): route RAG-indexing + SBERT embeddings PEPs through resolve_run_primary_engine by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4753
  • fix(egress): close inference-path fail-open (LLM/embeddings PEPs use the single primary source) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4752
  • fix(fetch): return a recoverable tool message on a per-URL egress denial by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4761
  • fix(security): ignore CVE-2026-48931 in patchright-bundled Node (alert #7994) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4811
  • fix(ci): fail loudly when Grype produces no SARIF instead of uploading an empty one by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4796
  • ci(security): ignore unfixable CVEs in Grype by fix state by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4797
  • fix(security): repair non-functional Bearer XSS/redirect suppressions in JS (9 false positives) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4799
  • ci(release-gate): wait for grype-scan before checking code-scanning alerts by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4817
  • fix(security): green the WebSocket-CORS unit suite + fix stale '*' default docs (#3091 follow-up) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4807
  • fix(security): rework #3090 symlink + LDR_DATA_DIR hunks (500 on non-root, apostrophe crash) + add tests by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4808
  • fix(search): restore TinyFish ruff-format gate + redact query from request-error logs (#4057 follow-up) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4806
  • ci: fail loudly when Bearer/Semgrep produce no SARIF instead of uploading an empty one by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4818
  • fix(security): make Bearer SQLi suppressions in migrations 0013/0008 actually work by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4792
  • fix(security): don't log the user's path when blocking a restricted directory by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4820
  • feat(security): warn at startup on weak SQLCipher KDF with existing user DBs by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4816
  • build(security): pre-commit guard for malformed bearer:disable directives + cleanup by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4821
  • fix(security): don't log the user's submitted path on a RAG path-validation failure by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4825
  • fix(security): log folder/file basenames (not full paths) in RAG local indexing by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4831
  • fix(notifications): surface validator reason + admin hint in test-URL error by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4002
  • fix(security): don't leak URL-parse exception in notification test error (CodeQL #4775) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4835

๐Ÿ’ฅ Breaking Changes

  • remove(benchmarks): drop cross-run result reuse by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4498
  • refactor(llm-providers): collapse dual-path LLM construction; fix Ollama enable_thinking by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3984
  • chore: remove the dead /research/api/config endpoint by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4551
  • refactor(journal_quality)!: remove the retired DOAJ Seal quality signal by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4531
  • refactor(routes): extract _research_not_found helper (DRY) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4713

โœจ New Features

  • Remove experimental search strategies not in the frontend by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4420
  • feat(library): per-collection 'available to the research agent' toggle by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4453
  • feat(benchmarks): add sampling seed for reproducible benchmark question selection by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4516
  • ci(release-gate): CPU baseline smoke test under qemu-emulated CPUs by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4506
  • fix(api): load user context for REST research endpoints (and remove /quick_summary_test) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3661
  • feat(library): warn in research log when collection search results are incomplete by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4520
  • feat(warnings): add action link to model-mismatch hardware warning by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4529
  • ci(ai-review): auto-run on every push to non-draft PRs by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4554
  • ci(forensics): request arrival/duration logging for #4431 navigation-stall hunts by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4536
  • feat(dev): add run_test_instance.sh launcher for a disposable LDR dev server by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4382
  • feat(ci): run AI code review across a configurable list of models by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4667
  • feat(search): cap local RAG results (default 20) + opt-in LLM relevance filter by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4765
  • feat(search): group the search-engine selector into ordered bands with headers by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4814
  • feat(metrics): a11y empty states + link feedback to source research by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4793
  • feat(library): opt-in scheduled sweep to index unindexed library documents (#3939 follow-up) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4627

๐Ÿ› Bug Fixes

  • test(conftest): stop QueueProcessorV2 thread between tests by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4441
  • fix(ui): bind listeners before async init awaits in pdf-upload + help by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4421
  • chore(news): drop redundant inline smooth-scroll override by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4447
  • test(downloaders): fix GC-timing flake in context-manager close test by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4444
  • fix(tests): instant scroll in mobile-nav overlap test (defeat Bootstrap smooth-scroll) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4442
  • fix(library): make FAISS quarantine WARNING actionable by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4221
  • fix(library): make ODT and office-doc uploads actually work (#4414) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4415
  • fix(progress): rebalance progress bar for detailed reports by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3806
  • fix(search): validate and deduplicate follow-up relevance filter indices by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4337
  • fix(news): honor flat source_type fields in SQLCardStorage.create() by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4245
  • fix(news): subscription folder dropdown never loads and folder selection is dropped by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4495
  • fix(embeddings): import text splitters from concrete submodules, not package root by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4493
  • fix(deps): pin faiss-cpu to 1.13.x to avoid SIGILL on non-AVX2 CPUs by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4491
  • fix(search): honor search.max_results in Library/Collection RAG engines by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4496
  • fix(benchmarks): make xbench-DeepSearch respect the configured number of examples by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4494
  • fix(loaders): clear error for encrypted .xls files by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4467
  • fix(research): refuse LLM synthesis when no sources are available (prevents fabricated citations) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4503
  • fix: extract WARNING_AFFECTING_KEYS constant + add missing egress keys (DRY PR 6/23) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4463
  • fix(tests): make QueueProcessorV2.stop() interrupt the loop wait โ€” removes ~10s teardown per app test by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4533
  • fix(api): 400 for unknown /analyze_documents params + document allow_default_settings by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4527
  • fix(scaleserp): guard against null link dropping entire result set by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4528
  • fix(tests): disable Chrome leak-detection dialog that ate CDP input after login (#4430) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4501
  • fix(ui): show actual search engine name instead of "web_search" by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4470
  • test(api): real-path regression tests for /generate_report user-context (#4396) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4552
  • fix(ci): honour fast SQLCipher KDF in test servers via LDR_TEST_MODE by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4558
  • fix(metrics): record LLM calls when provider reports no token usage by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4473
  • fix(settings): collapse sections by default on mobile by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4032
  • fix(library): don't quarantine healthy FAISS index when embedding provider is down by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4512
  • fix(ui-tests): real assertions for collection delete + subscription toggle/delete via API seeding by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4174
  • fix(ui): render friendly engine name in agent-thinking tool_call panel (follow-up to #4470) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4570
  • fix(rag): dedup collection indexing across SSE route and background worker by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4502
  • fix(ui-tests): drop dead-field subscription tests, retarget at #subscription-strategy by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4151
  • fix(ui-tests): real assertions for document upload + delete + bulk-select by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4187
  • fix(news): make subscription status the single source of truth for active/due by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4492
  • test(settings): regression-test bulk warning recalc for egress keys (#4463) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4582
  • fix(db): don't load report_content/chunk_text into memory in list queries (#4560) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4574
  • fix(settings): remove duplicate LLAMACPP entry from model-provider dropdown by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4594
  • fix(metrics): drive rate-limiting analytics from RateLimitEstimate (dead panel) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4576
  • fix(models): use_alter on ResearchResource.document_id to break circular FK by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3776
  • fix(library): batch convert_all_research to bound memory on large history (#4560) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4585
  • refactor: remove redundant per-site -stripping (rely on central wrapper) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4343
  • test(ui-tests): real assertions for 10 settings-interaction tests (dead-field audit PR 1) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4589
  • test(themes): generate theme CSS from registry instead of the gitignored file by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4599
  • fix(settings): restore shared_library safety warning by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3766
  • fix(llm): guard central think-strip against non-string content (follow-up to #4343) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4611
  • refactor(llm): make auto-discovery the single source of truth for providers by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4591
  • test(ui-tests): real assertions for 4 settings-pages Input tests (dead-field audit PR 2) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4613
  • fix: add thread safety to SearchCache memory cache by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/3138
  • fix(news): correct subscription run-now schedule + repair broken folder PUT route (#4492 follow-up) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4587
  • test(ui-tests): real assertions for library collection-card + doc-search (dead-field audit PR 3) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4617
  • fix(settings): source the provider dropdown from auto-discovery (not a hardcoded list) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4622
  • fix(rag): make H3 embedding_dimension probe real + extend dedup to index_all (#4502 follow-up) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4593
  • fix(news): repair subscription-history and organized-subscriptions 500s by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4588
  • fix(memory): cap persisted log message size + share /history/logs cap constants by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4240
  • Fix AttributeError on list-type LLM content (recovered from #4628) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4644
  • fix(logs): honor ?limit on /api/research//logs by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4645
  • fix(ui-tests): make escapeKeyFunction test real app behavior (was failing with navigation error) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4655
  • fix(logs): tie-break equal-timestamp log ordering by ResearchLog.id by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4661
  • fix(errors): preserve tailored error messages in error report generator by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4087
  • test(ui-tests): real assertion for semanticColors (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4658
  • fix(errors): stop over-broad error patterns from giving wrong advice by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4666
  • Drop dead Document.notes legacy column (recovered from #4619) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4643
  • fix(ui-tests): make focusIndicatorVisible reliable in the accessibility shard by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4683
  • fix(ui-tests): chat report-refactor test no longer closes the page without an LLM (shard fix) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4680
  • test(ui-tests): real assertions for context overflow (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4671
  • fix(db): serialize per-user DB cold-open to prevent concurrent-migration race by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4665
  • fix(research): detailed reports bypass report.enable_file_backup (H2) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4684
  • fix(export,news): malformed RIS export + dropped subscription-history metadata by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4435
  • fix(library): bound research-list dropdown query (#4560) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4719
  • refactor(engines): unify API key placeholder list (DRY) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4715
  • fix(library): stream get_unique_domains scan to bound memory (#4560) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4720
  • fix(ci): stop unrelated labels from cancelling in-flight AI reviews by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4697
  • fix(library): defer text_content in collection document loads (#4560) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4598
  • test(ui-tests): real assertions for results star-rating (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4670
  • test(ui-tests): real assertions for news feed (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4672
  • test(ui-tests): real assertions for followup research (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4673
  • test(ui-tests): real assertions for error handling (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4678
  • test(ui-tests): real assertions for mobile interactions (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4679
  • fix(library): project ResearchResource whole-table scans to bound memory (#4560) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4724
  • test(chat): de-flake per-user cap test (cleanup_middleware 1% sample) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4688
  • test(settings): remove stale duplicate cleanup rate-limit tests (#4735 follow-up) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4741
  • fix(research): carry username in run snapshot so the agent can use document collections by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4746
  • fix(ci): whitelist vulture false positives blocking v1.8.0 release by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4755
  • fix(ci): seed link-analytics shard data + bump experimental badge to 12px floor by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4763
  • fix(tests): update tests stale after #3091 (CORS) and #4057 (TinyFish) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4815
  • fix(ci): standardize server-readiness probes (curl -fsS /api/v1/health) + make responsive-ui cleanup real by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4794
  • ci(pre-commit): retry only hook install, not the lint run by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4826
  • fix(metrics): announce the real star-reviews load error; drop dead re-announce by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4828
  • fix(journal-quality): follow OpenAlex 2026-06 standard-format snapshot layout by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4830
  • fix(startup): defer heavy ML imports off the app-boot path (fixes UI test gates) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4829
  • fix(web): defer WeasyPrint import so it no longer blocks server cold start (#4431) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4734

โšก Performance Improvements

  • ci(release-gate): cache the cpu-smoke pdm venv, pin two rationale comments by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4525
  • test(ui-tests): replace delay(1000) with polling in context-overflow tests by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4708
  • test(startup): add create_app-level import-weight regression guard by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4833

๐Ÿ—„๏ธ Database Changes

  • chore: deprecate (but keep) dormant UploadBatch model by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4178
  • chore(db): drop orphaned cache tables, remove dead Cache/SearchCache models by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4641

๐Ÿ“š Documentation

  • docs: add test-review (PUNCHLIST) completion report by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4293
  • docs(test): clarify test_handles_errors_gracefully is intentional behavior by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4292
  • test: annotate 28 PUNCHLIST KEEP-marked tests with audit-reviewed markers by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4295
  • fix(settings): loguru brace formatting + docstring clarity in _filter_editable_settings by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4485
  • docs(readme): document the x86-64 AVX minimum CPU requirement by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4513
  • docs(progress): cross-reference _REPORT_PHASES emitters by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4481
  • docs(resource-cleanup): record that asyncio.run loops don't reproduce #3816 by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4143
  • docs: mark get_available_providers cache note as removed in #4590 by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4595
  • docs: fix stale ai-reviewer.sh location in AI reviewer setup guide by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4718
  • docs(library): document FAILED/COMPLETED revival in queue_research_downloads by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4696
  • docs(changelog): note the orphaned cache-table drop (#4641) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4727
  • docs: regenerate CONFIGURATION.md (add missing TinyFish + RAG rows) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4819
  • docs(adr): ADR-0005 โ€” reject in-app response compression by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4836

๐Ÿ”ง CI/CD & Maintenance

  • chore: clear changelog fragments for 1.7.0 by @github-actions[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4440
  • test: annotate 276 PUNCHLIST entries as 'reviewed โ€” issue resolved by prior PR' by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4296
  • chore: delete orphan web/static/css/auth.css by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4148
  • chore(deps): bump actions/checkout from 6.0.2 to 6.0.3 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4477
  • chore(deps): bump github/codeql-action from 4.36.0 to 4.36.2 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4478
  • ci: cap pytest-tests job at 75 minutes by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4514
  • ๐Ÿค– Update dependencies by @github-actions[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4509
  • ci: raise pytest-tests timeout to 120 minutes by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4522
  • refactor: delete dead files (DRY PR 3/23) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4460
  • chore(ui-tests): drop dead-field history CRUD tests (unseedable in CI) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4580
  • ๐Ÿค– Update dependencies by @github-actions[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4647
  • chore(deps): bump zizmorcore/zizmor-action from 0.5.6 to 0.5.7 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4739
  • chore: bump minor version to 1.8.0 by @github-actions[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4743
  • ci(pre-commit): lint that release-gate SARIF scanners are in both needs lists by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4822
  • ๐Ÿค– Update dependencies by @github-actions[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4759
  • test(ci): surface login HTTP status in register_ci_user diagnostics by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4791
  • refactor(chat): remove dead/inert context code + orphaned max_context_messages setting by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4350

โฌ†๏ธ Dependencies

  • chore(deps): bump marked from 18.0.4 to 18.0.5 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4475
  • chore(deps-dev): bump happy-dom from 20.10.1 to 20.10.2 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4476
  • chore(deps): bump dompurify from 3.4.8 to 3.4.9 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4504
  • chore(deps-dev): bump eslint from 10.4.1 to 10.5.0 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4606
  • chore(deps-dev): bump eslint from 10.4.1 to 10.5.0 in /tests/puppeteer by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4603
  • chore(deps): bump dompurify from 3.4.9 to 3.4.10 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4604
  • chore(deps-dev): bump happy-dom from 20.10.2 to 20.10.3 by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4605
  • chore(deps): bump js-yaml from 4.1.1 to 4.2.0 in /tests/puppeteer in the npm_and_yarn group across 1 directory by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4608
  • chore(deps-dev): bump js-yaml from 4.1.1 to 4.2.0 in /tests/api_tests_with_login in the npm_and_yarn group across 1 directory by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4609
  • chore(deps): bump js-yaml from 4.1.1 to 4.2.0 in /tests in the npm_and_yarn group across 1 directory by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4610
  • chore(deps): bump @playwright/test from 1.60.0 to 1.61.0 in /tests/accessibility_tests by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4629
  • chore(deps-dev): bump @playwright/test from 1.60.0 to 1.61.0 in /tests/ui_tests/playwright by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4630
  • chore(deps): bump puppeteer from 25.1.0 to 25.2.0 in /tests/puppeteer by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4750
  • chore(deps): bump puppeteer from 25.1.0 to 25.2.0 in /tests/ui_tests by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4748
  • chore(deps-dev): bump puppeteer from 25.1.0 to 25.2.0 in /tests/api_tests_with_login by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4747
  • chore(deps): bump puppeteer from 25.1.0 to 25.2.0 in /tests by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4749
  • chore(deps-dev): bump @playwright/test from 1.61.0 to 1.61.1 in /tests/ui_tests/playwright by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4757
  • chore(deps): bump @axe-core/playwright from 4.11.3 to 4.12.1 in /tests/accessibility_tests by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4756
  • chore(deps): bump @playwright/test from 1.61.0 to 1.61.1 in /tests/accessibility_tests by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4758
  • chore(deps): bump puppeteer from 25.2.0 to 25.2.1 in /tests by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4772
  • chore(deps): bump puppeteer from 25.2.0 to 25.2.1 in /tests/puppeteer by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4771
  • chore(deps-dev): bump puppeteer from 25.2.0 to 25.2.1 in /tests/api_tests_with_login by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4769
  • chore(deps): bump puppeteer from 25.2.0 to 25.2.1 in /tests/ui_tests by @dependabot[bot] in https://github.com/LearningCircuit/local-deep-research/pull/4770

๐Ÿงน Code Quality & Refactoring

  • refactor(settings): extract _filter_editable_settings helper by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4469
  • chore(benchmarks): remove dead sampling paths from xbench dataset loaders by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4518
  • chore(benchmarks): collapse identical dataset branches in _create_task_queue by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4519
  • refactor: remove dead-code overrides (DRY PR 1/23) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4458
  • refactor: use shared LANGUAGE_CODE_MAP in SerpAPI, Brave, Google PSE (DRY PR 4/23) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4461
  • refactor: extract _extract_display_link helper (DRY PR 5/23) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4462
  • chore: add Session type hints to db_session parameters across remaining files by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4487
  • refactor: remove dead SEARCH_SNIPPETS_ONLY checks (DRY PR 2/23) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4459
  • refactor(benchmark): extract YAML export helpers into a unit-tested module by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4584
  • refactor(llm): remove dead provider-availability surface from llm_config by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4590
  • refactor(auth): centralize research DB-password guard in password_utils by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4577
  • chore(ui-tests): remove dead-field orphan formSubmitWithQuery (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4638
  • refactor(api): single-source the Ollama /api/tags probe (H1) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4650
  • refactor(auth): extract session create/cleanup helpers (DRY) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4712
  • refactor(config): extract _ensure_dir helper in paths.py (DRY) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4714
  • fix: correct test quality bugs and env var pollution by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/2976
  • refactor(strategies): add base error-response and citation helpers (DRY) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4711
  • refactor(settings): add unwrap_setting utility (DRY) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4716
  • refactor(search): extract run_parallel_searches helper (DRY) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4717
  • refactor(engines): extract _create_journal_filter helper (DRY) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4710
  • cleanup: remove dead code and consolidate remove_think_tags duplication by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/2894

๐Ÿงช Tests

  • test(logpanel): 20s timeout for the MAX_LOG_ENTRIES prune test by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4443
  • test(ui): add CI coverage for journal quality dashboard and download manager by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4449
  • test(journal_quality): add unit tests for db.py accessor methods by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4464
  • test(api): endpoint-completeness meta-test + autospec real-path factories (follow-up to #3661) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4521
  • test(chat): de-flake per-user cap test (remove 30s wall-clock dependency) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4549
  • test(providers): guard that local providers stay auto-discovered by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4618
  • test(ui-tests): real assertion for news subscription card (dead-field audit PR 4) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4624
  • test(ui-tests): real assertions for mobile dropdown-open + delete modal (dead-field audit PR 5) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4639
  • test(ui-tests): real assertions for benchmark config dropdowns + start button (dead-field audit PR 6) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4637
  • chore(ui-tests): remove dead-field orphan enterKeySubmits (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4648
  • test(ui-tests): convert dead ctrlEnterSubmit orphan into a CI-safe keyboard-submit test by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4652
  • chore(ui-tests): de-rot ctrlEnterSubmit comment + use optional chaining (review follow-up) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4656
  • test(ui-tests): real assertion for flashMessagesDisplayed (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4657
  • test(ui-tests): assert /auth/change-password form directly, fail not skip (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4662
  • test(ui-tests): real assertions for crud operations (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4677
  • test(ui-tests): real assertions for history page (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4675
  • test(ui-tests): real assertions for research workflow (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4676
  • test(ui): AI-review follow-ups to dead-field audit tests by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4725

๐Ÿ Python Changes

  • chore: add Session type hints to remaining db_session parameters by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4575

Other Changes

  • docs(test): link upstream happy-dom#2182 for the KaTeX sanitize workaround by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4438
  • fix(security): pass Google Gemini API key via header (#4184) by @Donny-Guo in https://github.com/LearningCircuit/local-deep-research/pull/4452
  • fix(security): suppress torch GHSA-rrmf-rvhw-rf47, document Grype DB-lag policy by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4535
  • refactor(lmstudio): ensure URLs end with /v1 for LM Studio integration by @jactan77 in https://github.com/LearningCircuit/local-deep-research/pull/4532
  • refactor: centralize the default search engine as DEFAULT_SEARCH_TOOL by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4547
  • test(api): remove orphaned TestApiGetConfig for deleted /config endpoint by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4556
  • fix(settings): fix text_separators JSON decoding, add UI validation and fallback handling by @skbs-eng in https://github.com/LearningCircuit/local-deep-research/pull/4231
  • test(ui-tests): real assertions for metrics dashboard (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4668
  • test(ui-tests): real assertions for realtime progress (dead-field audit) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4669
  • fix(security): triage XML/node CVEs + remove SQLi false positive (#7978โ€“#7991) by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4768
  • ci(pre-commit): add author identity consistency check by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4809
  • style: apply ruff-format to 8 files drifted from the pinned formatter by @LearningCircuit in https://github.com/LearningCircuit/local-deep-research/pull/4813
  • fix: align file backup verifier gate with UI toggle key by @skbs-eng in https://github.com/LearningCircuit/local-deep-research/pull/4803

New Contributors

  • @Donny-Guo made their first contribution in https://github.com/LearningCircuit/local-deep-research/pull/4452
  • @jactan77 made their first contribution in https://github.com/LearningCircuit/local-deep-research/pull/4532

Full Changelog: https://github.com/LearningCircuit/local-deep-research/compare/v1.7.0...v1.8.0

Security Fixes

  • CVE-2026-48931

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track Local Deep Research

Get notified when new releases ship.

Sign up free

About Local Deep Research

AI-powered deep research tool with multi-source search (arXiv, PubMed, web)

All releases โ†’

Related context

Earlier breaking changes

  • v1.6.11 JavaScript rendering disabled by default in production Docker image; new web.enable_javascript_rendering setting (default false).

Beta — feedback welcome: [email protected]