NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #9 by repository stars
Last release 24 days ago
14 Sep 2026
Ships on a steady schedule
a new release about every 9 days
Nearly every release is documented
notes for 40 of 40 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
1188 releases · first in 2013
Nothing published for this version
Nothing published for this version
p4p3r ( @P4P3R-HAK ) reported the security vulnerability and suggested the fix
DECRQM query late left ?2004;2$y, CTRL-UP left 5A, and SGR mouse input left 0;1;1M--tiebreak=pathname not detecting the last path separator when the line contains a non-ASCII character before it (#4902)progress in the --listen status payload staying at 100 while a new search was running, which made a snapshot with a new query and the previous result set look complete (#4903)
progress of 100 means the matches belong to the query reported next to themseq 10 | fzf --height=~100% --list-border --header-lines=1 --header-lines-border=inline--listen is used and 100+ signals interrupt the wait (#4917)fzf#run returns an empty list when it runs fzf asynchronously. Use sink, sinklist, or exit to get the resultpopup as a synonym of the tmux layout key
let g:fzf_layout = { 'popup': '90%,70%' }g:fzf_layout to pick a different layoutOne column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Performance optimizations for non-ASCII input
chafa does under tmux (#4885)replace-query corrupting the item text when the query is edited afterwardsNothing published for this version
Nothing published for this version
Performance optimizations for short queries
change-border-label and transform-border-label now work on the native border of a tmux or Zellij floating pane--preview-window ~NRun() returns when fzf is used as a library--height mode (#4790) (@Cyrus580529)chpwd hook functions being called twice by ALT-C (#4879) (@LangLangBart, @lucc)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
nushell: fixed deprecation error of str downcase on nushell 0.114.0 or above ( #4857 ) ( @sim590 )
# No separator shown below the header border
fzf --style full --input-border none --header foo
# Separator shown; no border separates the input section from the list section
fzf --style full --input-border none --header foo --no-header-border
# No separator below the border of the preview window at 'next' position
fzf --preview : --preview-window next
# Conversely, separator is now shown when the input border does not draw
# a line facing the list section
fzf --input-border bottom--height --no-clear inside Neovim terminal by using DECSC/DECRC instead of CSI s/CSI ustr downcase on nushell 0.114.0 or above (#4857) (@sim590).deb packages for easy installation on Debian-based distros (#4859)Nothing published for this version
Nothing published for this version
Release highlights: https://junegunn.github.io/fzf/releases/0.74.0/
Release highlights: https://junegunn.github.io/fzf/releases/0.74.0/
--popup starts fzf in a floating pane instead of a popup (#4850)
border-native is implied--border, so that the fzf-drawn border is the only border shown (none and line are treated as no border)
fzf --popup --border--border-label is set as the title of the floating pane, and is displayed on the border if pane-border-status is enabled in tmux
fzf --popup --border-label ' fzf '--popup uses the native border by default, consistent with tmux, so that the pane can be moved and resized with the mouse; fzf draws its own border when a border style is explicitly specified with --border
--border-label is set as the name of the pane, displayed on the native borderresult-final event, a variant of result that is not triggered while the input stream is still open (#4835)
# 'result' fires per intermediate snapshot (header keeps updating during load);
# 'result-final' fires once after the stream closes (footer shows the final count)
(seq 100; sleep 1; seq 100) | fzf --query 1 \
--bind 'result:transform-header(echo result: $FZF_MATCH_COUNT),result-final:transform-footer(echo final: $FZF_MATCH_COUNT)'wait action to block subsequent actions until search completes (#4825)
# Wait for search to complete before moving to the best match
fzf --bind 'start:change-query(foo)+wait+best'start:wait can be used to wait until the input is fully loaded
# Move to the last item after the input is fully loaded
(seq 1000; sleep 1; seq 1001 2000) | fzf --bind 'start:wait+last'alt-left to backward-word and alt-right to forward-word by default (#4833)$FZF_CURRENT_ITEM export when the item is larger than 64 KB; a huge item can overflow ARG_MAX and break preview and other child commands with E2BIG (#4806)transform and bg-transform now allow a bare put action in the output to insert the key that triggered the action
# Insert the typed key ('a') into the query
fzf --bind 'a:transform:echo put'ALT-C in zsh no longer resolves symbolic links when changing the directory, consistent with the cd builtin (#4816) (@silverneko)bw theme not inheriting overridden colorsCTRL-R now works when $fish_color_normal or $fish_color_comment is empty or invalid (#4831) (@bitraid)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Skip $FZF_CURRENT_ITEM export when the item contains a NUL byte; exec(2) rejects the env, breaking preview and other child commands
$FZF_CURRENT_ITEM export when the item contains a NUL byte; exec(2) rejects the env, breaking preview and other child commands (#4806)--listen; a single ~390 KB request could block the single-threaded server for ~8 s (Michal Majchrowicz, Marcin Wyczechowski, AFINE Team)Nothing published for this version
Nothing published for this version
Release highlights: https://junegunn.github.io/fzf/releases/0.73.0/
Release highlights: https://junegunn.github.io/fzf/releases/0.73.0/
fzf --nushell and the installer (#4630) (@sim590)--preview-window=next position that places the preview adjacent to the input section, on the list side: above the input in the default layout, below it in --layout=reverse (#4798)every(N) event for --bind, where N is seconds$FZF_IDLE_TIME (whole seconds) and $FZF_IDLE_TIME_MS (milliseconds), holding the elapsed time since the last user activity
every(N) to build idle-based behavior such as auto-accept or auto-quit (#1211)
# Live process list; --track --id-nth 2 keeps the cursor on the same PID across reloads
fzf --header-lines 1 --track --id-nth 2 --bind 'start,every(2):reload-sync:ps -ef'
# Auto-accept after 10 seconds of inactivity, with a countdown in the footer after 5s
fzf --bind 'every(1):bg-transform:
if [[ $FZF_IDLE_TIME -lt 5 ]]; then echo change-footer:
elif [[ $FZF_IDLE_TIME -lt 10 ]]; then echo "change-footer:auto-accept in $((10 - FZF_IDLE_TIME))s"
else echo accept
fi'$FZF_CURRENT_ITEM for shells where quoting {} is awkward (#4802)change-preview-window no longer resets wrap / wrap-word state set via toggle-preview-wrap / toggle-preview-wrap-word (#4791)FuzzyMatchV2 on 32-bit builds (Michal Majchrowicz, Marcin Wyczechowski, AFINE Team)bg-transform reload / exclude payloads being droppedNothing published for this version
Nothing published for this version
Release highlights: https://junegunn.github.io/fzf/releases/0.72.0/
Release highlights: https://junegunn.github.io/fzf/releases/0.72.0/
--header-border, --header-lines-border, and --footer-border now accept a new inline style that embeds the section inside the list frame, separated from the list content by a horizontal line. When the list border has side segments, the separator joins them as T-junctions.
--list-border shape that has both top and bottom segments (rounded, sharp, bold, double, block, thinblock, or horizontal); falls back to line otherwise. horizontal has no side borders, so the separator is drawn without T-junction endpoints.ps -ef | fzf --reverse --style full \
--header 'Select a process' --header-lines 1 \
--bind 'load:transform-footer:echo $FZF_TOTAL_COUNT processes' \
--header-border dashed --header-first \
--header-lines-border inline --footer-border inline--header-label and --footer-label render on their respective separator row.--color list-border when the section's own border color is not explicitly set.inline takes precedence over --header-first: the inline section stays inside the list frame. --header-border=inline requires --header-lines-border to be inline or unset.dashed border style with dashed edges (╶ / ┆) and rounded corners.
--border=dashed, --list-border=dashed, etc.VimResized event (#4778) (@Vulcalien)Nothing published for this version
Release highlights: https://junegunn.github.io/fzf/releases/0.71.0/
Release highlights: https://junegunn.github.io/fzf/releases/0.71.0/
--popup as a new name for --tmux with Zellij support
--popup starts fzf in a tmux popup or a Zellij floating pane--tmux is now an alias for --popup--id-nth
--id-nth=NTH to define item identity fields for cross-reload operationsreload is triggered with tracking enabled, fzf searches for the tracked item by its identity fields in the new list.
--track --id-nth .. tracks by the entire line--track --id-nth 1 tracks by the first field--track without --id-nth retains the existing index-based tracking behaviorEscape or Ctrl-C to cancel the blocked state without quitting+T* / +t* while searching--multi, selected items are preserved across reload-sync by matching their identity fields=== query: 'linux' ===
[all] baseline: 21.95ms current: 17.47ms (1.26x) matches: 179966 (12.79%)
[1T] baseline: 179.63ms current: 180.53ms (1.00x) matches: 179966 (12.79%)
[2T] baseline: 97.38ms current: 90.05ms (1.08x) matches: 179966 (12.79%)
[4T] baseline: 53.83ms current: 44.77ms (1.20x) matches: 179966 (12.79%)
[8T] baseline: 41.66ms current: 22.58ms (1.84x) matches: 179966 (12.79%)
GET / HTTP endpoint now includes positions field in each match entry, providing the indices of matched characters for external highlighting (#4726)--height=~-HEIGHT) (#4682)--walker=follow no longer follows symlinks whose target is an ancestor of the walker root, avoiding severe resource exhaustion when a symlink points outside the tree (e.g. Wine's z: → /) (#4710)--{accept,with}-nth removing trailing whitespaces with a non-default --delimiter--with-shell not handling quoted arguments correctly (#4709)toggle-preview--frozen-left is usedsh_glob option is on (#4714) (@EvanHahn)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Added change-with-nth action for dynamically changing the --with-nth option.
change-with-nthchange-with-nth action for dynamically changing the --with-nth option.
--with-nth to be set initially.| can be given to cycle through.echo -e "a b c\nd e f\ng h i" | fzf --with-nth .. \
--bind 'space:change-with-nth(1|2|3|1,3|2,3|)'change-header-lines action for dynamically changing the --header-lines option=== query: 'l' ===
[all] baseline: 168.87ms current: 95.21ms (1.77x) matches: 5069891 (94.78%)
[1T] baseline: 1652.22ms current: 841.40ms (1.96x) matches: 5069891 (94.78%)
=== query: 'lin' ===
[all] baseline: 343.27ms current: 252.59ms (1.36x) matches: 3516507 (65.74%)
[1T] baseline: 3199.89ms current: 2230.64ms (1.43x) matches: 3516507 (65.74%)
=== query: 'linux' ===
[all] baseline: 85.47ms current: 63.72ms (1.34x) matches: 307229 (5.74%)
[1T] baseline: 774.64ms current: 589.32ms (1.31x) matches: 307229 (5.74%)
=== query: 'linuxlinux' ===
[all] baseline: 55.13ms current: 35.67ms (1.55x) matches: 12230 (0.23%)
[1T] baseline: 461.99ms current: 332.38ms (1.39x) matches: 12230 (0.23%)
=== query: 'linuxlinuxlinux' ===
[all] baseline: 51.77ms current: 32.53ms (1.59x) matches: 865 (0.02%)
[1T] baseline: 409.99ms current: 296.33ms (1.38x) matches: 865 (0.02%)
nth attribute merge order to respect precedence hierarchy (#4697)printf with builtin printf to bypass local indirections (#4684) (@DarrenBishop)Nothing published for this version
Nothing published for this version
Implemented word wrapping in the list section
--wrap=word (or --wrap-word) option and toggle-wrap-word action for word-level line wrapping in the list sectionctrl-/ and alt-/ from toggle-wrap to toggle-wrap-wordfzf --wrap=wordwrap-word flag for --preview-window to enable word-level wrappingtoggle-preview-wrap-word actionfzf --preview 'bat --style=plain --color=always {}' \
--preview-window wrap-word \
--bind space:toggle-preview-wrap-word--color: underline-double, underline-curly, underline-dotted, underline-dashed
fzf --color 'fg:underline-curly,current-fg:underline-dashed'4:N) and underline colors (SGR 58/59)
# In the list section
printf '\e[4:3;58;2;255;0;0mRed curly underline\e[0m\n' | fzf --ansi
# In the preview window
fzf --preview "printf '\e[4:3;58;2;255;0;0mRed curly underline\e[0m\n'"--preview-wrap-sign to set a different wrap indicator for the preview windowalt-gutter color option (#4602) (@hedgieinsocks)$FZF_WRAP environment variable to child processes (char or word when wrapping is enabled) (#4672) (@bitraid)ALT-ENTER to reformat and insert selected commandsSHIFT-DELETE)_fzf_compgen_{path,dir} to respect FZF_COMPLETION_{PATH,DIR}_OPTS (#4592) (@shtse8, @LangLangBart)--preview-window follow not working correctly with wrapping (#3243, #4258)track-current unset after a combined movement action (#4649)--accept-nth being ignored in filter mode (#4636) (@charemma)maxWidth (#4596) (@LangLangBart)x-api-key header not required for GET requests (#4627)execute triggered via a server request (#4653)redraw-current-line (#4635) (@jameslazo)fzf-tmux TERM quoting and added mktemp usage (#4664) (@Goofygiraffe06)FuzzyMatchV2 (#4608)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Added --freeze-left=N option to keep the leftmost N columns always visible. ```sh
--freeze-left=N option to keep the leftmost N columns always visible.# Keep the file name column fixed and always visible
git grep --line-number --color=always -- '' |
fzf --ansi --delimiter : --freeze-left 1
# Can be used with --keep-right
git grep --line-number --color=always -- '' |
fzf --ansi --delimiter : --freeze-left 1 --keep-right
--freeze-right=N option to keep the rightmost N columns always visible.# Stronger version of --keep-right that always keeps the right-end visible
fd | fzf --freeze-right 1
# Keep the base name always visible
fd | fzf --freeze-right 1 --delimiter /
# Keep both leftmost and rightmost components visible
fd | fzf --freeze-left 1 --freeze-right 1 --delimiter /
--info=inline to print the spinner (load indicator).Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →