feat(docs): add sentry - #7492

Merged
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry
Feb 16, 2026
Merged

feat(docs): add sentry#7492
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry

Conversation

@aidankmcalister

@aidankmcalisteraidankmcalister commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Integrated error tracking and monitoring across the documentation site.
    • Global error UI now captures and reports client-side errors and offers a recovery link.
    • Added request/route instrumentation and performance tracing, including router transition capture.
  • Chores
    • Added monitoring dependency and environment-specific monitoring configuration to enable Sentry integration.

@vercel

vercelBot commented Feb 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
docsReadyReadyPreview, CommentFeb 16, 2026 3:20pm

Request Review

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉


Walkthrough

Adds Sentry integration to the docs app: dependency, Next.js config wrapper, server and edge initializers, client and shared instrumentation hooks, and an App Router global error component that captures exceptions.

Changes

Cohort / File(s)Summary
Next.js config & dependency
apps/docs/next.config.mjs, apps/docs/package.json
Wrapped existing MDX config with withSentryConfig(...) and added @sentry/nextjs to dependencies; added Sentry options (org/project/authToken/tunnelRoute/silent) and webpack-related options.
Runtime Sentry initializers
apps/docs/sentry.server.config.ts, apps/docs/sentry.edge.config.ts
New server- and edge-targeted Sentry init files calling Sentry.init() with dsn, tracesSampleRate: 1, enableLogs: true, and sendDefaultPii: true.
Client instrumentation
apps/docs/src/instrumentation-client.ts
Initialized client-side Sentry and exported onRouterTransitionStart = Sentry.captureRouterTransitionStart.
Shared instrumentation + loader
apps/docs/src/instrumentation.ts
New register() that dynamically imports sentry.server.config or sentry.edge.config based on NEXT_RUNTIME; exports onRequestError aliasing Sentry.captureRequestError.
App Router error boundary
apps/docs/src/app/global-error.tsx
Added GlobalError client component that calls Sentry.captureException(error) on mount and renders a full-viewport error UI with a "Go to docs" link.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically identifies the main change: integrating Sentry error tracking/monitoring into the docs application.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

🍈 Lychee Link Check Report

3660 links:✅ 2729 OK | 🚫 0 errors | 🔀 265 redirects | 👻 664 excluded

✅ All links are working!


Full Statistics Table
StatusCount
✅ Successful2729
🔀 Redirected265
👻 Excluded664
🚫 Errors0
⛔ Unsupported2
⏳ Timeouts0
❓ Unknown0

coderabbitai[bot]
coderabbitaiBot previously requested changes Feb 13, 2026

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/docs/next.config.mjs (1)

1-55: ⚠️ Potential issue | 🟡 Minor

Fix the trailing backslash typo on line 27; authToken gating is optional.

Your Sentry configuration is well-structured per @sentry/nextjs@10.38.0. A couple of clarifications:

  • Line 27 typo: Remove the trailing \ from the comment (CI\CI).
  • webpack options placement: Your nested webpack: { automaticVercelMonitors, treeshake: ... } is the correct modern location for these options (not mixing buckets). Both automaticVercelMonitors and treeshake.removeDebugLogging are valid here and won't cause issues.
  • authToken undefined behavior: When process.env.SENTRY_AUTH_TOKEN is missing in non-CI environments, authToken is simply undefined, and the build proceeds without attempting uploads—no failure. Explicit CI gating (as suggested below) is defensive and good practice, but not strictly required.
Optional defensive CI gating
- authToken: process.env.SENTRY_AUTH_TOKEN,+ authToken: process.env.CI ? process.env.SENTRY_AUTH_TOKEN : undefined,

Fix the typo. The authToken suggestion is optional; the rest is correct as-is.

apps/docs/src/instrumentation-client.ts (1)

2-29: ⚠️ Potential issue | 🟠 Major

Lock down Sentry config: env-based DSN, lower sampling rates, and disable PII by default.

The current config poses three real risks on a public docs site:

  1. Hardcoded DSN prevents separate environment configs. Preview/staging deployments will send errors to the same production project, polluting signal and making it harder to troubleshoot issues in isolation. Use process.env.NEXT_PUBLIC_SENTRY_DSN instead, so environments can be configured independently.

  2. sendDefaultPii: true captures IP addresses, headers, and user-like context by default. This is a privacy concern for a public site—users haven't consented to PII collection by Sentry. The Sentry default is false for good reason. Set it to false unless you have explicit consent and documented need.

  3. tracesSampleRate: 1 means 100% of transactions (all page navigation, API calls, etc.) are sent to Sentry. On a docs site with meaningful traffic, this will quickly exceed your quota (5M spans/month on standard plans) and trigger pay-as-you-go overage charges. Production should use a much lower rate (~0.1 = 10% is a common starting point), configurable via env var.

As for enableLogs: true—it's a valid option that pipes console logs into Sentry. There's no inherent problem, but gating it to dev-only (process.env.NODE_ENV !== "production") reduces noise in production events.

Apply this pattern:

Suggested fix
 Sentry.init({
- dsn: "https://e83ce4699e59051fdeaa330bf4a0dfb9@o4510879743737856.ingest.us.sentry.io/4510879744000000",+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,- tracesSampleRate: 1,+ tracesSampleRate:+ process.env.NODE_ENV === "production"+ ? Number(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE ?? 0.1)+ : 1,- enableLogs: true,+ enableLogs: process.env.NODE_ENV !== "production",- sendDefaultPii: true,+ sendDefaultPii: false,
});

If NEXT_PUBLIC_SENTRY_DSN can be absent in dev/preview, guard the init:

if(process.env.NEXT_PUBLIC_SENTRY_DSN){Sentry.init({ ... });}
🤖 Fix all issues with AI agents
In `@apps/docs/sentry.edge.config.ts`:
- Around line 1-20: Replace the hardcoded Sentry configuration in Sentry.init:
read dsn from an environment variable (e.g., process.env.SENTRY_DSN) instead of
the literal string, drive tracesSampleRate from an env var with a safe
production default (e.g., parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE) ||
0.1), set enableLogs based on NODE_ENV (true only in development), and set
sendDefaultPii from an env var defaulting to false (e.g.,
!!JSON.parse(process.env.SENTRY_SEND_DEFAULT_PII || "false")); apply the same
env-driven changes to sentry.server.config.ts so both edge and server configs
use the same safe defaults.
In `@apps/docs/src/app/global-error.tsx`:
- Around line 1-27: Replace the Pages Router-only NextError usage in GlobalError
with a minimal custom error UI and recovery button: inside the GlobalError
component (function GlobalError) remove NextError and render a simple message
and a "Try again" button that calls the reset() function (destructure reset from
the component props) to trigger client-side recovery; when reporting to Sentry
use Sentry.captureException(error) together with Sentry.captureContext (or
Sentry.setContext) to tag the event with error.digest for correlation (ensure
you pass error.digest in the context before captureException) so production logs
can be tied to the UI error digest.
🧹 Nitpick comments (1)
apps/docs/src/instrumentation.ts (1)

1-13: Use else if to clarify mutually exclusive runtime branches.

Since NEXT_RUNTIME is mutually exclusive, switching to else if makes the intent clearer and avoids unnecessary condition checks:

Runtime branch tightening
 export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
- }-- if (process.env.NEXT_RUNTIME === "edge") {+ } else if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}

The direct assignment of Sentry.captureRequestError to onRequestError is correct and intentional for Next.js 16.1.1 with @sentry/nextjs 10.38.0—Sentry explicitly documents this pattern as the recommended integration approach for error capture in instrumentation files.

Comment threadapps/docs/sentry.edge.config.ts
Comment threadapps/docs/src/app/global-error.tsx
@aidankmcalister
aidankmcalister merged commit ec72e7d into mainFeb 16, 2026
7 of 10 checks passed
@aidankmcalister
aidankmcalister deleted the feat/add-sentry branch February 16, 2026 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aidankmcalister@mhartington
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(docs): add sentry - #7492

