releases.shpreview
Home/Svelte
Svelte

Svelte

Patch Changes
  • fix: properly track effect end node for async sibling component (#18371)

  • fix: prevent false-positive reactivity loss warning (#18373)

  • chore: bump esrap dependency (#18372)

  • fix: ignore declaration tags for animation directive (#18366)

  • fix: reject pending async deriveds on discard (#18308)

Minor Changes
  • feat: explicit env vars (#15934)
Patch Changes
  • fix: remove check for svelte.config.js before running sync (#15946)

  • fix: generate a placeholder tsconfig.json to squelch sync-time warnings (#15948)

  • fix: allow use of $app/env/public in service workers (#15950)

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_locally warnings for $derived declarations in declaration tags (#18348)

  • fix: tolerate whitespace before let/const in 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 type attribute is applied after value (#18345)

  • fix: update SvelteURLSearchParams when 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 submit now returns a boolean to indicate submission validity for enhanced remote forms (2.57.0, Docs, #15530)
  • Breaking: requested(...) now requires limit and yields { arg, query } entries instead of returning the validated argument directly (2.58.0, Docs, #15739)
  • requested(...) now supports query.batch(...), which makes batch remote query workflows easier to inspect in request-time logic (2.59.0, Docs, #15751)
  • submit and hidden remote 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 - use await 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 programmatic submit() API and can be passed into enhance callbacks (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 stdio mode 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

Libraries, Tools & Components

UI Components and Visual Effects

App Building and Product Tooling

Developer Tools and Utilities

Plugins and Runtime Integrations

That's it for this month! Let us know if we missed anything on Reddit or Discord.

Until next time 👋🏼!

Minor Changes
  • feat: allow declarations in the template (#18282)
Patch Changes
  • perf: use createElement instead of createElementNS for HTML elements (#18262)

  • perf: store current_sources as a Set for O(1) membership checks (#18278)

  • perf: deduplicate identical hoisted templates within a component (#18320)

  • perf: hoist rest_props exclude list as a module-scope Set (#18252)

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 @const blockers 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_events warning (#18272)

  • fix: catch rejected promises while merging/committing (#18266)

Minor Changes
  • breaking: the .run() method has been removed from remote queries on both the client and the server. Use await 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 submit method to form remote function instances (#15657)

  • feat: pass form remote function instance into enhance callback (#15657)

Patch Changes
  • fix: resolve the app payload without using process.env.NODE_ENV (#15852)

  • fix: support exactOptionalPropertyTypes for optional route params (#15825)

  • fix: correctly send true value 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:body and 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)

Minor Changes
  • feat: support query.batch in requested(...) (#15751)

  • breaking: on the server, make the promise returned from refresh represent adding the refresh to the map, not the time it takes to run the remote function (#15705)

  • feat: experimental query.live function (#15705)

Patch Changes
  • fix: unwrap Promise in RemoteCommand output 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)
  • form fields can now specify a default value using field.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 submit now returns a boolean to 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)
    • requested now requires limit and 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 sv as an experimental feature (sv@0.1.0, Docs, #1020)
  • The sv and sv-utils packages 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)
  • sv will now more reliably detect if Vitest v3 is installed when configuring projects (sv@0.15.2, #1073)
  • Types for TweenOptions, SpringOptions, SpringUpdateOptions and Updater are now available as exports from svelte/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 sv add-ons
  • Ep. 138 - Changelog
  • Ep. 139 - Changelog, Imperative interfaces

To Read

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-check with 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 👋🏼!

Last Checked
44m ago
Tracking since Nov 26, 2016