Skip to content

Latest commit

 

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tout est là icon

Tout est là

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.

Release Platform Swift License: MIT

Main window screenshot

✨ Features

  • Whole-disk index — multithreaded getattrlistbulk scanning 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 ⌥Space summon
  • 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

📦 Installation

Option 1: download the prebuilt app

  1. Grab the latest ToutEstLa-x.x.x.zip from Releases and unzip it
  2. Drag ToutEstLa.app into Applications
  3. Allow it to run following the first-launch guide, then grant indexing permission per the Full Disk Access guide

🚦 First launch: the app is not notarized by Apple

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)

  1. Double-click ToutEstLa.app; in the warning dialog click Done (not "Move to Trash")
  2. Open System Settings → Privacy & Security and scroll down to the Security section
  3. Next to "ToutEstLa was blocked to protect your Mac", click Open Anyway
  4. 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.app

On 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.

🔐 Indexing permission: Full Disk Access

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:

  1. 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")
  2. Click , pick /Applications/ToutEstLa.app, and make sure its toggle is on
  3. Quit the app completely and relaunch it (the permission is evaluated at process start)
  4. 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.

🔍 Search syntax

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.

⌨️ Shortcuts

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)

⚡ Performance

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

🏗 Architecture: porting the Everything design to macOS

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

🛠 Building from source

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 signature

The 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 debugging

Code 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

❓ FAQ

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).

📄 License

MIT © Fangyuan Lin

Inspired by voidtools Everything. This project is not affiliated with voidtools; "Everything" is a trademark of its respective owner.

About

Everything-style instant file search for macOS — native Swift/AppKit, zero dependencies | macOS 原生的 Everything,全盘文件即时搜索

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages