mrkeyoor.com_
Wed 16 Sept 05:26 UTC
Dev Toolsevaluationupdated 27 Aug 2026

fzf review

fzf is an interactive fuzzy finder for the terminal. It reads lines, lets you narrow them with a forgiving query, and returns the selected entry, which turns shell output into a keyboard-driven picker.

+113stars / 7d
Verdict

Our fzf run installed 19 packages, built in 15 seconds, and passed all 4 tested Go packages, making it an unusually low-risk addition to a terminal workflow. Use it when selection is the missing step between Unix commands, especially if previews or live reloads can replace a custom script. Test the exact terminal integration before rolling it out on Emacs or Windows, where recent issue reports describe display problems.

We ran it

Lab card: what happened when we ran fzfScreenshot of fzf (junegunn.github.io/fzf)
Install✓ · 7s19 packages
Build✓ · 15s
Tests✓ · 13s4 passed · 0 failed of 4 (go test)
Repo160 files~42,025 lines of source · 1.8 MB · 8 CI workflows · Dockerfile · tests dir

Answers from our run

Does fzf build from source?

Dependencies installed in 7 seconds (19 packages), and the build succeeded in 15 seconds. We cloned commit 956562d into a clean Debian container with 3 CPUs and no project-specific setup.

Do fzf's tests pass?

Yes: 4 of 4 passed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use fzf?

Users who want semantic search across document meaning: the README documents fuzzy, exact, prefix, suffix, inverse, and OR terms, all over supplied text lines.

What are the alternatives to fzf?

skim, fzy, peco. Our fzf run installed 19 packages, built in 15 seconds, and passed all 4 tested Go packages, making it an unusually low-risk addition to a terminal workflow.

Setup5/57-second install, 15-second build, and all tested packages passed
Docs5/5Installation, query syntax, shell hooks, previews, and actions are clear
Community5/582,666 stars with pushes and issue activity in August 2026
Maturity5/5v0.74.3 is active and our build plus test run passed cleanly

Discussed on

  1. hnFzf – a command-line fuzzy finder279 points
  2. hnfzf.vim29 points
  3. hnFzf: A command-line fuzzy finder25 points
  4. hnA command-line fuzzy finder written in Go15 points
  5. hnA command-line fuzzy finder written in Go14 points

Who it’s for

Terminal users who repeatedly search files, command history, processes, branches, or hosts.
Shell authors who need an interactive selector with previews, reloads, and custom actions.
Vim, Neovim, tmux, or Zellij users who want a picker inside an existing workflow.
Developers who prefer one portable binary over a larger terminal application framework.

Who it’s NOT for

Users who want semantic search across document meaning: the README documents fuzzy, exact, prefix, suffix, inverse, and OR terms, all over supplied text lines.
Teams that cannot test terminal-specific behavior: open reports cover redraw problems in Emacs and line wrapping after Ctrl-R in a VS Code PowerShell terminal.
Anyone expecting previews to be isolated from shell execution: the README says preview and execute actions run commands through $SHELL -c.
GUI-first users who do not work in a shell, editor terminal, tmux, or Zellij: fzf's interface and integrations are terminal based.

Setup reality

Our sandbox installed 19 packages in 7 seconds. The build passed in 15 seconds, and all 4 tested Go packages passed in 13 seconds. The checkout was 1.8 MB with 160 files and about 42,025 source lines.

The binary itself needs no account or remote service. Shell key bindings and completion require evaluating or sourcing the generated integration for Bash, Zsh, Fish, or Nushell. Preview recipes often call separate tools such as bat, tree, fd, or ripgrep.

Package-manager versions may lag recent options. Popup mode requires tmux 3.3 or newer or Zellij 0.44 or newer, and is ignored elsewhere. Preview and execute strings run through the user's shell, so quoting and untrusted input deserve care.

fzf turns any line-oriented command into a picker

fzf's contract is simple: send it newline-separated candidates, type a query, and receive the selected line on standard output. That makes it useful far beyond files. Command history, process lists, Git branches, hostnames, environment variables, and application-specific records all fit the same model. The fuzzy matcher tolerates gaps, while exact, prefix, suffix, inverse, and OR terms give you more control when the broad match returns too much.

The small contract hides a capable terminal interface. Fullscreen, inline height, tmux popup, and Zellij popup modes cover common layouts. Multi-select, mouse input, previews, labels, colors, and a large binding system let a script feel like a purpose-built tool. Our checkout was only 160 files and 1.8 MB, with about 42,025 source lines. That is compact enough to audit and package without adopting an application framework.

