Cause #1: Something's Already Using the Port
The most common reason I see ELIFECYCLE in the wild is a port conflict. Your app tries to bind to port 3000 (or 8080, whatever), and something else is already squatting there. Happened to a client last month — their old dev server was still running in a background terminal, and every time they ran npm start, it died instantly with this error.
The error message usually prints right above the ELIFECYCLE line. Look for something like Error: listen EADDRINUSE: address already in use :::3000. That's your smoking gun.
Fix: Find and kill the process or change the port
On macOS/Linux, find what's using the port:
lsof -i :3000
kill -9 [PID]
On Windows (PowerShell):
netstat -ano | findstr :3000
taskkill /PID [PID] /F
If you don't want to kill anything — maybe it's another project you care about — just change the port. For React (CRA), set the env variable:
export PORT=3001 && npm start
For Express or Node, change the port in your code or use an .env file. The point is: don't fight the conflict, sidestep it.
Quick tip: if you're on Windows and nothing shows up on that port, check if you're running Docker. I've seen Docker's port forwarding eat ports silently. docker ps is your friend.
Cause #2: A Syntax Error or Crash in Your Script
Second most common: your start script actually runs, but your app crashes immediately because of a syntax error, a missing module, or an unhandled exception. The ELIFECYCLE error is just npm saying "your script exited with a non-zero code." It's a wrapper, not the root cause.
I once spent an hour debugging a Vue project where someone had left an extra closing brace in a config file. The app compiled, then bailed instantly, and the only clue was ELIFECYCLE.
Fix: Read the error above ELIFECYCLE
Scroll up. The actual stack trace is there. Look for lines like SyntaxError: Unexpected token or Error: Cannot find module 'some-package'. Fix that and you're done.
If the output is huge, pipe it to a file and search:
npm start 2>&1 | tee start.log
grep -i "error" start.log
Also, check your package.json scripts section. Sometimes the start script itself is wrong — maybe it points to a file that doesn't exist. I've seen "start": "node app.js" where nobody actually created app.js. That gives you ELIFECYCLE faster than you can say "works on my machine."
Cause #3: Stale node_modules or a Broken Dependency
Third on the list: your dependencies are out of sync or corrupted. This happens after a merge conflict, switching branches, or someone hand-editing package.json. npm's lifecycle scripts (like prestart or postinstall) can also fail for weird reasons.
I had a client whose build worked on their laptop but not the office PC. Turned out the PC had an old node_modules from a different Node version. Classic.
Fix: Clean install
Don't just run npm install — that might not overwrite corrupted files. Do the nuclear option:
rm -rf node_modules package-lock.json
npm install
On Windows use rd /s /q node_modules or just delete the folder in Explorer. Then reinstall.
If that still fails, check your Node version. node -v — most modern frameworks need Node 16 or higher. I've seen ELIFECYCLE on Node 14 with a React 18 app. Upgrading Node fixed it instantly.
Also, look for any prestart or predev scripts in package.json. If those fail, npm aborts with ELIFECYCLE before your app even starts. Comment them out temporarily to test.
Quick-Reference Summary
| Cause | Symptom | Fix |
|---|---|---|
| Port conflict | EADDRINUSE in the error output | Kill the process on that port or change the port |
| Syntax/crash in script | Actual error message above ELIFECYCLE | Fix the syntax error or missing module |
| Broken dependencies | Random errors, works on other machines | Delete node_modules and reinstall; check Node version |
Remember: ELIFECYCLE is just npm's way of saying "your script failed." Don't panic. Read the actual error above it. Nine times out of ten, it's one of these three things, and the fix takes less than five minutes.