Less code,
more reactivity
Think VueUse, for Angular Signals
76 composables for browser APIs, DOM elements, and reactive state. SSR-ready, type-safe, tree-shakable.
import { windowSize, mediaQuery, storage } from '@signality/core';
@Component({ /* ... */ })
export class App {
// every one is a signal, cleanup is automatic
readonly size = windowSize();
readonly mobile = mediaQuery('(width <= 768px)');
readonly draft = storage('draft', {});
}Skip the boilerplate
Signality wraps imperative platform APIs into signals: listeners attach lazily, tear down with the component, and stay inert during server rendering.
readonly width = signal(window.innerWidth);
constructor() {
const update = () => {
this.width.set(window.innerWidth);
};
window.addEventListener('resize', update);
inject(DestroyRef).onDestroy(() => {
window.removeEventListener('resize', update);
});
// and this still throws during SSR
}readonly size = windowSize();
// size.width() and size.height() are signals:
// SSR-safe, torn down with the componentWhat's inside
76 utilities across 9 categories, every one documented with a usage example.
How they work
Signals in, signals out
Reactive state comes back as signals, ready to compose with computed and effect. No RxJS subscriptions to unwrap.
SSR-safe by default
Browser APIs return safe defaults on the server, then pick up real values in the browser.
Automatic cleanup
Listeners, observers, and timers are disposed with the injection context that created them.
Reactive options
Where configuration can change over time, options take a signal as readily as a plain value.
Tree-shakable
Only the utilities you import end up in your bundle.
Strictly typed
Written in strict TypeScript with full inference, from options to return values.
Built in the open
Signality follows the philosophy of VueUse, rebuilt for Angular's signal-based reactivity.