Merged
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry
Feb 16, 2026
Merged

feat(docs): add sentry#7492
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry

Conversation

@aidankmcalister

@aidankmcalisteraidankmcalister commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Integrated error tracking and monitoring across the documentation site.
    • Global error UI now captures and reports client-side errors and offers a recovery link.
    • Added request/route instrumentation and performance tracing, including router transition capture.
  • Chores
    • Added monitoring dependency and environment-specific monitoring configuration to enable Sentry integration.

@vercel

vercelBot commented Feb 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
docsReadyReadyPreview, CommentFeb 16, 2026 3:20pm

Request Review

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉


Walkthrough

Adds Sentry integration to the docs app: dependency, Next.js config wrapper, server and edge initializers, client and shared instrumentation hooks, and an App Router global error component that captures exceptions.

Changes

Cohort / File(s)Summary
Next.js config & dependency
apps/docs/next.config.mjs, apps/docs/package.json
Wrapped existing MDX config with withSentryConfig(...) and added @sentry/nextjs to dependencies; added Sentry options (org/project/authToken/tunnelRoute/silent) and webpack-related options.
Runtime Sentry initializers
apps/docs/sentry.server.config.ts, apps/docs/sentry.edge.config.ts
New server- and edge-targeted Sentry init files calling Sentry.init() with dsn, tracesSampleRate: 1, enableLogs: true, and sendDefaultPii: true.
Client instrumentation
apps/docs/src/instrumentation-client.ts
Initialized client-side Sentry and exported onRouterTransitionStart = Sentry.captureRouterTransitionStart.
Shared instrumentation + loader
apps/docs/src/instrumentation.ts
New register() that dynamically imports sentry.server.config or sentry.edge.config based on NEXT_RUNTIME; exports onRequestError aliasing Sentry.captureRequestError.
App Router error boundary
apps/docs/src/app/global-error.tsx
Added GlobalError client component that calls Sentry.captureException(error) on mount and renders a full-viewport error UI with a "Go to docs" link.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically identifies the main change: integrating Sentry error tracking/monitoring into the docs application.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

🍈 Lychee Link Check Report

3660 links:✅ 2729 OK | 🚫 0 errors | 🔀 265 redirects | 👻 664 excluded

✅ All links are working!


Full Statistics Table
StatusCount
✅ Successful2729
🔀 Redirected265
👻 Excluded664
🚫 Errors0
⛔ Unsupported2
⏳ Timeouts0
❓ Unknown0

coderabbitai[bot]
coderabbitaiBot previously requested changes Feb 13, 2026

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/docs/next.config.mjs (1)

1-55: ⚠️ Potential issue | 🟡 Minor

Fix the trailing backslash typo on line 27; authToken gating is optional.

Your Sentry configuration is well-structured per @sentry/nextjs@10.38.0. A couple of clarifications:

  • Line 27 typo: Remove the trailing \ from the comment (CI\CI).
  • webpack options placement: Your nested webpack: { automaticVercelMonitors, treeshake: ... } is the correct modern location for these options (not mixing buckets). Both automaticVercelMonitors and treeshake.removeDebugLogging are valid here and won't cause issues.
  • authToken undefined behavior: When process.env.SENTRY_AUTH_TOKEN is missing in non-CI environments, authToken is simply undefined, and the build proceeds without attempting uploads—no failure. Explicit CI gating (as suggested below) is defensive and good practice, but not strictly required.
Optional defensive CI gating
- authToken: process.env.SENTRY_AUTH_TOKEN,+ authToken: process.env.CI ? process.env.SENTRY_AUTH_TOKEN : undefined,

Fix the typo. The authToken suggestion is optional; the rest is correct as-is.

apps/docs/src/instrumentation-client.ts (1)

2-29: ⚠️ Potential issue | 🟠 Major

Lock down Sentry config: env-based DSN, lower sampling rates, and disable PII by default.

The current config poses three real risks on a public docs site:

  1. Hardcoded DSN prevents separate environment configs. Preview/staging deployments will send errors to the same production project, polluting signal and making it harder to troubleshoot issues in isolation. Use process.env.NEXT_PUBLIC_SENTRY_DSN instead, so environments can be configured independently.

  2. sendDefaultPii: true captures IP addresses, headers, and user-like context by default. This is a privacy concern for a public site—users haven't consented to PII collection by Sentry. The Sentry default is false for good reason. Set it to false unless you have explicit consent and documented need.

  3. tracesSampleRate: 1 means 100% of transactions (all page navigation, API calls, etc.) are sent to Sentry. On a docs site with meaningful traffic, this will quickly exceed your quota (5M spans/month on standard plans) and trigger pay-as-you-go overage charges. Production should use a much lower rate (~0.1 = 10% is a common starting point), configurable via env var.

As for enableLogs: true—it's a valid option that pipes console logs into Sentry. There's no inherent problem, but gating it to dev-only (process.env.NODE_ENV !== "production") reduces noise in production events.

Apply this pattern:

Suggested fix
 Sentry.init({
- dsn: "https://e83ce4699e59051fdeaa330bf4a0dfb9@o4510879743737856.ingest.us.sentry.io/4510879744000000",+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,- tracesSampleRate: 1,+ tracesSampleRate:+ process.env.NODE_ENV === "production"+ ? Number(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE ?? 0.1)+ : 1,- enableLogs: true,+ enableLogs: process.env.NODE_ENV !== "production",- sendDefaultPii: true,+ sendDefaultPii: false,
});

If NEXT_PUBLIC_SENTRY_DSN can be absent in dev/preview, guard the init:

if(process.env.NEXT_PUBLIC_SENTRY_DSN){Sentry.init({ ... });}
🤖 Fix all issues with AI agents
In `@apps/docs/sentry.edge.config.ts`:
- Around line 1-20: Replace the hardcoded Sentry configuration in Sentry.init:
read dsn from an environment variable (e.g., process.env.SENTRY_DSN) instead of
the literal string, drive tracesSampleRate from an env var with a safe
production default (e.g., parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE) ||
0.1), set enableLogs based on NODE_ENV (true only in development), and set
sendDefaultPii from an env var defaulting to false (e.g.,
!!JSON.parse(process.env.SENTRY_SEND_DEFAULT_PII || "false")); apply the same
env-driven changes to sentry.server.config.ts so both edge and server configs
use the same safe defaults.
In `@apps/docs/src/app/global-error.tsx`:
- Around line 1-27: Replace the Pages Router-only NextError usage in GlobalError
with a minimal custom error UI and recovery button: inside the GlobalError
component (function GlobalError) remove NextError and render a simple message
and a "Try again" button that calls the reset() function (destructure reset from
the component props) to trigger client-side recovery; when reporting to Sentry
use Sentry.captureException(error) together with Sentry.captureContext (or
Sentry.setContext) to tag the event with error.digest for correlation (ensure
you pass error.digest in the context before captureException) so production logs
can be tied to the UI error digest.
🧹 Nitpick comments (1)
apps/docs/src/instrumentation.ts (1)

1-13: Use else if to clarify mutually exclusive runtime branches.

Since NEXT_RUNTIME is mutually exclusive, switching to else if makes the intent clearer and avoids unnecessary condition checks:

Runtime branch tightening
 export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
- }-- if (process.env.NEXT_RUNTIME === "edge") {+ } else if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}

The direct assignment of Sentry.captureRequestError to onRequestError is correct and intentional for Next.js 16.1.1 with @sentry/nextjs 10.38.0—Sentry explicitly documents this pattern as the recommended integration approach for error capture in instrumentation files.

Comment threadapps/docs/sentry.edge.config.ts
Comment threadapps/docs/src/app/global-error.tsx
@aidankmcalister
aidankmcalister merged commit ec72e7d into mainFeb 16, 2026
7 of 10 checks passed
@aidankmcalister
aidankmcalister deleted the feat/add-sentry branch February 16, 2026 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aidankmcalister@mhartington
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(docs): add sentry - #7492

Merged
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry
Feb 16, 2026
Merged

feat(docs): add sentry#7492
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry

Conversation

@aidankmcalister

@aidankmcalisteraidankmcalister commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Integrated error tracking and monitoring across the documentation site.
    • Global error UI now captures and reports client-side errors and offers a recovery link.
    • Added request/route instrumentation and performance tracing, including router transition capture.
  • Chores
    • Added monitoring dependency and environment-specific monitoring configuration to enable Sentry integration.

@vercel

vercelBot commented Feb 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
docsReadyReadyPreview, CommentFeb 16, 2026 3:20pm

Request Review

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉


Walkthrough

Adds Sentry integration to the docs app: dependency, Next.js config wrapper, server and edge initializers, client and shared instrumentation hooks, and an App Router global error component that captures exceptions.

Changes

Cohort / File(s)Summary
Next.js config & dependency
apps/docs/next.config.mjs, apps/docs/package.json
Wrapped existing MDX config with withSentryConfig(...) and added @sentry/nextjs to dependencies; added Sentry options (org/project/authToken/tunnelRoute/silent) and webpack-related options.
Runtime Sentry initializers
apps/docs/sentry.server.config.ts, apps/docs/sentry.edge.config.ts
New server- and edge-targeted Sentry init files calling Sentry.init() with dsn, tracesSampleRate: 1, enableLogs: true, and sendDefaultPii: true.
Client instrumentation
apps/docs/src/instrumentation-client.ts
Initialized client-side Sentry and exported onRouterTransitionStart = Sentry.captureRouterTransitionStart.
Shared instrumentation + loader
apps/docs/src/instrumentation.ts
New register() that dynamically imports sentry.server.config or sentry.edge.config based on NEXT_RUNTIME; exports onRequestError aliasing Sentry.captureRequestError.
App Router error boundary
apps/docs/src/app/global-error.tsx
Added GlobalError client component that calls Sentry.captureException(error) on mount and renders a full-viewport error UI with a "Go to docs" link.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically identifies the main change: integrating Sentry error tracking/monitoring into the docs application.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

🍈 Lychee Link Check Report

3660 links:✅ 2729 OK | 🚫 0 errors | 🔀 265 redirects | 👻 664 excluded

✅ All links are working!


Full Statistics Table
StatusCount
✅ Successful2729
🔀 Redirected265
👻 Excluded664
🚫 Errors0
⛔ Unsupported2
⏳ Timeouts0
❓ Unknown0

coderabbitai[bot]
coderabbitaiBot previously requested changes Feb 13, 2026

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/docs/next.config.mjs (1)

1-55: ⚠️ Potential issue | 🟡 Minor

Fix the trailing backslash typo on line 27; authToken gating is optional.

Your Sentry configuration is well-structured per @sentry/nextjs@10.38.0. A couple of clarifications:

  • Line 27 typo: Remove the trailing \ from the comment (CI\CI).
  • webpack options placement: Your nested webpack: { automaticVercelMonitors, treeshake: ... } is the correct modern location for these options (not mixing buckets). Both automaticVercelMonitors and treeshake.removeDebugLogging are valid here and won't cause issues.
  • authToken undefined behavior: When process.env.SENTRY_AUTH_TOKEN is missing in non-CI environments, authToken is simply undefined, and the build proceeds without attempting uploads—no failure. Explicit CI gating (as suggested below) is defensive and good practice, but not strictly required.
Optional defensive CI gating
- authToken: process.env.SENTRY_AUTH_TOKEN,+ authToken: process.env.CI ? process.env.SENTRY_AUTH_TOKEN : undefined,

Fix the typo. The authToken suggestion is optional; the rest is correct as-is.

apps/docs/src/instrumentation-client.ts (1)

2-29: ⚠️ Potential issue | 🟠 Major

Lock down Sentry config: env-based DSN, lower sampling rates, and disable PII by default.

The current config poses three real risks on a public docs site:

  1. Hardcoded DSN prevents separate environment configs. Preview/staging deployments will send errors to the same production project, polluting signal and making it harder to troubleshoot issues in isolation. Use process.env.NEXT_PUBLIC_SENTRY_DSN instead, so environments can be configured independently.

  2. sendDefaultPii: true captures IP addresses, headers, and user-like context by default. This is a privacy concern for a public site—users haven't consented to PII collection by Sentry. The Sentry default is false for good reason. Set it to false unless you have explicit consent and documented need.

  3. tracesSampleRate: 1 means 100% of transactions (all page navigation, API calls, etc.) are sent to Sentry. On a docs site with meaningful traffic, this will quickly exceed your quota (5M spans/month on standard plans) and trigger pay-as-you-go overage charges. Production should use a much lower rate (~0.1 = 10% is a common starting point), configurable via env var.

As for enableLogs: true—it's a valid option that pipes console logs into Sentry. There's no inherent problem, but gating it to dev-only (process.env.NODE_ENV !== "production") reduces noise in production events.

Apply this pattern:

Suggested fix
 Sentry.init({
- dsn: "https://e83ce4699e59051fdeaa330bf4a0dfb9@o4510879743737856.ingest.us.sentry.io/4510879744000000",+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,- tracesSampleRate: 1,+ tracesSampleRate:+ process.env.NODE_ENV === "production"+ ? Number(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE ?? 0.1)+ : 1,- enableLogs: true,+ enableLogs: process.env.NODE_ENV !== "production",- sendDefaultPii: true,+ sendDefaultPii: false,
});

If NEXT_PUBLIC_SENTRY_DSN can be absent in dev/preview, guard the init:

if(process.env.NEXT_PUBLIC_SENTRY_DSN){Sentry.init({ ... });}
🤖 Fix all issues with AI agents
In `@apps/docs/sentry.edge.config.ts`:
- Around line 1-20: Replace the hardcoded Sentry configuration in Sentry.init:
read dsn from an environment variable (e.g., process.env.SENTRY_DSN) instead of
the literal string, drive tracesSampleRate from an env var with a safe
production default (e.g., parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE) ||
0.1), set enableLogs based on NODE_ENV (true only in development), and set
sendDefaultPii from an env var defaulting to false (e.g.,
!!JSON.parse(process.env.SENTRY_SEND_DEFAULT_PII || "false")); apply the same
env-driven changes to sentry.server.config.ts so both edge and server configs
use the same safe defaults.
In `@apps/docs/src/app/global-error.tsx`:
- Around line 1-27: Replace the Pages Router-only NextError usage in GlobalError
with a minimal custom error UI and recovery button: inside the GlobalError
component (function GlobalError) remove NextError and render a simple message
and a "Try again" button that calls the reset() function (destructure reset from
the component props) to trigger client-side recovery; when reporting to Sentry
use Sentry.captureException(error) together with Sentry.captureContext (or
Sentry.setContext) to tag the event with error.digest for correlation (ensure
you pass error.digest in the context before captureException) so production logs
can be tied to the UI error digest.
🧹 Nitpick comments (1)
apps/docs/src/instrumentation.ts (1)

1-13: Use else if to clarify mutually exclusive runtime branches.

Since NEXT_RUNTIME is mutually exclusive, switching to else if makes the intent clearer and avoids unnecessary condition checks:

Runtime branch tightening
 export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
- }-- if (process.env.NEXT_RUNTIME === "edge") {+ } else if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}

The direct assignment of Sentry.captureRequestError to onRequestError is correct and intentional for Next.js 16.1.1 with @sentry/nextjs 10.38.0—Sentry explicitly documents this pattern as the recommended integration approach for error capture in instrumentation files.

Comment threadapps/docs/sentry.edge.config.ts
Comment threadapps/docs/src/app/global-error.tsx
@aidankmcalister
aidankmcalister merged commit ec72e7d into mainFeb 16, 2026
7 of 10 checks passed
@aidankmcalister
aidankmcalister deleted the feat/add-sentry branch February 16, 2026 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aidankmcalister@mhartington
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(docs): add sentry - #7492

Merged
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry
Feb 16, 2026
Merged

feat(docs): add sentry#7492
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry

Conversation

@aidankmcalister

@aidankmcalisteraidankmcalister commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Integrated error tracking and monitoring across the documentation site.
    • Global error UI now captures and reports client-side errors and offers a recovery link.
    • Added request/route instrumentation and performance tracing, including router transition capture.
  • Chores
    • Added monitoring dependency and environment-specific monitoring configuration to enable Sentry integration.

@vercel

vercelBot commented Feb 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
docsReadyReadyPreview, CommentFeb 16, 2026 3:20pm

Request Review

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉


Walkthrough

Adds Sentry integration to the docs app: dependency, Next.js config wrapper, server and edge initializers, client and shared instrumentation hooks, and an App Router global error component that captures exceptions.

Changes

Cohort / File(s)Summary
Next.js config & dependency
apps/docs/next.config.mjs, apps/docs/package.json
Wrapped existing MDX config with withSentryConfig(...) and added @sentry/nextjs to dependencies; added Sentry options (org/project/authToken/tunnelRoute/silent) and webpack-related options.
Runtime Sentry initializers
apps/docs/sentry.server.config.ts, apps/docs/sentry.edge.config.ts
New server- and edge-targeted Sentry init files calling Sentry.init() with dsn, tracesSampleRate: 1, enableLogs: true, and sendDefaultPii: true.
Client instrumentation
apps/docs/src/instrumentation-client.ts
Initialized client-side Sentry and exported onRouterTransitionStart = Sentry.captureRouterTransitionStart.
Shared instrumentation + loader
apps/docs/src/instrumentation.ts
New register() that dynamically imports sentry.server.config or sentry.edge.config based on NEXT_RUNTIME; exports onRequestError aliasing Sentry.captureRequestError.
App Router error boundary
apps/docs/src/app/global-error.tsx
Added GlobalError client component that calls Sentry.captureException(error) on mount and renders a full-viewport error UI with a "Go to docs" link.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically identifies the main change: integrating Sentry error tracking/monitoring into the docs application.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

🍈 Lychee Link Check Report

3660 links:✅ 2729 OK | 🚫 0 errors | 🔀 265 redirects | 👻 664 excluded

✅ All links are working!


Full Statistics Table
StatusCount
✅ Successful2729
🔀 Redirected265
👻 Excluded664
🚫 Errors0
⛔ Unsupported2
⏳ Timeouts0
❓ Unknown0

coderabbitai[bot]
coderabbitaiBot previously requested changes Feb 13, 2026

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/docs/next.config.mjs (1)

1-55: ⚠️ Potential issue | 🟡 Minor

Fix the trailing backslash typo on line 27; authToken gating is optional.

Your Sentry configuration is well-structured per @sentry/nextjs@10.38.0. A couple of clarifications:

  • Line 27 typo: Remove the trailing \ from the comment (CI\CI).
  • webpack options placement: Your nested webpack: { automaticVercelMonitors, treeshake: ... } is the correct modern location for these options (not mixing buckets). Both automaticVercelMonitors and treeshake.removeDebugLogging are valid here and won't cause issues.
  • authToken undefined behavior: When process.env.SENTRY_AUTH_TOKEN is missing in non-CI environments, authToken is simply undefined, and the build proceeds without attempting uploads—no failure. Explicit CI gating (as suggested below) is defensive and good practice, but not strictly required.
Optional defensive CI gating
- authToken: process.env.SENTRY_AUTH_TOKEN,+ authToken: process.env.CI ? process.env.SENTRY_AUTH_TOKEN : undefined,

Fix the typo. The authToken suggestion is optional; the rest is correct as-is.

apps/docs/src/instrumentation-client.ts (1)

2-29: ⚠️ Potential issue | 🟠 Major

Lock down Sentry config: env-based DSN, lower sampling rates, and disable PII by default.

The current config poses three real risks on a public docs site:

  1. Hardcoded DSN prevents separate environment configs. Preview/staging deployments will send errors to the same production project, polluting signal and making it harder to troubleshoot issues in isolation. Use process.env.NEXT_PUBLIC_SENTRY_DSN instead, so environments can be configured independently.

  2. sendDefaultPii: true captures IP addresses, headers, and user-like context by default. This is a privacy concern for a public site—users haven't consented to PII collection by Sentry. The Sentry default is false for good reason. Set it to false unless you have explicit consent and documented need.

  3. tracesSampleRate: 1 means 100% of transactions (all page navigation, API calls, etc.) are sent to Sentry. On a docs site with meaningful traffic, this will quickly exceed your quota (5M spans/month on standard plans) and trigger pay-as-you-go overage charges. Production should use a much lower rate (~0.1 = 10% is a common starting point), configurable via env var.

As for enableLogs: true—it's a valid option that pipes console logs into Sentry. There's no inherent problem, but gating it to dev-only (process.env.NODE_ENV !== "production") reduces noise in production events.

Apply this pattern:

Suggested fix
 Sentry.init({
- dsn: "https://e83ce4699e59051fdeaa330bf4a0dfb9@o4510879743737856.ingest.us.sentry.io/4510879744000000",+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,- tracesSampleRate: 1,+ tracesSampleRate:+ process.env.NODE_ENV === "production"+ ? Number(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE ?? 0.1)+ : 1,- enableLogs: true,+ enableLogs: process.env.NODE_ENV !== "production",- sendDefaultPii: true,+ sendDefaultPii: false,
});

If NEXT_PUBLIC_SENTRY_DSN can be absent in dev/preview, guard the init:

if(process.env.NEXT_PUBLIC_SENTRY_DSN){Sentry.init({ ... });}
🤖 Fix all issues with AI agents
In `@apps/docs/sentry.edge.config.ts`:
- Around line 1-20: Replace the hardcoded Sentry configuration in Sentry.init:
read dsn from an environment variable (e.g., process.env.SENTRY_DSN) instead of
the literal string, drive tracesSampleRate from an env var with a safe
production default (e.g., parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE) ||
0.1), set enableLogs based on NODE_ENV (true only in development), and set
sendDefaultPii from an env var defaulting to false (e.g.,
!!JSON.parse(process.env.SENTRY_SEND_DEFAULT_PII || "false")); apply the same
env-driven changes to sentry.server.config.ts so both edge and server configs
use the same safe defaults.
In `@apps/docs/src/app/global-error.tsx`:
- Around line 1-27: Replace the Pages Router-only NextError usage in GlobalError
with a minimal custom error UI and recovery button: inside the GlobalError
component (function GlobalError) remove NextError and render a simple message
and a "Try again" button that calls the reset() function (destructure reset from
the component props) to trigger client-side recovery; when reporting to Sentry
use Sentry.captureException(error) together with Sentry.captureContext (or
Sentry.setContext) to tag the event with error.digest for correlation (ensure
you pass error.digest in the context before captureException) so production logs
can be tied to the UI error digest.
🧹 Nitpick comments (1)
apps/docs/src/instrumentation.ts (1)

1-13: Use else if to clarify mutually exclusive runtime branches.

Since NEXT_RUNTIME is mutually exclusive, switching to else if makes the intent clearer and avoids unnecessary condition checks:

Runtime branch tightening
 export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
- }-- if (process.env.NEXT_RUNTIME === "edge") {+ } else if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}

The direct assignment of Sentry.captureRequestError to onRequestError is correct and intentional for Next.js 16.1.1 with @sentry/nextjs 10.38.0—Sentry explicitly documents this pattern as the recommended integration approach for error capture in instrumentation files.

Comment threadapps/docs/sentry.edge.config.ts
Comment threadapps/docs/src/app/global-error.tsx
@aidankmcalister
aidankmcalister merged commit ec72e7d into mainFeb 16, 2026
7 of 10 checks passed
@aidankmcalister
aidankmcalister deleted the feat/add-sentry branch February 16, 2026 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aidankmcalister@mhartington
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(docs): add sentry - #7492

Merged
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry
Feb 16, 2026
Merged

feat(docs): add sentry#7492
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry

Conversation

@aidankmcalister

