Skip to content

chore(release): 2.0.0 - #227

Merged
dangreen merged 1 commit into
mainfrom
simple-release
Oct 21, 2026
Merged

dangreen merged 1 commit into
mainfrom
simple-release

Conversation

@github-actions

@github-actions github-actions Bot commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

nano_kit

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • store,query: $getMapKey, setMapKey, deleteMapKey, clearMap, subMapEvent,
    fireMapEvent, $$insert, $$clear, $$deleted and the SignalsMapEvent and
    SignalsMapEvents types are removed from @nano_kit/store, and SignalsMap is a class to
    create with new, not a type over a plain Map. The cache of a query client context is
    a ShardedSignalsMap: its has, set and delete take a sharded key.
  • agera,kida: effect no longer defers when created inside a deferred scope body: use
    deferEffect there. subscribe, listen, observe and subscribeAny no longer accept the
    noDefer argument.
  • kida,store,react,svelte-kit: InjectionContext no longer extends Map: its values are in the public deps
    map, so context.set(token, value) becomes context.deps.set(token, value). A dependency that
    is not provided is no longer created in the context that injects it first, and a context no
    longer takes a dependency from above when it overrides what that dependency reads.
  • intl: relativetime() takes a moment, a date, a timestamp or a date string,
    instead of a count of units, and its unit option is gone, so a call that passes it no
    longer compiles. Format in one unit with largestUnit and smallestUnit set to it, and
    format a count of units with Intl.RelativeTimeFormat or a plural() message.
  • kida: resolved hands values through verbatim - a falsy source value is data, not a
    reset to undefined: emptiness is expressed by T itself (e.g. T | null), and the input type
    drops the falsy arm.
  • kida,store: an operator called with static operands returns the value, not an accessor.
    concat is removed, the f tag takes its place.
  • the packages require Node.js 24 or newer.
  • kida,store,query: the tasks pool is gone — TasksPool$, TasksRunner$, tasksRunner, addTask,
    waitCurrentTasks and taskPromise are removed, waitTasks takes a signal instead of a pool, and
    the tasks() and ssr() query settings are removed: hydratable() is the whole SSR setting.

