We use Sentry.
In addition to ports, we use window.addEventListener("error", function() { ... })
for runtime errors. Some of those are caused by Debug.todo
(which we use also in production by not using --optimize
) and others are caused by unexpected behavior of elm (which includes interruption by browser extensions).