Automated scanners probing for WordPress paths (/blog/wp/v2/posts/*,
POST /) generate a React Router 404 or 405 on every hit, and handleError
forwarded all of them to Sentry, exhausting the quota. The existing
defence was a list of ignoreErrors regexes that needed a new entry for
each scanner pattern.
Filter on what the error is instead: shouldReportServerError drops 4xx
responses React Router generated itself (internal: true) for requests
that matched nothing. Responses the app throws deliberately still report,
as do all 5xx and real exceptions.
A request carrying a same-origin Referer is still reported, so a broken
internal link remains visible in Sentry -- only cold scanner hits are
dropped. No HTTP response changes; every URL returns the status and page
it did before.
Also adds /blog to the Express bot-probe filter so the highest-volume
path 404s without an SSR render, and removes the now-redundant
route-404 ignoreErrors entries.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ESrxBMZMx2BD9rcKTCgLe4
* feat: add Sentry error monitoring (#77)
Installs and configures @sentry/react-router with server and client
instrumentation. Disabled in development to avoid noise; only active
in production.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: add VSCode Sentry MCP server config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: pass vite env to sentryReactRouter plugin
sentryReactRouter requires the ConfigEnv as a second argument to read
the vite `command` property.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>