Primary finding
Synchronous child_process calls block the Node event loop on every request
- dashboard/app/api/secrets/route.ts:30-75
- dashboard/app/api/auth/route.ts:5-12
Every GET/POST/DELETE fans out to multiple synchronous `gh` invocations (auth status, repo detection, secret list). On a multi-user dashboard this serializes all other requests handled by the same Node worker for hundreds of ms per call. The dashboard is described as a local tool, so severity is low, but the comment `// Check if ANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKEN is set` in GET hides that it actually shells out three times.
Recommendation
Use the async `execFile` (promisified) and await it; or batch results behind a short in-memory cache (e.g. 5s TTL) for repo and auth-status checks.