Features

  • add development diagnostics with separate development and production builds (#236) (39be996)
  • agera,kida,store: add uninspected to keep the nodes of a listener out of inspect, and the old value to UpdateEvent (#262) (83384ce)
  • agera,kida: add deferEffect for effects owned by a deferred scope (#257) (12cb14b)
  • agera: add inspect to report graph events in the development build (#237) (07e4290)
  • agera: call the inspect listener with one event object (#264) (f49ec73)
  • agera: enclose the lifecycle listeners of a node between FireEvent and FireEndEvent (#267) (ef084b7)
  • agera: report the end of a run with RunEndEvent, and leave oldValue out of a first evaluation (#265) (61186e0)
  • devtools,store: add the DevTools panel (#263) (bc1e51a)
  • intl: accept a signal, an accessor or null as the value of a format() message (#286) (4010477)
  • intl: make relativetime() take a moment and pick the unit by the distance (#287) (cdf1238)
  • intl: use a plain string translation for every plural form and match case (#246) (82d45cf)
  • kida,store,query: attach tasks to the signals they fill (#222) (841acd1)
  • kida,store,react,svelte-kit: create a dependency in the deepest context that provides what it reads, and add provideAs (#279) (5052174)
  • kida,store: move latest from kida to @nano_kit/store (#296) (f503e28)
  • kida,store: return a plain result from the operators when every operand is static (#260) (3a8b32f)
  • kida: add latest for the value of the source that changed last (#231) (84efaed)
  • kida: attach the resolved promise as a task and hand values through verbatim (#223) (8fabbeb)
  • kida: export child to build custom child signals (#250) (8794697)
  • kida: rename the template tag f to text (505d947)
  • preact,preact-router,preact-ssr: support Preact 11 (#302) (b05c190)
  • require Node.js 24 (#268) (c6ed062)
  • store,query: replace the signals map functions with the SignalsMap and IndexedSignalsMap classes (#261) (c062f06)
  • svelte-kit: support SvelteKit 3 (#299) (b2c54bb)

Bug Fixes

  • agera: drop the development warning about a signal written inside a computed (#266) (21e269b)
  • agera: mount a mountable first read on a re-run of a computed that another computed reads (#294) (df898de)
  • agera: queue batch and trigger writes onto a running flush instead of draining it (#256) (d6afbdd)
  • deps: update dependency @astrojs/starlight to ^0.42.0 (#228) (bb5a65c)
  • deps: update dependency jotai to v3 (#243) (a6c972f)
  • deps: update dependency mobx to v7 (#184) (5c3ff53)
  • deps: update dependency starlight-llms-txt to ^0.12.0 (#258) (d52874c)
  • deps: update dependency starlight-sidebar-topics to ^0.9.0 (#232) (65da70d)
  • intl: do not warn that a format() message is missing from the translations (#285) (3c12504)
  • intl: require explicit options next to a fallback in the Intl formatters (#245) (6b3d44e)
  • kida: keep onMount subscribed when a signal remounts within the unmount delay (#229) (b911d4c)
  • kida: type record() and deepRecord() of a Signalish source as readable (#295) (ffe5453)
  • next-router: let a nested NextNavigationProvider pick up search params below a prerenderable layout (#242) (13a2eb3)
  • platform-web,svelte-kit: round-trip any value through the cookie storage on the server and in the browser (#289) (8ed53a3)
  • platform-web: accept null in parseLocales for a missing Accept-Language header (#244) (1e29516)
  • platform-web: broadcast broadcasted writes and resets while the signal is not observed (#247) (2696386)
  • platform-web: expire a cookie immediately with maxAge: 0 (#248) (bae248e)
  • preact: reuse the parent context by default in HydrationProvider, as React does (#249) (cb2d9e2)
  • query: drop the development warning about a cache key shard registered twice (#275) (6a0749b)
  • query: refetch a query revalidated while its request is in flight (#284) (2c0ed97)
  • router,ssr: render the httpEquiv meta prop as the http-equiv attribute (#253) (568df71)
  • router: stop back() and forward() of browserNavigation from throwing Illegal invocation (#290) (f747eaf)
  • ssr,react-ssr,preact-ssr,svelte-ssr: escape head values and the dehydrated snapshot in the rendered html (#239) (60eefe2)
  • ssr: link the stylesheets of a chunk after those of the chunks it imports (#282) (07b0c48)
  • svelte-router: re-render App when the matched page component changes (#241) (0d44ed1)
  • svelte-router: resolve getLocation, getNavigation, getPaths and getCanGoBack through the Svelte context (#240) (2e465d3)

agera

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • effect no longer defers when created inside a deferred scope body: use
    deferEffect there. subscribe, listen, observe and subscribeAny no longer accept the
    noDefer argument.
  • the packages require Node.js 24 or newer.

Features

  • add deferEffect for effects owned by a deferred scope (#257) (12cb14b)
  • add inspect to report graph events in the development build (#237) (07e4290)
  • add uninspected to keep the nodes of a listener out of inspect, and the old value to UpdateEvent (#262) (83384ce)
  • add development diagnostics with separate development and production builds (#236) (39be996)
  • call the inspect listener with one event object (#264) (f49ec73)
  • enclose the lifecycle listeners of a node between FireEvent and FireEndEvent (#267) (ef084b7)
  • report the end of a run with RunEndEvent, and leave oldValue out of a first evaluation (#265) (61186e0)
  • require Node.js 24 (#268) (c6ed062)

Bug Fixes

  • drop the development warning about a signal written inside a computed (#266) (21e269b)
  • mount a mountable first read on a re-run of a computed that another computed reads (#294) (df898de)
  • queue batch and trigger writes onto a running flush instead of draining it (#256) (d6afbdd)

@nano_kit/devtools

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

@nano_kit/intl

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • relativetime() takes a moment, a date, a timestamp or a date string,
    instead of a count of units, and its unit option is gone, so a call that passes it no
    longer compiles. Format in one unit with largestUnit and smallestUnit set to it, and
    format a count of units with Intl.RelativeTimeFormat or a plural() message.
  • the packages require Node.js 24 or newer.

Features

  • accept a signal, an accessor or null as the value of a format() message (#286) (4010477)
  • add development diagnostics with separate development and production builds (#236) (39be996)
  • make relativetime() take a moment and pick the unit by the distance (#287) (cdf1238)
  • require Node.js 24 (#268) (c6ed062)
  • use a plain string translation for every plural form and match case (#246) (82d45cf)

Bug Fixes

  • do not warn that a format() message is missing from the translations (#285) (3c12504)
  • require explicit options next to a fallback in the Intl formatters (#245) (6b3d44e)

kida

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • effect no longer defers when created inside a deferred scope body: use
    deferEffect there. subscribe, listen, observe and subscribeAny no longer accept the
    noDefer argument.
  • InjectionContext no longer extends Map: its values are in the public deps
    map, so context.set(token, value) becomes context.deps.set(token, value). A dependency that
    is not provided is no longer created in the context that injects it first, and a context no
    longer takes a dependency from above when it overrides what that dependency reads.
  • resolved hands values through verbatim - a falsy source value is data, not a
    reset to undefined: emptiness is expressed by T itself (e.g. T | null), and the input type
    drops the falsy arm.
  • an operator called with static operands returns the value, not an accessor.
    concat is removed, the f tag takes its place.
  • the packages require Node.js 24 or newer.
  • the tasks pool is gone — TasksPool$, TasksRunner$, tasksRunner, addTask,
    waitCurrentTasks and taskPromise are removed, waitTasks takes a signal instead of a pool, and
    the tasks() and ssr() query settings are removed: hydratable() is the whole SSR setting.

Features

  • add deferEffect for effects owned by a deferred scope (#257) (12cb14b)
  • add latest for the value of the source that changed last (#231) (84efaed)
  • add uninspected to keep the nodes of a listener out of inspect, and the old value to UpdateEvent (#262) (83384ce)
  • add development diagnostics with separate development and production builds (#236) (39be996)
  • attach tasks to the signals they fill (#222) (841acd1)
  • attach the resolved promise as a task and hand values through verbatim (#223) (8fabbeb)
  • create a dependency in the deepest context that provides what it reads, and add provideAs (#279) (5052174)
  • export child to build custom child signals (#250) (8794697)
  • move latest from kida to @nano_kit/store (#296) (f503e28)
  • rename the template tag f to text (505d947)
  • require Node.js 24 (#268) (c6ed062)
  • return a plain result from the operators when every operand is static (#260) (3a8b32f)

Bug Fixes

  • keep onMount subscribed when a signal remounts within the unmount delay (#229) (b911d4c)
  • type record() and deepRecord() of a Signalish source as readable (#295) (ffe5453)

@nano_kit/next-router

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

Bug Fixes

  • let a nested NextNavigationProvider pick up search params below a prerenderable layout (#242) (13a2eb3)

@nano_kit/platform-web

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

Bug Fixes

  • accept null in parseLocales for a missing Accept-Language header (#244) (1e29516)
  • broadcast broadcasted writes and resets while the signal is not observed (#247) (2696386)
  • expire a cookie immediately with maxAge: 0 (#248) (bae248e)
  • round-trip any value through the cookie storage on the server and in the browser (#289) (8ed53a3)

@nano_kit/preact

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

Bug Fixes

  • reuse the parent context by default in HydrationProvider, as React does (#249) (cb2d9e2)

@nano_kit/preact-router

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

@nano_kit/preact-ssr

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

Bug Fixes

  • escape head values and the dehydrated snapshot in the rendered html (#239) (60eefe2)

@nano_kit/query

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • $getMapKey, setMapKey, deleteMapKey, clearMap, subMapEvent,
    fireMapEvent, $$insert, $$clear, $$deleted and the SignalsMapEvent and
    SignalsMapEvents types are removed from @nano_kit/store, and SignalsMap is a class to
    create with new, not a type over a plain Map. The cache of a query client context is
    a ShardedSignalsMap: its has, set and delete take a sharded key.
  • the packages require Node.js 24 or newer.
  • the tasks pool is gone — TasksPool$, TasksRunner$, tasksRunner, addTask,
    waitCurrentTasks and taskPromise are removed, waitTasks takes a signal instead of a pool, and
    the tasks() and ssr() query settings are removed: hydratable() is the whole SSR setting.

Features

  • add development diagnostics with separate development and production builds (#236) (39be996)
  • attach tasks to the signals they fill (#222) (841acd1)
  • replace the signals map functions with the SignalsMap and IndexedSignalsMap classes (#261) (c062f06)
  • require Node.js 24 (#268) (c6ed062)

Bug Fixes

  • drop the development warning about a cache key shard registered twice (#275) (6a0749b)
  • refetch a query revalidated while its request is in flight (#284) (2c0ed97)

@nano_kit/react

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • InjectionContext no longer extends Map: its values are in the public deps
    map, so context.set(token, value) becomes context.deps.set(token, value). A dependency that
    is not provided is no longer created in the context that injects it first, and a context no
    longer takes a dependency from above when it overrides what that dependency reads.
  • the packages require Node.js 24 or newer.

Features

  • create a dependency in the deepest context that provides what it reads, and add provideAs (#279) (5052174)
  • require Node.js 24 (#268) (c6ed062)

@nano_kit/react-router

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

@nano_kit/react-ssr

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

Bug Fixes

  • escape head values and the dehydrated snapshot in the rendered html (#239) (60eefe2)

@nano_kit/router

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

  • add development diagnostics with separate development and production builds (#236) (39be996)
  • require Node.js 24 (#268) (c6ed062)

Bug Fixes

  • render the httpEquiv meta prop as the http-equiv attribute (#253) (568df71)
  • stop back() and forward() of browserNavigation from throwing Illegal invocation (#290) (f747eaf)

@nano_kit/ssr

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

Bug Fixes

  • escape head values and the dehydrated snapshot in the rendered html (#239) (60eefe2)
  • link the stylesheets of a chunk after those of the chunks it imports (#282) (07b0c48)
  • render the httpEquiv meta prop as the http-equiv attribute (#253) (568df71)

@nano_kit/store

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • $getMapKey, setMapKey, deleteMapKey, clearMap, subMapEvent,
    fireMapEvent, $$insert, $$clear, $$deleted and the SignalsMapEvent and
    SignalsMapEvents types are removed from @nano_kit/store, and SignalsMap is a class to
    create with new, not a type over a plain Map. The cache of a query client context is
    a ShardedSignalsMap: its has, set and delete take a sharded key.
  • InjectionContext no longer extends Map: its values are in the public deps
    map, so context.set(token, value) becomes context.deps.set(token, value). A dependency that
    is not provided is no longer created in the context that injects it first, and a context no
    longer takes a dependency from above when it overrides what that dependency reads.
  • an operator called with static operands returns the value, not an accessor.
    concat is removed, the f tag takes its place.
  • the packages require Node.js 24 or newer.
  • the tasks pool is gone — TasksPool$, TasksRunner$, tasksRunner, addTask,
    waitCurrentTasks and taskPromise are removed, waitTasks takes a signal instead of a pool, and
    the tasks() and ssr() query settings are removed: hydratable() is the whole SSR setting.

Features

  • add uninspected to keep the nodes of a listener out of inspect, and the old value to UpdateEvent (#262) (83384ce)
  • add development diagnostics with separate development and production builds (#236) (39be996)
  • add the DevTools panel (#263) (bc1e51a)
  • attach tasks to the signals they fill (#222) (841acd1)
  • create a dependency in the deepest context that provides what it reads, and add provideAs (#279) (5052174)
  • move latest from kida to @nano_kit/store (#296) (f503e28)
  • replace the signals map functions with the SignalsMap and IndexedSignalsMap classes (#261) (c062f06)
  • require Node.js 24 (#268) (c6ed062)
  • return a plain result from the operators when every operand is static (#260) (3a8b32f)

@nano_kit/svelte

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

@nano_kit/svelte-kit

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • InjectionContext no longer extends Map: its values are in the public deps
    map, so context.set(token, value) becomes context.deps.set(token, value). A dependency that
    is not provided is no longer created in the context that injects it first, and a context no
    longer takes a dependency from above when it overrides what that dependency reads.
  • the packages require Node.js 24 or newer.

Features

  • create a dependency in the deepest context that provides what it reads, and add provideAs (#279) (5052174)
  • require Node.js 24 (#268) (c6ed062)
  • support SvelteKit 3 (#299) (b2c54bb)

Bug Fixes

  • round-trip any value through the cookie storage on the server and in the browser (#289) (8ed53a3)

@nano_kit/svelte-router

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

Bug Fixes

  • re-render App when the matched page component changes (#241) (0d44ed1)
  • resolve getLocation, getNavigation, getPaths and getCanGoBack through the Svelte context (#240) (2e465d3)

@nano_kit/svelte-ssr

2.0.0 (2026-10-21)

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

⚠ BREAKING CHANGES

  • the packages require Node.js 24 or newer.

Features

Bug Fixes

  • escape head values and the dehydrated snapshot in the rendered html (#239) (60eefe2)

This PR was generated with simple-release.

📄 Cheatsheet

You can configure the bot's behavior through a pull request comment using the !simple-release/set-options command.

Command Format

!simple-release/set-options

```json
{
  "bump": {}
}
```

Useful Parameters

The options shape the pull request generation, so the bump ones matter here. Release-time options like publish belong in the config file.

Parameter Type Description
version string Force set specific version
as 'major' | 'minor' | 'patch' | 'prerelease' Release type. prerelease keeps the type derived from the commits and makes the version a prerelease
prerelease string Pre-release identifier (e.g., "alpha", "beta")
firstRelease boolean Whether this is the first release
skip boolean Skip version bump
byProject Record<string, object> Per-project bump options for monorepos

Usage Examples

Force specific version

!simple-release/set-options

```json
{
  "bump": {
    "version": "2.0.0"
  }
}
```

Force major bump

!simple-release/set-options

```json
{
  "bump": {
    "as": "major"
  }
}
```

Create alpha pre-release

!simple-release/set-options

```json
{
  "bump": {
    "prerelease": "alpha"
  }
}
```

Custom Changelog Preamble

You can add custom markdown to the top of the changelog (right after the version header) using the !simple-release/set-preamble command. The markdown after the command line becomes the preamble. Start its headings at ### — the level of the generated changelog sections like ### Features.

!simple-release/set-preamble

### What's new?

- The website was completely redesigned
- The new API gives you awesome possibilities

In a monorepo, pass the full package name after the command to target a single package's changelog. Wrap the name in backticks so GitHub keeps it as text instead of a mention:

!simple-release/set-preamble `@your-org/core`

### Core changes

- New plugin system

Use one comment per package, plus one without a name for the whole release.

Access Restrictions

The commands can only be used by users with permissions:

  • repository owner
  • organization member
  • collaborator

Notes

  • The last comment with !simple-release/set-options command takes priority
  • The last !simple-release/set-preamble comment per package takes priority
  • JSON must be valid, otherwise the set-options command will be ignored
  • Parameters apply only to the current release execution
  • The commands can be updated by editing the comment or adding a new one

@github-actions
github-actions Bot force-pushed the simple-release branch 22 times, most recently from 145867d to 6dd0c2b Compare September 8, 2026 16:06
@github-actions
github-actions Bot force-pushed the simple-release branch 8 times, most recently from 43d3c6b to 045feb2 Compare September 9, 2026 15:07
@github-actions
github-actions Bot force-pushed the simple-release branch 10 times, most recently from 2414428 to dd15682 Compare September 30, 2026 19:19
@github-actions
github-actions Bot force-pushed the simple-release branch 9 times, most recently from bac21f4 to 009f244 Compare October 7, 2026 13:09
@github-actions
github-actions Bot force-pushed the simple-release branch 4 times, most recently from 3b027dd to edc378b Compare October 14, 2026 13:43
@github-actions
github-actions Bot force-pushed the simple-release branch 3 times, most recently from e1820cf to 88cdfcd Compare October 18, 2026 13:01
@codecov

codecov Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.62%. Comparing base (b05c190) to head (1f6920b).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #227      +/-   ##
==========================================
+ Coverage   83.60%   83.62%   +0.02%     
==========================================
  Files         228      228              
  Lines        4849     4849              
  Branches     1074     1074              
==========================================
+ Hits         4054     4055       +1     
+ Misses        554      553       -1     
  Partials      241      241              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@dangreen

Copy link
Copy Markdown
Member

!simple-release/set-preamble

Nano Kit 2.0 🎉

What's new

  • DevTools. @nano_kit/devtools is a panel right on the page to inspect your stores: your signals, their values and a log of every change.
  • Development warnings. In development, the packages warn about common mistakes, like a missing route parameter or a missing translation.
  • Tasks on signals. SSR and tests wait only for the data they need, not for every request in flight.
  • Smarter dependency injection. Stores are shared between nested contexts unless a context overrides what they depend on. The new provideAs swaps an implementation, like a mock API in tests.
  • SignalsMap class. The reactive map now has the familiar Map API.
  • Operators. With static operands they return a plain value, and pick, text and latest are new.
  • intl. relativetime() picks the unit by itself, from "5 minutes ago" to "yesterday", and format() messages accept signals.
  • Preact 11 and SvelteKit 3 are supported.

Upgrading from 1.x

The breaking changes below list everything. The usual edits:

  • Node.js 24 or newer is required.
  • inject(TasksRunner$) with task(fn) becomes task($signal, fn), waitTasks(pool) becomes waitTasks($signal), and client(ssr()) or client(tasks(), hydratable()) becomes client(hydratable()).
  • context.set(token, value) becomes context.deps.set(token, value). To keep a store per context, provide it in that context.
  • $getMapKey(map, key), setMapKey, deleteMapKey and clearMap become map.$get(key), map.set, map.delete and map.clear of a new SignalsMap().
  • An operator with static operands returns the value, not an accessor, and concat($first, ' ', $last) becomes text`${$first} ${$last}` (the f tag in the notes below shipped as text).
  • resolved keeps a falsy value as data: express an empty state with the type, such as User | null.
  • An effect created in a deferred scope body no longer defers: use deferEffect there.
  • relativetime() takes a moment instead of a count, and its unit option is gone: set largestUnit and smallestUnit to one unit to format in it.

Where to start

  • 📚 Documentation: guides for every package
  • 🛠️ DevTools: install the panel and open it with Alt+Shift+D
  • 🤖 Agent Skills: teach your coding agent the Nano Kit API

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant