Yuru
Yuru is a fast command-line fuzzy finder with Japanese, Korean, and Chinese phonetic search. It is designed to feel familiar to fzf users while adding multilingual matching and source-span highlighting for CJK text.
The name comes from ゆるい, meaning loose or relaxed. In this project it points
to forgiving fuzzy matching: the query can be a little loose, and Yuru tries to
find the intended multilingual text.
Yuru's direction and fuzzy-finder behavior are human-led, while the coding has been done primarily through agentic coding. The implementation, tests, installers, shell integrations, and documentation are heavily shaped by that agentic workflow, with the project maintainer steering the specification.
Demo Video

Watch the full-quality MP4 demo
Why Yuru instead of fzf?
| Feature | fzf | Yuru |
|---|---|---|
| General fuzzy finding | Yes | Yes |
| Japanese kana/kanji phonetic matching | Limited | Yes |
| Korean Hangul romanized/initial matching | Limited | Yes |
| Chinese pinyin and initials matching | Limited | Yes |
| fzf-like shell bindings | Yes | Yes |
| Full fzf option compatibility | Yes | Partial, evolving |
| CJK source-span highlighting | Limited | Yes |
Multilingual fuzzy finding has problems that are different from plain fzf-style matching. A single visible candidate may need original text, normalized text, Japanese kana and romaji readings, Korean Hangul romanization and choseong initials, Chinese pinyin and initials, and source-span maps for highlighting. Yuru keeps those as typed search keys and expands each query into a small set of compatible variants, so a romanized query can match CJK readings without turning every search into an unbounded cross-product.
See architecture and optimization details for the indexing model, search algorithms, Big-O estimates, fzf comparison, streaming input, lazy candidate construction, async search workers, and preview workers.
Localized documentation:
Install
Yuru installs into user space by default. It does not require sudo.
macOS and Linux guided install:
|
This installs yuru into ~/.local/bin unless XDG_BIN_HOME or
YURU_INSTALL_BIN_DIR is set. --all also adds shell integration for the current
shell. Run from an interactive terminal, this command asks for install-time
choices such as default language, preview command, image preview protocol, shell
bindings, preview text extensions, and shell path backend, then writes
user-space defaults to ~/.config/yuru/config.toml. Pressing Enter accepts the
prompt defaults. The preview command default auto uses Yuru's built-in preview
with bat when available for configured text extensions. The image preview
protocol default is none. The shell path backend default auto tries fd,
then fdfind, then the portable fallback.
To preselect guided-install defaults:
|
--bindings accepts all, none, ask, or a comma-separated list such as
ctrl-t,ctrl-r,completion. You can re-run the guided config later with
yuru configure.
Windows PowerShell:
$script = Invoke-RestMethod https://raw.githubusercontent.com/Ameyanagi/yuru/v0.1.7/install.ps1
Invoke-Expression "& { $script } -All -Version v0.1.7"
This installs yuru.exe into %LOCALAPPDATA%\Yuru\bin, adds that directory to
the user PATH, adds PowerShell integration to your user profile, and can write
guided config values to %APPDATA%\yuru\config.toml. Interactive installs ask
for the default language, preview command, preview text extensions, image
preview protocol, shell bindings, and shell path backend. Use -DefaultLang,
-PreviewCommand, -PreviewImageProtocol, -PathBackend, and -Bindings to
preselect those values.
$script = Invoke-RestMethod https://raw.githubusercontent.com/Ameyanagi/yuru/v0.1.7/install.ps1
Invoke-Expression "& { $script } -All -Version v0.1.7 -DefaultLang ja -PreviewCommand auto -PreviewImageProtocol none -PathBackend auto -Bindings all"
To install only the binary:
|
$script = Invoke-RestMethod https://raw.githubusercontent.com/Ameyanagi/yuru/v0.1.7/install.ps1
Invoke-Expression "& { $script } -Version v0.1.7"
Crates.io:
The crates.io package and installed command are both yuru.
Source builds use Lindera's embedded IPADIC dictionary for Japanese readings, so
they require a working C compiler. On macOS, install Xcode Command Line Tools;
Yuru's Cargo config and scripts prefer /usr/bin/clang for Apple targets.
Release binaries do not require a local compiler.
Image preview support is compiled by default through the image feature. To
build without image decoding/rendering dependencies:
Latest convenience install commands are also available from the main branch,
but release-pinned commands are recommended for reproducibility.
See install and uninstall details, including release checksums and exactly which files the installer can modify.
Shell Integration
Yuru can print shell setup code directly from the binary:
|
PowerShell:
yuru --powershell | Invoke-Expression
The shell integration provides:
CTRL-T: insert selected files or directoriesCTRL-R: search command historyALT-C: cd into a selected directory**<TAB>: fuzzy path completion
The bash, zsh, and fish behavior follows fzf’s documented shell integration model. PowerShell support uses PSReadLine key handlers.
Usage
Filter input:
|
Open the interactive finder:
|
Interactive mode streams stdin and default commands, so large generators such as
fd can keep producing candidates while the UI is already open. Use --sync if
you want fzf-style synchronous startup.
Chinese pinyin initials:
|
Japanese romaji:
|
Korean Hangul romanization, choseong initials, and 2-set keyboard input:
|
|
|
Auto language mode keeps one backend active per run:
| LANG=zh_CN.UTF-8
Explain a match:
|
Check local setup:
fzf Compatibility
Yuru accepts fzf's current option surface so existing shell bindings and
FZF_DEFAULT_OPTS do not fail at parse time. Search/scripting options such as
--query, --filter, --select-1, --exit-0, --print-query, --read0,
--print0, --nth, --with-nth, --accept-nth, --scheme, --walker, and
--expect are implemented. --bind is partial; unsupported bind actions warn
by default:
FZF_DEFAULT_OPTS is loaded in safe mode by default so UI-heavy fzf options do
not accidentally break Yuru:
||
[preview] command = "auto" enables Yuru's built-in preview: images are
rendered internally, configured text extensions use bat when available and
fall back to cat-style plain text output. Files outside the configured
extension list also use the text path when their contents look like ASCII text.
Preview commands that emit image bytes,
or select image files directly, are rendered through the default image feature
with ratatui-image; raster images and SVG files are supported. Ghostty uses
the Kitty graphics protocol, including inside tmux when passthrough is enabled. Set
YURU_PREVIEW_IMAGE_PROTOCOL=sixel|kitty|iterm2|halfblocks or
[preview] image_protocol = "kitty" in config to force a protocol. The config
default none leaves automatic detection enabled.
See the full fzf compatibility matrix.
Configuration
Yuru reads ~/.config/yuru/config.toml after safe fzf defaults and before
YURU_DEFAULT_OPTS and CLI arguments.
[]
= "auto" # plain | ja | ko | zh | auto
= "path" # default | path | history
= "smart" # smart | ignore | respect
= 200
= "safe"
= "warn"
[]
= "auto" # auto | none | shell command
= [
"txt", "md", "markdown", "toml", "json", "yaml", "yml", "csv", "tsv",
"log", "rs", "py", "js", "ts", "tsx", "sh", "ps1", "sql", "html", "css",
]
= "none" # none | halfblocks | sixel | kitty | iterm2
[]
= "greedy" # greedy | fzf-v1 | fzf-v2 | nucleo
= 8
= 8
= 1024
[]
= "lindera" # none | lindera
[]
= true
= true
= true
[]
= true
= true
= "common" # none | common
[]
= "all" # all | none | ctrl-t,ctrl-r,alt-c,completion
= "auto" # auto | fd | fdfind | find
= "__yuru_compgen_path__ ."
= "--preview-auto"
= "__yuru_compgen_dir__ ."
= "--preview-auto"
See configuration details and
language matching behavior.
Matcher algorithm names are compatibility-inspired modes: fzf-v1 uses Yuru's
greedy scorer, while fzf-v2 and nucleo use the nucleo-backed quality scorer.
Development
Install local git hooks:
Run the quality gate:
Run benchmarks:
YURU_BENCH_1M=1
The hook policy runs formatter, linter, tests, and benchmarks before commits and
pushes. Set YURU_SKIP_BENCH=1 only when you intentionally need a fast local
checkpoint.
Performance numbers from the current benchmark suite are published in docs/performance.md. Troubleshooting notes are in docs/troubleshooting.md.
Releases
GitHub Actions builds release assets for:
x86_64-unknown-linux-gnux86_64-apple-darwinaarch64-apple-darwinx86_64-pc-windows-msvc
Create a version tag to publish a release and crates.io packages. The release workflow only runs on tags, and the tag must match the crate version.
Release notes are tracked in CHANGELOG.md. Contributor and security policies live in CONTRIBUTING.md and SECURITY.md.
License
Yuru is distributed under the terms of both the MIT license and the Apache License 2.0. See LICENSE-MIT and LICENSE-APACHE.