Svelte
Patch Changes
-
fix: error at compile time on duplicate snippet/declaration tag definitions (#18351)
-
fix: parse declaration tag contents more robustly (#18353)
-
fix: correctly transform references to earlier declarators in a declaration tag (e.g.
{let a = $state(0), b = $derived(a * 2)}) (#18348) -
fix: avoid spurious
state_referenced_locallywarnings for$deriveddeclarations in declaration tags (#18348) -
fix: tolerate whitespace before
let/constin declaration tags (#18348) -
fix: prevent infinite loop when a tag's expression ends with a trailing
/at the end of the input (#18350) -
fix: more robust parsing of declaration tags with regards to
type(#18330) -
fix: preserve newlines in spread input values when the
typeattribute is applied aftervalue(#18345) -
fix: update
SvelteURLSearchParamswhen setting duplicate keys to the same joined value (#18336) -
fix: check references for blockers on server, too (#18352)
This month we got a bunch of improvements in SvelteKit's forms and remote functions. Plus, a new query function (.live(...)) that makes accessing real-time data from the server easier.
Keep an eye out for a few breaking changes in remote functions, if you're using those. Otherwise, enjoy all the new SvelteKit features and bug fixes in the latest versions of Svelte.
Let's dive in!
What's new in SvelteKit
- Form
submitnow returns a boolean to indicate submission validity for enhanced remote forms (2.57.0, Docs, #15530) - Breaking:
requested(...)now requireslimitand yields{ arg, query }entries instead of returning the validated argument directly (2.58.0, Docs, #15739) requested(...)now supportsquery.batch(...), which makes batch remote query workflows easier to inspect in request-time logic (2.59.0, Docs, #15751)submitandhiddenremote form fields can now accept booleans and numbers directly (2.60.0, Docs, #15802)- SvelteKit now warns when remote form validation issues are never read, helping catch missed UX paths earlier (2.60.0, Docs, #15653)
- Breaking:
.run()was removed from remote queries - useawait query()directly in all contexts instead (2.61.0, Docs, #15779) - Remote queries can now be awaited in event handlers, async callbacks and module scope, with cache deduping shared across reactive and non-reactive consumers (2.61.0, Docs, #15779)
query.live(...)makes working with long-lived remote query subscriptions easier and are now async-iterable (experimental 2.59.0, async in 2.61.0, Docs, #15878)- Breaking: Enhance callbacks now receive a copy of the form remote function instance, rather than a
{ form, data, submit }object. Plus, remote form instances now expose a programmaticsubmit()API and can be passed intoenhancecallbacks (2.61.0, Docs, #15657)
For all the features and bugfixes that landed this month, check out the SvelteKit / Adapter CHANGELOGs.
What's new in Svelte and the Svelte ecosystem
- Templates now allow declarations directly in markup, making it easier to define values close to where they're used (svelte@5.56.0, #18282)
- Svelte language-tools now support TypeScript 6.0 across the language server, svelte2tsx and svelte-check packages (svelte-language-server@0.18.0/svelte2tsx@0.7.55/svelte-check@4.4.8/svelte-preprocess@6.0.4, Docs, #2985 / #675)
- Svelte MCP's
stdiomode can now read file content directly, reducing round trips in local tool workflows (mcp@0.1.23, Docs, #198) - vite-plugin-svelte now enables the optimizer for server environments during development (vite-plugin-svelte@7.1.0, #1328)
Want to dive deep into everything new this month? Check out the language-tools, ai-tools and vite-plugin-svelte releases.
For all the minor changes and bugfixes that came out in the Svelte compiler this month, you can read the full Svelte CHANGELOG.
Community Showcase
Apps & Sites built with Svelte
- asciidia.com is an ASCII-style browser game experiment built with Svelte
- Bingewatcher.org is a daily movie guessing game based on data from Wikipedia and word vectors for 157 languages
- Delcard is an open source peer-to-peer card game platform built with SvelteKit (GitHub)
- Dialyma is an open source canvas builder that can export production-ready code (GitHub)
- Exort is a local workspace for writing microcontroller code, compiling and uploading projects, and monitoring live serial output on supported boards (GitHub)
- Heavy Duty Inc is a turn-based tactics game built with Svelte (Reddit)
- hope-art.app applies protection filters to artwork images before sharing them online to prevent unauthorized AI training and style mimicry (GitHub)
- Image Palette Studio turns images into UI themes with generated CSS variables (GitHub)
- Pad is a local-first collaboration tool that combines a Go CLI with an embedded Svelte web app for human-agent workflows (GitHub)
- Serverwat.ch is a SvelteKit dashboard for monitoring Hetzner-hosted projects
- Trezur is a privacy-preserving browser-side 2FA authenticator with PWA support and cloud sync (GitHub)
- Splitwave is a free node-based audio router for macOS built with Tauri + Svelte (GitHub)
- Tank Supremo is a multiplayer 3D tank game built with Svelte
- Vivix is a JavaScript execution visualizer that uses a worker-based interpreter for smooth timeline scrubbing (GitHub)
- Zenos is a stealth startup from SvelteKit maintainer Ben McCann that is bringing software productivity to the physical world.
Learning Resources
This Week in Svelte
- Ep. 140 - Changelog, Imperative interfaces
- Ep. 141 - Changelog
- Ep. 142 - Changelog
To Read
- Why Svelte Is Better Than React in the Agentic Era by Zack Webster
- Automate LinkedIn Carousels with SvelteKit Remote Functions by Rishi Raj Jain
- Tank Supremo: From a Teenage Dream to a Multiplayer Game by Eyal Azulay
Libraries, Tools & Components
UI Components and Visual Effects
- Huey provides a composable color picker for Svelte 5 (GitHub)
- Svelte Dot Matrix Loaders provides 50+ animated dot-matrix loaders for Svelte projects (GitHub)
- Paper Shaders for Svelte provides paper-style shader effects in an open source Svelte package (GitHub)
- EmbedPDF for Svelte provides a headless PDF viewer for Svelte apps built on PDFium instead of PDF.js (GitHub)
- Svelte Event Calendar is a Google-like event calendar component for Svelte with drag-and-drop editing and multiple calendar support (GitHub)
App Building and Product Tooling
- Convex Better Auth UI for SvelteKit provides self-hosted auth and organization UI components powered by Convex + Better Auth (GitHub)
- Aphex CMS is an open source Sanity-inspired CMS that runs inside a single SvelteKit app (GitHub)
- svelte-visual-builder is an Elementor-style visual builder for SvelteKit projects
- SvelteESP32 v3.0 lets you wire Svelte frontends to ESP32 workflows with an updated Vite plugin flow
Developer Tools and Utilities
- Svelte Hero is a new JetBrains plugin focused on better Svelte support
- jscpd v4.2.0 now supports Svelte projects for duplicate code detection (Changelog)
- Svelte Use provides a collection of composable utilities for Svelte apps (GitHub)
Plugins and Runtime Integrations
- vite-plugin-svelte-tailwind-auto-reference automatically injects Tailwind CSS
@referencein Svelte style blocks when@applyis used - SvelteKit Proxy provides a simple way to proxy requests in production using SvelteKit's
hooks.server.ts - svelte-ws adds WebSocket support across SvelteKit runtimes with an adapter and Vite plugin
That's it for this month! Let us know if we missed anything on Reddit or Discord.
Until next time 👋🏼!
Patch Changes
-
fix: unlink errored and otherwise finished batch (#18264)
-
perf: walk composedPath() directly in delegated event propagation (#18268)
-
fix: transfer effects when merging batches (#18254)
-
fix: allow
$derived(await ...)in disconnected effect roots (#18273) -
fix: remove temporary raw-text hydration markers (#18269)
-
fix: propagate async
@constblockers through closure references so template expressions like{(() => host)()}correctly wait for the awaited value (#18309) -
fix: properly unlink batches (#18298)
-
fix: settle discarded batch (#18290)
-
fix: declare
let:directives before{@const}declarations on slotted elements (#18271) -
fix: resume outro-ed branches if they were kept around (#18291)
-
fix: avoid waterfall-warning when async resolves to same value (#18297)
-
fix: correctly coordinate component-level effects inside async blocks (#18260)
-
fix: make unnecessary commit work less likely (#18263)
-
chore: add tag name to
a11y_click_events_have_key_eventswarning (#18272) -
fix: catch rejected promises while merging/committing (#18266)
Patch Changes
- fix: regression where routes starting and ending with a route group are not matched correctly (#15903)
Minor Changes
-
breaking: the
.run()method has been removed from remote queries on both the client and the server. Useawait query()directly instead — it now works everywhere (#15779) -
feat: remote queries can now be awaited in any context (event handlers, module scope, async callbacks), not just inside reactive contexts. The cache is shared across reactive and non-reactive subscribers, so awaiting a query in an event handler will dedupe with components that have already subscribed to the same query. (#15779)
-
feat: live query instances are now themselves async-iterable (#15878)
-
feat: add programmatic
submitmethod toformremote function instances (#15657) -
feat: pass
formremote function instance intoenhancecallback (#15657)
Patch Changes
-
fix: resolve the app payload without using
process.env.NODE_ENV(#15852) -
fix: support
exactOptionalPropertyTypesfor optional route params (#15825) -
fix: correctly send
truevalue to the server for 'submit' and 'hidden' form fields (#15858) -
fix: avoid build warnings about undefined universal hooks (#15895)
-
fix: prefer default error page when failing to decode the URL pathname (#15744)
-
fix: disable link prefetching on slow internet connections (#15885)
-
fix: allow routes ending with optional parameters next to more specific routes (#15861)
-
fix: remove reliance on Content-Length header in deserialize_binary_form, which caused failures when proxies (e.g. Vercel, Azure) strip the header and use chunked transfer encoding (#15796)
Patch Changes
-
fix: don't unset batch when calling
{#await ...}promise (#18243) -
fix: promise-ify
{#await await ...}expressions on the server and correctly hydrate them on the client (#18243) -
fix: deduplicate dependencies that are added outside the init/update cycle (#18243)
-
fix: avoid false-positive batch invariant error (#18246)
-
fix: inline primitive constants in attribute values during SSR (#18232)
Patch Changes
-
fix(print): handle
svelte:bodyand fix keyframe percentage double-printing (#18234) -
fix: execute uninitialized derived even if it's destroyed (#18228)
-
fix: use named symbols everywhere (#18238)
-
fix: don't run teardown effects when deriveds are unfreezed (#18227)
-
fix: unset context synchronously in
run(#18236)
Patch Changes
- fix: resolve paths to route files with the letter drive on Windows (#15793)
Minor Changes
-
feat: support
query.batchinrequested(...)(#15751) -
breaking: on the server, make the promise returned from
refreshrepresent adding the refresh to the map, not the time it takes to run the remote function (#15705) -
feat: experimental
query.livefunction (#15705)
Patch Changes
-
fix: unwrap
PromiseinRemoteCommandoutput type (#15771) -
fix: empty call to
.updates()on a command/form invocation means "don't update anything" (#15705) -
fix:
form.fields.foo.as('checkbox', default_value)now works (#15752) -
fix: remote forms with default values defined by
field.as('text', defaultValue)now correctly reset to the provided default values once submitted (#15753) -
fix: make sure queries always get started correctly (#15705)
-
fix: allow plain functions as overrides in
updates(#15705)
This month we got a ton of improvements to SvelteKit's remote functions, TypeScript 6.0 support and the experimental release of community plugins in the Svelte CLI.
Svelte was also featured in ThoughtWorks Technology Radar!
Big month, bigger showcase... so let's dive in!
What's new in SvelteKit
- SvelteKit now supports TypeScript 6.0 (2.56.0, Docs, #15595)
formfields can now specify a default value usingfield.as(type, value), reducing boilerplate for pre-populated forms (2.56.0, Docs, #15577)- Remote function transport now uses
hydratable, enabling richer data types in query results (2.56.0, #15533) - Form
submitnow returns abooleanto indicate submission validity for enhanced form remote functions (2.57.0, Docs, #15530) - Remote Function Breaking Changes (2.56.0)
- Client-requested query refreshes must obtain permission from the server (#15562)
- Stabilize remote function caching by sorting object keys (#15570)
- Add
run()method to queries, disallow awaiting queries outside render (#15533) - Isolate command-triggered query refresh failures per-query (#15562)
requestednow requireslimitand yields{ arg, query }entries rather than validated args (#15739)
Looking for more details on the many bug fixes and performance optimizations from this month? Check out the SvelteKit / Adapter CHANGELOGs.
What's new in Svelte and Svelte Dev Tools
- Community add-ons are now available in
svas an experimental feature (sv@0.1.0, Docs, #1020) - The
svandsv-utilspackages are now separate in the CLI package - leading to a more explicit public API and a deprecation pass for old features (sv@0.2.0, Docs, #1046) svwill now more reliably detect if Vitest v3 is installed when configuring projects (sv@0.15.2, #1073)- Types for
TweenOptions,SpringOptions,SpringUpdateOptionsandUpdaterare now available as exports fromsvelte/motion(svelte@5.55.0, Docs, #17967)
For a full list of changes - including all the important bugfixes that went into the releases this month - check out the Svelte compiler's CHANGELOG.
Community Showcase
Apps & Sites built with Svelte
- 4Track is a faithful recreation of a 4-track tape recorder in the browser
- Kumamap is a bear incident map that collates official reports, news and community reports in Japan
- Overshoot is an interactive exploration of Disney's 12 Principles of Animation
- DockScope is a visual Docker dashboard with a 3D dependency graph, live metrics, logs, terminal and container actions
- dnsoptic is a DNS health audit tool that checks nameservers, mail authentication, DNSSEC, security posture and migration diffs
- swap. is a collection of little games built around sorting algorithms
- Scapedle is a Wordle game with Old School RuneScape (OSRS) words
- Ephemeral Forms is a modern, zero-login, offline-first form builder with AI-powered generation, real-time collaboration and cross-device sync
- CORDIAL is an AI Native IDE optimized for a big screen experience. "Good for people who want to feel like Tom Cruise in Minority Report"
Learning Resources
Featuring Svelte Contributors and Ambassadors
- Paolo Ricciuti - Svelte, TMCP by devtools-fm
This Week in Svelte
- Ep. 137 - Changelog, Community
svadd-ons - Ep. 138 - Changelog
- Ep. 139 - Changelog, Imperative interfaces
To Read
- hello svelte: migrating and redesigning my oss project by Jaydip Sanghani
Libraries, Tools & Components
UI Components and Animations
- Blossom Color Picker is a flower-style color picker
- thisux/sveltednd (last featured in December 2024) has been updated to support Svelte 5
- phantom-ui is a structure-aware skeleton loader built with web components
- Svelte Spell UI is a port of the original Spell UI that you can copy-paste into any project
- Svileo is a physics-based toast component inspired by Sileo
- Motion Core (last featured in February) has been rewritten from Three.js to OGL with a much-reduced file size
State Management
- Stately is a Pinia-inspired state management library that provides a structured way to define shared state, mutate it directly and observe changes
Utilities and Integrations
- Sveltia I18n is an internationalization library powered by runes and the messageformat library for formatting messages using Unicode MessageFormat 2 (MF2)
- Nabu is a modular, local-first Svelte block editor engine built on a Single ContentEditable architecture
- Svelte Agentation turns UI annotations into structured context that AI coding agents can understand and act on
Developer Tools
- Atom Forge is a full-stack TypeScript toolkit with Svelte 5 UI components, type-safe RPC and a battle-tested architecture pattern that scales
- svelte-check-native is a Rust/tsgo drop-in replacement for
svelte-checkwith the same flags, output formats and exit codes
That's it for this month! Let us know if we missed anything on Reddit or Discord.
Until next time 👋🏼!
Svelte CLI Community Add-ons, TypeScript 6.0 support in SvelteKit