Manage state with style in every framework
Last release 1 months ago
07 Jul 2026
Ships unpredictably
gaps range from 2 weeks to 10 months
Nearly every release is documented
notes for 33 of 33 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
33 releases · first in 2022
Release timeline
33 releases since 2022Releases
- 1.14.47 Jul 2026
Release notes2 sources agree
Open source →Patch Changes
-
#947
2910fbfThanks @JoviDeCroock! - Fix computeds returning stale values after a batch reverts a signal to its original value.Reconciling a reverted batch write used to roll the signal's version number back, breaking version monotonicity. A lazy computed that read the signal during the batch had already observed the intermediate version, so a later write could re-mint that same version number for a different value and the computed would treat it as unchanged forever. Subscriber nodes that saw the pre-batch version are now fast-forwarded instead, keeping the no-op skip optimization without ever reusing version numbers.
-
#945
d40746bThanks @andrewiggins! - Prevent model effect capture while creating effects insideuntracked()andaction()callbacks.If you create an
effect()inside anuntracked()callback within acreateModel()factory, that effect is no longer disposed when the model is disposed. Use the disposer returned byeffect()to clean it up manually.
-
- 1.14.316 Jun 2026
Release notes2 sources agree
Open source →Patch Changes
- #937
beb84c1Thanks @JoviDeCroock! - Optimize bundle size
- #937
- 1.14.211 May 2026
Release notes2 sources agree
Open source →Patch Changes
- #915
054afc1Thanks @JoviDeCroock! - Shave some bytes by using untracked to implement peek
- #915
- 1.14.131 Mar 2026
Release notes2 sources agree
Open source →Patch Changes
-
#906
0c65390Thanks @JoviDeCroock! - Wrap nested object methods returned from createModel so composed models keep action batching semantics without manual action wrappers. -
#911
6c17923Thanks @JoviDeCroock! - Avoid hard-requiringESNext.Disposablein consumer tsconfigs forModelandeffect()types.
-
- 1.14.08 Mar 2026
Release notes2 sources agree
Open source →Minor Changes
- #891
308c921Thanks @JoviDeCroock! - Prevent batches where a signal goes from A --> B --> A from triggering dependent updates, a computed/effect should not re-run when the dependencies in a batched update amount to an equal value.
- #891
- 1.13.04 Feb 2026
Release notes2 sources agree
Open source →Minor Changes
-
#812
19ac39bThanks @andrewiggins! - AddcreateModelandactionto signals core packagecreateModelprovides a structured way to create reactive model classes that encapsulate signals, computed values, and actions:const CounterModel = createModel((initialCount = 0) => { const count = signal(initialCount); const doubled = computed(() => count.value * 2); effect(() => { console.log("Count changed:", count.value); }); return { count, doubled, increment() { count.value++; }, }; }); const counter = new CounterModel(5); counter.increment(); // Updates are automatically batched counter[Symbol.dispose](); // Cleans up all effectsKey features:
- Factory functions can accept arguments for initialization
- All methods are automatically wrapped as actions (batched & untracked)
- Effects created during model construction are captured and disposed when the model is disposed via
Symbol.dispose - TypeScript validates that models only contain signals, actions, or nested objects with signals/actions
actionis a helper that wraps a function to run batched and untracked:const updateAll = action(items => { items.forEach(item => item.value++); }); // All updates batched into single notification
-
- 1.12.220 Jan 2026
Release notes
Open source →Patch Changes
- #827
f17889bThanks @JoviDeCroock! - Add mangle entry for _debugCallback
- #827
- 1.12.123 Aug 2025
Release notes2 sources agree
Open source →Patch Changes
- #747
57bc903Thanks @JoviDeCroock! - Remove internal annotation as it confused TS
- #747
- 1.12.019 Aug 2025
Release notes
Open source →Minor Changes
- #681
6cc7005Thanks @JoviDeCroock! - Allow for naming your singals/computeds/effects
- #681
- 1.11.029 Jun 2025
Release notes2 sources agree
Open source →Minor Changes
-
#706
4045d2dThanks @marvinhagemeister! - feat: support disposingeffect()with resource managementThis allows
effect()'s to be disposed with the newusingkeyword from the explicit resource management proposal.Whenever an effect goes out of scope the
Symbol.disposefunction is called automatically.const count = signal(0); function doSomething() { // The `using` keyword calls dispose at the end of // this function scope using _ = effect(() => { console.log(count.value); return () => console.log("disposed"); }); console.log("hey"); } doSomething(); // Logs: // 0 // hey // disposed
-
- 1.10.011 Jun 2025
Release notes2 sources agree
Open source →Minor Changes
- #697
5e7a167Thanks @JoviDeCroock! - Publicly exposedispose()on an effect callback
- #697
- 1.9.029 May 2025
Release notes2 sources agree
Open source →Minor Changes
- #634
62bed44Thanks @JoviDeCroock! - Add an option to specify a watched/unwatched callback to a signal
Patch Changes
- #688
587e702Thanks @JoviDeCroock! - Loosen up types forwatchedandunwatched
- #634
- 1.8.04 Aug 2024
Release notes2 sources agree
Open source →Minor Changes
-
#587
cd9efbbThanks @JoviDeCroock! - Adjust theReadOnlySignaltype to not inherit fromSignalthis way the type can't be widened without noticing, i.e. when we'd haveconst sig: Signal = useComputed(() => x);We would have widened the type to be mutable again, which for a computed is not allowed. We want to provide the tools to our users to avoid these footguns hence we are correcting this type in a minor version.
-
- 1.7.06 Jul 2024
Release notes2 sources agree
Open source →Minor Changes
- #578
931404eThanks @JoviDeCroock! - Allow for passing no argument to the signal and the type to be automatically inferred asT | undefined
- #578
- 1.6.112 Jun 2024
- 1.6.019 Mar 2024
Release notes2 sources agree
Open source →Minor Changes
Patch Changes
- 1.5.17 Dec 2023
- 1.5.08 Sept 2023
Release notes
Open source →Minor Changes
- #964
8d5adb1Thanks @JoviDeCroock! - Add Performance Insights for instance-level update hotspots and explicitly instrumented no-output-change computed recomputations.
Additional notes
Open source →1.5.0
Minor Changes
- #405
9355d96Thanks @JoviDeCroock! - Add unique identifier to everySignal, this will be present on thebrandproperty of a Signal coming from eithersignal()orcomputed()
Additional notes
Open source →Minor Changes
- #405
9355d96Thanks @JoviDeCroock! - Add unique identifier to everySignal, this will be present on thebrandproperty of a Signal coming from eithersignal()orcomputed()
- #964
- 1.4.02 Aug 2023
Release notes
Open source →Minor Changes
-
#866
00ba858Thanks @JoviDeCroock! - Add special case in devtools-ui for component updates -
#851
a7f500bThanks @JoviDeCroock! - Add special copy for component renders
Additional notes
Open source →1.4.0
Minor Changes
- #380
256a331Thanks @XantreGodlike! - Adduntrackedfunction, this allows more granular control withineffect/computedaround what should affect re-runs.
Additional notes
Open source →Minor Changes
- #380
256a331Thanks @XantreGodlike! - Adduntrackedfunction, this allows more granular control withineffect/computedaround what should affect re-runs.
-
- 1.3.129 Jun 2023
Release notes
Open source →Patch Changes
-
#620
4cda002Thanks @developit! - Simplify text update patch to avoid using new internals -
#618
021c726Thanks @JoviDeCroock! - Ensure that the Effects versions are updated when using it as a JSX Signal
Additional notes
Open source →Patch Changes
- #373
8c12a0dThanks @rschristian! - Removes package.json#exports.umd, which had invalid paths if they were ever to be consumed
- #359
26f6526Thanks @andrewiggins! - Change effect callback return type fromvoidtounknown. Same for effect cleanup function.
-
- 1.3.011 Apr 2023
Release notes
Open source →Minor Changes
- #578
931404eThanks @JoviDeCroock! - Allow for passing no argument to the signal and the type to be automatically inferred asT | undefined
Patch Changes
- Updated dependencies [
931404e]:- @preact/[email protected]
Additional notes
Open source →Minor Changes
- #320
8b70764Thanks @JoviDeCroock! - SupporttoJSONon aSignal
Patch Changes
- #249
8e726edThanks @billybimbob! - Add typing for effect cleanup
- #578
- 1.2.329 Dec 2022
Additional notes
Open source → - 1.2.213 Oct 2022
- 1.2.11 Oct 2022
Release notes
Open source →Patch Changes
54094d5Thanks @JoviDeCroock! - Format react/preact components in the debug logging https://github.com/preactjs/signals/pull/844
Additional notes
Open source →1.2.1
Patch Changes
- #399
24fa9f7Thanks @rschristian! - Fixes UMD builds of@preact/signalsand@preact/signals-react
Additional notes
Open source →Patch Changes
-
#205
4b73164Thanks @jviide! - Use the same tracking logic for both effects and computeds. This ensures that effects are only called whenever any of their dependencies changes. If they all stay the same, then the effect will not be invoked. -
#207
57fd2e7Thanks @jviide! - Fix effect disposal when cleanup throws -
#209
49756aeThanks @jviide! - Optimize dependency value change checks by allowing earlier exists from the loop
Additional notes
Open source →Patch Changes
- 1.2.021 Sept 2022
Release notes
Open source →1.2.0
Minor Changes
- #387
6e4dab4Thanks @XantreGodlike! - Removed difference in behaviour between adapters, signals that use a JSX value will correctly re-render the whole component rather than attempting the JSX-Text optimization.
Additional notes
Open source →Additional notes
Open source →This release improves performance of signals across all measurements. We want to especially highlight @jviide 's work in #161 here as it did outstanding strides on reducing memory usage, improving performance and ending up making signals one (if not the) fastest reactive library at the time of this writing 🎉
Minor Changes
-
#183
79ff1e7Thanks @jviide! - Add ability to run custom cleanup logic when an effect is disposed.effect(() => { console.log("This runs whenever a dependency changes"); return () => { console.log("This runs when the effect is disposed"); }); }); -
#170
3e31aabThanks @jviide! - Allow disposing a currently running effect
Patch Changes
-
#188
b4611ccThanks @jviide! - Fix.subscribe()unexpectedly tracking signal access -
#162
9802da5Thanks @developit! - Add support forSignal.prototype.valueOf -
#161
6ac6923Thanks @jviide! - Remove all usages ofSet,Mapand other allocation heavy objects in signals-core. This substaintially increases performance across all measurements.
Additional notes
Open source →Minor Changes
-
#183
79ff1e7Thanks @jviide! - Add ability to run custom cleanup logic when an effect is disposed.effect(() => { console.log("This runs whenever a dependency changes"); return () => { console.log("This runs when the effect is disposed"); }); });
Patch Changes
- #162
9802da5Thanks @developit! - Add support forSignal.prototype.valueOf
- #387
- 1.1.115 Sept 2022
Release notes
Open source →Patch Changes
- #215
515ff33Thanks @jmeistrich ! - Fix signal not updated in React production build
Additional notes
Open source →Patch Changes
- #198
3db7500Thanks @JoviDeCroock! - Fix server-sider-render error when unmounting a signal passed as text into JSX.
Additional notes
Open source →Patch Changes
-
#143
f2ba3d6Thanks @Pauan! - Simplifybatch()to use a single flag instead of a counter -
#150
160ea77Thanks @marvinhagemeister! - Fix computed signal being re-calculated despite dependencies not having changed -
#137
4385ea8Thanks @jviide! - Fix.subscribe's TypeScript type -
#148
b948745Thanks @marvinhagemeister! - Movetypesfield inpackage.jsonto the top of the entry list to ensure that TypeScript always finds it. -
#149
00a59c6Thanks @marvinhagemeister! - Fix invalidated signals insidebatch()not being refreshed when read inside a batching operation. This fixes a regression.
Additional notes
Open source →Patch Changes
- #150
160ea77Thanks @marvinhagemeister! - Fix computed signal being re-calculated despite dependencies not having changed
- #148
b948745Thanks @marvinhagemeister! - Movetypesfield inpackage.jsonto the top of the entry list to ensure that TypeScript always finds it.
- #149
00a59c6Thanks @marvinhagemeister! - Fix invalidated signals insidebatch()not being refreshed when read inside a batching operation. This fixes a regression.
- #215
- 1.1.013 Sept 2022
Release notes
Open source →Additional notes
Open source →Minor Changes
- #91
fb74bb9Thanks @JoviDeCroock! - adduseSignalEffecthook
Additional notes
Open source →Minor Changes
- bc0080c: experimental: Add
.subscribe()-method to signals to add support for natively using signals with Svelte - #134 @marvinhagemeister
Patch Changes
- 336bb34: Don't mangle
Signalclass name - #100 @marvinhagemeister - 7228418: Fix incorrectly named variables and address typos in code comments. - #129 @elliotwaite
- 32abe07: Fix internal API functions being able to unmark non-invalidated signals - #112 @marvinhagemeister
- 4782b41: Fix conditionally signals (lazy branches) not being re-computed upon activation - #127 @marvinhagemeister
- bf6af3b: Fix a memory leak when computed signals and effects are removed - #117 @developit
Additional notes
Open source →Minor Changes
- bc0080c: Add
.subscribe()-method to signals to add support for natively using signals with Svelte
Patch Changes
- 336bb34: Don't mangle
Signalclass name - 7228418: Fix incorrectly named variables and address typos in code comments.
- 32abe07: Fix internal API functions being able to unmark non-invalidated signals
- 4782b41: Fix conditionally signals (lazy branches) not being re-computed upon activation
- bf6af3b: - Fix a memory leak when computed signals and effects are removed
- #91
- 1.0.17 Sept 2022
Release notes
Open source →Patch Changes
- #761
c7c3218Thanks @JoviDeCroock! - Fix reporting complex values to the extension
Additional notes
Open source →Patch Changes
- 62439c9: Fixes invalid React peer dependency range for environments with strict peerDeps - #105 @rschristian
Additional notes
Open source →Patch Changes
- 5644c1f: Fix stale value returned by
.peek()when called on a deactivated signal.
- #761
- 1.0.05 Sept 2022
Release notes
Open source →Minor Changes
-
#681
6cc7005Thanks @JoviDeCroock! - Initial release of@preact/signals-debug -
#727
8fe8decThanks @JoviDeCroock! - Add devtools capabilities and component tracking
Patch Changes
- Updated dependencies [
6cc7005]:- @preact/[email protected]
Additional notes
Open source →Major Changes
- 2ee8489: The v1 release for the signals package, we'd to see the uses you all come up with and are eager to see performance improvements in your applications.
Minor Changes
- ab22ec7: Add
.peek()method to read from signals without subscribing to them.
Patch Changes
- b56abf3: Throw an error when a cycle was detected during state updates
-
- 0.0.52 Sept 2022
Release notes
Open source →Patch Changes
- 702a9c5: Update TypeScript types to mark computed signals as readonly
- 0.0.424 Aug 2022
- 0.0.324 Aug 2022
Release notes
Open source →Patch Changes
- 1e4dac5: Add
prepublishOnlyscripts to ensure we're publishing fresh packages
- 1e4dac5: Add
- 0.0.224 Aug 2022
Release notes
Open source →0.0.2
Patch Changes
- #401
17e1491Thanks @andrewiggins! - Lower required babel version required as a peer dependency
- #401