Slank is a dead-simple reactive signal system for JavaScript — no tooling, no build steps, no opinions.
It gives you just four primitives:
explicit()– create manually updated reactive valuesimplicit()– create derived values that automatically updatefx()– create reactive effects that re-run when dependencies changetick()– schedule a function to run after the DOM is painted
⚡ Tiny. Tool-free. Trivially composable. Reactive state that stays out of your way.
npm install slankOr load it from a CDN:
import { explicit, implicit, fx, tick } from 'https://esm.sh/slank'Creates a reactive value that can be read and written.
const count = explicit(0)
count.value++ // update
console.log(count.value) // readCreates a derived value that updates automatically when dependencies change.
const double = implicit(() => count.value * 2)
console.log(double.value) // 0 → 2 → 4 as count changesRuns a function and re-runs it whenever any signals it reads change.
fx(() => {
console.log(`Count is ${count.value}, double is ${double.value}`)
})Runs a function after the DOM is painted. Useful when working with dynamically injected HTML or doing layout measurements.
tick(() => {
const height = document.querySelector('.box')?.offsetHeight
console.log('Box height:', height)
})const count = explicit(0)
const double = implicit(() => count.value * 2)
fx(() => {
document.body.textContent = `Double is: ${double.value}`
})
setInterval(() => count.value++, 1000)- Minimal: Fits in your head
- Declarative: You write what depends on what — Slank handles the rest
- Zero-config: No compiler, no JSX, no weird syntax
- Just works in vanilla JS, small projects, or anywhere else
- Quick UIs without a framework
- Micro-interactions with state
- State + derived logic in web components
- Building your own reactive framework
The core design of Slank was inspired by Joy of Code — an excellent resource for learning reactive programming concepts in JavaScript.
MIT