Connect Hematite to a local SearXNG instance for private, unlimited, and high-fidelity web search.
- Privacy-first: your search queries stay behind your own SearXNG proxy instead of being tied directly to your identity.
- Unlimited research volume: no per-query billing, no API quotas, no central search proxy bottleneck.
- No tracking: your search history is not being logged by a third-party agent platform.
- Authoritative technical truth: Hematite can look up current API versions, package releases, and runtime behavior beyond model cutoff dates.
- Zero ongoing cost: once Docker is installed, the research layer runs locally on your machine.
- Hardened defaults: Hematite ships an opinionated SearXNG scaffold tuned for technical research instead of making you assemble it manually.
- Safer upstream posture: the default scaffold now favors a smaller technical-source pool rather than the older broad 12-engine profile, reducing unnecessary upstream query fan-out and lowering the chance of rate limits or bans.
Hematite v0.6.0+ can now scaffold and boot the local search stack for you.
- Install Docker Desktop and make sure the Docker daemon is running.
- Leave
auto_start_searxenabled in.hematite/settings.json, or set it explicitly:{ "auto_start_searx": true } - Launch Hematite.
If searx_url is unset or points at a local address such as http://localhost:8080, Hematite will:
- Scaffold the stack under
~/.hematite/searxng-localunlessHEMATITE_SEARX_ROOToverrides it. - Detect whether SearXNG is already reachable.
- Run
docker compose up -dif it is offline. - Wait for the local search endpoint to respond before continuing startup.
If the service is already running, Hematite reuses it and does not blindly restart the stack.
If Docker Desktop is missing or the daemon is offline, Hematite now surfaces a compact startup note telling you exactly what is wrong instead of failing silently.
You can still scaffold the files manually from the repo root:
powershell -ExecutionPolicy Bypass -File scripts/setup-searxng.ps1Hematite now automates much of the upkeep, but you can manually control the SearXNG backend too.
curl http://localhost:8080Or verify the JSON API directly:
curl "http://localhost:8080/search?q=hematite&format=json"cd $HOME\.hematite\searxng-local
docker compose downcd $HOME\.hematite\searxng-local
docker compose up -dThe current scaffold defaults to this safer technical pool:
- duckduckgo
- brave
- mojeek
- wikipedia
- github
- stackoverflow
- npm
- crates.io
That is a better fit for a personal development machine than the older broad 12-engine setup, which created more upstream traffic and more opportunities for rate limits.
If you want to widen it later, edit searxng/settings.yml manually.
By default, Hematite v0.6.0+ will attempt to automatically start the local SearXNG stack if:
auto_start_searxistruesearx_urlis unset or points at a local address- Docker Desktop is installed and running
To disable startup automation:
{
"auto_start_searx": false
}If you want Hematite to stop only the SearXNG instance it started in the current session when the app exits:
{
"auto_stop_searx": true
}Hematite only auto-stops session-owned stacks. It does not blindly tear down a SearXNG instance that was already running before Hematite started.
- Docker not found: install Docker Desktop or set
auto_start_searxtofalse. - Docker daemon offline: start Docker Desktop, then relaunch Hematite.
- Port conflict: edit
docker-compose.yamlin your SearXNG root to map a different host port, then updatesearx_urlin.hematite/settings.json. - Custom location: set
HEMATITE_SEARX_ROOTif you want the stack outside~/.hematite/searxng-local. - Already running elsewhere: point
searx_urlat that instance and Hematite will use it instead of trying to manage a local stack.
- Docker Desktop installed and running on Windows.
- At least 1 GB of free RAM for the SearXNG containers.
Create a dedicated folder for your SearXNG instance:
mkdir searxng-local
cd searxng-local
mkdir searxngCreate this in your searxng-local root:
services:
searxng:
container_name: searxng
image: docker.io/searxng/searxng:latest
restart: always
networks:
- searxng
ports:
- "8080:8080"
volumes:
- ./searxng:/etc/searxng:rw
environment:
- SEARXNG_BASE_URL=http://localhost:8080/
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
networks:
searxng:
ipam:
driver: defaultCreate this in the searxng/ subfolder. The formats section must include json for Hematite to work.
use_default_settings: true
server:
secret_key: "CHANGE_ME_TO_SOMETHING_RANDOM"
limiter: false
image_proxy: true
search:
safe_search: 0
autocomplete: ""
formats:
- html
- json
engines:
- name: google
engine: google
shortcut: g
use_official_api: false
- name: duckduckgo
engine: duckduckgo
shortcut: ddg
- name: bing
engine: bing
shortcut: b
- name: brave
engine: brave
shortcut: br
- name: qwant
engine: qwant
shortcut: qw
- name: startpage
engine: startpage
shortcut: sp
- name: mojeek
engine: mojeek
shortcut: mj
- name: wikipedia
engine: wikipedia
shortcut: wp
- name: github
engine: github
shortcut: gh
- name: stackoverflow
engine: stackexchange
shortcut: so
- name: crates.io
engine: crates
shortcut: crio
ui:
static_use_hash: true
query_in_title: trueFrom your searxng-local folder, either double-click start_searx.bat or run:
docker compose up -dHematite uses http://localhost:8080 by default for local search. If your SearXNG instance is there and reachable, research_web will use it automatically.
If you moved it to a different port, update .hematite/settings.json:
{
"searx_url": "http://localhost:8888"
}If you want Hematite to manage that custom local instance too:
{
"searx_url": "http://localhost:8888",
"auto_start_searx": true,
"auto_stop_searx": false
}