MiniSearch

felladrinApache-2.0活跃维护

浏览器里直接跑的极简 AI 搜索平台,聚合多个搜索源并调用本地大模型做问答,无需后端服务器。

Minimalist web-searching platform with an AI assistant that runs directly from your browser. Demo: https://felladrin-minisearch.hf.space

2026.11.8发布于 2026-11-08 04:41 UTC608star76fork同步于 2026-11-10 11:57 UTC

怎么上手

由 README 提炼,执行前请确认
docker run -p 7860:7860 ghcr.io/felladrin/minisearch
硬件要求按 README 说明

AI 模型可在浏览器内用 WebGPU 或 CPU 运行;README 未说明具体显存或 GPU 型号要求。

有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

自托管的隐私搜索平台,AI 助手直接在浏览器里跑,不用 API key 也不外泄查询

浏览器里直接跑的极简 AI 搜索平台,聚合多个搜索源并调用本地大模型做问答,无需后端服务器。

核心能力

  • AI 模型在浏览器内用 WebGPU 或 CPU 推理
  • 内置 SearXNG 聚合网页与图片结果
  • 用 cross-encoder 模型在本地重排搜索结果
  • 回答附带引用来源并支持追问记忆
  • 历史与缓存存于浏览器 IndexedDB

容易踩的坑

