2026-09-23
- Moved the bi-encoder's dense passage scoring to a worker thread.
onnxruntime-noderuns inference synchronously on the calling thread, so a scoring pass stopped the server's event loop for its whole duration and nothing else could be served while it ran, including the concurrent /page-content reads that share the model. On a 200-passage pool the worst main-thread stall went from 815 ms to 1.5 ms, and the pass finished in 2.7 s instead of 6.1 s, with the scores byte-identical. A worker that fails to start or dies mid-request answers with empty scores, which the page reader already treats as "rank lexically".
2026-09-22
- Security: the search token is now generated by each server process on first use instead of being read from the temp directory. The image build used to write one into the image, so every container of a build ran with the same token, and anyone who pulled the image could read it from the layer. That token gates /search, /page-content, /thumbnail and /inference.
- Batched the bi-encoder's dense passage scoring so a page of passages runs in a few forward passes instead of one per passage, cutting the dense-scoring time.
- Fixed the history filter re-reading the whole history window from IndexedDB on every keystroke; typing now re-filters the entries already loaded, with the search debounced.
- Removed the dismissible "Tips" box from the settings menu. The features it pointed at are documented in the repository.
- Fixed SearXNG dying at startup with "attempt to write a readonly database" on instances that mount their own settings file. The image build ran its import check as root and left SearXNG's SQLite caches owned by root, so the container, running as
node, could not rebuild them when its secret key differed from the build-time one. Every query returned a 502 while the container still reported healthy. The build now clears those caches and their-shmand-walsidecars, so the running user creates its own on first start. - Fixed an open tab staying stuck on a 401 after the server rotated its search token. A restart, a second instance, or a dev-server reload left the client hashing a token the server never issued, and the cached /api/config was never dropped. A 401 from the search endpoint now refetches the config and retries the search once; a second 401 is reported as the failure it is, so a token the server will never accept cannot drive a loop of config fetches.
- Documented how to tune the bundled SearXNG engines at container start through
SEARXNG_SETTINGS_PATH, without rebuilding the image: the difference between thedisabledandinactiveswitches, why a build arg with the same name changes nothing at runtime, and the /status, log, and direct-query checks that show which engines are answering and which are blocked from your IP.
2026-09-21
- Security: cleared every fixable high and critical vulnerability from the Docker image, covering the Debian base packages, npm's bundled dependency tree, SearXNG's vendored Python packages, and build-only dependencies that were shipping in the runtime image.
- Answered a rejected or stripped search token with a readable page that links back to the app, when the browser asked for HTML.
- Fixed page-content ranking to fuse dense bi-encoder scores with the lexical ranking instead of using lexical alone, so the passages selected for the prompt match the query better.
- Fixed the "Clear all history" button to stay enabled when AI responses or chat messages remain even with no searches, and its confirmation now names all three things it deletes.