Shell integration gives Ctrl-R, Ctrl-T, and Alt-C real value

The bundled shell setup turns Ctrl-R into searchable history, Ctrl-T into file selection, and Alt-C into directory selection. Bash, Zsh, Fish, and Nushell have documented paths, though Nushell writes a generated integration file instead of piping into source. Fuzzy completion also knows about paths, directories, process IDs, hostnames, variables, aliases, and supported commands. A plain binary install does not activate those behaviors by itself.

Defaults are deliberately adjustable. The built-in walker can include files, directories, hidden entries, and followed links, while skip rules can omit .git, node_modules, and target. Users can replace the candidate generator with fd, ripgrep, or another command. Our sandbox added just 19 packages during the 7-second install, so the core stays light. Fancy preview recipes can still accumulate external dependencies that your dotfiles must install separately.

What happened when we ran it

Our run installed fzf in 7 seconds, then completed the build in 15 seconds. The test step took 13 seconds and all 4 tested Go packages passed, with 0 failures. We used commit 956562d in a fresh unprivileged Debian container with 3 CPUs and 8 GB of RAM. Nothing in the supplied logs showed a missing package, compiler error, or failed test.

Those measurements cover the repository, not interactive behavior in every terminal. The project contains 8 CI workflow files, a Dockerfile, and a tests directory, which supports the clean result we saw. A 13-second Go test cannot reproduce each combination of shell, editor terminal, multiplexer, keyboard mode, or escape-sequence handling. Teams should still try their chosen bindings in the actual terminals their developers use.

Preview and reload actions can replace small terminal apps

A preview command runs whenever focus changes and can show text, metadata, diffs, trees, or images. The reload action can rebuild the candidate list on an event, which powers the documented interactive ripgrep example. execute starts a program and returns to fzf; become replaces fzf with the chosen command. These pieces are enough for branch switchers, log viewers, process tools, and repository browsers without maintaining a custom interface.

They also execute shell text. The README states that preview commands use $SHELL -c COMMAND, and placeholders are interpolated into actions. Correct quoting matters when candidates contain spaces, quotes, control characters, or text from an untrusted source. The documentation recommends null-delimited output with --print0 and xargs -0 for safer filename handling. Treat copied snippets as shell programs, especially once a binding can delete, kill, or overwrite something.

Recent terminal regressions are the main adoption caveat

GitHub showed 82,666 stars, 326 combined issues and pull requests, and a last push on August 26, 2026. Release v0.74.3 arrived on August 17. Its notes include fixes for bracketed paste handling, startup on terminals that do not answer escape sequences, preview image rendering under tmux, and query replacement. That is current maintenance, and it also shows how much terminal state the program must handle.

Open reports deserve attention if your standard setup matches them. Issue 4883 describes an extra displayed space in Emacs with v0.74.1 and v0.74.2, while issue 4892 reports broken wrapped input after using Ctrl-R in a VS Code PowerShell terminal. These are specific integrations, not evidence that the 4 tested Go packages are generally broken. Pin a known version and add a brief manual check for history search, cancellation, multiline input, and paste behavior.

The 35-second local check makes fzf easy to trial

Install, build, and tests took 35 seconds combined in our sandbox. The quickest evaluation is therefore practical: pipe a real list into the binary, add one preview, and connect one shell binding. If that removes a repeated search-and-copy routine, fzf has earned its place. Its output remains ordinary text, so removing it later does not strand data or force a migration.

Power users can spend days tuning colors and actions, but the base value arrives much earlier. Start with history and file selection, avoid a global preview command, and keep destructive actions out of bindings until quoting has been tested. For developers who live in terminals, fzf is the default fuzzy picker to beat. For teams centered on graphical tools, its 15-second build is irrelevant because the interface still asks people to work in a shell.

Alternatives

ProjectWhat it isPick it when
skimA Rust fuzzy finder with an fzf-like terminal interface.pick this instead when Rust integration or skim's library API matters to your project.
fzyA compact terminal selector built around a simple fuzzy matching algorithm.pick this instead when you want a smaller feature set and do not need fzf's event and preview system.
pecoAn interactive filtering tool for piped command output.pick this instead when a basic Go filter meets the need and fzf's shell integrations are unnecessary.

Sources

  1. fzf README
  2. fzf repository
  3. fzf v0.74.3 release
  4. Emacs spacing regression report
  5. VS Code PowerShell wrapping report

More dev tools reviews

noty · forward-implementation-first · breakscale · black · ASC · BrewUI · the whole board →