Saved Trails are now first-class inside Wayfinder.
- Added a
Savedfacet for project saved Trails, available from the Trail menu and facet navigation. - Saved Trail rows show item counts plus active, modified, and last-active state.
- The preview pane now shows the ordered contents of a saved Trail before loading it.
- Pressing
<CR>on a saved Trail loads it into the working Trail and switches to the Trail facet. - The
STrail menu keeps the existing save/resume/load/rename/delete flow and now includesBrowse Saved Trails.
Empty, loading, and unavailable states now explain themselves inside the picker.
- Empty facets now show compact state rows such as
No references found,No likely tests found, orTrail is empty. - Loading rows and the top bar now name the pending source, such as
Loading LSP.... - Missing or unavailable sources now surface small reasons, including no LSP client, disabled text fallback, missing
rg, disabled Git, or files outside a Git repo. - State rows preview their explanation but do not jump, explore, pin, or export to quickfix.
Explore pivots are clearer before you press e.
- The top bar now shows the selected row's explore target, such as
Explore findUser. - Details mode includes the exact explore target location for the selected row when there is room.
euses the same target resolution shown in the UI, resolving symbols at code-row locations and falling back to file locations when no symbol is available.- Non-code rows now explain why they cannot be explored inside the picker.
The bottom keyhint bar can now get out of the way after the commands are familiar.
- Added
?to hide or show the bottom keyhint bar. - Hiding the keyhint bar lets the Wayfinder panes expand to the bottom of the frame.
- The visibility preference persists for the current Neovim session, and can be set with
layout.show_hints.
Explore targets can now be kept explicitly in Trail.
- Added
ainside Wayfinder to pin the current explored target into Trail. - Added
Ainside Wayfinder to pin the current explore path into Trail. - Trail now groups
a/Atarget pins separately fromprow pins. - Target/path pinning is explicit and dedupes existing Trail locations; exploring still does not auto-pin.
- Explore history remains temporary, while Trail remains the durable breadcrumb path.
Explore pivots are now reversible inside the picker.
- Added
b/finside Wayfinder to move backward and forward through explore history. - Explore history is session-local and separate from Trail; it does not save, load, pin, or mutate Trail items.
- The top bar now shows compact explore history state, using
Originalat the root target andBack Nafter pivots. - Opening a new Wayfinder session starts with clean explore history.
Wayfinder can now pivot from a selected code result and gather connected code from that location without leaving the picker.
- Added
einside Wayfinder to explore from the selected code result. - Exploring cancels stale source work, re-roots the session on the selected file location, and starts gathering again.
- Existing Trail items stay intact; exploring does not auto-pin or auto-switch to Trail.
- Git history rows are not explorable because they describe commits rather than precise code locations.
- LSP-backed exploration can reuse clients already attached to the previous buffer when pivoting to another loaded file.
Wayfinder's picker loop is smoother under slow backends and long status text.
- LSP-backed rows can now update progressively while slower LSP work is still pending.
- Git previews now ignore stale async callbacks when selection changes quickly.
- Likely Tests rows now target a relevant test block or symbol mention instead of always opening at line 1.
- Filtering still keeps the picker visible while updating results after the prompt completes.
- The top bar and keyhint bar now budget long text so subject, filter, Trail, and reason labels do not overflow the Wayfinder frame.
Saved Trails now remember the last Trail you worked with, and you can resume it explicitly when you come back to a project.
- Added
:WayfinderTrailResumeto load the last active saved Trail for the current project. - Added
Resume Last Trailto the in-picker Trail menu. - Saving, loading, cycling, renaming, and deleting saved Trails now keep the stored last-active Trail state correct.
:checkhealth wayfindernow reports the last active saved Trail when one is available.- Normal
:Wayfinderopens still start normally; saved Trails are only resumed when you ask for them.
fix(v0.2.1): polish saved Trail status and preview context
Commit message
fix(v0.2.1): polish saved Trail status and preview context
- ui(topbar): show saved Trail counts in the existing Trail status area
- health: report saved Trail storage root/file details and current-project saved counts
- preview(header): show clearer project-relative file context with line ranges in the preview header
- layout(size): make narrow-editor fallback warnings more specific about the space the 3-pane layout needs
Changed
-
Saved Trail count in the top bar
- The existing Trail status area now includes the current project's saved Trail count when it is relevant.
- Examples include:
Trail (2 saved)Trail (2 saved) • unsavedTrail (3 saved): auth bugTrail (3 saved): auth bug • modified
-
Preview header context
- The preview header now keeps project-relative file context visible while also showing the selected line or line range.
- Git previews can show a short commit hash in that same header instead of using a separate label row.
-
Healthcheck Trail diagnostics
:checkhealth wayfindernow reports the saved Trail storage root, the current project's saved Trail storage file, and the saved Trail count for the current project.
-
Cleaner narrow-window fallback
- When the editor is too small for Wayfinder's centered 3-pane layout, the warning now includes an approximate minimum editor size instead of only saying that the window is too small.
-
Facet selection memory
- While Wayfinder stays open, moving away from a facet and coming back now restores the last selected item for that facet when it still exists.
- A fresh
:Wayfinderopen still starts clean at the top as before.
release(v0.2.0): add persistent named Trails per project
Commit message
release(v0.2.0): add persistent named Trails per project
- trail(save): add save/save-as/load/rename/delete support for named Trails scoped to the current project
- trail(ui): add saved/unsaved Trail state in the top bar and an in-picker S Trail menu
- trail(store): persist Trail data under stdpath("state") without changing normal unsaved Trail behavior
Added
-
Persistent named Trails per project
- Added explicit save, save-as, load, rename, and delete support for named Trails scoped to the current project.
- Saved Trails live under Neovim state instead of inside the repo.
- If you never save a Trail, ordinary Trail behavior stays the same.
-
Trail persistence commands
- Added
:WayfinderTrailSave - Added
:WayfinderTrailSaveAs - Added
:WayfinderTrailLoad - Added
:WayfinderTrailDelete - Added
:WayfinderTrailRename
- Added
-
In-picker Trail menu
- Added
Sinside Wayfinder to open a small Trail menu for save/load/rename/delete actions without introducing a second management UI.
- Added
-
Saved Trail cycling
- Added
[and]inside Wayfinder to cycle through saved Trails for the current project without reopening the Trail menu.
- Added
Changed
-
Top bar Trail state
- The existing Trail status area now reflects saved and unsaved working Trail state.
- Examples include:
Trail • unsaved • 3 itemsTrail: auth bug • 3 itemsTrail: auth bug • modified
-
Explicit persistence semantics
- Trail persistence is opt-in by action, not automatic.
- Pinning items does not auto-save them.
- Opening Wayfinder does not auto-restore a saved Trail in this first pass.
-
Persistence flow polish
- Save/load/rename/delete actions now suspend and restore the current Wayfinder session cleanly around
vim.ui.selectandvim.ui.inputprompts so prompt UIs do not appear behind the picker.
- Save/load/rename/delete actions now suspend and restore the current Wayfinder session cleanly around
-
Persistence storage and attachment safety
- Saved Trail attachment is now scoped to the current project, so
Save Trailonly reuses an active saved name inside the same repo. - The persisted
trailsJSON shape now stays stable even when deleting the last saved Trail.
- Saved Trail attachment is now scoped to the current project, so
-
Test harness organization
- Split the growing headless test harness into shared support plus grouped Trail, persistence, UI, filter, and source suites while keeping the same coverage.
release(v0.1.10): add compact match reasons for weaker result sources
Commit message
release(v0.1.10): add compact match reasons for weaker result sources
- refs(text): show a small plain-text fallback reason for grep-backed Text Matches
- tests(heuristics): show a concise why-this-matched reason for likely-test results
- git(selection): show a small file-touch reason for the selected Git item while keeping commit metadata in details
Changed
-
Clearer weak-source trust hints
- Text Matches, likely Tests, and Git selections can now surface a concise top-bar reason explaining why the current item showed up.
- This keeps weaker sources more trustworthy without cluttering the existing 2-line row model.
-
Examples of selection reasons
- Text Matches use a plain-text fallback reason.
- Test matches can surface filename or symbol-text matching.
- Git selections explain that the commit touched the current file.
-
Filter matching includes reasons
- The local
/filter now matches against these row reasons too, so filtering stays consistent with what the list shows.
- The local
-
More useful health output
:checkhealth wayfindernow reportsripgrep,git, current-buffer LSP clients, resolved scope, and the activeperformance/scope.modeconfig instead of only basic load status.
fix(v0.1.9): harden layout borders and narrow-editor opens
Commit message
fix(v0.1.9): harden layout borders and narrow-editor opens
- ui(border): default inner pane floats to border = "none" so global winborder settings do not break the 3-pane layout
- layout(size): detect editors that are too small for the centered 3-pane UI and abort cleanly instead of opening invalid pane widths
- tests(layout): add a regression test for the narrow-editor path so small windows warn and exit without leaving a stale Wayfinder session
Fixed
-
Inner pane border inheritance
- Inner Wayfinder panes now default to
border = "none"unless they explicitly request a border, so globalwinbordersettings no longer add nested borders inside the picker. - The outer Wayfinder frame still keeps its configured border style.
- This came in via PR #6. Thanks to @tomerlevy1 for the contribution.
- Inner Wayfinder panes now default to
-
Small editor crash
- Fixed a case where very narrow editor windows could drive the preview pane width to zero or below and crash Wayfinder with an invalid float width error.
Changed
-
Graceful narrow-window fallback
- Wayfinder now detects when the current editor is too small for the 3-pane layout, shows a short warning, and aborts cleanly instead of half-opening broken UI state.
-
Regression coverage for layout sizing
- Added a headless test for the too-small editor path so layout changes can keep this failure mode from regressing.
fix(v0.1.8): refine Trail pinning flow and preview context
Commit message
fix(v0.1.8): refine Trail pinning flow and preview context
- trail(pin): stop auto-switching into the Trail facet when pinning multiple items
- ui(list): mark already-pinned items on the second row of each result
- ui(topbar): keep Trail item counts visible after pin notices expire
- keys(filter): add <C-l> to clear the current local filter in-place
- preview(header): show a project-relative path line above the snippet so file context is visible without taking over the preview
Changed
-
Lighter pin flow
- Pinning no longer forces Wayfinder into the
Trailfacet after the second item, so collecting several items in a row stays focused on the current facet.
- Pinning no longer forces Wayfinder into the
-
Pinned item markers
- Result rows now show a small pinned marker on the second line once an item has already been added to Trail.
-
Persistent Trail status
- The top bar now keeps a steady
Trail • N itemsstatus after the temporaryPinned to Trailnotice expires, so the Trail state stays visible across facet changes.
- The top bar now keeps a steady
-
Faster filter reset
- Added
<C-l>inside Wayfinder to clear the current local filter and rerender immediately without reopening the picker.
- Added
-
Preview file context
- The preview pane now uses a project-relative path line above the snippet instead of starting code on the first row.
- This keeps the current file context visible while leaving the code preview itself as the main focus.
release(v0.1.7): add smarter local filter terms
Commit message
release(v0.1.7): add smarter local filter terms
- filter(query): support space-separated include terms with AND matching
- filter(negation): support !term exclusions in the local Wayfinder filter
- filter(phrases): support double-quoted exact phrases in local filter queries
Added
- Smarter local filter queries
- Added space-separated positive terms with AND semantics to Wayfinder's local
/filter. - Added negated terms with
!termso obvious noise can be excluded quickly. - Added double-quoted phrase matching for exact multi-word terms.
- Added space-separated positive terms with AND semantics to Wayfinder's local
Changed
-
Filter matching behavior
- Local filtering now matches against
label,secondary, anddetailusing parsed include/exclude terms instead of a single raw substring.
- Local filtering now matches against
-
Demo media refresh
- Refreshed the README screenshots and animated demo to show the current Wayfinder flow, including local filter usage, result movement, Trail pinning, and jump behavior.
fix(v0.1.6): clean up highlight API usage and timer safety warnings
Commit message
fix(v0.1.6): clean up highlight API usage and timer safety warnings
- ui(layout): replace deprecated buffer highlight calls in the Wayfinder layout with extmark-based range highlights while preserving pane styling
- preview: guard preview window attachment when the preview pane disappears mid-render
- lsp(async): clarify timer lifecycle and nilability in LSP and async helpers to avoid stale timer warnings
- util: normalize vim.system results and move debounce timers to vim.uv
Fixed
-
Deprecated layout highlight API
- Replaced deprecated buffer highlight calls in the Wayfinder layout renderer with extmark-based range highlights.
- Preserved the existing visual hierarchy for the facet rail, result list, top bar, and footer hints.
-
Preview window safety
- Fixed a case where preview rendering could try to attach a buffer to a preview window that had already been closed.
-
Timer lifecycle warnings
- Cleaned up timer handling in the LSP source and async helpers so timer creation and teardown are explicit and safer under static analysis.
Changed
-
Async helper result normalization
vim.system()results are now normalized before callback delivery instead of mutating the raw result object.
-
Debounce timer backend
- Debounce timers now use
vim.uvconsistently.
- Debounce timers now use
release(v0.1.5): keep Wayfinder responsive during slow LSP work
Commit message
release(v0.1.5): keep Wayfinder responsive during slow LSP work
- lsp(async): track and cancel stale LSP requests across open, close, refresh, and symbol changes
- lsp(bounds): chunk large LSP response processing and finalize safely on timeout instead of blocking the editor
- lsp(flow): defer expensive LSP facets slightly so the picker opens first and stays responsive while results load
Changed
-
Async LSP request lifecycle
- Wayfinder now tracks in-flight LSP requests per session and cancels or ignores stale work when the picker closes, refreshes, or reopens on a different symbol.
- Normal open and close paths stay responsive even when LSP-backed sources are still running.
-
Bounded LSP result processing
- Large LSP reference and caller payloads are processed in bounded chunks instead of one heavy pass on the main thread.
- Slow LSP-backed sources now finalize safely on timeout instead of leaving the picker stuck in a loading state.
-
Non-blocking open path
- Expensive LSP facets are deferred slightly behind the initial open so the centered picker appears first and remains interactive while results populate.
-
Full UI close on
:q- Running
:qfrom a focused Wayfinder pane now closes the full Wayfinder UI through the normal shutdown path instead of leaving part of the picker behind. - This came in via PR #4. Thanks to @joshuamblanch for the contribution.
- Running
Added
- Minimal LSP timeout control
- Added
limits.refs.timeout_msas an optional cap for slow LSP-backed collection in large repositories.
- Added
release(v0.1.4): add scope and performance controls for large repos
Commit message
release(v0.1.4): add scope and performance controls for large repos
- scope(config): add project/cwd/package/file_dir scope modes plus package markers and performance presets
- sources(limits): add per-source result caps and timeouts for refs, text matches, tests, and git
- jumps(tagstack): push the origin window position onto the tag stack before normal Wayfinder edit jumps so <C-t> returns cleanly
Added
-
Scope controls for large repos
- Added
scope.modewithproject,cwd,package, andfile_diroptions so Wayfinder can stay focused in large repos and monorepos. - Added configurable
package_markerssopackagescope can stop at the nearest app or module root.
- Added
-
Performance presets and source limits
- Added
performance = "fast" | "balanced" | "full"for quick tuning without rewriting the config. - Added per-source limits and timeouts for
refs,text,tests, andgitso expensive sources stay responsive.
- Added
-
Tag stack integration for edit jumps
- Normal Wayfinder edit jumps now push the origin position onto the tag stack so
<C-t>can return to where the jump started. - This came in via PR #2. Thanks to @joshuamblanch for the contribution.
- Normal Wayfinder edit jumps now push the origin position onto the tag stack so
Changed
- Scope-aware result gathering
- Text matches, likely tests, and git collection now respect the active Wayfinder scope instead of always searching the full project.
- LSP results are post-filtered to the active scope where practical, which makes package mode behave better in monorepos.
fix(v0.1.3): Trail remove keybinding conflict and Trail clear action (closes #1)
Commit message
fix(v0.1.3): Trail remove keybinding conflict and Trail clear action (closes #1)
- keys(trail): move details toggle from d to D so dd reliably removes pinned Trail items
- keys(trail): add da to clear the full Trail from inside Wayfinder
- ui(footer): expand the bottom keyhint strip to two lines so Trail actions are easier to discover
Fixed
- Trail remove keybinding conflict
- Fixed where
ddwould trigger the single-key details toggle instead of removing the selected pinned Trail item. - Details now use
D, soddworks reliably for Trail removal.
- Fixed where
Added
- Trail clear action
- Added
dainside Wayfinder to clear the full Trail quickly.
- Added
Changed
- Footer keyhint layout
- Expanded the bottom keyhint strip to two lines so movement, Trail actions, and export controls are easier to scan.
release(v0.1.2): quickfix export, Trail traversal, TrailShow, and focus polish
Commit message
release(v0.1.2): quickfix export, Trail traversal, TrailShow, and focus polish
- trail(quickfix): export the current facet or Trail to quickfix with readable file, line, column, and summary text
- trail(commands): add Trail next, previous, and open commands for navigation outside the Wayfinder UI
- trail(show): add WayfinderTrailShow and a TrailShow mapping to open Wayfinder directly on the Trail facet
Added
-
Quickfix export for the current facet
- Added
:WayfinderExportQuickfixto export the current visible facet in its current order, including filteredAllresults. - Added in-UI quickfix export so the active facet can be pushed into quickfix without leaving Wayfinder.
- Added
-
Trail quickfix export
- Added
:WayfinderExportTrailQuickfixto export Trail items to quickfix in Trail order.
- Added
-
Trail traversal outside the UI
- Added
:WayfinderTrailNext,:WayfinderTrailPrev, and:WayfinderTrailOpenso Trail can be used during normal editing without reopening Wayfinder. - Added
<Plug>(WayfinderTrailNext),<Plug>(WayfinderTrailPrev), and<Plug>(WayfinderTrailOpen)for optional user mappings.
- Added
-
Trail UI shortcut
- Added
:WayfinderTrailShowand<Plug>(WayfinderTrailShow)to open Wayfinder directly on the Trail facet without changing the meaning ofTrailOpen.
- Added
Changed
-
Trail navigation safety
- Trail traversal now skips invalid or deleted entries instead of breaking navigation flow.
-
Wayfinder focus stability
- Fixed a case where Wayfinder could leave input on the buffer behind the popup instead of keeping focus in the active Wayfinder pane.
feat(navigation): auto-advance empty calls, add reverse facet cycling, and wrap results
Commit message
feat(navigation): auto-advance empty calls, add reverse facet cycling, and wrap results
- navigation(symbol): switch to Refs on open when Calls is empty but Refs already has useful results
- navigation(facets): add <S-Tab> to move backward through facets
- navigation(results): wrap middle-pane movement so next/prev loops across the result list
Changed
-
Smarter initial facet selection
- Wayfinder now skips an empty
Callsview on symbol-open whenRefsalready has useful results, so the first facet is less likely to feel dead.
- Wayfinder now skips an empty
-
Reverse facet navigation
- Added
<S-Tab>to move backward through facets, alongside existing forward facet navigation with<Tab>.
- Added
-
Wrapped result movement
- The middle results pane now wraps at the ends, so moving down from the last result returns to the first, and moving up from the first returns to the last.