@aidankmcalisteraidankmcalister commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Integrated error tracking and monitoring across the documentation site.
    • Global error UI now captures and reports client-side errors and offers a recovery link.
    • Added request/route instrumentation and performance tracing, including router transition capture.
  • Chores
    • Added monitoring dependency and environment-specific monitoring configuration to enable Sentry integration.

@vercel

vercelBot commented Feb 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
docsReadyReadyPreview, CommentFeb 16, 2026 3:20pm

Request Review

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉


Walkthrough

Adds Sentry integration to the docs app: dependency, Next.js config wrapper, server and edge initializers, client and shared instrumentation hooks, and an App Router global error component that captures exceptions.

Changes

Cohort / File(s)Summary
Next.js config & dependency
apps/docs/next.config.mjs, apps/docs/package.json
Wrapped existing MDX config with withSentryConfig(...) and added @sentry/nextjs to dependencies; added Sentry options (org/project/authToken/tunnelRoute/silent) and webpack-related options.
Runtime Sentry initializers
apps/docs/sentry.server.config.ts, apps/docs/sentry.edge.config.ts
New server- and edge-targeted Sentry init files calling Sentry.init() with dsn, tracesSampleRate: 1, enableLogs: true, and sendDefaultPii: true.
Client instrumentation
apps/docs/src/instrumentation-client.ts
Initialized client-side Sentry and exported onRouterTransitionStart = Sentry.captureRouterTransitionStart.
Shared instrumentation + loader
apps/docs/src/instrumentation.ts
New register() that dynamically imports sentry.server.config or sentry.edge.config based on NEXT_RUNTIME; exports onRequestError aliasing Sentry.captureRequestError.
App Router error boundary
apps/docs/src/app/global-error.tsx
Added GlobalError client component that calls Sentry.captureException(error) on mount and renders a full-viewport error UI with a "Go to docs" link.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically identifies the main change: integrating Sentry error tracking/monitoring into the docs application.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

🍈 Lychee Link Check Report

3660 links:✅ 2729 OK | 🚫 0 errors | 🔀 265 redirects | 👻 664 excluded

✅ All links are working!


Full Statistics Table
StatusCount
✅ Successful2729
🔀 Redirected265
👻 Excluded664
🚫 Errors0
⛔ Unsupported2
⏳ Timeouts0
❓ Unknown0

coderabbitai[bot]
coderabbitaiBot previously requested changes Feb 13, 2026

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/docs/next.config.mjs (1)

1-55: ⚠️ Potential issue | 🟡 Minor

Fix the trailing backslash typo on line 27; authToken gating is optional.

Your Sentry configuration is well-structured per @sentry/nextjs@10.38.0. A couple of clarifications:

  • Line 27 typo: Remove the trailing \ from the comment (CI\CI).
  • webpack options placement: Your nested webpack: { automaticVercelMonitors, treeshake: ... } is the correct modern location for these options (not mixing buckets). Both automaticVercelMonitors and treeshake.removeDebugLogging are valid here and won't cause issues.
  • authToken undefined behavior: When process.env.SENTRY_AUTH_TOKEN is missing in non-CI environments, authToken is simply undefined, and the build proceeds without attempting uploads—no failure. Explicit CI gating (as suggested below) is defensive and good practice, but not strictly required.
Optional defensive CI gating
- authToken: process.env.SENTRY_AUTH_TOKEN,+ authToken: process.env.CI ? process.env.SENTRY_AUTH_TOKEN : undefined,

Fix the typo. The authToken suggestion is optional; the rest is correct as-is.

apps/docs/src/instrumentation-client.ts (1)

2-29: ⚠️ Potential issue | 🟠 Major

Lock down Sentry config: env-based DSN, lower sampling rates, and disable PII by default.

The current config poses three real risks on a public docs site:

  1. Hardcoded DSN prevents separate environment configs. Preview/staging deployments will send errors to the same production project, polluting signal and making it harder to troubleshoot issues in isolation. Use process.env.NEXT_PUBLIC_SENTRY_DSN instead, so environments can be configured independently.

  2. sendDefaultPii: true captures IP addresses, headers, and user-like context by default. This is a privacy concern for a public site—users haven't consented to PII collection by Sentry. The Sentry default is false for good reason. Set it to false unless you have explicit consent and documented need.

  3. tracesSampleRate: 1 means 100% of transactions (all page navigation, API calls, etc.) are sent to Sentry. On a docs site with meaningful traffic, this will quickly exceed your quota (5M spans/month on standard plans) and trigger pay-as-you-go overage charges. Production should use a much lower rate (~0.1 = 10% is a common starting point), configurable via env var.

As for enableLogs: true—it's a valid option that pipes console logs into Sentry. There's no inherent problem, but gating it to dev-only (process.env.NODE_ENV !== "production") reduces noise in production events.

Apply this pattern:

Suggested fix
 Sentry.init({
- dsn: "https://e83ce4699e59051fdeaa330bf4a0dfb9@o4510879743737856.ingest.us.sentry.io/4510879744000000",+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,- tracesSampleRate: 1,+ tracesSampleRate:+ process.env.NODE_ENV === "production"+ ? Number(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE ?? 0.1)+ : 1,- enableLogs: true,+ enableLogs: process.env.NODE_ENV !== "production",- sendDefaultPii: true,+ sendDefaultPii: false,
});

If NEXT_PUBLIC_SENTRY_DSN can be absent in dev/preview, guard the init:

if(process.env.NEXT_PUBLIC_SENTRY_DSN){Sentry.init({ ... });}
🤖 Fix all issues with AI agents
In `@apps/docs/sentry.edge.config.ts`:
- Around line 1-20: Replace the hardcoded Sentry configuration in Sentry.init:
read dsn from an environment variable (e.g., process.env.SENTRY_DSN) instead of
the literal string, drive tracesSampleRate from an env var with a safe
production default (e.g., parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE) ||
0.1), set enableLogs based on NODE_ENV (true only in development), and set
sendDefaultPii from an env var defaulting to false (e.g.,
!!JSON.parse(process.env.SENTRY_SEND_DEFAULT_PII || "false")); apply the same
env-driven changes to sentry.server.config.ts so both edge and server configs
use the same safe defaults.
In `@apps/docs/src/app/global-error.tsx`:
- Around line 1-27: Replace the Pages Router-only NextError usage in GlobalError
with a minimal custom error UI and recovery button: inside the GlobalError
component (function GlobalError) remove NextError and render a simple message
and a "Try again" button that calls the reset() function (destructure reset from
the component props) to trigger client-side recovery; when reporting to Sentry
use Sentry.captureException(error) together with Sentry.captureContext (or
Sentry.setContext) to tag the event with error.digest for correlation (ensure
you pass error.digest in the context before captureException) so production logs
can be tied to the UI error digest.
🧹 Nitpick comments (1)
apps/docs/src/instrumentation.ts (1)

1-13: Use else if to clarify mutually exclusive runtime branches.

Since NEXT_RUNTIME is mutually exclusive, switching to else if makes the intent clearer and avoids unnecessary condition checks:

Runtime branch tightening
 export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
- }-- if (process.env.NEXT_RUNTIME === "edge") {+ } else if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}

The direct assignment of Sentry.captureRequestError to onRequestError is correct and intentional for Next.js 16.1.1 with @sentry/nextjs 10.38.0—Sentry explicitly documents this pattern as the recommended integration approach for error capture in instrumentation files.

Comment threadapps/docs/sentry.edge.config.ts
Comment threadapps/docs/src/app/global-error.tsx
@aidankmcalister
aidankmcalister merged commit ec72e7d into mainFeb 16, 2026
7 of 10 checks passed
@aidankmcalister
aidankmcalister deleted the feat/add-sentry branch February 16, 2026 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aidankmcalister@mhartington
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(docs): add sentry - #7492

Merged
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry
Feb 16, 2026
Merged

feat(docs): add sentry#7492
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry

Conversation

@aidankmcalister

