---
name: svelte
description: "Modern Svelte 5 and SvelteKit development covering runes-based reactivity, snippets, SSR/SSG, and state management, including migration notes from legacy Svelte 4 syntax. Use when writing or reviewing Svelte components, deciding between runes and legacy reactive statements, building SvelteKit routes and load functions, or migrating a Svelte 4 codebase to Svelte 5."
metadata:
maintainer: Mindrally
source: https://github.com/Mindrally/skills
---
# Svelte / SvelteKit
This skill covers Svelte and SvelteKit development with deep knowledge of SSR, SSG, and modern web patterns, including the Svelte 5 runes system and how it differs from legacy Svelte 4 reactivity.
## Core Principles
- Write concise, technical components with accurate SvelteKit examples
- Emphasize SSR/SSG capabilities and performance optimization
- Use TypeScript with proper naming conventions
- Prioritize minimal client-side JavaScript through server-side rendering
- Follow functional and declarative programming patterns
## Svelte 5 Runes
Svelte 5 introduces runes — compiler-level primitives that make reactivity explicit, replacing Svelte 4's implicit `let`/`$:` reactivity.
- Use `$state` for reactive state (replaces plain `let` bindings that needed reactivity)
- Use `$derived` for computed values (replaces `$: computed = ...`)
- Use `$effect` for side effects (replaces `$: { ... }` blocks)
- Use `$props` for component properties (replaces `export let prop`)
- Use `$bindable` for two-way bindable props (replaces implicit `bind:` support on exported props)
- Use `$inspect` during development to log reactive value changes
- Runes are compiler syntax, not imports — never `import { $state } from 'svelte'`. Only import genuine utilities that still require it, such as `tick`, `untrack`, `mount`, or `unmount`.
### Svelte 4 vs. Svelte 5
**Svelte 4 (legacy reactivity):**
```svelte
```
**Svelte 5 (runes):**
```svelte
```
Key differences to apply when writing or reviewing components:
1. **Reactivity is explicit** — `$state()` marks reactive variables, `$derived()` replaces `$:` for computed values, `$effect()` replaces `$: {}` blocks for side effects.
2. **Event handling is standardized** — Svelte 5 treats event handlers as ordinary HTML properties (`onclick={handler}`) instead of Svelte-specific directives (`on:click={handler}`). There are no more event modifiers like `|preventDefault`; call `e.preventDefault()` inline instead: `onclick={e => { e.preventDefault(); handler(e); }}`.
3. **Component props** use `let { propName } = $props()` instead of multiple `export let propName` declarations. Mark a prop bindable from the parent with `$bindable()`.
4. **Snippets replace slots** for most reusable markup — `{#snippet name(params)}...{/snippet}` and `{@render name(args)}` reduce duplication and are more composable than named slots. Existing `` usage still works but prefer snippets in new Svelte 5 code.
When maintaining an existing Svelte 4 codebase, keep using `export let`, `on:event`, and `$:` reactive statements consistently within that codebase rather than mixing paradigms — full-file migrations to runes should be deliberate, not incidental.
## Styling
- Use scoped styling via Svelte's `