Illuminate your files
🔍 OCR · 📄 全文搜索 · 🏷️ EXIF · ⚡ Tauri · 🍎 macOS
A fast, native file search and management tool built with Tauri 2 + React
- Multi-mode search — Search by file name, text content, EXIF metadata, or OCR (macOS)
- File type presets — Quick filter by Document, Code, Image, or Config categories
- Tree view — Hierarchical folder tree with expand/collapse navigation
- File preview — In-app preview for text, code, and image files with context highlighting
- OCR highlight — Visual bounding box overlay on OCR-matched images
- Batch management — Select and move multiple files to trash with one click
- Native performance — BFS + Rayon thread pool for concurrent scanning, real-time result streaming
- Large directory handling — Confirmation dialog for directories exceeding threshold, with "remember" rules
- Skipped directories log — Review which directories were skipped and why
- Persistent settings — Large dir threshold, scan/skip rules, display preferences, saved across sessions
- Theme support — Light, Dark, and System theme modes
- Keyboard shortcuts —
Cmd/Ctrl+Btoggle sidebar,Cmd/Ctrl+Enterstart scan - Sidebar layout — Collapsible sidebar with file type presets, scan path, and OCR toggle
- Settings panel — Configure scan threshold, display options, and file type extension rules
- Reveal in Finder — Open file location directly in system file manager
- Cross-platform — Runs on macOS, Windows, and Linux
| Mode | Description |
|---|---|
| File Name | Match keywords against file and folder names |
| Text Content | Search inside text-based files (code, documents, configs) |
| EXIF Data | Search image EXIF metadata (camera, lens, GPS, etc.) |
| OCR Text | Extract and search text from images using Vision framework (macOS only) |
- Node.js >= 20
- pnpm >= 9
- Rust >= 1.77
- macOS: Xcode Command Line Tools
- Windows: Microsoft Visual Studio C++ Build Tools
- Linux:
libgtk-3-dev,libwebkit2gtk-4.1-dev,libappindicator3-dev,librsvg2-dev
# Install dependencies
pnpm install
# Start development server
pnpm tauri dev
# Build for production
pnpm tauri buildDownload the latest installer for your platform from GitHub Releases:
| Platform | Formats |
|---|---|
| macOS (Apple Silicon) | .dmg, .app |
| macOS (Intel) | .dmg, .app |
| Windows | .msi, .nsis |
| Linux | .deb, .AppImage |
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Vite 7, Zustand 5, Lucide Icons |
| Backend | Rust, Tauri 2, Walkdir, Rayon, Kamadak-exif, Trash |
| Build | pnpm, tauri-cli |
| CI/CD | GitHub Actions |
The scan engine uses a concurrent BFS + Rayon thread pool design:
- BFS thread traverses the directory tree, classifying directories by size
- Dispatcher thread feeds work items from a channel into the Rayon thread pool
- Rayon thread pool (CPU-bound) performs file matching in parallel — filename, text content, EXIF, and OCR
- Result/Progress handler thread streams results back to the frontend in real-time
Large directories (>1000 entries by default) trigger a confirmation dialog before scanning, with an optional "remember" rule system.
| Shortcut | Action |
|---|---|
Cmd/Ctrl + B |
Toggle sidebar |
Cmd/Ctrl + Enter |
Start scan |
Enter |
Submit search input |
search/
├── src/ # React frontend
│ ├── App.tsx # Main application component
│ ├── App.css # Application styles
│ ├── index.css # Theme variables and base styles
│ ├── main.tsx # React entry point
│ ├── components/
│ │ ├── Sidebar/ # Collapsible sidebar with presets
│ │ ├── SearchBar/ # Search input and scan controls
│ │ ├── ResultsView/ # Tree view with file results
│ │ ├── ScanProgress/ # Scan progress indicator
│ │ ├── PresetSelector/ # File type preset configuration
│ │ ├── EmptyState/ # Empty state placeholder
│ │ └── modals/
│ │ ├── ConfirmPanel.tsx # Large directory confirmation dialog
│ │ ├── SkippedDirsPanel.tsx # Skipped directories review
│ │ ├── SettingsPanel.tsx # Application settings
│ │ ├── FilePreviewModal.tsx # Text/code file preview
│ │ └── ImagePreviewModal.tsx # Image preview with OCR highlights
│ ├── store/
│ │ └── index.ts # Zustand state management
│ ├── types/
│ │ └── index.ts # TypeScript type definitions
│ ├── constants/
│ │ └── presets.ts # File type presets configuration
│ ├── utils/
│ │ ├── storage.ts # Settings persistence
│ │ └── file.ts # File utility functions
│ └── assets/ # Static assets
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── lib.rs # Tauri builder, plugin setup, command registration
│ │ ├── main.rs # Application entry point
│ │ ├── types.rs # Shared data structures
│ │ ├── config.rs # Persistent configuration management
│ │ ├── scanner.rs # File scanning engine (BFS + Rayon)
│ │ └── commands/
│ │ ├── mod.rs # Command module declarations
│ │ ├── scan.rs # Scan lifecycle commands
│ │ ├── file_ops.rs # File operations (preview, trash, reveal)
│ │ └── system.rs # System commands (sound, config file)
│ ├── resources/ # OCR scripts, sounds, etc.
│ ├── Cargo.toml # Rust dependencies
│ └── tauri.conf.json # Tauri configuration
├── docs/ # Architecture and product documentation
├── .github/workflows/ # CI/CD release pipeline
├── DESIGN.md # Apple-style design system documentation
├── ARCHITECTURE.md # System architecture overview
├── package.json
└── vite.config.ts
MIT