Everything else is configured in the console
The settings below are edited in the admin console and take effect within a minute — no
restart. The console stores them in the database.
The variable names are shown because some of these can also be pinned in the
environment, and a pinned value then shows as locked in the console. On Compose
that means adding the variable to the web service's own
environment: block in docker-compose.yml — putting it in
.env alone does nothing, because Compose only passes on what the compose
file lists. On Kubernetes the equivalent is web.extraEnv. Each group below
says which way it goes.
Mail console only
Sign-in verification, invitations, password resets and run notifications. Point it at your
own relay — Exchange, Microsoft 365, Google Workspace, Postfix, SES.
Do not put these in .env. The shipped
.env.example and docker-compose.yml contain no
TV_SMTP_* variables at all, and the web service forwards none
of them, so a TV_SMTP_HOST in .env has no effect. The Helm
chart carries no SMTP values either. The only mail key Compose does pass through from
.env is TESTVIBE_MANDRILL_API_KEY.
TV_SMTP_HOST console only | Relay hostname. Required for mail to work. Not read from .env on Compose. |
TV_SMTP_PORT console only | 587 (STARTTLS) or 25. Port 465 is not supported — use 587, which every mainstream relay also offers. |
TV_SMTP_USE_TLS console only | On by default. Turn off only for an internal relay with no TLS. |
TV_SMTP_USERNAME console only | Blank if the relay authorises this host by IP. |
TV_SMTP_PASSWORD console only | App password or service-account token. Microsoft 365 and Google Workspace both need one of these, not a user's own password. |
TESTVIBE_EMAIL_SENDER_ADDRESS console only | From address, on a domain your relay owns. Required for mail to work. Not read from .env on Compose. |
TESTVIBE_EMAIL_SENDER_NAME console only | Display name. Defaults to TestVibe. |
Press Send test in the console. It pushes a real message through these
settings, so a wrong password surfaces there instead of as a colleague's missing
invitation. Configure mail before anyone opens the app: sign-up sends a
verification link, and with no relay that link is only printed to the web container's
log.
Single sign-on console or .env
Local email and password always works. Add your identity provider over OpenID Connect —
Microsoft Entra ID, Okta, Keycloak, Auth0 and Ping are all standard OIDC. Register TestVibe
as a confidential web application; the console shows you the exact redirect URI to paste.
The Compose stack does forward all of these from .env, so pinning
them there works.
TV_OIDC_ISSUER required | The issuer URL, not the authorize URL — we read /.well-known/openid-configuration from it. |
TV_OIDC_CLIENT_ID required | From your provider's app registration. |
TV_OIDC_CLIENT_SECRET required | Stored encrypted. |
TV_OIDC_LABEL | Button text: “Continue with this”. |
TV_OIDC_SCOPES | Defaults to openid email profile. |
TESTVIBE_GITHUB_CLIENT_ID / _SECRET | Optional GitHub sign-in. |
TESTVIBE_GOOGLE_CLIENT_ID / _SECRET | Optional Google sign-in. Register the callback with a trailing slash. |
SAML is not supported. Every provider listed above speaks OIDC.
AI models console or .env
Which models write and heal your tests. Not a list of variables: in the console's
AI models page you connect a provider, then tick the individual models
your users may pick. Those are two separate acts, so a new model never appears in
anyone's picker until you say so.
Anthropic and OpenAI are the two engines TestVibe
generates with, direct. OpenCode and OpenRouter are
gateways — many vendors' models behind one key. Custom is anything
speaking the OpenAI chat-completions API: vLLM, Ollama, LM Studio, LiteLLM, or Azure
OpenAI behind a gateway. That is how you keep prompts and page content inside your own
network.
Each provider gets a Test connection button, so a wrong key surfaces
there rather than as a failed generation. A model must support tool-calling or
generation stalls. Keys are stored encrypted and never shown back to you.
ANTHROPIC_API_KEY, OPENAI_API_KEY and TV_LLM_*
are forwarded from .env on Compose.
AI providers in the guide works through the
choice.
Capacity console only
Set these in the console. The Compose stack forwards none of them from
.env.
TV_SANDBOX_LOCKED_MAX | Concurrent test runs; single features and whole suites share this budget. Default 10. |
TV_SANDBOX_GENERATION_MAX | Concurrent AI generations. Default 10. Each drives a real browser, so this usually decides how much CPU the host needs. |
TV_SANDBOX_LOAD_MAX | Concurrent load-test machines, not runs. Default 20. A browser-mode run takes one machine per 20 virtual users; k6 runs pack far more per machine. |
TV_SANDBOX_ROAMING_MAX | Concurrent assistant sessions — the chat and explore browser only. Default 10. It does not control test runs. |
TV_SANDBOX_ACQUIRE_TIMEOUT_SECONDS | How long queued work waits for a slot before failing with capacity_unavailable. Default 1800 (30 minutes). |
These are admission caps. Work that does not fit queues rather than being rejected, so
raising one above the capacity you deployed just moves the queue. The runner and browser
containers each stay at one replica: run state lives in the process that
accepted the job, so the chart refuses runner.replicaCount or
browser.replicaCount above 1, and Compose --scale is not
supported. Add capacity by giving that one container more CPU.
Capacity & concurrency works through the sizing, with
a section each for test runs,
generation and
load testing.