A blazing-fast, keyboard-driven file explorer and search engine for macOS.
Built with Rust + Tauri + React. Searches 325,000+ files in under 5ms.
Fast Explorer is a native macOS desktop application that replaces Spotlight and Finder for power users. It maintains an in-memory fuzzy index of your entire filesystem β pre-warmed from a SQLite database on launch β allowing sub-millisecond searches across hundreds of thousands of files without ever touching the disk at query time.
The application provides two core modes:
- Search Mode β Fuzzy search your entire filesystem with real-time results.
- Browse Mode β Navigate directories like a native file browser with keyboard shortcuts.
Landing Page
![]() Browse Mode (3-Column Layout) |
![]() Command Palette |
![]() Settings & Shortcuts |
![]() Performance Latency Metrics |
Check out the full capabilities and real-time sub-5ms fuzzy search of Fast Explorer in action:
π Watch the Fast Explorer Product Demo on Google Drive
fast-explorer/
βββ src/ # React + TypeScript frontend (Vite)
β βββ App.tsx # Root application shell & state management
β βββ index.css # Glassmorphic design system (CSS variables)
β βββ components/
β βββ ResultList.tsx # Virtualized search result list
β βββ FileIcon.tsx # Native file type icon resolver
β βββ StatusBar.tsx # Bottom status bar (search latency metric)
β
βββ src-tauri/ # Rust + Tauri native backend
β βββ src/
β β βββ main.rs # Tauri command handlers & IPC bridge
β β βββ models.rs # Shared data types (FileEntry, Metadata)
β β βββ db/mod.rs # SQLite persistence layer (rusqlite)
β β βββ scanner/
β β β βββ mod.rs # Orchestrates parallel directory scans
β β β βββ worker.rs # Concurrent file walker (tokio tasks)
β β βββ platform/
β β β βββ mod.rs # Platform abstraction trait
β β β βββ macos.rs # macOS FSEvents + metadata APIs
β β β βββ fallback.rs # Cross-platform fallback implementation
β β βββ watcher.rs # Real-time filesystem change watcher (notify)
β β βββ symlink.rs # Safe symlink resolution & cycle detection
β β βββ telemetry/
β β βββ mod.rs
β β βββ metrics.rs # Throughput & latency instrumentation
β β βββ reporter.rs # Live throughput logging to stderr
β βββ Cargo.toml # Rust dependencies
β βββ tauri.conf.json # Tauri app configuration (window, CSP, etc.)
β
βββ index.html # Vite HTML entry point
βββ vite.config.ts # Vite bundler configuration
βββ tailwind.config.js # TailwindCSS configuration
βββ package.json # npm scripts & frontend dependencies
βββ README.md # This file
Launch
β
βΌ
SQLite DB (fex.db)
β Pre-loads all known paths into RAM
βΌ
In-Memory Index (DashMap<String, FileEntry>)
β
βββ[User Types Query]βββΊ Nucleo Fuzzy Matcher βββΊ Ranked Results βββΊ UI
β
βββ[Background]βββΊ Scanner Workers (10 tokio tasks)
β Walk /Applications + ~/
βΌ
SQLite Writer βββΊ DB Updated βββΊ RAM Reloaded
| Operation | macOS Finder / Spotlight | Fast Explorer |
|---|---|---|
| Search 325K files | 1,200 β 4,000 ms (Spotlight index cold) | 2 β 8 ms |
| Directory listing | 80 β 250 ms (Finder builds thumbnails) | < 2 ms |
| Fuzzy match quality | Exact prefix / metadata only | Full path fuzzy + boundary boost |
| App launch readiness | 3 β 8 sec (Spotlight daemon re-index) | < 500 ms (DB pre-warm) |
| Background RAM usage | ~200 MB (mds + mds_stores) | ~60 MB |
Why the gap exists:
- Zero disk I/O at query time. The entire index lives in a
DashMapin RAM. Queries never touch the filesystem. - Nucleo fuzzy matcher. The same engine powering Helix editor β hyper-optimised for Unicode-aware, boundary-boosted fuzzy matching with SIMD acceleration.
- Parallel scan pipeline. On first launch, 10 concurrent
tokioworkers fan out across/Applicationsand~/simultaneously, achieving 200,000+ files/sec scan throughput. - Incremental updates. The
notifycrate hooks into macOS FSEvents β only changed paths are re-written to SQLite and re-inserted into RAM, never a full re-scan. - No thumbnail generation. Fast Explorer resolves file type icons from extension + UTI metadata only, with zero image I/O.
| Requirement | Version | Install |
|---|---|---|
| Rust | β₯ 1.75 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
| Node.js | β₯ 18 | nodejs.org or brew install node |
| Xcode CLT | Latest | xcode-select --install |
# 1. Clone the repository
git clone https://github.com/yourname/fast-explorer.git
cd fast-explorer
# 2. Install JavaScript dependencies
npm install
# 3. Start the development server (Vite + Tauri hot-reload)
npm run tauri devFirst run note: Rust will compile ~420 crates which takes 3β5 minutes. Subsequent builds use the incremental cache and are nearly instant.
# Produces a signed .app bundle in src-tauri/target/release/bundle/macos/
npm run tauri buildThe SQLite index is stored at:
~/Library/Application Support/fast-explorer/fex.db
It is auto-created on first launch and auto-updated in the background. You can safely delete it β it will rebuild on the next launch.
- Fuzzy search across 325K+ indexed files with sub-10ms response time
- Boundary-boosted scoring β
repomatchesmy-Repohigher thandepository - Paginated results β loads 50 at a time, expands on demand (no UI jitter)
- Live search latency metric β β‘ badge in the status bar shows exact ms cost
- 3-column layout β Favorites sidebar | File list | Detail Inspector
- Breadcrumb navigation with history stack (Backspace to go back)
- Inline filter β type to filter current directory without leaving browse mode
- Favorites β pin any folder with
βD, persisted for the session
Type / in either mode to open the system command palette:
| Command | Action |
|---|---|
/search |
Switch to Search Mode |
/browse |
Switch to Browse Mode |
/home |
Jump to Home Directory |
/apps |
Jump to /Applications |
/desktop |
Jump to Desktop |
/downloads |
Jump to Downloads |
/terminal |
Open Terminal in active folder |
/vscode |
Open highlighted item in VS Code |
/reveal |
Reveal item in macOS Finder |
/settings |
Open in-app Settings panel |
/displays |
Open macOS Displays preferences |
/sound |
Open macOS Sound preferences |
/keyboard |
Open macOS Keyboard preferences |
/network |
Open macOS Network preferences |
/battery |
Open macOS Battery preferences |
/info |
Show database index statistics |
/close |
Quit the application window |
Three tabbed panels accessible via the gear icon or β,:
- β¨οΈ Shortcuts β Full keyboard reference
- βοΈ App Settings β Result limit (50/100/200), toggle Inspector, toggle Favorites sidebar
- βΉοΈ Version & About β Build ID, engine info, database optimiser
- Open any file natively with
β΅(uses macOSopencommand) - Copy full path to clipboard with
βC - Reveal in Finder via command palette
- Open in VS Code via command palette
- Open Terminal at current directory via command palette
| Shortcut | Action |
|---|---|
β1 |
Switch to Search Mode |
β2 |
Switch to Browse Mode |
βB |
Toggle Search β Browse |
β, |
Open / Close Settings panel |
| Shortcut | Action |
|---|---|
β / β |
Navigate results |
β΅ |
Open highlighted file |
βC |
Copy full path to clipboard |
βD |
Add/remove folder from Favorites |
Esc |
Clear query |
/ |
Enter command palette |
| Shortcut | Action |
|---|---|
β / β |
Navigate items |
β΅ |
Enter folder / Open file |
Backspace / Esc |
Go back / clear filter |
Tab / β§Tab |
Cycle Favorites sidebar |
βC |
Copy full path to clipboard |
βD |
Add/remove current folder from Favorites |
/ |
Enter command palette |
In src/App.tsx, add an entry to the SYSTEM_COMMANDS array:
{
cmd: "/mycommand",
desc: "Human-readable description shown in palette",
icon: "π§",
action: async () => {
// Call any Tauri command or run JS logic
await invoke("my_rust_command", { param: "value" });
}
}In src-tauri/src/main.rs:
#[tauri::command]
async fn my_new_command(param: String) -> Result<String, String> {
// Your logic here
Ok(format!("Result: {}", param))
}
// Register it in the handler:
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![
// ... existing commands ...
my_new_command,
])The scanner is launched per-directory in main.rs. To index additional paths, add them alongside the existing scan triggers:
start_background_scan(app_handle.clone(), "/your/custom/path".to_string()).await;In src/components/FileIcon.tsx, add extension mappings to the EXTENSION_MAP object:
const EXTENSION_MAP: Record<string, { icon: string; color: string }> = {
// ... existing entries ...
myext: { icon: "π§", color: "#FF6B6B" },
};| Crate | Purpose |
|---|---|
tauri 1.6 |
Native window + IPC bridge |
tokio |
Async runtime for parallel scanning |
rusqlite (bundled) |
SQLite persistence β no system dependency |
nucleo 0.2 |
SIMD-accelerated fuzzy matcher |
notify 6.1 |
Cross-platform filesystem event watcher |
dashmap 6 |
Concurrent lock-free in-memory hashmap |
dirs 5 |
XDG/macOS-aware path resolution |
| Package | Purpose |
|---|---|
@tauri-apps/api |
JS β Rust IPC bindings |
react 18 |
Component UI framework |
framer-motion |
Smooth animations & transitions |
vite |
Ultra-fast dev server & bundler |
typescript |
Type-safe component development |
tailwindcss |
Utility CSS (design system base) |
- Fork the repository
- Create a feature branch:
git checkout -b feat/my-feature - Make your changes with clear commit messages
- Ensure
npm run tauri devbuilds without errors - Open a Pull Request describing what you changed and why
MIT License β see LICENSE for details.
Built with β€οΈ using Rust, Tauri, and React.
Searches your whole Mac faster than you can blink.



