Playwright "Timed out waiting ... from config.webServer"
By Daniel Zoghalchali·Latchkey
Playwright started your app via webServer but the configured url never responded within the timeout. The server is slow to compile/boot in CI, crashed on start, or the url/port does not match.
What this error means
The run aborts before tests with "Timed out waiting 60000ms from config.webServer." No specs run because Playwright never confirmed the app was ready.
Playwright output
Error: Timed out waiting 60000ms from config.webServer.
at WebServer._waitForProcess
Diagnose it: browser, server, or timing?
End-to-end failures in CI are dominated by three causes that have nothing to do with the test: the browser binary is missing, the application under test is not listening yet, or the test raced the page. Establish which before reading the assertion.
Terminal
# 1. are the browsers actually installed in THIS job?
npx playwright install --with-deps chromium
npx playwright --version
# 2. is the app up before the tests start?
npx wait-on http://localhost:3000 --timeout 60000
# 3. capture evidence for the failure you cannot reproduce
npx playwright test --trace on --video retain-on-failure
Common causes
App boots slower than the timeout in CI
A cold build (Next/Vite production build, asset compilation) on a loaded runner takes longer than the default 60s readiness window - a timing race that often clears on retry.
Wrong url/port or a crashed server
The webServer.url does not match where the app listens, or the start command exits/crashes immediately, so the url never becomes reachable.
Run the command manually in CI to confirm it boots and listens on the expected port.
Check the server logs Playwright prints for a crash on startup.
Build the app in a prior step so webServer only has to serve, not compile.
Make the browser cache safe
Key the browser cache to the exact test-runner version. A cache restored from a different version gives you a binary that does not match the client and fails in a way that reads like a missing install.
Install browsers after dependencies, not before; a dependency install can replace the package that owns the browser path.
Prefer the vendor container image when the runner allows it. It removes the whole class of missing-system-library failures.
How to prevent it
Set a generous webServer.timeout for the slowest CI tier.
Pre-build the app before the E2E step so boot is fast.
Keep webServer.url and the app port in one shared value.
Frequently asked questions
What causes Playwright "Timed out waiting ... from config.webServer"?
There are 2 common causes: app boots slower than the timeout in ci and wrong url/port or a crashed server. A cold build (Next/Vite production build, asset compilation) on a loaded runner takes longer than the default 60s readiness window - a timing race that often clears on retry.
How do I fix Playwright "Timed out waiting ... from config.webServer"?
There are 2 fixes depending on which cause you have: raise the readiness timeout and match the url and diagnose a server that never starts. Work through them in order, since the first is the most common.
What does Playwright "Timed out waiting ... from config.webServer" actually mean?
The run aborts before tests with "Timed out waiting 60000ms from config.webServer." No specs run because Playwright never confirmed the app was ready.
How do I stop Playwright "Timed out waiting ... from config.webServer" happening again?
Set a generous webServer.timeout for the slowest CI tier. The prevention section lists 3 changes that keep it from recurring.
Can Latchkey fix this automatically?
Yes. Latchkey runs your GitHub Actions on managed runners that detect this failure, apply the fix, and retry the job automatically - self-healing is on by default.