@aidankmcalisteraidankmcalister commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Integrated error tracking and monitoring across the documentation site.
    • Global error UI now captures and reports client-side errors and offers a recovery link.
    • Added request/route instrumentation and performance tracing, including router transition capture.
  • Chores
    • Added monitoring dependency and environment-specific monitoring configuration to enable Sentry integration.

@vercel

vercelBot commented Feb 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
docsReadyReadyPreview, CommentFeb 16, 2026 3:20pm

Request Review

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉


Walkthrough

Adds Sentry integration to the docs app: dependency, Next.js config wrapper, server and edge initializers, client and shared instrumentation hooks, and an App Router global error component that captures exceptions.

Changes

Cohort / File(s)Summary
Next.js config & dependency
apps/docs/next.config.mjs, apps/docs/package.json
Wrapped existing MDX config with withSentryConfig(...) and added @sentry/nextjs to dependencies; added Sentry options (org/project/authToken/tunnelRoute/silent) and webpack-related options.
Runtime Sentry initializers
apps/docs/sentry.server.config.ts, apps/docs/sentry.edge.config.ts
New server- and edge-targeted Sentry init files calling Sentry.init() with dsn, tracesSampleRate: 1, enableLogs: true, and sendDefaultPii: true.
Client instrumentation
apps/docs/src/instrumentation-client.ts
Initialized client-side Sentry and exported onRouterTransitionStart = Sentry.captureRouterTransitionStart.
Shared instrumentation + loader
apps/docs/src/instrumentation.ts
New register() that dynamically imports sentry.server.config or sentry.edge.config based on NEXT_RUNTIME; exports onRequestError aliasing Sentry.captureRequestError.
App Router error boundary
apps/docs/src/app/global-error.tsx
Added GlobalError client component that calls Sentry.captureException(error) on mount and renders a full-viewport error UI with a "Go to docs" link.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically identifies the main change: integrating Sentry error tracking/monitoring into the docs application.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

🍈 Lychee Link Check Report

3660 links:✅ 2729 OK | 🚫 0 errors | 🔀 265 redirects | 👻 664 excluded

✅ All links are working!


Full Statistics Table
StatusCount
✅ Successful2729
🔀 Redirected265
👻 Excluded664
🚫 Errors0
⛔ Unsupported2
⏳ Timeouts0
❓ Unknown0

coderabbitai[bot]
coderabbitaiBot previously requested changes Feb 13, 2026

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/docs/next.config.mjs (1)

1-55: ⚠️ Potential issue | 🟡 Minor

Fix the trailing backslash typo on line 27; authToken gating is optional.

Your Sentry configuration is well-structured per @sentry/nextjs@10.38.0. A couple of clarifications:

  • Line 27 typo: Remove the trailing \ from the comment (CI\CI).
  • webpack options placement: Your nested webpack: { automaticVercelMonitors, treeshake: ... } is the correct modern location for these options (not mixing buckets). Both automaticVercelMonitors and treeshake.removeDebugLogging are valid here and won't cause issues.
  • authToken undefined behavior: When process.env.SENTRY_AUTH_TOKEN is missing in non-CI environments, authToken is simply undefined, and the build proceeds without attempting uploads—no failure. Explicit CI gating (as suggested below) is defensive and good practice, but not strictly required.
Optional defensive CI gating
- authToken: process.env.SENTRY_AUTH_TOKEN,+ authToken: process.env.CI ? process.env.SENTRY_AUTH_TOKEN : undefined,

Fix the typo. The authToken suggestion is optional; the rest is correct as-is.

apps/docs/src/instrumentation-client.ts (1)

2-29: ⚠️ Potential issue | 🟠 Major

Lock down Sentry config: env-based DSN, lower sampling rates, and disable PII by default.

The current config poses three real risks on a public docs site:

  1. Hardcoded DSN prevents separate environment configs. Preview/staging deployments will send errors to the same production project, polluting signal and making it harder to troubleshoot issues in isolation. Use process.env.NEXT_PUBLIC_SENTRY_DSN instead, so environments can be configured independently.

  2. sendDefaultPii: true captures IP addresses, headers, and user-like context by default. This is a privacy concern for a public site—users haven't consented to PII collection by Sentry. The Sentry default is false for good reason. Set it to false unless you have explicit consent and documented need.

  3. tracesSampleRate: 1 means 100% of transactions (all page navigation, API calls, etc.) are sent to Sentry. On a docs site with meaningful traffic, this will quickly exceed your quota (5M spans/month on standard plans) and trigger pay-as-you-go overage charges. Production should use a much lower rate (~0.1 = 10% is a common starting point), configurable via env var.

As for enableLogs: true—it's a valid option that pipes console logs into Sentry. There's no inherent problem, but gating it to dev-only (process.env.NODE_ENV !== "production") reduces noise in production events.

Apply this pattern:

Suggested fix
 Sentry.init({
- dsn: "https://e83ce4699e59051fdeaa330bf4a0dfb9@o4510879743737856.ingest.us.sentry.io/4510879744000000",+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,- tracesSampleRate: 1,+ tracesSampleRate:+ process.env.NODE_ENV === "production"+ ? Number(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE ?? 0.1)+ : 1,- enableLogs: true,+ enableLogs: process.env.NODE_ENV !== "production",- sendDefaultPii: true,+ sendDefaultPii: false,
});

If NEXT_PUBLIC_SENTRY_DSN can be absent in dev/preview, guard the init:

if(process.env.NEXT_PUBLIC_SENTRY_DSN){Sentry.init({ ... });}
🤖 Fix all issues with AI agents
In `@apps/docs/sentry.edge.config.ts`:
- Around line 1-20: Replace the hardcoded Sentry configuration in Sentry.init:
read dsn from an environment variable (e.g., process.env.SENTRY_DSN) instead of
the literal string, drive tracesSampleRate from an env var with a safe
production default (e.g., parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE) ||
0.1), set enableLogs based on NODE_ENV (true only in development), and set
sendDefaultPii from an env var defaulting to false (e.g.,
!!JSON.parse(process.env.SENTRY_SEND_DEFAULT_PII || "false")); apply the same
env-driven changes to sentry.server.config.ts so both edge and server configs
use the same safe defaults.
In `@apps/docs/src/app/global-error.tsx`:
- Around line 1-27: Replace the Pages Router-only NextError usage in GlobalError
with a minimal custom error UI and recovery button: inside the GlobalError
component (function GlobalError) remove NextError and render a simple message
and a "Try again" button that calls the reset() function (destructure reset from
the component props) to trigger client-side recovery; when reporting to Sentry
use Sentry.captureException(error) together with Sentry.captureContext (or
Sentry.setContext) to tag the event with error.digest for correlation (ensure
you pass error.digest in the context before captureException) so production logs
can be tied to the UI error digest.
🧹 Nitpick comments (1)
apps/docs/src/instrumentation.ts (1)

1-13: Use else if to clarify mutually exclusive runtime branches.

Since NEXT_RUNTIME is mutually exclusive, switching to else if makes the intent clearer and avoids unnecessary condition checks:

Runtime branch tightening
 export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
- }-- if (process.env.NEXT_RUNTIME === "edge") {+ } else if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}

The direct assignment of Sentry.captureRequestError to onRequestError is correct and intentional for Next.js 16.1.1 with @sentry/nextjs 10.38.0—Sentry explicitly documents this pattern as the recommended integration approach for error capture in instrumentation files.

Comment threadapps/docs/sentry.edge.config.ts
Comment threadapps/docs/src/app/global-error.tsx
@aidankmcalister
aidankmcalister merged commit ec72e7d into mainFeb 16, 2026
7 of 10 checks passed
@aidankmcalister
aidankmcalister deleted the feat/add-sentry branch February 16, 2026 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aidankmcalister@mhartington
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(docs): add sentry - #7492

Merged
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry
Feb 16, 2026
Merged

feat(docs): add sentry#7492
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry

Conversation

@aidankmcalister

