The latest stable fzf features in the 0.70 - 0.74 range: --popup maturing in tmux and Zellij, --listen growing more stable, --gutter and --highlight-line for a cleaner UI, synchronized update mode to reduce flicker, and modern distribution with .deb packages and multi-platform binaries.

In episode 18 we covered troubleshooting — and as you saw, many diagnosis sessions end with the same recommendation: "upgrade fzf to the latest version." Now is the right time to look at the recent versions closely. Episode 19 explores the latest stable features in the 0.70 - 0.74 range — the versions we use throughout this series.
This range has matured four important themes. First, --popup: popup mode with native borders in tmux 3.7+ and Zellij, plus --popup-preview for the preview as a separate popup. Second, --listen: the feature from episode 16 that grew more stable — more reliable on Unix domain sockets, with a simpler way to track the program state. Third, UI cleanliness: --gutter and --highlight-line giving a cleaner look and a stronger cursor. Fourth, the platform: synchronized update mode to reduce flicker, and modern distribution with .deb packages and multi-platform binaries.
--popup: Maturing in tmux and ZellijYou know popups from episode 12. In this version range, the popup story gets stronger. Since fzf 0.50, --popup=BORDER_STYLE pops fzf into its own floating area. The crucial update: tmux 3.7 and Zellij now support fzf's native popup borders — fzf draws its own rounded border and popup shape in these multiplexers, rather than relying on their built-in window borders.
What changes for you:
--border choice: rounded, sharp, double, rounded is default, or none.--popup-preview[=N%] shows the preview as its own separate popup — as if the preview detaches from the main interface.fzf --popup=double
fzf --popup --popup-preview=50%Note
Combining --popup with --listen (episode 16) is a supported and interesting pair — fzf runs as a popup while its HTTP server keeps it controllable from outside. A floating panel controlled from another program is a powerful component for building interfaces.
--listen: Growing More StableIn episode 16 you used --listen as an HTTP server and a Unix domain socket. In this version range, the feature's stability improves further:
.sock path is the preferred method for local communication: no network port, just a path, and a $FZF_SOCK variable exposed to child processes.--listen-unsafe exists with a warning in the name — it disables protections (accepting connections without $FZF_API_KEY). Its very existence is a sign of the authors' stance: security first.GET / on the server returns the program state as JSON, letting a script read what fzf is showing without sending any action.curl -s localhost:6266 | jq '{query, current, total}'--gutter and --highlight-lineTwo options deliver the "clean look" part of this range. --gutter hides the gutter — the empty column that exists because the result list is sized to reserve space for digits, > markers, and multi-selection indicators. Hiding it tightens the interface and makes the results feel less boxed in:
fzf --gutter--highlight-line renders the entire active line highlighted — not just the cursor marker — like a "selected row" that's easy to spot:
fzf --highlight-lineBoth are the visual signature of modern fzf setups: rows that sit cleanly, with a clear active line — a sharper look than the older gutter + cursor pattern.
A subtle but meaningful improvement in the rendering pipeline: synchronized update mode. With it, fzf renders the whole frame synchronously instead of drawing line-by-line — the display updates feel smoother, and flicker is significantly reduced. This matters most in slow terminals, remote sessions over SSH (episode 13), and multiplexers like tmux, where flicker is amplified.
The practical recommendation: turn synchronized update mode on when the terminal is slow or flicker is visible, and keep it off when you prioritize raw responsiveness. It's a small trade, but in a multiplexed session the difference is immediately visible.
.deb Packages and Multi-Platform BinariesThe last theme is how fzf is delivered. The ecosystem now provides multi-platform binary releases: linux, macOS, Windows, FreeBSD, and OpenBSD, for both amd64 and arm64 — so a modern Linux-on-ARM (Raspberry Pi or a cloud ARM instance) no longer needs to compile from source.
For Debian and Ubuntu systems, a .deb package is available directly from the release page — so dpkg -i fzf-0.74.2-linux_amd64.deb installs fzf system-wide, complete with man pages, shell integration, and the fzf-tmux script. This is much simpler than compiling from source, and it tracks the release without an extra package manager.
For convenience, here's a compact snapshot of what the release notes in this range brought — the same features this episode is built around:
| Version | Highlight |
|---|---|
| 0.70 | Scrolling optimization for larger lists |
| 0.71 | Linear scaling across CPU cores; 86x lighter match cache; --track and --id-nth (episode 16-17) |
| 0.72 | Stability fixes around --listen and previews |
| 0.73 | every(N) periodic reloads (episode 16); Unix socket stability; --popup-preview |
| 0.74 | --gutter, --highlight-line, synchronized update mode, .deb packages, --popup auto-disable in nested popups |
Tip
This table is a map, not a promise — exact behaviors depend on the version you actually have. Get in the habit of checking fzf --version, and read the release notes when a behavior changes between versions. Feature versioning exists to be read.
| Mistake | Symptom | Solution |
|---|---|---|
| Expecting native borders in an old tmux | Popup drawn without a border | Upgrade tmux to 3.7+, or use Zellij |
--popup combined with --border doubled | Border looks double | Don't specify --border when the popup draws its own border |
--gutter still shows a gap | Gutter gap remains | The gap is the nth column, not the gutter — adjust with --layout or --nth |
| Flicker in SSH/tmux sessions | Lines redraw one at a time | Enable synchronized update mode |
| Compiling from source on ARM | Build time wasted | Use the multi-platform binary release |
| Installing without a package manager | Version lag or manual tracking | Use the .deb package on Debian/Ubuntu |
In this episode 19 you explored the latest stable features in the 0.70 - 0.74 range: --popup with native borders in tmux 3.7+ and Zellij plus --popup-preview; --listen getting more stable with Unix sockets, --listen-unsafe, and JSON state; UI cleanliness with --gutter and --highlight-line; synchronized update mode to cut flicker; and modern distribution via .deb packages and multi-platform binaries — making this version range the one you'll most likely meet in production.
The message to take home: fzf's recent versions are about maturity — smoother rendering, cleaner UI, and easier distribution — rather than brand-new concepts.
So far fzf has been a tool we train in isolation. But no tool lives alone. In episode 20 we broaden the lens: integration with editors & developer ecosystem — fuzzy completion with a Vim/Neovim plugin, the tree-sitter and ripgrep parser for highlighting, Telescope-like integrations, LSP integrations, and how these tie into a developer's daily workflow.