Bug tracking for SvelteKit — session replay, console + HAR (2026)
SvelteKit bug-reporting guide for QA + dev teams: framework-specific gotchas, common bugs, and how to capture them with BugMojo session replay.
What SvelteKit teams ship with BugMojo
Svelte 5 replaced the magic of "assign to a variable, the UI updates" with **runes** — `$state`, `$derived`, `$effect`. The new system is more explicit and faster, but it changes how every Svelte bug manifests. SvelteKit 2 layered on top brings server load functions, form actions, and edge-deployed adapters — each with its own failure modes.
A SvelteKit bug report needs the route ID (because the same URL can hit different `+page.server.ts` files depending on layout), the form action result, and the rune state at the failure moment. BugMojo captures the DOM + console + network HAR end-to-end so the engineer can see exactly where the load function returned vs where the page rendered.
This guide covers Svelte 5 runes gotchas, SvelteKit 2 load-function bugs, and how to wire BugMojo into a Svelte team's workflow.
SvelteKit gotchas
Framework-specific failure modes engineers actually ship through. Each is hard to spot in a screenshot and obvious in a session replay.
Common SvelteKit bugs
Real SvelteKit bug patterns — the symptom you will see in a report and the fix that actually works.
$state on an object does not deep-track new properties
Symptom: Adding a new key to a `$state` object does not trigger updates.
Fix: `$state` proxies via `new Proxy`. Properties that exist at declaration are tracked; properties added later need to be declared up front (set to undefined initially) OR use `$state.raw` and replace the whole object.
let user = $state<{ name: string; email?: string }>({ name: '' });
// later
user.email = 'foo@bar.com'; // ✅ works because email was in the typegoto() before mount throws
Symptom: Navigation from `$effect` or `onMount` fails silently.
Fix: SvelteKit's `goto()` requires the navigation system to be initialized. Wrap in `tick()` or use `redirect()` from a load function instead.
Streamed promises in load() never resolve on the client
Symptom: A skeleton loader spins forever for a server-streamed promise.
Fix: Streamed promises require the response to remain open. A reverse proxy or compression middleware can buffer the response and break streaming. Test against a direct origin URL, then add infrastructure back layer by layer.
Setup
# Install BugMojo from the Chrome Web Store
# Works with SvelteKit dev (vite), preview, and any adapter (Node, Vercel, Cloudflare)BugMojo vs alternatives
The honest comparison — where BugMojo wins, and where another tool might serve you better.
| Feature | BugMojo | Browser DevTools alone |
|---|---|---|
| Replay the bug for a teammate | ✅ | ❌ |
| Capture SvelteKit form action payload | ✅ network HAR | ⚠️ live only |
| Capture rune state at failure | ✅ (via DOM) | ⚠️ snapshot only |
| One-click ticket to Jira/Linear | ✅ | ❌ |
| MCP integration for AI coding agents | ✓ | — |
| Console + network (HAR) capture | ✓ | Partial |
| Zero-setup Quick Capture | No project, no SDK | Account / SDK required |
BugMojo records the DOM, console, and network — then ships a one-click ticket with the full replay attached. No SDK, no setup.
Try BugMojo freeFrequently asked questions
Frequently asked questions
Sources
- Svelte 5 runes overview — svelte.dev (2025)

