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.



