sentry-svelte-sdk
getsentry/sentry-for-ai
Full Sentry error monitoring, tracing, and session replay for Svelte and SvelteKit applications.
What is sentry-svelte-sdk?
Complete Sentry SDK setup wizard for Svelte and SvelteKit projects. Configures error monitoring, distributed tracing, session replay, and optional structured logging across client and server. Use when adding observability to new or existing Svelte/SvelteKit applications.
- Detects your project structure (plain Svelte vs. SvelteKit) and framework version to recommend the correct setup path
- Installs and configures @sentry/sveltekit or @sentry/svelte with sensible defaults for error monitoring and tracing
- Sets up client-side session replay with configurable masking and media blocking
- Configures server-side instrumentation and request tracing for SvelteKit (modern ≥2.31.0 and legacy paths)
- Handles source map upload via Vite plugin integration with SENTRY_AUTH_TOKEN
- Provides both interactive wizard mode (npx @sentry/wizard) and manual step-by-step configuration
How to install sentry-svelte-sdk
npx skills add https://github.com/getsentry/sentry-for-ai --skill sentry-svelte-sdk- Node.js and npm/yarn installed
- Existing Svelte or SvelteKit project (SvelteKit ≥2.31.0 recommended for modern setup)
- Sentry account and DSN (obtained from sentry.io)
- SENTRY_AUTH_TOKEN for source map uploads (optional but recommended)
How to use sentry-svelte-sdk
- 1.Run detection commands to determine your project type (SvelteKit version, existing Sentry packages, hook files)
- 2.Review the recommended feature set (Error Monitoring + Tracing always; Session Replay and Logging optional)
- 3.Choose setup path: run npx @sentry/wizard@latest -i sveltekit for interactive setup, or follow manual steps
- 4.For manual setup: install @sentry/sveltekit, enable instrumentation in svelte.config.js, create src/instrumentation.server.ts with Sentry.init()
- 5.Create src/hooks.client.ts with client-side init including replayIntegration, and src/hooks.server.ts with handleError and sentryHandle()
- 6.Add Vite plugin config to vite.config.ts with sentrySvelteKit() and set SENTRY_AUTH_TOKEN, SENTRY_ORG, SENTRY_PROJECT in .env
- 7.Verify setup by visiting the auto-generated /sentry-example-page or triggering a test error
Use cases
- Add error monitoring and tracing to a new SvelteKit application before deployment
- Instrument an existing Svelte app to capture unhandled errors and API call latency
- Enable session replay on user-facing SvelteKit apps to debug checkout or login flow issues
- Set up structured logging correlation with error traces on the server side
- Configure source map uploads to Sentry for readable stack traces in production
- SvelteKit and Svelte application developers
- Full-stack teams building SvelteKit apps with Node backends
- DevOps/SRE engineers setting up observability for Svelte-based services
- Teams needing session replay for debugging user-reported issues
sentry-svelte-sdk FAQ
Use the wizard (npx @sentry/wizard@latest -i sveltekit) if you can run it interactively—it handles login, org/project selection, and all file creation. Use manual setup if you need to script the installation or prefer explicit control.
Modern setup uses src/instrumentation.server.ts and svelte.config.js experimental flags for cleaner server-side init. Legacy setup puts Sentry.init() in src/hooks.server.ts. Always check your @sveltejs/kit version and follow the matching path.
It's optional but strongly recommended. Without it, stack traces in Sentry will show minified code. Set SENTRY_AUTH_TOKEN, SENTRY_ORG, and SENTRY_PROJECT in .env to enable automatic source map uploads via the Vite plugin.
Yes. The skill detects plain Svelte and installs @sentry/svelte instead. Setup is simpler—single entry point init. SvelteKit is recommended because it includes server-side tracing and automatic request instrumentation.
Uncomment the dataCollection block in both src/instrumentation.server.ts and src/hooks.client.ts. Set userInfo: false and httpBodies: [] to opt out of sensitive data collection.
Full instructions (SKILL.md)
Source of truth, from getsentry/sentry-for-ai.
name: sentry-svelte-sdk description: Full Sentry SDK setup for Svelte and SvelteKit. Use when asked to "add Sentry to Svelte", "add Sentry to SvelteKit", "install @sentry/sveltekit", or configure error monitoring, tracing, session replay, or logging for Svelte or SvelteKit applications. license: Apache-2.0 category: sdk-setup parent: sentry-sdk-setup disable-model-invocation: true
All Skills > SDK Setup > Svelte SDK
Sentry Svelte SDK
Opinionated wizard that scans your project and guides you through complete Sentry setup for Svelte and SvelteKit.
Invoke This Skill When
- User asks to "add Sentry to Svelte" or "set up Sentry" in a Svelte/SvelteKit app
- User wants error monitoring, tracing, session replay, or logging in Svelte or SvelteKit
- User mentions
@sentry/svelte,@sentry/sveltekit, or Sentry SDK for Svelte
Note: SDK versions and APIs below reflect current Sentry docs at time of writing (
@sentry/sveltekit≥10.8.0, SvelteKit ≥2.31.0). Always verify against docs.sentry.io/platforms/javascript/guides/sveltekit/ before implementing.
Phase 1: Detect
Run these commands to understand the project before making any recommendations:
# Detect framework type
cat package.json | grep -E '"svelte"|"@sveltejs/kit"|"@sentry/svelte"|"@sentry/sveltekit"'
# Check for SvelteKit indicators
ls svelte.config.js svelte.config.ts vite.config.ts vite.config.js 2>/dev/null
# Check SvelteKit version (determines which setup pattern to use)
cat package.json | grep '"@sveltejs/kit"'
# Check if Sentry is already installed
cat package.json | grep '"@sentry/'
# Check existing hook files
ls src/hooks.client.ts src/hooks.client.js src/hooks.server.ts src/hooks.server.js \
src/instrumentation.server.ts 2>/dev/null
# Detect logging libraries (Node side)
cat package.json | grep -E '"pino"|"winston"|"consola"'
# Detect if there's a backend (Go, Python, Ruby, etc.) in adjacent directories
ls ../backend ../server ../api 2>/dev/null
cat ../go.mod ../requirements.txt ../Gemfile 2>/dev/null | head -3
What to determine:
| Question | Impact |
|---|---|
@sveltejs/kit in package.json? | SvelteKit path vs. plain Svelte path |
| SvelteKit ≥2.31.0? | Modern (instrumentation.server.ts) vs. legacy setup |
@sentry/sveltekit already present? | Skip install, go straight to feature config |
vite.config.ts present? | Source map upload via Vite plugin available |
| Backend directory found? | Trigger Phase 4 cross-link suggestion |
Phase 2: Recommend
Present a concrete recommendation based on what you found. Don't ask open-ended questions — lead with a proposal:
Recommended (core coverage):
- ✅ Error Monitoring — always; auto-captures unhandled errors on client and server
- ✅ Tracing — SvelteKit has both client-side navigation spans and server-side request spans; always recommend
- ✅ Session Replay — recommended for user-facing SvelteKit apps (client-side only)
Optional (enhanced observability):
- ⚡ Logging — structured logs via
Sentry.logger.*; recommend when app uses server-side logging or needs log-to-trace correlation
Recommendation logic:
| Feature | Recommend when... |
|---|---|
| Error Monitoring | Always — non-negotiable baseline |
| Tracing | Always for SvelteKit (client + server); for plain Svelte when calling APIs |
| Session Replay | User-facing app, login flows, or checkout pages present |
| Logging | App already uses server-side logging, or structured log search is needed |
Propose: "I recommend setting up Error Monitoring + Tracing + Session Replay. Want me to also add structured Logging?"
Phase 3: Guide
Determine Setup Path
| Your project | Package | Setup complexity |
|---|---|---|
| SvelteKit (≥2.31.0) | @sentry/sveltekit | 5 files to create/modify |
| SvelteKit (<2.31.0) | @sentry/sveltekit | 3 files (init in hooks.server.ts) |
Plain Svelte (no @sveltejs/kit) | @sentry/svelte | Single entry point |
Path A: SvelteKit (Recommended — Modern, ≥2.31.0)
Option 1: Wizard (Recommended)
You need to run this yourself — the wizard opens a browser for login and requires interactive input that the agent can't handle. Copy-paste into your terminal:
npx @sentry/wizard@latest -i sveltekitIt handles login, org/project selection, SDK installation, client/server hooks, Vite plugin config, source map upload, and adds a
/sentry-example-page.Once it finishes, come back and skip to Verification.
If the user skips the wizard, proceed with Option 2 (Manual Setup) below.
Option 2: Manual Setup
Step 1 — Install
npm install @sentry/sveltekit --save
Step 2 — svelte.config.js — Enable instrumentation
import adapter from "@sveltejs/adapter-auto";
const config = {
kit: {
adapter: adapter(),
experimental: {
instrumentation: { server: true },
tracing: { server: true },
},
},
};
export default config;
Step 3 — src/instrumentation.server.ts — Server-side init (runs once at startup)
import * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.SENTRY_ENVIRONMENT,
release: process.env.SENTRY_RELEASE,
dataCollection: {
// To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
// https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#dataCollection
// userInfo: false,
// httpBodies: [],
},
tracesSampleRate: 1.0, // lower to 0.1–0.2 in production
enableLogs: true,
});
Step 4 — src/hooks.client.ts — Client-side init
import * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: import.meta.env.PUBLIC_SENTRY_DSN ?? import.meta.env.VITE_SENTRY_DSN,
environment: import.meta.env.MODE,
dataCollection: {
// To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
// https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#dataCollection
// userInfo: false,
// httpBodies: [],
},
tracesSampleRate: 1.0,
integrations: [
Sentry.replayIntegration({
maskAllText: true,
blockAllMedia: true,
}),
],
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
enableLogs: true,
});
export const handleError = Sentry.handleErrorWithSentry();
Step 5 — src/hooks.server.ts — Server hooks (no init here in modern setup)
import * as Sentry from "@sentry/sveltekit";
import { sequence } from "@sveltejs/kit/hooks";
export const handleError = Sentry.handleErrorWithSentry();
// sentryHandle() instruments incoming requests and creates root spans
export const handle = Sentry.sentryHandle();
// If you have other handle functions, compose with sequence():
// export const handle = sequence(Sentry.sentryHandle(), myAuthHandle);
Step 6 — vite.config.ts — Source maps (requires SENTRY_AUTH_TOKEN)
import { sveltekit } from "@sveltejs/kit/vite";
import { sentrySvelteKit } from "@sentry/sveltekit";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [
// sentrySvelteKit MUST come before sveltekit()
sentrySvelteKit({
org: process.env.SENTRY_ORG,
project: process.env.SENTRY_PROJECT,
authToken: process.env.SENTRY_AUTH_TOKEN,
}),
sveltekit(),
],
});
Add to .env (never commit):
SENTRY_AUTH_TOKEN=sntrys_...
SENTRY_ORG=my-org-slug
SENTRY_PROJECT=my-project-slug
Path B: SvelteKit Legacy (<2.31.0 or @sentry/sveltekit <10.8.0)
Skip instrumentation.server.ts and svelte.config.js changes. Instead, put Sentry.init() directly in hooks.server.ts:
// src/hooks.server.ts (legacy — init goes here)
import * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: process.env.SENTRY_DSN,
tracesSampleRate: 1.0,
enableLogs: true,
});
export const handleError = Sentry.handleErrorWithSentry();
export const handle = Sentry.sentryHandle();
hooks.client.ts and vite.config.ts are identical to the modern path.
Path C: Plain Svelte (no SvelteKit)
Install:
npm install @sentry/svelte --save
Configure in entry point (src/main.ts or src/main.js) before mounting the app:
import * as Sentry from "@sentry/svelte";
import App from "./App.svelte";
Sentry.init({
dsn: import.meta.env.VITE_SENTRY_DSN,
environment: import.meta.env.MODE,
dataCollection: {
// To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
// https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options/#dataCollection
// userInfo: false,
// httpBodies: [],
},
integrations: [
Sentry.browserTracingIntegration(),
Sentry.replayIntegration({
maskAllText: true,
blockAllMedia: true,
}),
],
tracesSampleRate: 1.0,
tracePropagationTargets: ["localhost", /^https:\/\/yourapi\.io/],
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
enableLogs: true,
});
const app = new App({ target: document.getElementById("app")! });
export default app;
Optional: Svelte component tracking (auto-injects tracking into all components):
// svelte.config.js
import { withSentryConfig } from "@sentry/svelte";
export default withSentryConfig(
{ compilerOptions: {} },
{ componentTracking: { trackComponents: true } }
);
For Each Agreed Feature
Walk through features one at a time. Load the reference file, follow its steps, then verify before moving on:
| Feature | Reference | Load when... |
|---|---|---|
| Error Monitoring | ${SKILL_ROOT}/references/error-monitoring.md | Always (baseline) |
| Tracing | ${SKILL_ROOT}/references/tracing.md | API calls / distributed tracing needed |
| Session Replay | ${SKILL_ROOT}/references/session-replay.md | User-facing app |
| Logging | ${SKILL_ROOT}/references/logging.md | Structured logs / log-to-trace correlation |
For each feature: Read ${SKILL_ROOT}/references/<feature>.md, follow steps exactly, verify it works.
Configuration Reference
Key Sentry.init() Options
| Option | Type | Default | Notes |
|---|---|---|---|
dsn | string | — | Required. Use env var; SDK is disabled when empty |
environment | string | "production" | e.g., "staging", "development" |
release | string | — | e.g., "my-app@1.2.3" or git SHA |
dataCollection | object | — | Control what data is collected (userInfo, cookies, headers, etc.) |
dataCollection.userInfo | boolean | true | Auto-populate user.* fields from instrumentation |
dataCollection.cookies | boolean|object | true | Cookie collection and filtering |
dataCollection.httpHeaders | object | {request: true, response: true} | HTTP header collection for requests/responses |
dataCollection.httpBodies | string[] | ["incomingRequest", "outgoingRequest", "incomingResponse", "outgoingResponse"] | Which HTTP body types to collect |
dataCollection.queryParams | boolean|object | true | Query parameter collection and filtering |
tracesSampleRate | number | — | 0–1; use 1.0 in dev, 0.1–0.2 in prod |
tracesSampler | function | — | Per-transaction sampling; overrides tracesSampleRate |
tracePropagationTargets | (string|RegExp)[] | — | URLs that receive distributed tracing headers |
replaysSessionSampleRate | number | — | Fraction of all sessions recorded (client only) |
replaysOnErrorSampleRate | number | — | Fraction of error sessions recorded (client only) |
enableLogs | boolean | false | Enable Sentry.logger.* API |
beforeSendLog | function | — | Filter/modify logs before send |
debug | boolean | false | Verbose SDK output to console |
Server-Only Options (instrumentation.server.ts / hooks.server.ts)
| Option | Type | Notes |
|---|---|---|
serverName | string | Hostname tag on server events |
includeLocalVariables | boolean | Attach local vars to stack frames |
shutdownTimeout | number | ms to flush events before process exit (default: 2000) |
Adapter Compatibility
| Adapter | Support |
|---|---|
@sveltejs/adapter-auto / adapter-vercel (Node) | ✅ Full |
@sveltejs/adapter-node | ✅ Full |
@sveltejs/adapter-cloudflare | ⚠️ Partial — requires extra setup |
| Vercel Edge Runtime | ❌ Not supported |
SvelteKit File Summary
| File | Purpose | Modern | Legacy |
|---|---|---|---|
src/instrumentation.server.ts | Server Sentry.init() — runs once at startup | ✅ Required | ❌ |
src/hooks.client.ts | Client Sentry.init() + handleError | ✅ Required | ✅ Required |
src/hooks.server.ts | handleError + sentryHandle() (no init) | ✅ Required | ✅ Init goes here |
svelte.config.js | Enable experimental.instrumentation.server | ✅ Required | ❌ |
vite.config.ts | sentrySvelteKit() plugin for source maps | ✅ Recommended | ✅ Recommended |
.env | SENTRY_AUTH_TOKEN, SENTRY_ORG, SENTRY_PROJECT | ✅ For source maps | ✅ For source maps |
Verification
After setup, trigger test events to confirm Sentry is receiving data:
<!-- src/routes/sentry-test/+page.svelte -->
<script>
import * as Sentry from "@sentry/sveltekit";
</script>
<button onclick={() => { throw new Error("Sentry client test"); }}>
Test Client Error
</button>
<button onclick={() => Sentry.captureMessage("Sentry test message", "info")}>
Test Message
</button>
// src/routes/sentry-test/+server.ts
export const GET = () => {
throw new Error("Sentry server test");
};
Check the Sentry dashboard:
- Issues → both errors should appear within seconds
- Traces → look for route-based transactions
- Replays → session recording visible after page interaction
- Logs → structured log entries (if logging enabled)
If nothing appears, set debug: true in Sentry.init() and check the browser/server console for SDK output.
Phase 4: Cross-Link
After completing Svelte/SvelteKit setup, check for a companion backend missing Sentry coverage:
# Look for backend in adjacent directories
ls ../backend ../server ../api ../go ../python 2>/dev/null
cat ../go.mod 2>/dev/null | head -3
cat ../requirements.txt ../pyproject.toml 2>/dev/null | head -3
cat ../Gemfile 2>/dev/null | head -3
If a backend exists without Sentry configured, suggest the matching skill:
| Backend detected | Suggest skill |
|---|---|
Go (go.mod) | sentry-go-sdk |
Python (requirements.txt, pyproject.toml) | sentry-python-sdk |
Ruby (Gemfile) | sentry-ruby-sdk |
| Node.js (Express, Fastify, etc.) | Use @sentry/node — see docs.sentry.io/platforms/javascript/guides/express/ |
Troubleshooting
| Issue | Solution |
|---|---|
| Events not appearing | Set debug: true, check DSN, open browser console for SDK errors |
| Source maps not working | Run npm run build (not dev), verify SENTRY_AUTH_TOKEN is set |
| Server errors not captured | Ensure handleErrorWithSentry() is exported from hooks.server.ts |
| Client errors not captured | Ensure handleErrorWithSentry() is exported from hooks.client.ts |
| Session replay not recording | Confirm replayIntegration() is in client init only (never server) |
sentryHandle() + other handles not composing | Wrap with sequence(Sentry.sentryHandle(), myHandle) |
| Ad-blocker blocking events | Set tunnel: "/sentry-tunnel" and add a server-side relay endpoint |
| SvelteKit instrumentation not activating | Confirm experimental.instrumentation.server: true in svelte.config.js |
| Cloudflare adapter issues | Consult docs.sentry.io/platforms/javascript/guides/sveltekit/ for adapter-specific notes |
wrapLoadWithSentry / wrapServerLoadWithSentry errors | These are legacy wrappers — remove them; sentryHandle() instruments load functions automatically in ≥10.8.0 |
Related skills
More from getsentry/sentry-for-ai and the wider catalog.

sentry-tanstack-start-sdk
Full Sentry SDK setup for TanStack Start React. Use when asked to "add Sentry to TanStack Start", "install @sentry/tanstackstart-react", or configure error monitoring, tracing, session replay, logs, or user feedback in a TanStack Start React app.

sentry-workflow
Route to the right Sentry workflow for fixing production issues, reviewing code, or upgrading SDKs.

sentry-android-sdk
Full Sentry SDK setup for Android with error monitoring, tracing, profiling, and session replay.

sentry-browser-sdk
Full Sentry SDK setup for browser JavaScript with error monitoring, tracing, and session replay.

agents-md
Create and maintain concise AGENTS.md and CLAUDE.md instruction files for coding agents.

blog-writing-guide
Write and review blog posts for Sentry's engineering blog following their voice, standards, and quality bar.