@ff-labs/pi-fff
pi extension: FFF-powered fuzzy file and content search
Package details
Install @ff-labs/pi-fff from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@ff-labs/pi-fff- Package
@ff-labs/pi-fff- Version
0.10.5- Published
- Aug 16, 2026
- Downloads
- 36.3K/mo · 10.5K/wk
- Author
- dmtr.kovalenko
- License
- MIT
- Types
- extension
- Size
- 65.3 KB
- Dependencies
- 2 dependencies · 3 peers
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@ff-labs/pi-fff
A pi extension that replaces the built-in find and grep tools with FFF — a Rust-native, SIMD-accelerated file finder with built-in memory.
What it does
| Built-in tool | pi-fff replacement | Improvement |
|---|---|---|
find (spawns fd) |
fffind (FFF fileSearch) |
Fuzzy matching, frecency ranking, git-aware, pre-indexed |
grep (spawns rg) |
ffgrep (FFF grep) |
SIMD-accelerated, frecency-ordered, mmap-cached, no subprocess |
| (none) | fff-multi-grep (FFF multiGrep) |
OR-logic multi-pattern search via Aho-Corasick |
@ file autocomplete (fd-backed) |
@ file autocomplete (FFF-backed, default) |
Fuzzy ranking from FFF index/frecency |
Key advantages over built-in tools
- No subprocess spawning — FFF is a Rust native library called through the Node binding. No
fd/rgprocess per call. - Pre-indexed — files are indexed in the background at session start. Searches are instant.
- Frecency ranking — files you access often rank higher. Learns across sessions.
- Query history — remembers which files were selected for which queries. Combo boost.
- Git-aware — modified/staged/untracked files are boosted in results.
- Smart case — case-insensitive when query is all lowercase, case-sensitive otherwise.
- Fuzzy file search —
finduses fuzzy matching, not glob-only. Typo-tolerant. - Cursor pagination — grep results include a cursor for fetching the next page.
Install
Requirements:
- pi
Install as a pi package
Via npm (recommended):
pi install npm:@ff-labs/pi-fff
Project-local install:
pi install -l npm:@ff-labs/pi-fff
Via git:
pi install git:github.com/dmtrKovalenko/fff
Pin to a release:
pi install git:github.com/dmtrKovalenko/fff@v0.3.0
Local development / manual install
git clone https://github.com/dmtrKovalenko/fff.git
cd fff/packages/pi-fff
npm install
Then add to your pi settings.json:
{
"extensions": ["/path/to/fff/packages/pi-fff/src/index.ts"]
}
Or test directly:
pi -e /path/to/fff/packages/pi-fff/src/index.ts
This extension registers FFF-powered tools (fffind, ffgrep, fff-multi-grep) alongside pi's built-in tools.
Tools
ffgrep
Search file contents. Smart case, plain text by default, regex optional.
Parameters:
pattern— search text or regexpath— directory/file constraint (e.g.src/,*.ts)ignoreCase— force case-insensitiveliteral— treat as literal string (default: true)context— context lines around matcheslimit— max matches (default: 100)cursor— pagination cursor from previous result
fffind
Fuzzy file name search. Frecency-ranked.
Parameters:
pattern— fuzzy query (e.g.main.ts,src/ config)path— directory constraintlimit— max results (default: 200)
fff-multi-grep
OR-logic multi-pattern content search. SIMD-accelerated Aho-Corasick.
Parameters:
patterns— array of literal patterns (OR logic)constraints— file constraints (e.g.*.{ts,tsx} !test/)context— context lineslimit— max matches (default: 100)cursor— pagination cursor
Commands
/fff-health— show FFF status (indexed files, git info, frecency/history DB status)/fff-rescan— trigger a file rescan/fff-mode <mode>— switch mode (tool name change requires restart)
Modes
tools-and-ui(default): registersfffind,ffgrep,fff-multi-grepas additional tools + FFF-backed@autocompletetools-only: additional tools only; keep pi's default@autocompleteoverride: replaces pi's built-infind,grepand addsmulti_grep+ FFF-backed@autocomplete
Mode precedence:
--fff-mode <mode>CLI flagPI_FFF_MODE=<mode>environment variable- default (
tools-and-ui)
Flags
--fff-mode <mode>— set mode (see above)--fff-frecency-db <path>— path to frecency database (also:FFF_FRECENCY_DBenv). Optional; see Data for the default.--fff-history-db <path>— path to query history database (also:FFF_HISTORY_DBenv). Optional; see Data for the default.--fff-enable-root-scan— allow indexing when launched from/(also:FFF_ENABLE_ROOT_SCAN=1env). FFF refuses to init at the filesystem root by default.--fff-enable-home-scan— index the home directory when launched from$HOME(also:FFF_ENABLE_HOME_SCANenv). Enabled by default. Disable with--fff-enable-home-scan=falseorFFF_ENABLE_HOME_SCAN=0if your$HOMEcontains huge trees (toolchains, kernel sources, build outputs) that make the background index run for a long time. When launched from$HOMEwith this enabled, pi shows a warning that the whole home tree is being indexed.
Data
FFF uses two LMDB databases:
- frecency database - file access frequency/recency, used to rank results
- history database - query-to-file selection history
Each path is resolved independently, in this order:
- CLI flag —
--fff-frecency-db/--fff-history-db - Env var —
FFF_FRECENCY_DB/FFF_HISTORY_DB - An existing fff.nvim database, so pi reuses the frecency you built up in your editor:
- frecency:
$XDG_CACHE_HOME/nvim/fff_nvim - history:
$XDG_DATA_HOME/nvim/fff_queries XDG_CACHE_HOMEdefaults to~/.cacheandXDG_DATA_HOMEto~/.local/share; on Windows both fall back under%LOCALAPPDATA%\nvim-data. Only directories count — a plain file at those paths is ignored.
- frecency:
- pi-local directory, created on demand —
$PI_CODING_AGENT_DIR/fff/{frecency,history}, defaulting to~/.pi/agent/fff/{frecency,history}
The extension only reads these databases; it never records the agent's own searches into your Neovim history. If a database cannot be opened, the finder starts without persistence and pi shows a warning instead of failing.
No project files are uploaded anywhere by this extension. It runs locally and only uses the configured LLM through pi itself.
Security
- No shell execution
- No network calls in the extension code
- No telemetry
- No credential handling beyond whatever pi and your configured model provider already do
- Search state is stored locally under
~/.pi/agent/fff/