I was tired of boilerplate and providers.
Like many React developers, I’ve gone through almost every popular global state library over the years…
And at some point I asked myself:
"What if I could just share state across components using a hook — no setup, no boilerplate, no ceremony?"
So I built Keact.
Keact is a key-based global state manager for React.
No Providers. No boilerplate. JustuseKeact("something").
The core idea is simple:
// In any component
import { useKeact } from '@inancakduvan/keact';
// Initialize once
const [username, setUsername] = useKeact('username', {
initialValue: 'John Doe'
});
// Read elsewhere globally by key
const [username] = useKeact('username');
// Also set elsewhere globally by key
const [username, setUsername] = useKeact('username');
setUsername('George Brown');
// End
No setup. No config. No mental gymnastics.
It works exactly like useState, but the value is globally shared by key.
Why not just use Zustand or Redux?
Good question.
They’re great tools, and I’ve used them both. But even Zustand — which is relatively minimal — still requires:
- Defining a store
- Creating functions for state updates
- Importing the store everywhere
For tiny apps, MVPs, or side projects, I often just want something stupidly simple.
- A shared value that updates everywhere
- Without writing a store or a context or importing 3 files
TypeScript support?
// store.ts
import { typeSafeKeact } from "@inancakduvan/keact";
interface KeactStore {
basket: {
id: string;
count: number;
}
}
export const useKeact = typeSafeKeact<KeactStore>();
// your-component.ts
import { useKeact } from "@/store.ts";
const [basket, setBasket] = useKeact('basket');
setBasket({
id: "12345",
count: 3
});
// End
Bonus: selector-style reading
Sometimes you just want to read a nested value:
const [itemCount] = useKeact((state) => state.cart.items.length);
This works! It's read-only, and super convenient for derived values.
How does it work under the hood?
Keact keeps a simple global object (globalStore) in memory:
When you call:
const [value, setValue] = useKeact("key", { initialValue: 123 });
It:
- Registers
"key"in the store if it doesn't exist. - When you update a key, keact notifies listeners.
- React’s useSyncExternalStore takes care of keeping your components fresh.
——-
Try it
- GitHub: https://github.com/inancakduvan/keact
- Docs & Demo: https://keact.vercel.app
- NPM:
npm i @inancakduvan/keact
What do you think?
I am not sure if that kind of library is necessary. I am not even sure about the approach. Also aware about potential structural issues in projects. But I just wanted to create a minimal version of a library in my mind. And let it go 🚌 now... I will just see what it is gonna happen. I will test it, iterate it, maybe keep it going maybe give it up. We will see...
I would love to discuss about it, please share your comments ❤️
Follow me on:
Github: https://github.com/inancakduvan/
X: https://x.com/InancAkduvan
Thank you for coming with me until end of the reading! 🙂
Top comments (0)