mrkeyoor.com_
Wed 23 Sept 00:35 UTC
Dev Toolsevaluationupdated 26 Aug 2026

fff review

FFF is a persistent file and content search engine for editors, coding agents, and long-running developer tools. It combines typo-tolerant matching, an in-memory index, filesystem watching, Git status, and frecency ranking, then exposes them through MCP, Neovim, Pi, Rust, Python, Node, Bun, and C interfaces.

+89stars / 7d
Verdict

Our npm check completed in 6 seconds with 0 installed packages and 0 known vulnerabilities, but it built and tested none of FFF's Rust or native deliverables. FFF is a strong candidate for an editor or coding agent that searches one repository many times and can validate its platform-specific binary. Keep ripgrep or fd for one-shot automation, ignored-path inspection, and environments where native watcher failures would stop the workflow.

We ran it

Lab card: what happened when we ran fffScreenshot of fff (fff.dmtrkovalenko.dev)
Install✓ · 6s0 packages · 13 MB
Buildn/ano build script
Testsn/ano test script
Known vulns00 critical · 0 high · 0 moderate · 0 low (npm audit)
Repo372 files~69,014 lines of source · 9 MB · 10 CI workflows · tests dir

Answers from our run

Does fff build from source?

Dependencies installed in 6 seconds (0 packages), and the project has no separate build step. We cloned commit 28fce41 into a clean Debian container with 3 CPUs and no project-specific setup.

Does fff have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Does fff have known vulnerabilities in its dependencies?

npm audit found none in the dependency tree at the time of our run.

Who should not use fff?

One-off shell searches where a persistent index and watcher have no time to repay their startup and integration cost.

What are the alternatives to fff?

ripgrep, fzf, fd. Our npm check completed in 6 seconds with 0 installed packages and 0 known vulnerabilities, but it built and tested none of FFF's Rust or native deliverables.

Setup3/5Prebuilt MCP paths exist, but client wiring and native artifacts vary
Docs5/5Frontends, APIs, constraints, ranking, and settings are documented
Community4/510,149 stars with 75 open issues and PRs and August activity
Maturity3/5Many release artifacts ship, while platform crash reports remain open

Discussed on

  1. hnFff.nvim – Typo-resistant code search66 points
  2. hnfff3 points

Who it’s for

Coding-agent users who search the same repository repeatedly and want fewer grep and read round trips.
Neovim users who want file finding and live grep in one native-backed picker.
Tool builders who need a file-search SDK rather than a subprocess around ripgrep and fzf.
Teams prepared to measure indexing, watcher, and memory behavior on their own large repositories.

Who it’s NOT for

One-off shell searches where a persistent index and watcher have no time to repay their startup and integration cost.
Agents that must inspect Git-ignored dependencies or generated files by default: issue 714 says explicit paths inside ignored areas are absent from the main index.
Android or Termux users needing a settled native path: issue 786 reports a reproducible SIGSEGV in directories with more than two child directories.
Repositories containing invalid UTF-8 Unix filenames unless a fixed release is confirmed: issue 799 reports a fatal scan-thread panic in v0.10.5 and has follow-up fix pull requests.
Teams that refuse install scripts piped into a shell and do not want to inspect or use Homebrew or release binaries instead.

Setup reality

Our sandbox's npm-oriented check of commit 28fce41 finished installation in 6 seconds, added 0 packages, and used 13 MB. The root exposed no build script or target and no test script or target, so both were skipped. Npm audit found 0 known vulnerabilities.

That check did not compile the Rust workspace, native libraries, MCP binary, Python wheel, or Neovim module. The repository contains a tests directory and 10 CI workflow files, while release v0.10.5 ships platform-specific artifacts for several frontends.

MCP installation can use a shell script, PowerShell, Homebrew, or a release binary, then requires client configuration and restart. Persistent use writes frecency, history, cache, and log data; indexed roots, ignored files, symlink policy, and watcher behavior need deliberate settings.

Persistent search is the reason to choose FFF

FFF keeps an indexed view of a repository inside a long-running process. File names and paths can be matched fuzzily, content can be searched as plain text, regex, or fuzzy text, and recently or frequently opened files rise in ranking. The watcher updates the index as the tree changes. Git annotations identify modified, staged, and untracked files. That combination is aimed at editors and agents that issue many related searches, where repeatedly starting independent shell commands loses ranking and warm state.

The project now spans several products. The MCP server exposes file find, grep, and multi-pattern grep to Claude Code, Codex, Cursor, Cline, and other clients. A Pi extension can add tools, replace built-in search, or also replace editor autocomplete. The Neovim plugin supplies interactive pickers and programmatic APIs. Native and language bindings target Rust, C, Python, Node, and Bun. Release 0.10.5 publishes platform binaries, wheels, an sdist, a C FFI library, and the Neovim module.

MCP can reduce round trips, but it adds local state

