Everything-style instant file search, native on macOS
English | 简体中文
"Everything is right there." Modeled on voidtools Everything and built from scratch in pure Swift + AppKit: whole-disk index, results as you type, live updates, instant restarts. Zero dependencies, fully offline.
- Whole-disk index — multithreaded
getattrlistbulkscanning at ~300k entries/sec; millions of files indexed in seconds on first launch - Results as you type — the filename blob is scanned as one contiguous memory block (the same trick Everything uses); typical queries return in 1–8 ms across 500k entries
- Live updates — an FSEvents file-level stream keeps the index current; creations, deletions and renames show up in the results within a second
- Instant restarts — the index is persisted together with an FSEvents event ID; on relaunch it is loaded and the event gap replayed, so nothing is ever missed and nothing is rescanned
- Full Everything search syntax — AND/OR/NOT, phrases, grouping, wildcards,
ext:size:dm:dc:path:regex:case:ww:parent:infolder:empty:and more - Native experience — AppKit UI, type filters, sortable columns, context menu, drag & drop to Finder, CSV export, global
⌥Spacesummon - Follows your system language — English by default, Simplified Chinese on zh-Hans systems; switchable anytime in Settings (Follow System / 简体中文 / English) with instant effect
- Featherweight — the app is under 1 MB; a 500k-entry index costs about 40 MB of memory
- Grab the latest
ToutEstLa-x.x.x.zipfrom Releases and unzip it - Drag
ToutEstLa.appinto Applications - Allow it to run following the first-launch guide, then grant indexing permission per the Full Disk Access guide
This is a personal open-source project and is not enrolled in the Apple Developer Program ($99/year), so the app carries only an ad-hoc signature and no notarization. On first launch macOS will warn that it "cannot verify the developer" — this is expected. The full source code lives in this repository; audit it or build it yourself if you prefer. To allow the app, pick either method:
Method A: allow via System Settings (recommended, works on every macOS version)
- Double-click
ToutEstLa.app; in the warning dialog click Done (not "Move to Trash") - Open System Settings → Privacy & Security and scroll down to the Security section
- Next to "ToutEstLa was blocked to protect your Mac", click Open Anyway
- Confirm Open Anyway once more — you will not be asked again
Method B: strip the quarantine flag (one command)
xattr -d com.apple.quarantine /Applications/ToutEstLa.appOn macOS 14 and earlier you can also right-click the app → Open → Open. Starting with macOS 15 Sequoia, Apple removed the right-click bypass; use method A or B instead.
To search the entire machine with no blind spots, the app needs Full Disk Access. That is macOS's unified privacy gate — Mail, Messages attachments, Safari data, other users' folders and protected parts of ~/Library all sit behind it.
How to grant it:
- Open System Settings → Privacy & Security → Full Disk Access
(the "Open System Settings…" button on the in-app yellow banner takes you straight there, or run
open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles") - Click +, pick
/Applications/ToutEstLa.app, and make sure its toggle is on - Quit the app completely and relaunch it (the permission is evaluated at process start)
- Run Index → Rebuild Index from the menu bar so protected folders get picked up
What happens without it? The app still works and indexes the vast majority of regular files, but TCC-protected locations (Mail, Messages, parts of ~/Library, other users' home folders, …) are silently denied by the system and simply won't appear in results. A yellow banner inside the app reminds you until access is granted.
Privacy statement: the app runs fully offline and contains no networking code whatsoever (all sources are in this repo — audit welcome). The index lives only on your machine at ~/Library/Application Support/ToutEstLa/index.bin, and nothing beyond file names, paths, sizes and dates is ever read.
| Syntax | Meaning | Example |
|---|---|---|
space |
AND — every term must match | report 2024 |
| |
OR — any term matches | jpg|png |
! |
NOT — exclude | installer !dmg |
"…" |
exact phrase (may contain spaces) | "project plan" |
< > / ( ) |
grouping | <jpg|png> screenshot |
* ? |
wildcards, anchored to the whole name | *.swift, IMG_????.jpg |
ext: |
extension list, ;-separated |
ext:mp4;mkv |
size: |
comparisons, ranges, named sizes | size:>100mb, size:1mb..10mb, size:huge |
dm: / dc: |
date modified / created | dm:today, dm:2024-06, dc:>2024-01-01, dm:lastweek..thisweek |
file: / folder: |
files only / folders only | folder:projects |
empty: |
empty folders | empty: |
path: |
match against the full path (automatic when a term contains /) |
path:downloads ext:zip |
parent: |
direct children of a folder | parent:/Users/me/Desktop |
infolder: |
anything beneath a folder | infolder:/Applications finance |
case: |
case-sensitive | case:README |
ww: |
whole word | ww:log |
regex: |
regular expression | regex:^IMG_\d+ |
Combine freely: ext:mp4 size:>100mb dm:thisyear — big videos modified this year.
The full reference ships inside the app under Help → Search Syntax.
| Keys | Action |
|---|---|
⌥ Space |
summon / hide the window from anywhere (can be disabled in Settings) |
Return / ⌘Return |
open selection / reveal in Finder |
⌘F |
focus the search field |
⌘I ⌘B ⌘U ⌘R |
toggle match case / whole word / match path / regex |
⌘E |
export results (CSV / plain text) |
Measured over 493,548 real files (--bench /Applications):
| Operation | Time |
|---|---|
| Full index build | 1.6 s (~310k entries/sec) |
Text / wildcard / ext: / size: queries |
1–8 ms |
| Sorting the entire index by name | 63 ms |
| Index memory footprint | 41 MB |
| Loading the persisted index at launch | < 1 s |
Everything's instant indexing relies on NTFS's MFT and USN Journal; APFS exposes no public equivalent. Each mechanism maps to a native macOS counterpart:
| Everything (Windows / NTFS) | Tout est là (macOS / APFS) |
|---|---|
| Reads the MFT directly to build its index | Multithreaded getattrlistbulk scan — one syscall returns a whole batch of names + metadata |
| Watches the USN Journal for changes | FSEvents file-level stream maintains the index incrementally |
| Index resident in memory | Struct-of-Arrays layout: names in one contiguous byte blob, tree as parent pointers, paths assembled on demand |
| Instant per-keystroke search | memchr scan over the whole name blob mapped back to entries — never per-entry matching; AND terms re-ordered by cost |
| Database persistence + fast startup | Binary index persistence + saved FSEvents event ID; the gap is replayed on launch, so startup is instant and lossless |
Requirements: macOS 13+, Xcode Command Line Tools (xcode-select --install), nothing else.
git clone https://github.com/Fangyuan025/ToutEstLa.git
cd ToutEstLa
./build_app.sh # release build + icon generation + ToutEstLa.app + ad-hoc signatureThe result is ToutEstLa.app in the project directory. A locally built app carries no quarantine flag, so no Gatekeeper approval is needed — Full Disk Access still is.
For development:
swift build # compile
./.build/release/ToutEstLa --selftest # 47 automated tests (syntax / index / FSEvents / persistence)
./.build/release/ToutEstLa --bench /Applications # performance benchmark
TEL_ROOTS=/some/dir ./.build/release/ToutEstLa # restrict index roots for debuggingCode layout (~3,300 lines, no dependencies):
Sources/ToutEstLa/
├── FileIndex.swift # in-memory index: SoA layout + rwlock + lock-free snapshots
├── Scanner.swift # multithreaded getattrlistbulk full-disk scanner
├── FSEventsWatcher.swift # live incremental updates + event replay
├── Query.swift # Everything-syntax parser and compiler
├── SearchEngine.swift # blob fast-scan + parallel matching + sorting
├── Persistence.swift # binary index persistence (compacted on save)
├── MainWindow.swift # main window (search field / results table / status bar)
├── AppDelegate.swift # menus and app lifecycle
├── AppState.swift # index lifecycle and preferences
├── TypeFilters.swift # audio / documents / pictures / … presets
├── HotKey.swift # ⌥Space global hotkey (Carbon)
├── PrefsWindow.swift # settings and syntax help windows
└── SelfTest.swift # automated tests
Does Full Disk Access survive app updates? Yes — since v1.1.1. The app is signed with a stable designated requirement bound to its bundle identifier, so the TCC grant keeps matching every future build. If you granted access to v1.1.0 or earlier (whose ad-hoc signature changed with every build), fix it once: System Settings → Privacy & Security → Full Disk Access → select ToutEstLa → remove it with −, then re-add it with + and relaunch. Trade-off to know: without a paid Developer ID certificate there is no cryptographic anchor, so the grant is tied to the identifier rather than to a verified publisher — build from source or verify the release checksum if that matters to you.
Why not just use Spotlight? Spotlight is built for fuzzy content and metadata search; its filename coverage is incomplete (large parts of the system are excluded by default), its syntax is limited, and freshness isn't guaranteed. This project does one thing well: finding files by name, Everything-style.
How long does the first index take? Does it keep consuming resources? Typically between ten seconds and a minute depending on file count — and you can search while it builds. Afterwards only FSEvents keeps it current, at negligible CPU cost; result refreshes pause while the window is hidden.
Where is the index stored? How do I uninstall completely?
The index lives in ~/Library/Application Support/ToutEstLa/. Delete the app and that folder and you're done (preferences: defaults delete com.stevenlin.toutestla).
Are external drives supported? Yes. Settings → enable "Index external volumes" → rebuild the index. Off by default to keep the first launch fast.
Can I exclude folders? Settings → add them to the exclusion list (noisy system locations such as Preboot and duplicate firmlink mounts are already excluded by default).
MIT © Fangyuan Lin
Inspired by voidtools Everything. This project is not affiliated with voidtools; "Everything" is a trademark of its respective owner.