CI setup
1. Add the workflow
npx stresseur init-ci
It writes .github/workflows/stresseur.yml. On each pull request and push to the default branch it starts your app, runs the flows and uploads the timings.
The app starts from, in order: a root Docker Compose file, a Dockerfile, a package.json start or dev script. To test a deployed server, set the APP_URL repository variable to its address. The variable wins over a detected app; --target compose (or docker, start) always starts your app in CI, even when it is set. STRESSEUR_BASE_URL, the name before 0.4, still works.
init-ci won’t write a workflow while api-tests/ has no flows. It warns when your flows call a separate API, and lists what your app needs in CI: a database, and variables left empty in .env.example.
Variables in .env.example come from repository secrets. Uploads use GitHub OIDC, so there is no token to store.
For AI checks, the workflow passes STRESSEUR_JUDGE_API_KEY, ANTHROPIC_API_KEY and OPENAI_API_KEY to the run step only. Add one with gh secret set STRESSEUR_JUDGE_API_KEY. Judge checks are skipped on pull requests from forks.
2. Install the GitHub App
In Stresseur Cloud, choose Import repository and install the GitHub App on the repo.
3. What a pull request shows
- One check, Stresseur / performance, for example
browse 31% slower · gate failed. - One comment, updated in place on each push: each flow’s result, flow time base → head, the steps that took the time, and the command to run it locally.

See Reading results and Gates.