Describe a file in plain words and fetchle brings back the path, ranked, in milliseconds. It's built for AI agents and humans, runs as one NativeAOT .NET binary, and nothing leaves your machine.
> fetchle "desktop app bundled claude binary"
AppData/Roaming/Claude/claude-code/2.1.286/635c1867224a/claude.exe 212 MB 2d ago
AppData/Roaming/Claude/claude-code/2.1.284/3f4bed3e44ad/claude.exe 211 MB 9d ago
2 of 2 matches · 6 ms
That output is the target, not shipped behavior. fetchle is pre-alpha, at v0.1. It indexes the roots you give it into a memory-mapped snapshot and answers from that, so a query skips the walk entirely. On a quiet Linux box, over a 48k-dir tree with nothing to prune, an indexed query takes 8 ms p95 where rg --files takes 586 ms. Over a 1M-entry home dir it's 16 ms against 187 ms for fetchle's own walk of the same pruned tree (rg walks the pruned third too, so its 779 ms isn't like for like). Method and caveats: docs/testing.md. Matching is still a case-insensitive substring of the path; ranking, plain-words search and the file watcher are the next work. See the roadmap for what lands when.
An agent looking for one exe ran Get-ChildItem -Recurse over three AppData folders and hit a 120 second timeout with nothing to show. One folder didn't exist, and PowerShell quietly turned that into a crawl of all 2.5 million entries under %LOCALAPPDATA%. The same search in raw .NET found the exe in 1.2 seconds. Agents improvise filesystem crawls like that constantly, and they can't tell which roots are expensive. fetchle gives them one call that answers from a local index, inside a time budget, every time.
semble does this for code content. fetchle does it for file names and paths.
You need the .NET SDK pinned in global.json, plus a native toolchain for the AOT build. CONTRIBUTING.md lists what each OS needs.
Build the native exe:
dotnet build.cs publishIt lands in artifacts/publish/. Search the current directory, or point it at another root:
artifacts/publish/fetchle config
artifacts/publish/fetchle config --root ~/srcA root that doesn't exist fails right away with exit code 2 instead of turning into a slow crawl.
Index the roots you search most, and queries read the snapshot instead of walking:
artifacts/publish/fetchle roots add ~
artifacts/publish/fetchle index rebuild
artifacts/publish/fetchle configThe snapshot is as fresh as the last index rebuild until the watcher lands in v0.4.
Run the MCP server over stdio, for an agent to connect to:
artifacts/publish/fetchle mcpIt exposes find_files and index_status. The MCP spec has the tool shapes.
- Vision and goals
- How it works
- CLI spec, MCP spec, install spec
- Contributing, testing, release pipeline, demo videos
- Roadmap, decisions, competitors
- Spike results
MIT