The MCP tools return paginated path and content results with file metadata, match locations, and optional context. Smart-case search can fall back to fuzzy matching when exact search returns nothing. Definition-like lines are classified before they reach the model, and weak fuzzy matches can be suppressed before they fill agent context. For a coding agent, those decisions may save a separate file discovery call followed by several reads. They also make FFF's ranking policy part of what the agent sees.

Installation is offered through a shell command, PowerShell, Homebrew, or downloaded release artifacts. The README sensibly links the scripts for inspection. After installation, each MCP client still needs an absolute binary path and a restart or new session. FFF writes frecency and history databases plus logs. Issue 820 reports that v0.10.5 places MCP trace logs directly in the root cache directory unless --log-file is set, so managed developer machines should choose explicit XDG-aligned storage before broad rollout.

What happened when we ran it

Our fresh Debian container checked commit 28fce41 through its npm-facing root. Installation completed in 6 seconds, added 0 packages, and left 13 MB on disk. Npm audit reported 0 known vulnerabilities. The checkout contained 372 files, about 69,014 lines of source, and occupied 9 MB. We found 10 CI workflow files, no Dockerfile, and a tests directory.

The root exposed no npm build script or target, so our harness skipped building. It also exposed no npm test script or target, so tests were skipped. Those results do not say that the Rust and native code lacks tests; they say this ecosystem probe did not execute them. It did not compile the MCP server, load a native Node module, start a watcher, or search a repository. Before adopting FFF, run the project's platform-specific checks and benchmark your actual tree, especially if filenames or paths are unusual.

Ignored files remain outside the main index

FFF honors repository ignore behavior during its initial scan. Issue 714 explains the consequence for agent workflows: supplying a concrete path under node_modules or another ignored directory still returns no result because the path only narrows the existing index. The proposal suggests a scoped auxiliary index for an explicitly named path. Until that behavior ships and is verified, agents need a fallback such as direct read, ripgrep with adjusted ignore flags, or a second tool for dependencies and generated outputs.

This limitation can be a feature when the goal is concise source search. Ignored build artifacts and dependencies are often noise, and indexing less content saves memory. The problem appears when an agent is debugging a package's installed manifest or generated file and confidently reports absence. Any MCP prompt that tells an agent to use FFF for every search should preserve an exception for explicit ignored paths and invalid roots. Search policy needs a fallback, not an exclusive mandate.

Platform-specific crashes deserve a release check

Issue 799 reports a fatal background-thread panic on Linux when a path contains invalid UTF-8 bytes. The report ties it to lossy decoding and a byte offset that no longer lands on a character boundary in the released Node artifact. Pull requests 805 and 809 propose fixes, but buyers should confirm which change merged and which tagged release contains it. A native indexer crashing on one filename can interrupt every subsequent agent search in that process.

Android has a different report. Issue 786 describes a reproducible segmentation fault under Termux when a directory contains more than 2 child directories. The report identifies the filesystem walk as the crash site. These issues do not make Linux or Android universally unusable, but they show why release binaries need a corpus test on each supported platform. Include non-UTF-8 names, symlinks, ignored trees, rapid renames, and large directory fan-out.

August activity is fast, and upgrades need care

GitHub recorded 10,149 stars, 75 combined open issues and pull requests, and a push on August 25, 2026. Release v0.10.5 arrived on August 16 with artifacts for its many frontends and fixes around CI, LMDB readers, and Pi database creation. Subsequent issues and pull requests address package loading, watcher sharing, cache paths, and filename handling. The project is active, but its broad surface means one version number covers several runtimes and packaging systems.

FFF earns a trial where search is an interactive loop rather than a single command. Its index, frecency, Git awareness, and agent-focused result shaping solve a real integration problem that ripgrep alone does not. Our 6-second npm check is intentionally weak evidence because it installed no packages and ran no tests. Pin a release, verify its native artifact and storage paths, retain a stateless fallback, and compare complete task behavior instead of trusting a headline search benchmark.

Alternatives

ProjectWhat it isPick it when
ripgrep gh↗A fast recursive command-line content searcher with mature ignore and regex behavior.pick this instead when searches are stateless, shell-driven, and easy to compose without an in-process index.
fzf gh↗A general-purpose fuzzy finder that works with shell pipelines and editor integrations.pick this instead when you want an interactive selector over arbitrary input rather than a repository-aware search SDK.
fd gh↗A straightforward command-line file finder with ignore-file support and familiar patterns.pick this instead when filename discovery is the job and persistent ranking or content indexing is unnecessary.

What people are saying

  1. [github-trending] dmtrKovalenko/fff

Sources

  1. FFF repository and README
  2. FFF v0.10.5 release
  3. Ignored-path search proposal
  4. Invalid UTF-8 filename crash
  5. Android directory-walk crash
  6. MCP log-path report

More dev tools reviews

crabbox · asdf · discord.js · h4cker · bend · 100-exercises-to-learn-rust · the whole board →