Migrating from Svelte 4 to Svelte 5: UI Library Compatibility Guide
Svelte 5 has been out long enough that the “should I migrate?” question has shifted to “when do I migrate?” For most teams, the answer is soon — if not already. But your migration timeline isn’t just about your own code. It’s about whether the UI libraries you depend on are ready.
We’ve tracked the Svelte 5 compatibility status of every library in our directory and compiled this guide to help you plan your migration. Here’s where the ecosystem stands in 2026.
What Changed in Svelte 5 That Breaks Things
Before diving into library compatibility, it helps to understand what exactly changed and why it matters for UI libraries specifically.
Runes replace stores and reactive declarations. The $state, $derived, and $effect runes replace Svelte 4’s $: reactive declarations, writable/readable stores, and component-level reactivity. Libraries that heavily used Svelte stores for internal state management needed significant rewrites.
Snippets replace slots. The {#snippet} and {@render} syntax replaces <slot> for content composition. This is the change that impacts UI libraries the most, because nearly every component library uses slots for composability — think Dialog content, Tab panels, Dropdown items.
Event handlers changed. The on:click directive syntax gave way to onclick props. Libraries that relied on createEventDispatcher needed to migrate to callback props.
Props declaration changed. The export let pattern was replaced by $props(). Every component in every library that accepts props needed updating.
These aren’t incremental changes — they touch the fundamental APIs that UI libraries are built on. That’s why migration across the ecosystem has been uneven.
Fully Svelte 5 Native
These libraries have been rewritten for or significantly updated to Svelte 5. They use runes, snippets, and the new event model natively. No compatibility layer, no legacy patterns.
shadcn-svelte
shadcn-svelte fully embraced Svelte 5 early. Since components live in your project as source files, the migration path was clean: the CLI generates Svelte 5 code, and existing users can re-add components to get the updated versions. The underlying Bits UI layer was rewritten from scratch for Svelte 5.
Migration tip: Re-run the shadcn-svelte CLI to regenerate components. Diff the new versions against your customizations and merge selectively. This is one of the advantages of the copy-paste model — you control the upgrade pace per component.
Bits UI
Bits UI received a ground-up rewrite for Svelte 5. The component API now uses snippets instead of slots, $props() instead of export let, and runes for internal state. The API surface changed enough that it’s essentially a major version bump.
Migration tip: If you use Bits UI directly (not through shadcn-svelte), expect to update your component compositions. Slot-based patterns need to become snippet-based. The library’s documentation has a comprehensive migration guide covering every component.
Skeleton v3
Skeleton released v3 with full Svelte 5 support. The new version is a significant evolution — updated component APIs, a reworked theming system, and Svelte 5 idioms throughout. Skeleton’s team maintained a compatibility period where v2 continued to receive patches for Svelte 4 users.
Migration tip: Skeleton v2 to v3 is a meaningful upgrade beyond just Svelte 5 compatibility. Plan to update theme configurations and some component APIs simultaneously. Their migration guide covers breaking changes in detail.
Melt UI
Melt UI has updated for Svelte 5 compatibility. The builder pattern translates reasonably well to Svelte 5 since it was always based on functions and actions rather than component-level patterns. That said, the store-based API ($trigger, $content) is a Svelte 4 idiom — it works in Svelte 5 but doesn’t feel native to the runes paradigm.
Migration tip: Melt UI works in Svelte 5 projects without major changes. If you’re starting fresh, consider whether Bits UI’s runes-native API is a better fit for the long term.
Compatible but Transitioning
These libraries work with Svelte 5 — often through Svelte’s compatibility mode — but haven’t fully adopted runes and snippets internally.
Flowbite Svelte
Flowbite Svelte has updated for Svelte 5 compatibility. The library works, but some components still show Svelte 4 patterns internally. The team has been progressively updating components to use native Svelte 5 idioms.
Migration tip: Update to the latest Flowbite Svelte version and test your specific component usage. Most standard components (buttons, cards, modals) work without changes. More complex components (data tables, advanced form patterns) may need attention.
Carbon Svelte
Carbon Svelte (the Svelte wrapper for IBM’s Carbon Design System) has moved toward Svelte 5 support, though the large surface area of the library means the transition has been gradual. Carbon has a massive component catalog, and each component needs individual attention.
Migration tip: Check Carbon’s changelog for component-specific Svelte 5 status. For new enterprise projects, evaluate whether the migration timeline aligns with your launch schedule.
Svelte Headless UI
Svelte Headless UI has been updated for Svelte 5 compatibility. The core headless patterns (disclosure, dialog, listbox, menu) translate well to the new reactivity model, though the API may still show some Svelte 4 conventions.
Migration tip: If you’re using Svelte Headless UI and migrating to Svelte 5, test each component you use. Consider evaluating Bits UI as an alternative if you want a fully runes-native headless library.
Stuck on Svelte 4
These libraries have not been updated for Svelte 5 and show no active development toward compatibility. Using them in a Svelte 5 project may work through legacy compatibility mode, but it’s not guaranteed to be stable long-term.
Smelte
Smelte, the Material Design library for Svelte, has been inactive for an extended period. It was designed for Svelte 3/4 and has not received updates for Svelte 5. The library’s last meaningful commits predate the Svelte 5 release.
If you’re using Smelte: Consider migrating to another library entirely. For Material Design aesthetics, look at custom Tailwind configurations or explore community theme presets for shadcn-svelte or Skeleton.
Attractions
Attractions, a component library with clean defaults and a focus on simplicity, has also gone quiet. Development stalled before Svelte 5’s release, and there’s no indication of an upcoming update.
If you’re using Attractions: Evaluate shadcn-svelte or Skeleton as replacements. Both offer similar “clean defaults” aesthetics with active Svelte 5 support and healthy communities.
SMUI (Svelte Material UI)
SMUI has had a complicated relationship with Svelte version transitions. While the maintainer has worked on updates, the pace of development has been slow relative to the ecosystem. Check the repository for the latest status before depending on it for a Svelte 5 project.
If you’re using SMUI: If you need Material Design components, evaluate the current compatibility status carefully. For non-Material projects, this is a natural point to switch to a more actively maintained library.
Planning Your Migration
Step 1: Audit Your Dependencies
Before writing any migration code, catalog every Svelte UI library in your project and check its Svelte 5 status. Use our directory to quickly see compatibility information for each library.
Step 2: Identify the Critical Path
Your migration is only as fast as your slowest dependency. If one critical library isn’t Svelte 5 ready, you have three options:
- Wait for the library to update (check their issue tracker for timelines)
- Replace the library with a Svelte 5-compatible alternative
- Fork and migrate the components you use (risky, but sometimes necessary)
Step 3: Migrate in Layers
Don’t try to update everything at once. Svelte 5’s compatibility mode lets you mix Svelte 4 and Svelte 5 patterns in the same project. Use this to your advantage:
- Update your framework to Svelte 5 / SvelteKit 2+ with compatibility mode enabled
- Update libraries one at a time, starting with the ones that have clean Svelte 5 support
- Migrate your own components from
export let/$:/ slots to$props()/$derived/ snippets - Remove compatibility mode once everything is updated
Step 4: Test Accessibility
This is the step most teams skip, and it’s the one that causes the most user-facing regressions. When UI libraries update their internals for Svelte 5, subtle accessibility behaviors can change — focus management, keyboard navigation, ARIA attribute timing. Run your existing accessibility tests (or write them now if you don’t have them) after every library upgrade.
The Big Picture
The Svelte 5 migration is largely behind the ecosystem’s most popular libraries. shadcn-svelte, Bits UI, Skeleton v3, and Melt UI are all production-ready on Svelte 5. If your stack is built on these, migrating is straightforward.
The pain points are in the long tail — older or less actively maintained libraries that haven’t kept pace. If you’re depending on one of these, the Svelte 4 to 5 migration is really a library migration, and the sooner you plan for it, the smoother it’ll go.
Browse our full library directory to check compatibility status for any Svelte UI library, or use the comparison tool to evaluate potential replacements side by side.