HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
junegunn
fzf
Go2013–2026
junegunn / fzf

fzf

:cherry_blossom: A command-line fuzzy finder

210Distinct people
229Mentions
5Explicit recommenders
84.2KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

:cherry_blossom: A command-line fuzzy finder

GitHub

Where it is used

  • Canopy — Canopy uses fzf’s matching and scoring algorithm, hand-ported in shared/fuzzy.ts and compiled into its frontend bundle. This implements fuzzy matching inside the app. Source

What people are saying

`ripgrep` is my favorite of the "new" linux utilities Yeah, but only when used together with fzf, the other favorite new cross-platform shell utility. I mean, after rg spits…

stinos used a recommendation phrase. 5 indexed comments match. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year229 dated mentions

Observed mentions: 2013-11-05 12:23:55 UTC to 2026-10-19 23:55:18 UTC.

01020302013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 2 mentions; 2 submissions, 0 comments20132014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 15 mentions; 5 submissions, 10 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 10 mentions; 2 submissions, 8 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 22 mentions; 7 submissions, 15 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 23 mentions; 3 submissions, 20 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 22 mentions; 2 submissions, 20 comments20192020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 25 mentions; 1 submissions, 24 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 34 mentions; 2 submissions, 32 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 26 mentions; 1 submissions, 25 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 19 mentions; 0 submissions, 19 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 14 mentions; 2 submissions, 12 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 10 mentions; 2 submissions, 8 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 5 mentions; 0 submissions, 5 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC220
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC202
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC15510
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC1028
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC22715
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC23320
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC22220
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC25124
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC34232
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC26125
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC19019
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC14212
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC1028
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC505

From the project README

An excerpt from the repository, fetched Nov 12, 2026.

