One fuzzy navigator for every workspace, agent, project, session, remote, directory, and action in Herdr.
Type what you remember. Navigator decides whether to focus, create, attach, hand off, invoke, or run—without making you remember which Herdr surface owns the destination.
prefix+t → type → Enter
Important
Upgrading from v0.3.1 or earlier? Sorry for the one-time breaking rename. Starting with v0.3.2, the plugin ID, binary, config directory, and action prefix are all herdr-navigator. See the migration steps below.
herdr plugin install thanhdat77/herdr-navigator --ref v0.3.2 --yes
herdr plugin action invoke herdr-navigator.openIf the overlay opens, add a shortcut to ~/.config/herdr/config.toml. Invoking open again focuses the existing Navigator in the current workspace instead of opening a duplicate:
[[keys.command]]
key = "prefix+t"
type = "plugin_action"
command = "herdr-navigator.open"
description = "jump to anything"Sorry for the migration. This completes the rename while the project is still young:
herdr plugin uninstall herdr-picker-plus
herdr plugin install thanhdat77/herdr-navigator --ref v0.3.2 --yes
herdr server reload-configReplace herdr-picker-plus with herdr-navigator in your Herdr keybindings. Navigator copies your old plugin config and Jump Back state into the new config directory on first run; the old files are left untouched. Local development links should use herdr plugin unlink herdr-picker-plus instead of uninstall.
Reload Herdr, then press prefix+t:
herdr server reload-configSource-aware rows keep live status, tabs, and panes aligned at a glance. Watch the full 17-second demo.
A single result list can move between live Herdr state and things that are not open yet:
- Type a repo name → focus its open workspace, or create one from a project, zoxide, or configured root.
- Type
@idleor an agent alias → focus that agent pane. - Filter remotes → hand off with Herdr's own
--remote TARGET --handoffflow. - Select an external integration → run its configured action.
| Capability | Why it matters |
|---|---|
| One index across Herdr | Search workspaces, agents, projects, sessions, remotes, directories, Quick Actions, and integrations together. |
| Action-aware Enter | Results do not just return paths; they focus, create, attach, hand off, invoke, or run. |
| Reuse first | Existing workspaces are focused before new ones are created. Project and directory workspaces sharing a cwd keep separate identities. |
| Agents are first-class | Search agent name, status, workspace, cwd, pane/tab/terminal IDs, session ID, and your own aliases. |
| Extensible without Rust | Add another tool with a command that returns JSON and a command that opens the selected item. |
| No picker dependency | The Rust/ratatui interface runs in a Herdr-managed pane; fzf and tv are not runtime requirements. |
Herdr's built-in navigation remains the simpler choice for a single entity type. Navigator is for the moment when “where next?” could mean a workspace, agent, path, session, remote, project, or action.
| Source | Data | Enter does |
|---|---|---|
workspace |
herdr workspace list + pane cwd |
Focus the exact workspace |
agent |
herdr agent list |
Focus the agent pane |
project |
Herdr Plus project TOML | Reuse or create a project workspace and apply tabs and split panes |
session |
Herdr sessions + configured local entries | Attach the local session |
server |
Configured remote targets | Hand off to the remote Herdr server |
zoxide |
zoxide query -l |
Reuse or create a directory workspace |
root |
Configured filesystem roots | Reuse or create a directory workspace |
quick |
Herdr Plus Quick Actions | Open the Quick Actions picker |
plugin |
Command/JSON integrations | Run the configured open command |
Every source can be disabled. Missing optional tools degrade quietly.
| Key | Action |
|---|---|
| type | Fuzzy search |
Enter |
Open selected item |
Up / Down |
Move selection |
Tab |
Cycle source filters |
Ctrl-W |
Workspaces |
Ctrl-A / @ |
Agents, using configured status order |
Ctrl-P |
Herdr Plus projects |
Ctrl-Q |
Herdr Plus Quick Actions |
Ctrl-S |
Remotes |
Ctrl-L |
Sessions |
Ctrl-Z |
Zoxide |
Ctrl-R |
Roots |
Ctrl-X |
Close the matching open workspace |
Ctrl-M |
Mark or unmark the selected item |
Ctrl-O |
Toggle preview |
Ctrl-U |
Clear query and filter |
? |
Show active keybindings |
Esc / Ctrl-C |
Back or close |
Status glyphs follow Herdr's prefix+g visual language: ◉ blocked/attention, animated Braille spinner working, ● idle, ✓ done, and ○ unknown. Marked items use ★, the focused workspace uses ◆, selection uses →, and source trees use ▾, ├─, and └─ markers.
Structured search narrows large result sets:
!claude # agent name
@idle # agent workspace/status
@Dotfiles # agent workspace label or id
/dotfiles # cwd/path
Set vim_mode = true for normal-mode j/k, source keys, and / search. All source shortcuts can be remapped through [picker.filter_keys].
Navigator remembers the workspace left by a successful local navigation. Bind the dedicated action for tmux-style current/previous toggling:
[[keys.command]]
key = "prefix+l"
type = "plugin_action"
command = "herdr-navigator.jump-back"
description = "jump to previous workspace"The previous workspace can also stay pinned at the top of the initial picker view:
[jump_back]
# Record local workspace transitions and enable the action.
enabled = true
# Pin the previous workspace only while the picker is unfiltered.
pin_previous = trueIf the previous workspace was closed, the next Jump Back clears the stale state and reports it.
Keep Navigator beside your work:
herdr plugin action invoke herdr-navigator.open-sideThe action opens the side pane, focuses it when it already exists, and closes it when invoked while focused. Unlike the overlay, the side pane stays open after Enter.
Optional binding:
[[keys.command]]
key = "prefix+shift+t"
type = "plugin_action"
command = "herdr-navigator.open-side"
description = "navigator side pane"Navigator writes a fully commented config on first run:
herdr plugin config-dir herdr-navigatorSee examples/default-config.toml for every option and its behavior. Common customizations:
[picker]
reuse_existing = true
create_missing = true
engine = "nucleo" # nucleo | skim | simple
source_order = ["workspace", "agent", "project", "session", "zoxide", "root", "server", "quick", "plugin"]
source_priority_boost = 5
agent_sort = "herdr" # herdr | priority | spaces
preview = true
detailed_rows = true # source-aware Herdr-style result rows
check_updates = true # daily background release check
vim_mode = false
[notifications]
enabled = true
audio = false # set true to enable sound
sound = "default" # default | custom
custom_sound = "" # Example: "~/sounds/navigator.wav"
[sources]
open_workspaces = true
agents = true
herdr_plus_projects = true
herdr_plus_quick_actions = true
sessions = true
servers = true
zoxide = true
roots = true
[[roots]]
path = "~/workspace"
max_depth = 3Useful config surfaces:
picker.detailed_rowsenables source-aware rows: right-aligned metadata for most sources and a full-path second line only for zoxide/root.picker.check_updateschecks GitHub releases in the background at most daily and shows↑ vX.Y.Z availablein the header; failures stay silent.[notifications]can disable notifications entirely or use Herdr's default sounds, no sound, or a custom audio file.[picker.filter_keys]remaps source shortcuts.[[agent_aliases]]adds memorable search terms without renaming Herdr panes.[sessions]controls local sessions and manual remote targets.[theme]inherits supported Herdr themes and custom tokens.[[integrations]]adds external command/JSON sources.
A tool only needs a list command and an open command:
[[integrations]]
id = "bookmarks"
label = "Bookmarks"
enabled = true
collect = "bookmarks list --json"
open = "bookmarks open {{id}}"
notify_success = true
notify_error = truecollect prints a JSON array:
[{"id":"abc","title":"Item","subtitle":"Info","path":"/tmp","kind":"bookmark"}]Navigator shell-quotes {{id}}, {{title}}, {{subtitle}}, {{path}}, and {{kind}} before running open. See docs/plugin-integrations.md for the full contract.
- Herdr
0.7.3or newer - Linux or macOS
- Optional:
zoxidefor directory history - Optional: Herdr Plus for project templates and Quick Actions
- Rust stable + Cargo only when building from source
Build and link locally:
git clone https://github.com/thanhdat77/herdr-navigator.git
cd herdr-navigator
cargo build --release
herdr plugin link "$PWD"Check that Herdr sees the plugin and its actions:
herdr plugin list
herdr plugin action list --plugin herdr-navigatorInspect every collected candidate without opening the TUI:
./target/release/herdr-navigator listIf a keybinding does nothing, verify the action ID and reload config:
rg "herdr-navigator.open" ~/.config/herdr/config.toml
herdr server reload-configOptional sources can be checked independently:
zoxide query -l
find ~/.config/herdr/plugins/config/cloudmanic.herdr-plus/projects -name '*.toml'docs/roadmap.md— roadmap and scope boundariesdocs/architecture.md— runtime flow and designdocs/integrations.md— Herdr/plugin integration patternsdocs/plugin-integrations.md— command/JSON contractCHANGELOG.md— released and unreleased changesCONTRIBUTING.md— development workflow
Herdr Navigator is intentionally small: reuse Herdr primitives, keep optional integrations optional, and make the common path prefix+t → type → Enter.
