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 8–Nov 15 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/15/2026, 10:01:16 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

14 sources
My non-built-in CLI utility recommendations, none of which are macOS specific: * atuin - TUI for shell history, backed by SQLite - https://github.com/atuinsh/atuin * LSD (LSDeluxe) - rewrite of `ls` - https://github.com/lsd-rs/lsd * ripgrep - https://github.com/BurntSushi/ripgrep * fzf - command-line fuzzy finder that enhances file search, command history search, and more - https://github.com/junegunn/fzf Notes: - To get pretty extra file/folder symbols with LSD, you'll probably need to install some special fonts. - You can use `fzf` and `ripgrep` together.
In Useful built-in macOS command-line utilities
> PowerShell has up-front required prerequisites that you can declare Anyone who's written more than a few scripts for others will have learned to do something like this at the start: declare -a reqs reqs+=(foo bar baz) missing=0 for r in "${reqs[@]}"; do if (! command -v "$r" &>/dev/null); then echo "${r} is required, please install it" missing=1 fi done if [ $missing -gt 0 ]; then exit 1 fi > Your script is very bravely trying to parse output that includes many different protocols, including: tcp, tcp6, udp, udp6, and unix domain sockets They probably didn't know you could specify a type. Mine only displays TCP4. > Now imagine putting your script side-by-side with the PowerShell script, and giving it to people to read. I'm gonna gatekeep here. If you don't know
Read the rest
what that script would do, you have no business administering Linux for pay. I'm not saying that in a "GTFO noob" way, but in a "maybe you should know how to use your job's tools before people depend on you to do so." None of that script is using exotic syntax. > Note that you had to use 'awk', which is a parser, and then three uses of 'grep' -- a regular expression language, which is also a kind of parsing. They _chose_ to. You _can_ do it all with awk (see my example in a separate post). > Literally in every discussion about PowerShell there's some Linux person who's only ever used bash complaining that PS syntax is "weird" or "hard to read". What are they talking about!? It's half the complexity for the same functionality, reads like English, and doesn't need write-only hieroglyphics for parameters. And yet somehow, bash and its kin continue to absolutely dominate usage. There is a reason that tools like ripgrep [0] are beloved and readily accepted: they don't require much in the way of learning new syntax; they just do the same job, but faster. You can load your local machine up with all kinds of newer, friendlier tools like fd [1], fzf[2], etc. – I definitely love fzf to death. But you'd better know how to get along without them, because when you're ssh'd onto a server, or god forbid, exec'd into a container built with who-knows-what, you won't have them. Actually, that last point sparked a memory: what do you do when you're trying to debug a container and it doesn't have things like `ps` available? You iterate through the `/proc` filesystem, because _everything is a file._ THAT is why the *nix way exists, is wonderful, and is unlikely to ever change. There is always a way to get the information you need, even if it's more painful. [0]: https://github.com/BurntSushi/ripgrep [1]: https://github.com/sharkdp/fd [2]: https://github.com/junegunn/fzf
In Techniques I use to create a great user experience for shell scripts
In addition, I think bash's `operate-and-get-next` can be very helpful. When you go back through your shell history, you can hit Ctrl+o instead of enter and it will execute the command then put the next one in your history on the command line, and keep track of where you are in your history. This way, you can rerun a bunch of commands by going to the first one and Ctrl+o till you are done. And you can edit those commands and hit Ctrl+o and still go to the next previously run command. Note: fzf's history search feature breaks this. https://github.com/junegunn/fzf/issues/2399 Edit: And up and down will still keep the relative position you are at in your history in case you want to skip a command.
In Ask HN: Any tool for managing large and variable command lines?
You probably already know these bits & bobs, but I wanted to share: [diff] external = difft Use the fantastic difftastic instead of git's diff. https://difftastic.wilfred.me.uk/ [alias] fza = "!git ls-files -m -o --exclude-standard | fzf -m --print0 | xargs -0 git add" gone = "!f() { git fetch --all --prune; git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -D; }; f" root = rev-parse --show-toplevel Those are the most used aliases in my gitconfig. "git fza" shows a list of modified/new files in an fzf window, and you can select each file with tab plus arrow keys. When you hit enter, those files are fed into "git add". Needs fzf: https://github.com/junegunn/fzf "git gone" removes local branches that don't exist on the remote. "git root" prints out the root of the repo. You can alias it to "cd $(git root)",
Read the rest
and zip back to the repo root from a deep directory structure. This one is less useful now for me since I started using zoxide to jump around. https://github.com/ajeetdsouza/zoxide
In Git tips and tricks
I tried this and a handful of alternatives a while back, but would often get frustrated because they’d jump to something different than what I intended or were missing some directory I wanted. Eventually I came up with an alternative using fd¹ and fzf². I have a variant of this in my .zshrc: function n { cd "$(fd . "${HOME}" --type d --color never | fzf --select-1 --query "${*}")" ls } Call it with `n` and get an interactive fuzzy search for your directories. If you do `n <argument>`, it’ll start the find with `<argument>` already filled in (and if there’s only one match, jump to it directly). The `ls` is optional but I find that I like having the contents visible as soon as I change directories. In my personal setup I’m also including iCloud Drive while excluding the rest of the Library directory³ as that is too noisy. I hav
Read the rest
e a separate `nl` function which searches just inside `~/Library` for when I need it, as well as other specialised `n<char>` functions that search inside specific places that I use frequently. ¹ https://github.com/sharkdp/fd ² https://github.com/junegunn/fzf ³ Change the fd command to: fd . "${HOME}" "${HOME}/Library/Mobile Documents/com~apple~CloudDocs" --exclude '/Library/' --type d --color never
In Z – Jump around

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.