Start with a plain store. Add structure only when the app earns it.
Most state libraries pick your architecture before you know if the app needs
one: actions, reducers, selectors, a provider tree, decided on day one. Kin
Store leaves that decision to you: set and dispatch are equally first-class,
not a beginner tier and an advanced one.
| Kin Store | Zustand | Redux / RTK | Jotai | MobX | |
|---|---|---|---|---|---|
| Bundle size (React usage) | 2.0 KB | 389 B | 17.5 KB | 4.0 KB | 15.6 KB |
| Zero dependencies | ✅ | ✅ | ❌ | ✅ | ✅ |
| Tiny footprint | ✅ | ✅ | ❌ | ✅ | ❌ |
| 100% type-safe | ✅ | ✅ | ✅ | ||
| Low boilerplate | ✅ | ❌ | |||
| Linear plugin composition | ✅ | ❌ | ❌ | — | — |
| Separate state and logic | ✅ | ❌ | ✅ | — | ✅ |
| Opt-in complexity | ✅ | ✅ | ❌ | ❌ | |
| No hidden magic | ✅ | ✅ | ✅ | ✅ | ❌ |
| Reactive composition | ✅ | ❌ | ✅ | ✅ |
✅ full support ·
Bundle sizes are each library's full package import, bundled with rolldown, minified, and gzipped; tree-shaking down to only the APIs you use will land smaller across the board.
Don't believe it? See full comparison with code examples →
Kin Store is pay-per-use: import only createStore and pay 231 B. Import
withPlugins and pay 1.0 KB. The plugin bundles (persist, history, immer)
add only what you import.
| Package | Description |
|---|---|
@kintools/store-core |
createStore, withPlugins, derive — the core primitives |
@kintools/store-plugins |
persist, history, immer — official plugins |
@kintools/store-react |
useStore, useSelector — React bindings |