@aidankmcalisteraidankmcalister commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Integrated error tracking and monitoring across the documentation site.
    • Global error UI now captures and reports client-side errors and offers a recovery link.
    • Added request/route instrumentation and performance tracing, including router transition capture.
  • Chores
    • Added monitoring dependency and environment-specific monitoring configuration to enable Sentry integration.

@vercel

vercelBot commented Feb 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
docsReadyReadyPreview, CommentFeb 16, 2026 3:20pm

Request Review

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉


Walkthrough

Adds Sentry integration to the docs app: dependency, Next.js config wrapper, server and edge initializers, client and shared instrumentation hooks, and an App Router global error component that captures exceptions.

Changes

Cohort / File(s)Summary
Next.js config & dependency
apps/docs/next.config.mjs, apps/docs/package.json
Wrapped existing MDX config with withSentryConfig(...) and added @sentry/nextjs to dependencies; added Sentry options (org/project/authToken/tunnelRoute/silent) and webpack-related options.
Runtime Sentry initializers
apps/docs/sentry.server.config.ts, apps/docs/sentry.edge.config.ts
New server- and edge-targeted Sentry init files calling Sentry.init() with dsn, tracesSampleRate: 1, enableLogs: true, and sendDefaultPii: true.
Client instrumentation
apps/docs/src/instrumentation-client.ts
Initialized client-side Sentry and exported onRouterTransitionStart = Sentry.captureRouterTransitionStart.
Shared instrumentation + loader
apps/docs/src/instrumentation.ts
New register() that dynamically imports sentry.server.config or sentry.edge.config based on NEXT_RUNTIME; exports onRequestError aliasing Sentry.captureRequestError.
App Router error boundary
apps/docs/src/app/global-error.tsx
Added GlobalError client component that calls Sentry.captureException(error) on mount and renders a full-viewport error UI with a "Go to docs" link.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically identifies the main change: integrating Sentry error tracking/monitoring into the docs application.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

🍈 Lychee Link Check Report

3660 links:✅ 2729 OK | 🚫 0 errors | 🔀 265 redirects | 👻 664 excluded

✅ All links are working!


Full Statistics Table
StatusCount
✅ Successful2729
🔀 Redirected265
👻 Excluded664
🚫 Errors0
⛔ Unsupported2
⏳ Timeouts0
❓ Unknown0

coderabbitai[bot]
coderabbitaiBot previously requested changes Feb 13, 2026

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/docs/next.config.mjs (1)

1-55: ⚠️ Potential issue | 🟡 Minor

Fix the trailing backslash typo on line 27; authToken gating is optional.

Your Sentry configuration is well-structured per @sentry/nextjs@10.38.0. A couple of clarifications:

  • Line 27 typo: Remove the trailing \ from the comment (CI\CI).
  • webpack options placement: Your nested webpack: { automaticVercelMonitors, treeshake: ... } is the correct modern location for these options (not mixing buckets). Both automaticVercelMonitors and treeshake.removeDebugLogging are valid here and won't cause issues.
  • authToken undefined behavior: When process.env.SENTRY_AUTH_TOKEN is missing in non-CI environments, authToken is simply undefined, and the build proceeds without attempting uploads—no failure. Explicit CI gating (as suggested below) is defensive and good practice, but not strictly required.
Optional defensive CI gating
- authToken: process.env.SENTRY_AUTH_TOKEN,+ authToken: process.env.CI ? process.env.SENTRY_AUTH_TOKEN : undefined,

Fix the typo. The authToken suggestion is optional; the rest is correct as-is.

apps/docs/src/instrumentation-client.ts (1)

2-29: ⚠️ Potential issue | 🟠 Major

Lock down Sentry config: env-based DSN, lower sampling rates, and disable PII by default.

The current config poses three real risks on a public docs site:

  1. Hardcoded DSN prevents separate environment configs. Preview/staging deployments will send errors to the same production project, polluting signal and making it harder to troubleshoot issues in isolation. Use process.env.NEXT_PUBLIC_SENTRY_DSN instead, so environments can be configured independently.

  2. sendDefaultPii: true captures IP addresses, headers, and user-like context by default. This is a privacy concern for a public site—users haven't consented to PII collection by Sentry. The Sentry default is false for good reason. Set it to false unless you have explicit consent and documented need.

  3. tracesSampleRate: 1 means 100% of transactions (all page navigation, API calls, etc.) are sent to Sentry. On a docs site with meaningful traffic, this will quickly exceed your quota (5M spans/month on standard plans) and trigger pay-as-you-go overage charges. Production should use a much lower rate (~0.1 = 10% is a common starting point), configurable via env var.

As for enableLogs: true—it's a valid option that pipes console logs into Sentry. There's no inherent problem, but gating it to dev-only (process.env.NODE_ENV !== "production") reduces noise in production events.

Apply this pattern:

Suggested fix
 Sentry.init({
- dsn: "https://e83ce4699e59051fdeaa330bf4a0dfb9@o4510879743737856.ingest.us.sentry.io/4510879744000000",+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,- tracesSampleRate: 1,+ tracesSampleRate:+ process.env.NODE_ENV === "production"+ ? Number(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE ?? 0.1)+ : 1,- enableLogs: true,+ enableLogs: process.env.NODE_ENV !== "production",- sendDefaultPii: true,+ sendDefaultPii: false,
});

If NEXT_PUBLIC_SENTRY_DSN can be absent in dev/preview, guard the init:

if(process.env.NEXT_PUBLIC_SENTRY_DSN){Sentry.init({ ... });}
🤖 Fix all issues with AI agents
In `@apps/docs/sentry.edge.config.ts`:
- Around line 1-20: Replace the hardcoded Sentry configuration in Sentry.init:
read dsn from an environment variable (e.g., process.env.SENTRY_DSN) instead of
the literal string, drive tracesSampleRate from an env var with a safe
production default (e.g., parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE) ||
0.1), set enableLogs based on NODE_ENV (true only in development), and set
sendDefaultPii from an env var defaulting to false (e.g.,
!!JSON.parse(process.env.SENTRY_SEND_DEFAULT_PII || "false")); apply the same
env-driven changes to sentry.server.config.ts so both edge and server configs
use the same safe defaults.
In `@apps/docs/src/app/global-error.tsx`:
- Around line 1-27: Replace the Pages Router-only NextError usage in GlobalError
with a minimal custom error UI and recovery button: inside the GlobalError
component (function GlobalError) remove NextError and render a simple message
and a "Try again" button that calls the reset() function (destructure reset from
the component props) to trigger client-side recovery; when reporting to Sentry
use Sentry.captureException(error) together with Sentry.captureContext (or
Sentry.setContext) to tag the event with error.digest for correlation (ensure
you pass error.digest in the context before captureException) so production logs
can be tied to the UI error digest.
🧹 Nitpick comments (1)
apps/docs/src/instrumentation.ts (1)

1-13: Use else if to clarify mutually exclusive runtime branches.

Since NEXT_RUNTIME is mutually exclusive, switching to else if makes the intent clearer and avoids unnecessary condition checks:

Runtime branch tightening
 export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
- }-- if (process.env.NEXT_RUNTIME === "edge") {+ } else if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}

The direct assignment of Sentry.captureRequestError to onRequestError is correct and intentional for Next.js 16.1.1 with @sentry/nextjs 10.38.0—Sentry explicitly documents this pattern as the recommended integration approach for error capture in instrumentation files.

Comment threadapps/docs/sentry.edge.config.ts
Comment threadapps/docs/src/app/global-error.tsx
@aidankmcalister
aidankmcalister merged commit ec72e7d into mainFeb 16, 2026
7 of 10 checks passed
@aidankmcalister
aidankmcalister deleted the feat/add-sentry branch February 16, 2026 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aidankmcalister@mhartington
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(docs): add sentry - #7492

Merged
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry
Feb 16, 2026
Merged

feat(docs): add sentry#7492
aidankmcalister merged 4 commits into
mainfrom
feat/add-sentry

Conversation

@aidankmcalister

