Tracing fzf's journey from the Vim plugin Junegunn Choi wrote in 2013 to becoming the de-facto standard fuzzy finder written in Go, and understanding the real problems it solves and the large ecosystem that has grown around it.

After episode 0 set up our environment — making sure fzf --version shows 0.74.x and the supporting tools are ready — in this episode we will take a brief pause from the hands-on work and understand why fzf exists. A tool's history and background may feel unimportant, yet that is exactly where the reasons behind its design live.
Why should you understand fzf's history? Because fzf was not born in a corporate meeting room, but from a very concrete personal need: "how can I find files quickly without leaving Vim?" Understanding its origins explains many design decisions — why fzf is pipeline-based, why it is so fast, and why to this day it remains the first choice of millions of developers and sysadmins.
The fzf story begins with a Korean developer named Junegunn Choi. In 2013, Junegunn was frustrated with the way file search worked inside Vim. This text editor is famously efficient, but file search still relied on heavy plugins or rigid commands. So, as good engineers tend to do, he wrote his own small solution: a fuzzy finder plugin for Vim that he named fzf — short for fuzzy finder.
At first fzf was just a Vim plugin. But its design principle differed from other plugins from day one: everything is pipeline-based. You could feed fzf any list — files, buffers, tags — and fzf would display it for interactive filtering. This principle is what later took fzf beyond the boundaries of Vim, and in 2015 the project was rewritten in Go as a standalone CLI program.
Note
Don't get confused: fzf is short for fuzzy finder, not another acronym. The early version written in Vim script only lasted until about the 0.9.x releases; since the Go version came out in 2015, fzf has been a standalone binary you can use in any shell — not just inside Vim.
The decision to rewrite fzf from Vim script into Go was not without reason. There were three problems that only a more "serious" language could solve:
This decision also explains why fzf --version only takes a few milliseconds to run and why fzf can filter millions of log lines without slowing down — two things that become quality standards in the following episodes.
The core problem fzf solves is very simple to state, but annoying to do by hand: choosing one item from a long list by typing a partial pattern.
| Scenario | Item List | Without fzf |
|---|---|---|
| Opening a file | Hundreds of files in a project | Typing the full path or clicking around |
| Running a process | Dozens of running processes | Reading ps then copying the PID |
| Selecting a branch | Hundreds of git branches | Memorizing long branch names |
| Searching history | Thousands of history lines | Retyping the same command |
| Searching file contents | Thousands of log lines | grep, then opening files one by one |
Take the contacts analogy on your phone: you never scroll through 500 contacts one by one. You type part of a name — say "jun" — and the list immediately shrinks. That is the same basic fuzzy finder philosophy: type a little, get what you mean. fzf brings that philosophy to the terminal, where the list can contain anything.
The most fundamental difference between fzf and classic search tools is interactivity. grep is a non-interactive filter: it reads lines, matches a pattern, prints the results, then finishes — you cannot choose from the results.
ls | grep configCompare that with fzf: instead of printing all results at once, fzf shows an interactive interface that updates the results every time you type. Each character you type filters the list in real time, until the item you want is left. That is when you press Enter, and fzf prints the selected item to stdout — becoming input for the next command.
ls | fzfThis is the answer to a question that often comes up: "doesn't grep already search? Why do we still need fzf?" grep answers "which lines match?" while fzf answers "which item do you want?" fzf is not a replacement for grep — it is the successor to the output of grep or find, turning a list into a living menu of choices.
fzf is not the only fuzzy finder in the terminal ecosystem. Several other projects try something similar, and understanding where it stands helps you appreciate its design choices:
| Project | Language | Status & Characteristics |
|---|---|---|
skim | Rust | Closest to fzf; aims to be a drop-in replacement, with a performance focus |
peco | Go | Simple and stable, widely used for basic filtering |
percol | Perl | An early generation that inspired others; rarely maintained now |
pick | Haskell | A different interface with a separate menu approach |
fzy | C | Better known as a fuzzy scoring library than a full tool |
fzf | Go | The most complete combination of speed, features, and ecosystem |
What sets fzf apart from the others is its feature scope and ecosystem: preview window, multi-select, custom keybindings, HTTP API, and integration with dozens of other tools. Many projects like skim were actually born as attempts to imitate fzf — proof of how strong its core design is.
Over time, fzf grew from a mere tool into a foundation used by many other pieces of software. The list below is only a small part of what uses it:
The presence of fzf-go is the most important leap: fzf is not just a program, it is also an API. You can use its scoring and filtering engine inside your own applications — a model that keeps fzf relevant far beyond a command-line tool. This is what "de-facto standard" means: a tool that others rely on to build upon.
rg --files | fzf --preview 'bat --color=always {}'The line above summarizes its ecosystem in one example: rg prepares the list, bat brings a colorful preview to life, and fzf is the interactive bridge in between. Each tool does one thing well, and fzf unites them.
In this episode 1, you traced fzf's journey from a 2013 Vim plugin — written by Junegunn Choi to speed up file search — to the Go fuzzy finder that has become the de-facto standard of the terminal ecosystem. You also understood the problem it solves, its difference from grep, its comparison with other finders, and the ecosystem that has grown around it.
The key takeaways:
grep filters; fzf filters and selects at the same time — interactive and real-time.skim, peco, percol, and others, fzf wins because of its features and ecosystem.In the next episode, episode 2, we will dissect fzf's core concepts and main architecture — the stdin -> filter -> stdout model that is its soul, how subsequence-based fuzzy matching and relevance scores work, the exit code language, and the anatomy of its interface components. See you in episode 2!