grove

Search and palettes

Three navigation surfaces: a file palette, full-text project search, and a command palette. Find a file, find a string, run a command.

File palette — Cmd+P

VS Code-style fuzzy quick-open over the whole workspace.

  • Matching runs off the main thread (an fzf index in a Web Worker), so results never lag the cursor even on large repos.
  • Ranking blends the fuzzy score with basename and recency boosts — files and folders you touch often float up. An empty query just shows your recent files.
  • Path-style queries work: auth/serv matches the directory against auth and the filename against serv.
  • Smart-case: lowercase queries match case-insensitively; add a capital to make it strict.
  • When a task is active, that task's changed files are indexed too, tagged as overlay entries.
  • Inside the markdown editor, typing @ opens an inline version of the same index to insert a file link. See Markdown editor.

Project search — Cmd+Shift+F

ripgrep on file contents, run from the Rust backend.

  • Honours .gitignore by default.
  • Literal by default; toggle the regex pill in the search bar to switch to a regex matcher.
  • Results stream in as ripgrep finds them and the list is virtualized — a thousand-match query doesn't block the UI.
  • Per-file result groups with line + context snippets; click a hit to jump to the file viewer at that line.

Command palette — Cmd+K

Fuzzy match over Grove's actions, grouped: Actions (new task, open last terminal), Panels (toggle task rail / file tree / comments), Editors (split pane, toggle chat, settings, shortcuts, project search), and File (copy relative/absolute path).

When the workspace has a GitHub remote, the palette also lists open pull requests live — selecting one opens it as a review task. See GitHub PR sync.

New-tab picker — Alt+N

Not an overlay: an empty editor tab renders as a picker. Tiles for New note, Browser, New terminal, New chat (docked as a pane tab), and Open file… (which hands off to the file palette).

Cmd+P vs Cmd+K

  • Cmd+P is purpose-built for filenames and is faster for "open this file."
  • Cmd+K is for actions: panels, panes, settings, PRs. Use it when "open this file" isn't what you want.

Indexing

  • The file index lives in memory, warms on first use, and is cached for a few minutes per workspace — a missed filesystem event self-heals when the cache expires.
  • No persistent text-search index: rg runs live per query. Snappy up to ~1M-LOC repos; we'll revisit if that stops being true.

Keyboard

Action Default
Command palette Cmd+K
File palette Cmd+P
Project search Cmd+Shift+F
New empty tab Alt+N

Within results: ↑ / ↓ move selection, Enter opens, Esc closes. Full list: Keyboard shortcuts.

Out of scope for now

  • Workspace-wide symbol search (LSP go-to-definition and find-references work within open files — see LSP).
  • Persistent / pre-warmed text index.
  • Search-and-replace across files.

Where this lives in the code

  • File index and palette: src/lib/fileSearchIndex.ts, src/workers/fileSearch.worker.ts, src/components/FilePalette.tsx.
  • Project search: src/components/ProjectSearch.tsx, src-tauri/src/search.rs.
  • Command palette and new-tab picker: src/components/CommandPalette.tsx, src/components/NewTabPicker.tsx.