fzf: The Fuzzy Finder That Turns Shell Scripts into Terminal Apps
One binary. Zero dependencies. Infinite possibilities.
If you've spent more than five minutes in a terminal, you've probably wished your shell scripts could have a proper interactive UI. Dropdowns, filters, multi-select, previews. The kind of thing you'd expect from a real app, not a bash script.
Enter fzf. It's a single binary that plugs into your shell and gives you fuzzy finding, interactive filtering, and a full terminal UI. And it's been quietly powering some of the most impressive terminal workflows for years.
What It Does
fzf is a general-purpose command-line fuzzy finder. You give it a list of items, it gives you an interactive, searchable, color-highlighted selection interface. You filter, you pick, you get the result on stdout. That's it.
But the magic is in how it composes.
ls | fzf
That's a file picker. Done.
history | fzf
That's a terminal history search. Done.
find . -type f | fzf --preview 'bat {}'
That's a file browser with syntax-highlighted previews. Still one line.
Why It's Cool
The power of fzf isn't just the fuzzy matching, which is excellent. It's the fact that it's a composable building block. It doesn't try to be an app. It tries to be the UI layer between your data and your fingers.
Here's what sets it apart:
1. It's a single binary with no dependencies
No runtime, no libraries, no node_modules. It's written in Go, compiles to a single static binary, and runs everywhere. You can drop it on any server and it just works.
2. The preview window is a game-changer
You can run any shell command in the preview pane. That means you can show file contents, image thumbnails (with the right terminal), git diffs, process logs, whatever. It makes fzf feel like a real GUI app, but in your terminal.
3. It's scriptable to the core
The whole thing is built around the Unix philosophy. Input via stdin, output via stdout. You can use it in shell scripts, pipe it into xargs, or wrap it in your own functions.
4. It has first-class bindings for everything
Vim, Neovim, tmux, bash, zsh, fish. There are official integration points for all of them. The Vim integration alone makes it worth the install.
5. The executable mode
Here's the kicker: fzf can also be used as an executable that runs commands. You can define actions in your config, and the selected item becomes the argument to another script. This is how people build full terminal apps out of a collection of shell scripts glued together with fzf.
How to Try It
If you're on macOS:
brew install fzf
Linux (Debian/Ubuntu):
apt install fzf
Or grab the binary directly from the GitHub releases page. No build step. Just download, chmod +x, and run.
If you're feeling brave, install the Vim plugin and the shell keybindings:
$(brew --prefix)/opt/fzf/install
That'll set up Ctrl+T for file search, Ctrl+R for history, and Alt+C for directory navigation in your shell. You'll wonder how you lived without it.
Final Thoughts
fzf is one of those rare tools that doesn't just solve a problem, it changes the way you think about solving problems. Once you start using it, you'll find yourself reaching for it in dozens of situations that you never considered before. "Oh, I can just pipe that to fzf and make it interactive."
It's the closest thing to "free UI" that exists in the terminal ecosystem. And the fact that it's a single, dependency-free binary means it'll be there on every server, every container, every machine you touch.
If you write shell scripts for a living, or even just for fun, fzf is the kind of tool that quietly becomes a permanent part of your workflow.
Try it. Your fingers will thank you.
Found this useful? Follow @githubprojects for more developer tools and projects.