The model dropdown was a hand-written list per provider, so it was wrong the day after every release: DeepSeek showed V3 while V3.2 was current, Anthropic still seeded claude-3-5-sonnet-20240620, Gemini seeded 1.5-pro. Worse, picking a model the provider had since retired failed only later, at generation time, with an error that pointed nowhere near this screen. A "Load models" button next to the dropdown now asks the provider what it serves right now — OpenAI, DeepSeek, OpenRouter, Groq, Mistral (all OpenAI-shaped /models), Anthropic, Gemini, and Ollama's local /api/tags. The live list replaces the static options once loaded; the static ones remain as the fallback for providers with no listing endpoint and for before the first fetch, and the per-provider defaults are now clearly seeds, not choices. The key is sent in the request body, never a query string — URLs end up in proxy and access logs. An empty key falls back to the saved one so the list loads without retyping it, and provider errors are surfaced verbatim (401 reads as "rejected the API key", not a generic failure). Switching providers clears the list so one provider's models are never offered under another. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
TrueVuln Frontend
Next.js 16 (App Router) UI for TrueVuln. See the root README for setup, deployment, and configuration — this app is deployed via Docker Compose alongside the backend, not standalone or on Vercel.
Local dev (without Docker)
npm install
npm run dev
Open http://localhost:3000. The dev server proxies API calls to the backend — see ../README.DEV.md for the full local (non-Docker) setup.