#state #frontend


A framework agnostic approach to managing frontend application state

9 releases

0.2.0 Jul 1, 2022
0.1.8 Apr 28, 2022
0.1.7 Sep 28, 2021
0.1.5 Aug 26, 2021
0.1.4 Jul 28, 2021

#424 in WebAssembly

Download history 6/week @ 2022-11-25 4/week @ 2022-12-02 8/week @ 2022-12-09 14/week @ 2022-12-16 10/week @ 2022-12-23 3/week @ 2022-12-30 16/week @ 2023-01-06 3/week @ 2023-01-13 11/week @ 2023-01-20 13/week @ 2023-01-27 29/week @ 2023-02-03 15/week @ 2023-02-10 53/week @ 2023-02-17 4/week @ 2023-02-24 8/week @ 2023-03-03 2/week @ 2023-03-10

69 downloads per month
Used in percy-preview-app



app-world Actions Status docs

A framework agnostic approach to managing frontend application state.

app-world is a simple thread-safe storage for application state and resources.


Highly interactive frontend applications need a way to interface with large amounts of application state.

Many frontend frameworks come with state management infrastructure that is coupled to the framework.

app-world is designed to be used in any frontend application. This makes it well suited those who want to be able to run their state related logic across multiple target platforms such as the web, mobile and desktop.

With app-world you have a single World which holds your application State, as well your application's Resources.

Resources are typically used to interface with the outside world, such as to write to a file storage or to make an API request.

You then send Messages to your world in order to update application state. This is the only way to mutate application state (with the exception of fields that have interior mutability).


app-world is designed so that at most one thread can access state at any given time.

This makes app-world unsuitable for highly stateful real-time games where you'll often want to be able to update state from many threads simultaneously.

If you're working on a game try checking out one of Rust's many entity component system crates.

Example Usage

use app_world::AppWorldWrapper;

struct MyAppWorld {
    state: MyAppState,
    resources: MyAppResources,

struct MyAppState {
    count: u32

struct MyAppResources {
    api_client: Arc<dyn SomeApiClient>

enum Msg {

type MyAppStateWrapper = AppWorldWrapper<MyAppState>;

impl AppWorld for MyAppWorld {
    // ...

fn main () {
    let world = AppWorldWrapper::new(MyAppWorld::new());



No runtime deps


  • send
  • test-utils