Read the project’s introduction
Show your love for fzf -- T-shirts, mugs, and stickers now available! fzf is a general-purpose command-line fuzzy finder and an interactive terminal toolkit. Whether you're selecting files, browsing command history, previewing data, navigating complex datasets with fuzzy matching, or creating custom menus and workflows, fzf provides the building blocks to turn shell scripts into rich terminal applications. Highlights Portable // Distributed as a single binary for easy installation Fast // Optimized to process millions of items in milliseconds Programmable // Event-driven architecture for building custom terminal interfaces and workflows Batteries-included // Comes with integrations for Bash, Zsh, Fish, Nushell, Vim, and Neovim Table of Contents Installation Using Homebrew Using Mise Linux packages Windows packages Using git Binary releases Setting up shell integration Vim/Neovim plugin Upgrading fzf Building fzf Usage Using the finder Display modes --height mode --popup mode Search syntax Environment variables Customizing the look Options Demo Examples Key bindings for command-line Fuzzy completion Files and directories Process IDs Host names Environment variables / Aliases Customizing fuzzy completion for bash and zsh Customizing fzf options for completion Customizing completion source for paths and directories Supported commands (bash) Custom fuzzy completion Fuzzy completion for fish Fuzzy completion for Nushell Vim plugin Advanced topics Customizing for different types of input Performance Executing external programs Turning into a different process Reloading the candidate list 1. Update the list of processes by pressing CTRL-R 2. Switch between sources by pressing CTRL-D or CTRL-F 3. Interactive ripgrep integration Preview window Previewing an image Tips Respecting .gitignore Fish shell fzf Theme Playground Related projects License Goods Sponsors ❤️ Installation Using Homebrew You can use Homebrew (on macOS or Linux) to install fzf. brew install fzf ImportantTo set up shell integration (key bindings and fuzzy completion), see the instructions below. fzf is also available via MacPorts: sudo port install fzf Using Mise You can use mise to install fzf. mise use -g fzf@latest Linux packages Package Manager Linux Distribution Command APK Alpine Linux sudo apk add fzf APT Debian 9+/Ubuntu 19.10+ sudo apt install fzf Conda conda install -c conda-forge fzf DNF Fedora sudo dnf install fzf Nix NixOS, etc. nix-env -iA nixpkgs.fzf Pacman Arch Linux sudo pacman -S fzf pkg FreeBSD pkg install fzf pkgin NetBSD pkgin install fzf pkg_add OpenBSD pkg_add fzf Portage Gentoo emerge --ask app-shells/fzf Spack spack install fzf XBPS Void Linux sudo xbps-install -S fzf Zypper openSUSE sudo zypper install fzf ImportantTo set up shell integration (key bindings and fuzzy completion), see the instructions below. Windows packages On Windows, fzf is available via Chocolatey, Scoop, Winget, and MSYS2: Package manager Command Chocolatey choco install fzf Scoop scoop install fzf Winget winget install fzf MSYS2 (pacman) pacman -S $MINGW_PACKAGE_PREFIX-fzf Using git Alternatively, you can "git clone" this repository to any directory and run install script. git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install The install script will add lines to your shell configuration file to modify $PATH and set up shell integration. Binary releases You can download the official fzf binaries from the releases page. https://github.com/junegunn/fzf/releases Setting up shell integration Add the following line to your shell configuration file. bash # Set up fzf key bindings and fuzzy completion eval "$(fzf --bash)" zsh # Set up fzf key bindings and fuzzy completion source <(fzf --zsh) fish # Set up fzf key bindings fzf --fish | source Nushell -- Nushell does not support piping into source, so the install script generates a file in the autoload directory. If you didn't use the install script, you can manually set it up: # Generate the integration script mkdir ($nu.default-config-dir | path join "autoload") fzf --nushell | save -f ($nu.default-config-dir | path join "autoload" "_fzf_integration.nu") Note--bash, --zsh, --fish, and --nushell options are only available in recent versions of fzf. If you have an older version of fzf, or want finer control, you can source individual script files in the /shell directory. The location of the files may vary depending on the package manager you use. Please refer to the package documentation for more information. (e.g. apt show fzf) TipYou can disable CTRL-T, CTRL-R, or ALT-C bindings by setting the corresponding *_COMMAND variable to an empty string when sourcing the script. For example, to disable CTRL-R and ALT-C: bash: FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= eval "$(fzf --bash)" zsh: FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= source <(fzf --zsh) fish: fzf --fish | FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= source nushell: add to your env.nu: $env.FZF_CTRL_R_COMMAND = ""; $env.FZF_ALT_C_COMMAND = "" Setting the variables after sourcing the script will have no effect. Vim/Neovim plugin If you use vim-plug, add this to your Vim configuration file: Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' junegunn/fzf provides the basic library functions fzf#install() makes sure that you have the latest binary junegunn/fzf.vim is a separate project that provides a variety of useful commands To learn more about the Vim integration, see README-VIM.md. TipIf you use Neovim and prefer Lua-based plugins, check out fzf-lua. Upgrading fzf fzf is being actively developed, and you might want to upgrade it once in a while. Please follow the instruction below depending on the installation method used. git: cd ~/.fzf && git pull && ./install brew: brew update; brew upgrade fzf macports: sudo port upgrade fzf chocolatey: choco upgrade fzf vim-plug: :Plu
Read the full README on GitHub

What Hacker News says

