#3244·werkzeug

Should we remove the interactive debugger?

Author: davidismCreated Aug 19, 2026Updated Aug 19, 2026

What if we removed the interactive debugger?

  • Its implementation is ridiculously complex. It's very impressive that it's possible at all.
  • I already had to fix it to work with Flask's contexts, and I'm not sure if we'd ever be able to get it to work with ASGI. Quart doesn't provide it.
  • It's a constant source of (invalid) security reports.
  • The PIN is annoying but not remotely secure.
  • Most users don't realize it also exposes a /console endpoint for arbitrary code without a traceback.
  • Its UI is hard to understand, it's not obvious what's clickable or how to use it.
  • Users end up copying the rich HTML traceback instead of the plain text version.
  • It doesn't work if the app is an API consumed by a JavaScript UI (without some clever detection and rendering in the UI code).
  • I'm not confident it correctly supports newer exception features such as contexts, groups, and notes.

It's nice if you didn't expect a request to fail and want to see why, but you could just as easily set a breakpoint in a real debugger then refresh the page. Perhaps it was more useful in the past, when debuggers and code navigation wasn't as good, and most people were using pdb. But that hasn't been the case for a long time now, PyCharm, VS Code, pudb, and others are all powerful and easy to use. I don't remember the last time I used it to execute code, vs just looking at the traceback and using PyCharm's debugger.

I guess showing the traceback is still useful, although we should make it easier to copy it as plain text. That said, it's already shown in the terminal, I can't think of a time that the dev wouldn't be able to look at that if they see a 500 error in the browser.

Django shows the config and request info, but Werkzeug middleware doesn't have a concept of that, it's only operating on an Environ. Perhaps we could add a hook to display additional info, but that's adding complexity where I want to remove it. And it's still possible to see all that by looking at the code or setting a breakpoint.