NimbleRun searches launchable apps only. It is not a general file searcher, web searcher, command runner, plugin host, AI assistant, or package manager. User-selected local folders are scanned only for the supported executable extension allowlist.
The priority order is:
- Idle resource usage and wake-up latency.
- Correct app discovery and launching.
- Keyboard and mouse efficiency.
- Visual polish.
The intended module boundaries are:
| Module | Owns | Must not own |
|---|---|---|
app_host |
WinMain, COM initialization, message loop, single instance, lifecycle | Search ranking |
ui |
HWND, focus, input, DPI, rendering | Folder scanning |
catalog |
Sources, merge, deduplication, immutable snapshots | Direct drawing |
user_folder_source |
User-selected local roots, recursive enumeration, extension allowlist | General file search, network paths |
search |
Normalization, matching, stable ranking | Shell calls |
shell |
Known Folders, Shell namespace, icon and launch APIs | Usage statistics |
storage |
Settings, pins, usage, atomic writes | Catalog enumeration |
diagnostics |
Bounded local logs and performance markers | Search text |
Core value types should remain copyable and testable without HWND or Shell COM ownership. Background work should publish a complete snapshot only after it succeeds; the UI must never display a half-built catalog.
All user-visible NimbleRun UI text is English. Keep product copy short and action-oriented, for example:
Search appsNo apps foundRefresh appsPin/UnpinOpen file locationSettingsQuit
Documentation can remain in Traditional Chinese when it is more useful to the project owner.
Release is the performance and packaging configuration. The project does not require Visual Studio:
- x64.
- C++20.
- LLVM-MinGW with link-time optimization where supported.
- Unicode, Control Flow Guard, ASLR, DEP, and high-entropy VA.
Debug is for development only and must not be used for release resource gates.
- Read the relevant design-spec section.
- Identify the narrowest module boundary that owns the behavior.
- Reuse existing types and helpers before adding code.
- Add or update one focused test for non-trivial logic.
- Run configure, build, tests, and the applicable manual checks.
- Update the relevant docs when behavior or a boundary changes.
Do not add a dependency, background loop, framework, or abstraction without a measured need.