229 sources
Sweet! Well-expressed, and well-explored. It's easy to setup an interface that makes search a bit easier still, including showing you a list as you interactively filter history, with fzf, [gh-fzf]. Examples of what users use most frequently, the key-bindings.{bash,zsh} has history key binds [arch-fzf]. The developer, junegunn, writes about it more generally, and all the other fun ways you can apply it [dev-fzf]. For a few years, I wrote history files per shell-spawn, and loaded a batch of history from recent days to keep fresh what's in the immediately searchable history. Nowadays, I've just offloaded that to atuin [atuin], which I install from brew or with cargo binstall. Much less configuration, and now get to quickly explicitly switch between history lists filtered as: global, host (you can sync among hosts), session, directory, -- I d
Read the rest
In Faster command recall with substring search
This is the .zshrc file I have in my dotfiles. It auto installs everything if you don't have it. Starts effectively instantly. External dependencies (or remove their line at the bottom) - [Mise](https://mise.jdx.dev/) fast asdf, runner, and direnv replacement - [oxide](https://github.com/ajeetdsouza/zoxide) smart and fast cd replacement -[atuin](https://atuin.sh/) ctrl + r and shell history finder - [fzf](https://github.com/junegunn/fzf) fuzzy finder ``` # Plugin Manager declare -A ZINIT ZINIT[NO_ALIASES]=1 ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git" [ ! -d $ZINIT_HOME ] && mkdir -p "$(dirname $ZINIT_HOME)" [ ! -d $ZINIT_HOME/.git ] && git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME" source "${ZINIT_HOME}/zinit.zsh" autoload -Uz compinit; compinit # Plugins zinit light Aloxaf/fzf-tab zstyle '
Read the rest
:fzf-tab:' use-fzf-default-opts yes zinit light zdharma-continuum/fast-syntax-highlighting zinit light zsh-users/zsh-autosuggestions # Starship zinit ice as"command" from"gh-r" \ atclone"./starship init zsh > init.zsh; ./starship completions zsh > _starship" \ atpull"%atclone" src"init.zsh" zinit light starship/starship zstyle ':fzf-tab:complete:' fzf-bindings 'shift-tab:toggle' zstyle ':fzf-tab:' switch-group ',' '.' zstyle ':fzf-tab:' continuous-trigger '`' source <(fzf --zsh) eval "$(mise activate zsh)" eval "$(zoxide init zsh)" eval "$(atuin init zsh --disable-up-arrow)" ```
In Oh My Zsh adds bloat
That sounds like you've already got it pretty well figured out, then. :) If you did want to get fuzzy-matching in your workflow, I might recommend using building a small alias/function with fzf[1], rather than using zoxide. Something like `dst=$(cat ~/myprojectlist.txt | fzf) && cd $dst && source sourceme`. You wouldn't get the list sorted by most-frequent/recent like you do with zoxide, but it sounds like that's not what you're looking for anyways. [1] https://github.com/junegunn/fzf
In Zoxide: A Better CD Command
Sure, fzf alone doesn't quite deliver the same UX if you need to visually preview the files. It does support sixel and other preview options though[1], and I'm sure that kind of workflow could be put together in other ways, but I can see how the experience would be better in a GUI tool. To be fair, I think this feature is not built into dired either and would require an additional package[2], so it still requires some customization as well. > In my experience, the kind of random, ad hoc browsing, previewing, editing, marking and unmarking files, I'm talking about isn't quite as straightforward in the shell. It's certainly possible, but it doesn't feel as seamless or fluid as it does in Emacs. But again, this is not a competition. Certainly. We should all use the tools we feel most comfortable with. And, frankly, the kind of visual selecti
Read the rest
on you mentioned is not something I frequently do myself. In the rare cases I've had to, I was fine with a more rudimentary approach of previewing the files in whatever program can read them and mapping them to filenames manually. Doing this with dired, fzf with preview mode, or in a proper file manager, whether that's in a terminal with something like lf or in a more featureful GUI one, would've probably been faster. That said, I was also objecting to your original claim that this cannot be easily done with standard Unix tools. At the end of the day, the choice of tools and what is easier to accomplish is subjective. I personally don't like relying on a single tool for my workflows, so I use Emacs strictly for editing text files. I even prefer the Git CLI over Magit, which is pretty blasphemous in the Emacs world. :) And I really like composing small purpose-built tools in the shell, especially if I can repurpose them in some way I hadn't done before, so using the shell instead of a file manager feels more natural to me. But they're all preferences, and it would be silly to claim that one is objectively inferior or superior to another. Cheers! [1]: https://github.com/junegunn/fzf?tab=readme-ov-file#previewin... [2]: https://github.com/protesilaos/dired-preview
In Emacs dired-mode as a file manager
fzf 0.60.3-1 from March 3rd is the latest in Debian, 0.61.1 from April 4 the latest upstream, so Debian is not exactly ancient. I guess you are using stable Debian? That doesn't get newer upstream releases, if you want the latest Debian fzf you can just install the build from unstable, which should work fine since Go does static linking, and there are often backports for when unstable packages can't be installed on stable. https://github.com/junegunn/fzf/tags https://tracker.debian.org/pkg/fzf
In AI can't stop making up software dependencies and sabotaging everything

Showing the 15 most recent of 229 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.