Blazing fast file search for Windows. winindex builds a full index of your local drives and returns results as you type, with no perceptible delay even across millions of files.
- Instant search — results appear as you type, debounced at 150 ms
- MFT scanning — on NTFS drives with administrator privileges, winindex reads the Master File Table directly, indexing a full drive in seconds rather than minutes
- Fallback scanner — on FAT32, or without elevation on NTFS, a fast
FindFirstFileBFS scanner is used automatically - Regex support — powered by RE2; toggle with Alt+1
- SIMD-accelerated substring search — dispatch to AVX2 or SSE4.2 when compiled with
/arch:AVX2, scalar fallback otherwise - Word-level matching — queries with spaces, underscores, or hyphens match filenames by token set, so
just rosy guitarfindsLedZep_Just-Rosy_June-Bug_guitar.flaceven though the words are non-adjacent and separated by different delimiters - Search modes — case-sensitive, whole-word, match full path, ignore diacritics; all togglable from the Search menu
- Change detection — USN journal replay and
ReadDirectoryChangesWwatcher are wired in and ready; live background monitoring is in active development - Portable mode — place a
winindex.ininext to the executable and all data stays in that directory - Persistent index — the index is serialised to disk (CRC-32 validated) and loaded on startup; only rebuilt when stale or missing
- Context menu — open file, open containing folder, copy full path, copy filename, cut (shell move), delete (Recycle Bin)
- Smart exclusions — Windows system folders,
Program Files,ProgramData, AppData, and user-configurable paths are excluded by default
MftScanner / FindFileScanner
|
| scan
v
Indexer -----------> IndexStore (memory + .idx)
index |
UsnJournalMonitor -------> (apply | entries
ChangeWatcher change) changes) |
v
SearchEngine (RE2 / scalar)
|
| results
v
MainWindow (Win32 UI)
- On first launch, a setup dialog asks which drives to index and which paths to exclude.
- The Indexer checks whether a valid on-disk index exists (configurable max-age, default 48 h). If not, it rebuilds.
- For each selected drive the appropriate scanner is chosen:
- MftScanner — opens the volume with
GENERIC_READand issuesFSCTL_ENUM_USN_DATAto walk the MFT without touching individual directories. - FindFileScanner — iterative BFS using
FindFirstFile/FindNextFile, skipping reparse points to avoid symlink loops.
- MftScanner — opens the volume with
- Entries (name, full path, size, last-modified, attributes) are accumulated in IndexStore and flushed to
winindex.idxon completion.
Each keystroke (after a 150 ms debounce) spawns a background std::thread:
- Substring mode — the needle and each filename are lowercased once;
SimdFindSubstringdispatches to the fastest available SIMD path at runtime. - Token-set mode — when the query contains a separator character (space,
_,-,.), both the query and each filename are split into tokens and the file matches if every query token appears somewhere in the filename token set. This letsjust rosy guitarmatchLedZep_Just-Rosy_June-Bug_guitar.flacwithout regex. Single-word queries skip this path entirely, keeping the SIMD fast path. - Regex mode — filenames (or full paths in match-path mode) are converted to UTF-8 and matched with a compiled
RE2pattern. - Results are capped at 10 000 and rendered in a virtual
LVS_OWNERDATAListView for zero-copy display.
UsnJournalMonitor can replay USN journal records (additions, deletions, renames) directly into the in-memory store, and ChangeWatcher provides ReadDirectoryChangesW-based monitoring for non-NTFS volumes. Full background monitoring after the initial build is in active development.
| Tool | Minimum version |
|---|---|
| Windows | 10 or above |
| Visual Studio Build Tools | 2026 (local builds); CI auto-detects 2022+ |
| CMake | 3.28 |
| Git | any recent |
Third-party dependencies (re2, abseil, GoogleTest) are fetched automatically by CMake's FetchContent — no manual installation needed.
# Debug
build.bat debug
# Release
build.bat releaseOr with CMake presets directly:
cmake --preset windows-msvc-release
cmake --build --preset releaseBinaries land in build/release/src/ui/Release/winindex.exe.
cmake --preset windows-msvc-debug
cmake --build --preset debug
ctest --preset test-debugSettings are stored in %APPDATA%\winindex\winindex.ini (or next to the .exe in portable mode).
| Setting | Default | Description |
|---|---|---|
SelectedDrives |
(chosen on first run) | Semicolon-separated drive roots to index, e.g. C:\;D:\ |
ExcludedPaths |
See below | Pipe-separated paths excluded from indexing |
ReindexIntervalHours |
48 |
Hours before the index is considered stale; 0 = manual only |
UseRegex |
0 |
Enable RE2 regex search |
CaseSensitive |
0 |
Case-sensitive matching |
WholeWord |
0 |
Whole-word matching |
MatchPath |
0 |
Match against the full path instead of filename only |
IgnoreDiacritics |
0 |
Fold diacritics before matching |
%SystemDrive%\Windows%SystemDrive%\Program Files%SystemDrive%\Program Files (x86)%SystemDrive%\ProgramData%SystemDrive%\$Recycle.Bin%SystemDrive%\System Volume Information%SystemDrive%\drivers%APPDATA%(Roaming)%LOCALAPPDATA%
These are applied as the initial default on a new install. Once a user has saved their own exclusion list, that list is used as-is and the defaults are not re-injected.
| Key | Action |
|---|---|
| Alt+1 | Toggle regular expression mode |
| Alt+2 | Toggle case-sensitive |
| Alt+3 | Toggle whole-word |
| Alt+4 | Toggle match path |
| Alt+5 | Toggle ignore diacritics |
| Enter | Open selected file |
| Ctrl+Enter | Open containing folder |
| Ctrl+C | Copy full path(s) |
| Ctrl+X | Cut (shell move to clipboard) |
| Delete | Move to Recycle Bin |
winindex/
src/
core/
indexer/ MftScanner, FindFileScanner, Indexer, ChangeWatcher, USN journal
search/ SearchEngine, SIMD search, RE2 integration, TokenMatcher (word-level matching)
settings/ Settings (INI), PathUtils
storage/ IndexStore, IndexSerializer (binary format + CRC-32)
ui/
assets/ Source icon and screenshot
MainWindow.* Main Win32 window, search bar, result ListView
FirstRunDialog.* Drive/exclusion setup on first launch
SettingsDialog.* Settings accessible from Index menu
winindex.rc Resources (menus, dialogs, icon)
tests/ GoogleTest/GoogleMock unit tests
.github/
workflows/ CI: build+test on every push; release packages on tags
CMakeLists.txt
CMakePresets.json
build.bat Convenience wrapper: build.bat [debug|release]
Tagged releases (v*) trigger the CI release job which produces:
- ZIP — portable build, extract and run
- NSIS installer — installs to
Program Files, creates a Start Menu shortcut
After cloning:
winget install Python.Python.3.12 LLVM.LLVM Cppcheck.Cppcheck
pip install pre-commit
pre-commit installTo run all checks on the full codebase (one-time cleanup):
pre-commit run --all-filesMIT
