A live OpenAI secret key is hardcoded in src/lib/ai.js line 3. Anyone with repo access can run up your bill or access your AI data. Rotate the key immediately and load it from an environment variable.
User input is concatenated directly into a SQL query in api/recipes/search.js line 24. An attacker can read, modify, or delete your entire database with a crafted search string.
The route /admin/dashboard in app/admin/page.jsx line 1 renders with no session or token verification. Any unauthenticated user can access all admin functionality.