This document outlines the planned features and enhancements for gitnav. The project follows semantic versioning and aims to maintain backward compatibility.
Current Version: v0.2.0
gitnav aims to be the fastest and most intelligent git repository navigator, combining the speed of Rust with smart features like frecency-based sorting, rich git information, and extensible actions. The goal is to make repository navigation effortless for developers working across multiple projects.
Releases follow a when-ready approach prioritizing stability over fixed timelines. Minor versions target 2-3 month intervals, with patch releases as needed.
Theme: Flexibility & Customization Status: Partially Complete (shipped in v0.2.0-dev)
-
Search across different directory trees simultaneously
-
Config:
[search] paths = ["~/dev", "~/work", "~/projects"] max_depth = 5
-
Env var:
GITNAV_SEARCH_PATHS(colon-separated) -
Cache key accounts for all paths (sorted + joined with
|)
-
Skip directories that rarely contain useful repos
-
Config:
[search] ignore_patterns = ["node_modules", ".tox", "venv", "target"]
-
Env var:
GITNAV_IGNORE_PATTERNS(colon-separated)
- Branch name and dirty dot shown inline in fzf list:
gitnav main ● - Config:
show_inline_meta = true(default) under[ui] - Env var:
GITNAV_UI_INLINE_META
- Detects Rust, Node, Go, Python, Ruby, Java, C# projects
- Shows badge in list and preview:
[rust],[node],[go], etc. - Config:
badge_style = "text"(or"icon","none") under[ui] - Env var:
GITNAV_UI_BADGE_STYLE
- Pass a query as first argument:
gn gitopens fzf pre-filtered to "git" - Flag:
--query <STRING>/-Q <STRING> - Shell wrappers (zsh, bash, fish, nushell, powershell) detect first non-flag arg automatically
gitnav init powershellgenerates agnfunction for PowerShell- Invoke via:
Invoke-Expression (& gitnav init powershell)in$PROFILE
-
Goal: Allow users to override default cache directory
-
Config Example:
[cache] location = "~/custom/cache/path"
-
Use Case: Network drives, custom XDG setups
-
Status: Planned
-
Goal: Expose all fzf customization to power users
-
Config Example:
[ui] fzf_extra_flags = ["--exact", "--no-sort", "--tac"]
-
Status: Planned
Theme: Interactivity & Workflows Target: Q2 2026 Status: Planned
- Goal: Launch $EDITOR in the selected repository
- Implementation:
- Detect $EDITOR or fallback to common editors
- Use fzf's
--bindfor keybinding - Execute command via shell wrapper
- UX: Press
ctrl-oto open, exit fzf automatically
-
Goal: Launch lazygit TUI for selected repo
-
Implementation:
- Check if
lazygitis in PATH - Execute in interactive mode
- Alternative: Support custom TUI git clients via config
- Check if
-
Config Example:
[actions] git_tui = "lazygit" # or "tig", "gitui"
- Goal: Open GitHub/GitLab/Bitbucket URL in browser
- Implementation:
- Parse remote URL from git config
- Detect remote type (github.com, gitlab.com, etc.)
- Use platform-specific open command (xdg-open, open, start)
- Challenge: Handle SSH vs HTTPS remotes, custom domains
- Goal: Remove repo from frecency list (future feature)
- Status: Depends on v0.4 frecency tracking
- Implementation: Mark repo as excluded in frecency database
- FZF Integration: Use
--bind 'ctrl-o:execute(...)'pattern - Shell Wrapper: May need to enhance wrapper function
- Error Handling: Graceful fallback if action commands not found
- Testing: Manual testing required (hard to automate fzf interactions)
Theme: Smart Sorting & Context Awareness Status: Planned
-
Goal: Sort repos by frequency + recency of access
-
Algorithm: Similar to Firefox's frecency algorithm
- Recent visits weighted higher
- Frequency smoothed over time windows
- Decay function for old visits
-
Storage: SQLite database or JSON file in cache directory
-
Schema:
{ "repo_path": "/Users/you/dev/project", "visits": [ {"timestamp": 1234567890, "weight": 1.0}, ... ], "last_visited": 1234567890, "frecency_score": 87.3 }
-
Goal: Multi-factor ranking algorithm
-
Factors:
- Frecency score (if available)
- Last git activity (commit timestamp)
- Alphabetical (fallback)
-
Config Example:
[sorting] method = "frecency" # "frecency", "activity", "alpha" boost_recent_activity = true
- Project type detection is implemented (Rust, Node, Go, Python, Ruby, Java, C#)
- Badge shown in fzf list and type shown in preview pane
- Remaining: Workspace-aware actions (e.g.,
ctrl-truns tests) planned for a later release
-
Goal: Pin important repos to always appear at the top of results
-
UX:
- Press
ctrl-fto toggle favorite/pin status - Pinned repos show a
[*]indicator in the list - Pinned repos always sorted first, then by frecency/activity
- Press
-
Storage: Stored in frecency database alongside visit tracking
-
Schema:
{ "repo_path": "/Users/you/dev/important-project", "pinned": true, "pinned_at": 1234567890, "frecency_score": 87.3 } -
Config Example:
[sorting] method = "frecency" pinned_first = true # default: true
-
Implementation:
- Add keybinding in fzf with
--bind 'ctrl-f:...' - Store pin state in frecency database
- Sort algorithm: pinned repos → frecency → alphabetical
- Add keybinding in fzf with
-
Benefit: Quick access to critical projects without relying on visit history
- Performance: Frecency calculation must be fast (< 5ms)
- Privacy: Frecency data stored locally, never transmitted
- Migration: Smooth transition from non-frecency to frecency
- Testing: Generate synthetic visit data for benchmarks
Theme: Extensibility & Power Features Target: 2027 Status: Exploration
- Goal: Show all worktrees for a repository
- Implementation: Parse
.git/worktrees/, list all checkouts - Preview: Show worktree paths + branches
- Navigation: Option to select specific worktree
-
Goal: Optionally treat submodules as separate repos
-
Config Example:
[search] scan_submodules = true
-
Challenge: Avoid duplicate parent/child listings
- Goal: Show PR count, issue count, CI status in preview
- Requirements:
ghCLI installed and authenticated - Implementation: Call
ghcommands, cache results - Challenge: Rate limiting, authentication failures
Features explicitly out of scope:
- Non-git directory navigation: Use zoxide/z/autojump instead
- Remote repository browsing: Use GitHub/GitLab web UI
- Git operations: Use git CLI or lazygit/tig
- File-level navigation: Use fzf/fd/ripgrep directly
gitnav focuses on repository navigation and stays in its lane.
Have ideas not on this roadmap? Open an issue with the enhancement label!
- GitHub Issues: github.com/msetsma/gitnav/issues
- Discussions: github.com/msetsma/gitnav/discussions
Last Updated: 2026-04-02 Maintained by: @msetsma