otter-search is the desktop search daemon for Otter Shell. It indexes personal files and answers fuzzy path queries plus content (grep-style) search. Indexing and scoring run in pure Zig (otter_tools_search in otter-tools-core). No Rust or vendored fuzzy engines.
A companion CLI, otter-searchctl, queries the indexes, checks status, lists roots, or triggers a reindex. The daemon must be running for otter-searchctl to work.
The daemon watches the filesystem and reindexes on changes (debounced and throttled so bursts of writes do not thrash the index).
Binaries
otter-search: indexing daemonotter-searchctl: control CLI (talks to the daemon)
Starting the daemon
Run once per session (or add to autostart).CLI: otter-searchctl
path and content accept space-separated multi-word queries. Replies stop after max_results matches (default 10, clamped to 50).
Results print as JSON.
Example JSON (path)
root index, size, modified, and score.
Content results include preview, line, col, ranges, root, and score.
Configuration
~/.config/otter-shell/otter-search.conf
root_0_..., bare, and so on).
Options
status also reports top-level rss_kb / pss_kb plus per-root scan progress when available.
Heavy directories (.git, node_modules, .cache, .local, .cargo, and similar) are excluded by default. Content search also skips browser/editor storage and media/binary extensions.
Exclusions and safety
Built-in exclusions keep memory usage reasonable:- VCS dirs, build/cache dirs, dependency trees
- Hidden dirs (except
~/.config) - Symlinks are not followed for indexing
max_files_per_root it is marked too_large and skipped for recursive indexing.
Reindexing
Integration
- Scripts and tools can call
otter-searchctland parse JSON. - otter-launcher uses the daemon for
file/f(path) andgrep/g(content) modes. - Embedders:
otter_tools_searchandsearch_clientin otter-tools-core, schemas in otter-config-types.
Content search is capped and skips binaries and large files. For very large collections, tune budgets or limit roots.

