| name | performance |
| description | Use when changing or reviewing performance-sensitive Nevermind paths: command palette search, keyboard input, AI chat streaming, extension views, cache invalidation, IPC, Electron window behavior, file/icon/thumbnail/clipboard work, or any request mentioning lag, latency, responsiveness, jank, render cost, or “performance is UX”. Trigger before making assumptions; explore the repo and identify the hot path first. |
Performance
Performance is UX. In Nevermind, every millisecond affects trust because the product is a keyboard-first command palette. Treat perceived latency, input responsiveness, and visual stability as product requirements, not polish.
How to use this skill
- Explore before assuming. Identify the exact interaction path: renderer input → IPC → main/provider work → cache/revalidation → render/update.
- Turn on local traces. Debug performance marks are dev-gated by default. In the renderer, use
localStorage.setItem('nvm.debugPerformance', 'true') if needed and tune noisy logs with localStorage.setItem('nvm.debugPerformance.slowMs', '16'). In main/CLI runs, use NVM_DEBUG_PERFORMANCE=1 and optionally NVM_DEBUG_PERFORMANCE_SLOW_MS=16.
- Read the logs before fixing. Use
mise exec -- pnpm logs:tail or inspect the app log for performance.measure entries. Compare paired layers such as search.renderer-to-results, ipc.actions:search, search.actions, extension.search.provider, root-actions.to-command-items, app.commit, view-action.ipc, ipc.palette:hide, and palette-window.show to locate where time is spent.
- Separate perceived and actual latency. Prefer showing cached/snapshot data immediately, hydrating expensive details later, and refreshing in place.