SearChat: a self-hosted conversational search stack built around SearXNG
Search + Chat = SearChat(AI Chat with Search), Support OpenAI/Anthropic/VertexAI/Gemini, DeepResearch, SearXNG, Docker. AI对话式搜索引擎,支持DeepResearch, 支持OpenAI/Anthropic/VertexAI/Gemini接口、聚合搜索引擎SearXNG,支持Docker一键部署。
At a glance
- What is it?
- SearChat wires a Vue front end, a Koa backend and a LangGraph research agent to your own search engines and model keys. The interesting part is not the chat UI, it is that the search layer can be a SearXNG instance you run yourself.
- Who is it for?
- Adopt SearChat if you already run SearXNG or hold model keys you want to keep inside your own network, and if you are comfortable editing model.json and docker-compose.yaml by hand. Do not adopt it if you need MCP tools, file upload or image search today, since all three are unchecked TODO items in the README.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 15 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The gap SearChat fills: search results that stay in your infrastructure
Most chat-with-search products make one of two choices. Either the search index belongs to the vendor, or the model does. SearChat's README positions it against both: it lists SearXNG first among supported search engines and describes it as open source aggregated search with no API key required, and it ships a SearXNG service inside the default docker-compose.yaml with SEARXNG_HOSTNAME pointed at http://searxng:8080. The model side is equally open: OpenAI-compatible, Gemini, Anthropic and Vertex AI endpoints are all listed. The intended user is someone who wants the conversational search experience but does not want the retrieval step to leave their network. That is a narrower audience than the README's feature list suggests, and it is the audience the design actually serves.
Architecture: a Turborepo monorepo with a Koa API and a Vue client
The repository is a Turborepo monorepo. The README names Node.js plus Koa for the backend and Vue 3 plus TypeScript for the frontend, and the Docker volume mount confirms the split: ./model.json is mounted to /app/apps/server/dist/model.json, so the server app is built into dist and reads its model configuration from a file at runtime rather than from environment variables alone. Chat history is stored client-side, in IndexedDB or LocalStorage according to the feature list. That choice keeps the server stateless with respect to conversations, which simplifies deployment but means history does not follow a user across browsers or devices. DeepResearch is a separate concern: it is orchestrated with LangChain and LangGraph, and the README notes it is also published as a standalone npm package called deepsearcher for use outside SearChat.
DeepResearch is the part you can lift out of the project
The README's example for the deepsearcher package is the clearest description of the mechanism anywhere in the material. You construct a DeepResearch instance with a searcher callback and an options object, then compile an agent and invoke it with a messages array. The searcher is your function, so retrieval is injected rather than hardcoded. Two options appear in the example: type set to 'openai', and enableCitationUrl, which defaults to true and produces superscript links in the form <sup>[[1](url)]</sup>; setting it to false switches output to the plain [[citation:1]] marker. In the Docker deployment the same behaviour is tuned through DEEP_MAX_RESEARCH_LOOPS and DEEP_NUMBER_OF_INITIAL_QUERIES, both set to 3 in the sample compose file. Those two keys are the cost dial. Each loop is another round of model calls and searches, and the README does not state a token or time budget for a run, so you are setting that ceiling yourself.
Getting it running: compose file, environment keys, model.json
The README recommends Docker and gives a three-step path. First, create a docker-compose.yaml based on deploy/docker-compose.yaml. Second, edit the search_chat service environment. The keys listed are PORT, BING_SEARCH_KEY, GOOGLE_SEARCH_KEY, GOOGLE_SEARCH_ID, TAVILY_KEY, ZHIPU_KEY, EXA_KEY, BOCHA_KEY, an optional JINA_KEY for web content extraction, the SearXNG block (SEARXNG_HOSTNAME, SEARXNG_SAFE, SEARXNG_LANGUAGE, SEARXNG_ENGINES, SEARXNG_IMAGES_ENGINES), the two DeepResearch variables, and an optional WHITELIST_DOMAINS. Third, create model.json alongside the compose file, in the same directory, and mount it into the container. The README states plainly that model configuration is required and that the model must support tool calling, flagged as an important note. All search keys are marked configure as needed, so a SearXNG-only setup needs no third-party search credentials at all. The README also warns that SearXNG needs network access to Google, which is the practical constraint that catches people deploying behind a restricted egress policy.
Where SearChat is the wrong tool
The README's own feature list is the best source of limitations. MCP support, image and video search, and file parsing are all unchecked TODO items. If your workflow assumes an agent that can call external MCP services, upload a PDF and ask questions about it, or return images alongside text, SearChat does not do those things yet, and the README does not commit to a date. A second constraint is the tool-calling requirement: a model without function calling will not drive the search loop, so cheaper or older endpoints that work fine for plain chat are not usable here. Third, DeepResearch is described as being refactored, which is a signal that the code path is in motion. Fourth, the default compose file in the README references image tag v1.2.0-alpha while the release list shows v1.2.2 and v1.2.3 as the most recent tags, so the documented example is not the newest artifact. Verify the tag before you pull.
Compared with running a hosted search API behind your own chat UI
The obvious alternative is to keep a chat front end and point it at a commercial search API, either Bing, Google CSE, Tavily, Exa or Bocha, all of which SearChat also supports. The difference is where the query goes and who can see it. With a hosted search API, every user question leaves your network and is billed per call, and the provider's index decides what is retrievable. With SearXNG, the query goes to a container you operate, which then fans out to engines such as Bing and Google according to SEARXNG_ENGINES. You trade API billing and vendor indexing for operational work: a SearXNG instance to keep alive, upstream engines that can rate-limit or change their HTML, and the egress requirement the README already flags. SearChat's value is that it supports both modes through the same configuration surface, so you can start with a hosted key and move to SearXNG later without changing the application.
Licence, upgrade path and what a version bump costs you
SearChat is MIT licensed, which places few restrictions on modification and redistribution; the usual obligation is preserving the copyright notice and licence text. That is a summary of the licence identifier in the repository, not legal advice, and if you redistribute the container image you should read the full text yourself. On maintenance, the release cadence visible here is uneven: v1.2.1 in December 2025, v1.2.2 later that same month, then v1.2.3 in May 2026, with the last push to the default branch in September 2026. The upgrade surface is small and mostly declarative. model.json is a mounted file, so a model change is an edit and a container restart rather than a rebuild. Environment variables live in your compose file. The riskier upgrade is the DeepResearch agent, because DEEP_MAX_RESEARCH_LOOPS and DEEP_NUMBER_OF_INITIAL_QUERIES control how much work a single query triggers, and a behaviour change in the agent between v1.2.2 and v1.2.3 will show up as different cost per query rather than as an obvious error.
Editorial conclusion
Adopt SearChat if you already run SearXNG or hold model keys you want to keep inside your own network, and if you are comfortable editing model.json and docker-compose.yaml by hand. Do not adopt it if you need MCP tools, file upload or image search today, since all three are unchecked TODO items in the README. Before committing, verify two things: that your chosen model actually supports tool calling, and that the container image tag in deploy/docker-compose.yaml matches a release you are willing to run, because the README's example pins v1.2.0-alpha while the newest tagged release is v1.2.3.
Community notes