@aidankmcalisteraidankmcalister commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Integrated error tracking and monitoring across the documentation site.
    • Global error UI now captures and reports client-side errors and offers a recovery link.
    • Added request/route instrumentation and performance tracing, including router transition capture.
  • Chores
    • Added monitoring dependency and environment-specific monitoring configuration to enable Sentry integration.

@vercel

vercelBot commented Feb 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
docsReadyReadyPreview, CommentFeb 16, 2026 3:20pm

Request Review

@coderabbitai

coderabbitaiBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉


Walkthrough

Adds Sentry integration to the docs app: dependency, Next.js config wrapper, server and edge initializers, client and shared instrumentation hooks, and an App Router global error component that captures exceptions.

Changes

Cohort / File(s)Summary
Next.js config & dependency
apps/docs/next.config.mjs, apps/docs/package.json
Wrapped existing MDX config with withSentryConfig(...) and added @sentry/nextjs to dependencies; added Sentry options (org/project/authToken/tunnelRoute/silent) and webpack-related options.
Runtime Sentry initializers
apps/docs/sentry.server.config.ts, apps/docs/sentry.edge.config.ts
New server- and edge-targeted Sentry init files calling Sentry.init() with dsn, tracesSampleRate: 1, enableLogs: true, and sendDefaultPii: true.
Client instrumentation
apps/docs/src/instrumentation-client.ts
Initialized client-side Sentry and exported onRouterTransitionStart = Sentry.captureRouterTransitionStart.
Shared instrumentation + loader
apps/docs/src/instrumentation.ts
New register() that dynamically imports sentry.server.config or sentry.edge.config based on NEXT_RUNTIME; exports onRequestError aliasing Sentry.captureRequestError.
App Router error boundary
apps/docs/src/app/global-error.tsx
Added GlobalError client component that calls Sentry.captureException(error) on mount and renders a full-viewport error UI with a "Go to docs" link.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically identifies the main change: integrating Sentry error tracking/monitoring into the docs application.
Merge Conflict Detection✅ Passed✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actionsBot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

🍈 Lychee Link Check Report

3660 links:✅ 2729 OK | 🚫 0 errors | 🔀 265 redirects | 👻 664 excluded

✅ All links are working!


Full Statistics Table
StatusCount
✅ Successful2729
🔀 Redirected265
👻 Excluded664
🚫 Errors0
⛔ Unsupported2
⏳ Timeouts0
❓ Unknown0

coderabbitai[bot]
coderabbitaiBot previously requested changes Feb 13, 2026

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/docs/next.config.mjs (1)

1-55: ⚠️ Potential issue | 🟡 Minor

Fix the trailing backslash typo on line 27; authToken gating is optional.

Your Sentry configuration is well-structured per @sentry/nextjs@10.38.0. A couple of clarifications:

  • Line 27 typo: Remove the trailing \ from the comment (CI\CI).
  • webpack options placement: Your nested webpack: { automaticVercelMonitors, treeshake: ... } is the correct modern location for these options (not mixing buckets). Both automaticVercelMonitors and treeshake.removeDebugLogging are valid here and won't cause issues.
  • authToken undefined behavior: When process.env.SENTRY_AUTH_TOKEN is missing in non-CI environments, authToken is simply undefined, and the build proceeds without attempting uploads—no failure. Explicit CI gating (as suggested below) is defensive and good practice, but not strictly required.
Optional defensive CI gating
- authToken: process.env.SENTRY_AUTH_TOKEN,+ authToken: process.env.CI ? process.env.SENTRY_AUTH_TOKEN : undefined,

Fix the typo. The authToken suggestion is optional; the rest is correct as-is.

apps/docs/src/instrumentation-client.ts (1)

2-29: ⚠️ Potential issue | 🟠 Major

Lock down Sentry config: env-based DSN, lower sampling rates, and disable PII by default.

The current config poses three real risks on a public docs site:

  1. Hardcoded DSN prevents separate environment configs. Preview/staging deployments will send errors to the same production project, polluting signal and making it harder to troubleshoot issues in isolation. Use process.env.NEXT_PUBLIC_SENTRY_DSN instead, so environments can be configured independently.

  2. sendDefaultPii: true captures IP addresses, headers, and user-like context by default. This is a privacy concern for a public site—users haven't consented to PII collection by Sentry. The Sentry default is false for good reason. Set it to false unless you have explicit consent and documented need.

  3. tracesSampleRate: 1 means 100% of transactions (all page navigation, API calls, etc.) are sent to Sentry. On a docs site with meaningful traffic, this will quickly exceed your quota (5M spans/month on standard plans) and trigger pay-as-you-go overage charges. Production should use a much lower rate (~0.1 = 10% is a common starting point), configurable via env var.

As for enableLogs: true—it's a valid option that pipes console logs into Sentry. There's no inherent problem, but gating it to dev-only (process.env.NODE_ENV !== "production") reduces noise in production events.

Apply this pattern:

Suggested fix
 Sentry.init({
- dsn: "https://e83ce4699e59051fdeaa330bf4a0dfb9@o4510879743737856.ingest.us.sentry.io/4510879744000000",+ dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,- tracesSampleRate: 1,+ tracesSampleRate:+ process.env.NODE_ENV === "production"+ ? Number(process.env.NEXT_PUBLIC_SENTRY_TRACES_SAMPLE_RATE ?? 0.1)+ : 1,- enableLogs: true,+ enableLogs: process.env.NODE_ENV !== "production",- sendDefaultPii: true,+ sendDefaultPii: false,
});

If NEXT_PUBLIC_SENTRY_DSN can be absent in dev/preview, guard the init:

if(process.env.NEXT_PUBLIC_SENTRY_DSN){Sentry.init({ ... });}
🤖 Fix all issues with AI agents
In `@apps/docs/sentry.edge.config.ts`:
- Around line 1-20: Replace the hardcoded Sentry configuration in Sentry.init:
read dsn from an environment variable (e.g., process.env.SENTRY_DSN) instead of
the literal string, drive tracesSampleRate from an env var with a safe
production default (e.g., parseFloat(process.env.SENTRY_TRACES_SAMPLE_RATE) ||
0.1), set enableLogs based on NODE_ENV (true only in development), and set
sendDefaultPii from an env var defaulting to false (e.g.,
!!JSON.parse(process.env.SENTRY_SEND_DEFAULT_PII || "false")); apply the same
env-driven changes to sentry.server.config.ts so both edge and server configs
use the same safe defaults.
In `@apps/docs/src/app/global-error.tsx`:
- Around line 1-27: Replace the Pages Router-only NextError usage in GlobalError
with a minimal custom error UI and recovery button: inside the GlobalError
component (function GlobalError) remove NextError and render a simple message
and a "Try again" button that calls the reset() function (destructure reset from
the component props) to trigger client-side recovery; when reporting to Sentry
use Sentry.captureException(error) together with Sentry.captureContext (or
Sentry.setContext) to tag the event with error.digest for correlation (ensure
you pass error.digest in the context before captureException) so production logs
can be tied to the UI error digest.
🧹 Nitpick comments (1)
apps/docs/src/instrumentation.ts (1)

1-13: Use else if to clarify mutually exclusive runtime branches.

Since NEXT_RUNTIME is mutually exclusive, switching to else if makes the intent clearer and avoids unnecessary condition checks:

Runtime branch tightening
 export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
- }-- if (process.env.NEXT_RUNTIME === "edge") {+ } else if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}

The direct assignment of Sentry.captureRequestError to onRequestError is correct and intentional for Next.js 16.1.1 with @sentry/nextjs 10.38.0—Sentry explicitly documents this pattern as the recommended integration approach for error capture in instrumentation files.

Comment threadapps/docs/sentry.edge.config.ts
Comment threadapps/docs/src/app/global-error.tsx
@aidankmcalister
aidankmcalister merged commit ec72e7d into mainFeb 16, 2026
7 of 10 checks passed
@aidankmcalister
aidankmcalister deleted the feat/add-sentry branch February 16, 2026 15:43
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@aidankmcalister@mhartington