GitPedia

Reworm

๐Ÿซ the simplest way to manage state

From pedronauckยทUpdated May 31, 2026ยทView on GitHubยท

Forget about actions, connections, reducers and a lot of boilerplate to create and manage states. With reworm you can create and manage state as simple as on the image above. The project is written primarily in TypeScript, distributed under the MIT License license, first published in 2018. It has gained significant community traction with 1,458 stars and 26 forks on GitHub. Key topics include: react, react-context, redux, state, state-management.

Latest release: v2.0.2
October 6, 2018View Changelog โ†’
<br /> <p align="center"> <img src="https://cdn-std.dprcdn.net/files/acc_649651/z2M2Am" width="300" /> </p> <p align="center"> <img src="https://badgen.net/npm/v/reworm" /> <img src="https://badgen.net/travis/pedronauck/reworm" /> <img src="https://badgen.net/badge/license/MIT/blue" /> </p> <p align="center"> <img src="https://cdn-std.dprcdn.net/files/acc_649651/9JemSv" width="80%"/> </p>

๐Ÿง ย  Why?

Forget about actions, connections, reducers and a lot of boilerplate to create and manage states. With reworm you can create and manage state as simple as on the image above.

Todo List Example

๐Ÿ’ป ย  Install and Usage

Install reworm using your package manager

bash
$ yarn add reworm

Then just wrap your app with our Provider, create your new state and use it!

jsx
import React from 'react' import { Provider, create } from 'reworm' const { get } = create({ name: 'John' }) const App = () => ( <Provider> <div>{get(s => s.name)}</div> </Provider> )

Change your state easily

Instead of defining actions or something else to change your state, with reworm you just need to use the set method like that:

js
import React from 'react' import { Provider, create } from 'reworm' const { set, get } = create({ name: 'John' }) class App extends React.Component { componentDidMount() { set(prev => ({ name: 'Peter' + prev.name })) } render() { return ( <Provider> <div>{get(s => s.name)}</div> </Provider> ) } }

Using selectors

Selectors are good because they prevent you from duplicating code. With it you can just create some functions and use them throughout your application.

jsx
import React from 'react' import { Provider, create } from 'reworm' const { select } = create({ list: ['Peter', 'John'] }) const johnSelector = select(state => state.list.find(user => user.includes('John')) ) const App = () => ( <Provider> <div>{johnSelector(user => user)}</div> </Provider> )

Listening state changes

If you want to listen changes on your state you can use subscribe():

jsx
import React from 'react' import { Provider, create } from 'reworm' const user = create() class App extends Component { state = { name: 'John' } componentDidMount() { user.subscribe(name => this.setState({ name })) user.set('Michael') } render() { return <div>Hello {this.state.name}</div> } }

๐Ÿ”Ž ย  API

create<T>(initial?: T): State

Create a new state

get((state: T) => React.ReactNode)

Use this method to access your state

set((state: T | (prevState: T) => T) => T)

Use this method to set your state

select<S = any>(selector: (state: T) => S) => (fn: GetFn<T>) => React.ReactNode

Create selectors that can be used with your state and avoid repeating code.

subscribe: (fn: SubscribeFn<T>) => () => void

Use this method to listen state changes

๐Ÿ“ ย  Typings

ts
type PrevState<T> = (prevState: T) => T type GetFn<T> = (state: T) => React.ReactNode type SubscribeFn<T> = (state: T) => any interface State<T> { get: (fn: GetFn<T>) => React.ReactNode set: (next: T | PrevState<T>) => void select: <S = any>( selector: (state: T) => S ) => (fn: GetFn<S>) => React.ReactNode subscribe: (fn: SubscribeFn<T>) => () => void } function create<T>(initial: T) => State<T>

๐Ÿ•บ ย  Contribute

If you want to contribute to this project, please see our Contributing Guide !

Contributors

Showing top 6 contributors by commit count.

View all contributors on GitHub โ†’

This article is auto-generated from pedronauck/reworm via the GitHub API.Last fetched: 6/21/2026