首次使用需在浏览器下载并缓存所选模型;默认端口为 7860,访问 http://localhost:7860;latest 标签随每次发布变动,需要稳定版本应固定镜像 digest。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本2026.11.8
  1. 2026.11.8最新正式版2026-11-08 · 2026-11-08 04:41 UTC

    2026-11-08

    • A model download that was interrupted, for example by reloading the page halfway, no longer stops every model from loading. wllama 3.8.1 checks every model in its cache before loading any, and throws on the first one that misses a file; before each load, MiniSearch now deletes the files of models whose download did not finish, so only that model downloads again.
    • The default system prompt's citation example is now a placeholder, [example.com](https://example.com/page), instead of a real YouTube video link that small models copied as if it were a source. On the benchmark's eleven core questions, over 110 answers from five small models, links to URLs that are not among the results fell from 12 to 7, the YouTube link disappeared, and the share of answers citing a result stayed level (48% before, 50% after). A saved prompt that is exactly the previous default moves to the new one; an edited prompt stays as it is.
    • Four models leave the Wllama catalog because they answer worse than LittleLamb 290M, the default for browsers without WebGPU and the catalog's quality floor: StableLM 2 Zephyr 1.6B, SmolLM 2 135M, Granite 4.0 350M and Pints 1.5B (16 to 25 points out of 84 on the benchmark, against 38 for LittleLamb). Granite 4.0 1B goes too: on WebGPU it writes only @ characters until it is stopped, though it answers well on the CPU. docs/wllama-model-evaluation.md now holds the scores of every catalog model and the rule that decided.
    • A browser whose saved settings point at a model that left the catalog switches to the default model on its next answer, and records the switch in the logs. Before, it failed to answer at all.
    • Browsers with WebGPU now start on their own default model, Gemma 3 4B, set with the new WLLAMA_DEFAULT_GPU_MODEL_ID; browsers without it keep LittleLamb 290M from WLLAMA_DEFAULT_MODEL_ID, which runs well on the CPU. Both only seed a profile that never saved settings. The GPU variable does not fall back to the CPU one, because .env.example sets that one and most deployments would otherwise hand GPUs the CPU model; a deployment that pinned WLLAMA_DEFAULT_MODEL_ID and wants the same model on GPUs should set both. Gemma 3 4B scored highest of twelve GPU candidates on the benchmark (docs/wllama-model-evaluation.md), with every point in two runs of fifteen questions in eleven languages, and on WebGPU it started answering in about 8 seconds.
    • Qwen 3.5 0.8B (533 MB) joins the Wllama catalog. On the benchmark's eleven core questions it scored 70 of 84 (one run), above larger models such as Qwen 3 1.7B (66) and Granite 4.2 3B (59), and on WebGPU it writes about 32 tokens per second. Like Qwen 3.5 4B it ignores reasoning_effort, so it thinks for the full 1024 tokens before most answers (about 33 seconds on an Apple M1 Max).
    • The README and the docs no longer give a number of models or a size range, so adding or removing a model does not leave them out of date.
    • Thinking models get a 1024-token reasoning budget instead of 256, because a chain of thought cut off that early degraded the answer. Every model is also asked for reasoning_effort: "low", which Granite 4.2 and Spark X2.6 honor by thinking less; the other templates ignore it. Five models that think by default had no budget at all and now get the same 1024 tokens: LittleLamb 290M, Qwen 3 0.6B, Qwen 3 1.7B, Polaris 4B and DeepSeek R1 Distill Qwen 1.5B. LittleLamb, the default for browsers without WebGPU, thought for up to 3,663 tokens on a single answer and sometimes never answered; with the budget it answered all 33 questions of three benchmark runs.

    2026-11-05

    • Relative month and year words in a query are anchored to absolute ones before the search leaves the browser: "next month" reaches the engines as "December 2026" and "明年" as "2027年". The anchor is appended rather than substituted, so a query that already names a year keeps its own phrasing, and two anchors per query is the ceiling. The typed query still drives the pr
  2. 2026.11.3.12026-11-03 · 2026-11-03 18:55 UTC
    查看更新说明

    2026-11-03

    • The five thinking models added on 2026-11-02 (Spark X2.6 1.7B and 4B, Granite 4.2 3B, Qwen 3.5 4B, Gemma 4 E2B) no longer ship with thinking switched off. Their chain of thought arrives on wllama's reasoning_content channel and is now wrapped in the configured reasoning markers, so the existing thinking UI shows it while the model reasons and the answer streams in after. The model warmup counts a reasoning token as a working model, so thinking models no longer log a failed warmup.
    • The same five models now cap their chain of thought with reasoningBudgetTokens (wllama's reasoning_budget_tokens, 256 tokens): when the model has thought that long without answering, the engine closes the reasoning channel and forces the final answer. Without the cap, Spark X2.6 and Granite 4.2 could spend the whole 4096-token context on reasoning and deliver no answer at all.
  3. 2026.11.32026-11-03 · 2026-11-03 01:52 UTC
    查看更新说明

    2026-11-02

    • Five new browser models joined the Wllama catalog: Spark X2.6 1.7B, Granite 4.2 3B, Qwen 3.5 4B, Gemma 4 E2B and Spark X2.6 4B, each tested end to end against the shipped wasm build with the search-answer prompt. The Gemma 4 and Qwen 3.5 architectures were previously absent from the catalog, and the new entries run on the wasm engine's supported architectures (gemma4, qwen35, spark2_5, granite). Models whose chat template thinks by default ship with chatTemplateKwargs: { enable_thinking: false }, a new per-model field passed to wllama as chat_template_kwargs, because MiniSearch renders only the content channel and a thinking template would otherwise spend the whole token budget on reasoning and answer with nothing. docs/ai-integration.md now records the two measured ceilings a candidate must fit (shard files under 2000 MiB, since Chromium's OPFS silently truncates beyond it; total weights under ~3.7 GB, since the wasm linear memory caps at 4 GiB), and npm run wllama-catalog-check HEADs every shard of every catalog model on HuggingFace to verify the claimed sizes.
  4. 2026.10.202026-10-20 · 2026-10-20 02:42 UTC
    查看更新说明

    Release 2026.10.20. See changelog.md for notable changes, and the compare view for the full commit list.

  5. 2026.10.112026-10-11 · 2026-10-11 00:56 UTC
    查看更新说明

    2026-10-10

    • The text-search fallback now cascades over Parallel and You.com instead of asking a single provider. On each search the configured providers are tried in a random order, one after the other, until one returns results, under the same 15-second budget, which is split across the providers still untried and not paused so a hanging one cannot starve the rest. A provider that answers HTTP 429 is paused until its Retry-After and skipped meanwhile, as You.com's acceptable use policy asks. A single search can now reach more than one provider; each sees the query text and this server's IP address, never the user's. SEARCH_FALLBACK_PROVIDERS picks the providers (all of them when empty), and SEARCH_FALLBACK_PARALLEL_API_KEY and SEARCH_FALLBACK_YOUCOM_API_KEY hold the optional keys. SEARCH_FALLBACK_PROVIDER and SEARCH_FALLBACK_API_KEY are removed: if either is still set while the fallback is enabled, the server stops at start with an error naming the replacement, and so does a provider key with a control character inside it. /status gained per-provider counters under searches.fallbackProviders.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    About

    MiniSearch is a self-hosted search engine with an AI assistant.

    The AI can run entirely inside your browser tab, on GPU or CPU, so a working setup needs no API key, no separate inference server, and no third party seeing your queries. Web results come from a bundled SearXNG metasearch instance, are reranked locally, and the whole thing ships as a single Docker container.

    Features

    • Private by design. No tracking, no telemetry, no accounts. Search history, cached results, and chats are stored in your browser and never leave your machine.
    • AI in your browser. Pick from several curated models that run on WebGPU where available and on CPU elsewhere. Models are downloaded once and cached by the browser.
    • Any backend you like. Connect an OpenAI-compatible API (Ollama, LM Studio, vLLM, llama.cpp server, or a hosted provider), use the crowdsourced AI Horde, or let the server proxy your own API without exposing its key.
    • A real search pipeline. Text and image results aggregated by SearXNG, reranked locally by a cross-encoder model, cached, and rate-limited; all inside the container.
    • Answers you can verify. Responses cite the sources they draw from, support follow-up questions with conversation memory, reveal the model's reasoning on demand, and can be read aloud.
    • Local history and analytics. Fuzzy-searchable history with pinning and full-session restore, plus usage statistics and an activity heatmap. Retention is configurable, and storage stays in the browser.
    • Fits your workflow. Set it as your browser's default search engine, trigger it from Raycast, embed it in your own pages, and optionally protect your instance with access keys.

    Quick start

    Run the published image:

    docker run -p 7860:7860 ghcr.io/felladrin/minisearch
    

    Then open http://localhost:7860 and start searching.

    latest moves on every release, so it changes under you. To stay on a known-good build, pin the digest, which always identifies the same image:

    docker inspect --format '{{index .RepoDigests 0}}' ghcr.io/felladrin/minisearch:latest
    docker run -p 7860:7860 ghcr.io/felladrin/minisearch@sha256:1a2b3c...
    

    The version the running instance reports (in the menu, and under build on /status) tells you which commit it was built from.

    Images carry provenance and SBOM attestations, which you can inspect with:

    docker buildx imagetools inspect ghcr.io/felladrin/minisearch:latest
    

    Add the service to your docker-compose.yml:

    services:
      minisearch:
        image: ghcr.io/felladrin/minisearch:latest
        ports:
          - "7860:7860"
    
    git clone https://github.com/felladrin/MiniSearch.git
    cd MiniSearch
    docker compose -f docker-compose.production.yml up --build
    

    Duplicate the Space to get your own hosted instance, no server required. Environment variables can be set in the Space settings.

    How it works

    flowchart LR
        subgraph browser [Your browser]
            UI[Search UI]
            LocalAI[In-browser model<br/>WebGPU or CPU]
            Storage[(IndexedDB<br/>history and cache)]
        end
        subgraph container [Docker container]
            Server[App server]
            SearXNG[SearXNG<br/>metasearch]
            Reranker[Reranker<br/>ONNX Runtime]
        end
        UI <--> Storage
        UI -->|search| Server
        Server --> SearXNG
        SearXNG --> Web((Web))
        Server --> Reranker
        UI -.->|in-browser inference| LocalAI
        UI -.->|remote inference, optional| RemoteAPI[OpenAI-compatible API<br/>or AI Horde]
    

    Your query goes to the app server, which asks the bundled SearXNG instance to aggregate results from multiple search engines. The server reranks them with a small cross-encoder model before returning them, and the browser caches them locally. If the AI response is enabled, the assistant reads the top results and writes a cited answer, either with a model running in your browser or through the backend you configured. The full picture is in docs/overview.md.

    Configuration

    MiniSearch works out-of-the-box, but you can customize it if you want. More details at docs/configuration.md.

    FAQ

    Add a custom search engine in your browser settings using the pattern http://localhost:7860/?q=%s, replacing the host with your instance's address. Your search term replaces %s.

    Add this Quicklink to Raycast, and edit it to point to your own instance if you have one.

    Yes. Open the menu, set "AI Processing Location" to Remote server (OpenAI-compatible API), then fill in the base URL, and optionally an API key and a model name. If the model is left blank, it is picked from the ones the API lists.

    Yes. Configure the INTERNAL_OPENAI_COMPATIBLE_API_* variables from the Configuration table and restart the container. A new option with the name you chose appears in the "AI Processing Location" menu, and the key stays on the server.

    Contributing

    See the Contributing Guidelines, Code of Conduct, and Security Policy.

    Releases

    Each release is cut with a CalVer tag (YYYY.M.D). Notable changes are documented in the Changelog.

    License

    Apache License 2.0