Starting a local app is easy. Getting back to a clean baseline is where the development loop shows its quality.
I want the lifecycle to be legible from the command line:
- start the process
- stop the process
- reset local state
- inspect the logs
Those are different operations. A stop command should not quietly delete data, and a reset command should not leave the old process holding the port.
pnpm dev:stop
pnpm dev:reset
pnpm dev:logs
The names are not the important part. The ownership is. dev:stop should end the process it started. dev:reset should say which cache, temporary data, lockfile, or socket it removes. dev:logs should make the failed run inspectable instead of sending me back through a browser tab and three terminal windows.
The useful failure cases are ordinary:
- the port is still occupied
- a migration stopped halfway through
- a stale cache changes the behavior
- the previous session left an orphaned process
Each one needs a documented path back to normal. “Restart the app” is not a recovery procedure when the thing that needs restarting is unclear.
An exit ramp is part of the local development interface. Without one, every small failure becomes archaeology. With one, stopping and recovering are routine operations instead of tribal knowledge.
Related posts

About Jeremy London
Engineering leader and builder in Denver. I write about AI platforms, agents, security, reliability, homelab infrastructure, and the parts of engineering work that have to survive production.