You know that feeling when you write Vue code? Everything just clicks. computed values update automatically, watch lets you react to changes elegantly, and ref.value gives you a consistent way to access everything.
Then you switch to React and... where did all that magic go?
ZenBox = Code in React like Vue π + Manage state like Zustand π»
- πͺ Powerful - All of Zustand's benefits + more
 - β‘οΈ Easy to Use - Where Vue's simplicity meets React's power
 - π¦ Lightweight - 100 lines of core code, no bloat, just the good stuff
 
// Types are automatically inferred from initial state
const userStore = createStore({
  name: "Del Wang",
  posts: ["Hello World!"],
});
// Computed values that just work
const greeting = useComputed(() => `Hey ${userStore.value.name}!`);
// Watch changes like Vue
useWatch(
  () => userStore.value.posts.length,
  (count) => console.log(`${count} posts now`)
);If you squint, this could be Vue code. But it's React, and it works exactly like you'd expect.
This is ZenBox - where Zustand's simplicity meets Vue's joyful developer experience.
π Visit https://zenbox.del.wang to view the full documentation.
npm install zenbox- π Documentation: zenbox.del.wang
 - π Issues: GitHub Issues
 - π¬ Discussions: GitHub Discussions
 
| Feature | ZenBox | Zustand | 
|---|---|---|
| Learning Curve | β As easy as Vue | β Low | 
| Vue-like Hooks | β
 useComputed / useWatch | 
β Not supported | 
| TypeScript | β Auto-inference | |
| Cross-Store | β Auto tracking | β Not supported | 
| State Access | β
 Unified store.value | 
get() / set() | 
| Scoping | β Built-in Provider | β Global by default | 
| Immer | β Built-in | |
| Bundle Size | < 3KB gzipped (without Immer) | < 1KB gzipped | 
MIT License Β© 2025-PRESENT Del Wang
