Skip to main content
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 daemon
  • otter-searchctl: control CLI (talks to the daemon)

Starting the daemon

Run once per session (or add to autostart).
Add otter-search to your compositor autostart so indexes are ready early. The daemon binds $XDG_RUNTIME_DIR/otter-shell/otter-search.sock.

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)

Path results include root index, size, modified, and score. Content results include preview, line, col, ranges, root, and score.

Configuration

~/.config/otter-shell/otter-search.conf
See the otter-conf Dynamic docs for accepted forms (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
If a root exceeds max_files_per_root it is marked too_large and skipped for recursive indexing.

Reindexing

Use after large file operations or when you want fresh results immediately. The daemon also watches for changes and applies live reindex with debounce and throttle.

Integration

  • Scripts and tools can call otter-searchctl and parse JSON.
  • otter-launcher uses the daemon for file / f (path) and grep / g (content) modes.
  • Embedders: otter_tools_search and search_client in 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.