MCPcopy
hub / github.com/statelyai/xstate

github.com/statelyai/xstate @xstate@5.32.3 sqlite

repository ↗ · DeepWiki ↗ · release xstate@5.32.3 ↗ · compare 2 versions
1,137 symbols 4,307 edges 431 files 27 documented · 2%
README
<img alt="XState logotype" src="https://raw.githubusercontent.com/statelyai/public-assets/main/logos/xstate-logo-black-nobg.svg" width="200">






<strong>Actor-based state management & orchestration for complex app logic.</strong> <a href="https://stately.ai/docs">→ Documentation</a>

XState is a state management and orchestration solution for JavaScript and TypeScript apps. It has zero dependencies, and is useful for frontend and backend application logic.

It uses event-driven programming, state machines, statecharts, and the actor model to handle complex logic in predictable, robust, and visual ways. XState provides a powerful and flexible way to manage application and workflow state by allowing developers to model logic as actors and state machines.

✨ Create state machines visually in Stately Studio → state.new


📖 Read the documentation

➡️ Create state machines with the Stately Editor

🖥 Download our VS Code extension

📑 Inspired by the SCXML specification

💬 Chat on the Stately Discord Community

✍️ Browse through the many XState examples

Which package should I use?

Pick based on what you need:

  • @xstate/store: simple event-based state management. <1kb, great TypeScript inference, similar in spirit to Redux/Zustand. Start here if you just need a store.
  • xstate: state machines, statecharts, actors, effects, and orchestration for complex app logic.

They work great together, but you don't need one to use the other.

Sponsors

Special thanks to the sponsors who support this open-source project:

Templates

Get started by forking one of these templates on CodeSandbox:

Template
[🤖 XState Template (CodeSandbox)](https://codesandbox.io/p/devbox/github/statelyai/xstate/tree/main/templates/vanilla-ts) [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/statelyai/xstate/tree/main/templates/vanilla-ts?file=%2Fsrc%2FfeedbackMachine.ts) - XState v5 - TypeScript - _No framework_
[⚛️ XState + React Template (CodeSandbox)](https://codesandbox.io/p/devbox/github/statelyai/xstate/tree/main/templates/react-ts) [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/statelyai/xstate/tree/main/templates/react-ts?file=%2Fsrc%2FfeedbackMachine.ts) - [React](https://react.dev/) - XState v5 - TypeScript
[💚 XState + Vue Template (CodeSandbox)](https://codesandbox.io/p/devbox/github/statelyai/xstate/tree/main/templates/vue-ts) [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/statelyai/xstate/tree/main/templates/vue-ts?file=%2Fsrc%2FfeedbackMachine.ts) - [Vue](https://vuejs.org/) - XState v5 - TypeScript
[🧡 XState + Svelte Template (CodeSandbox)](https://codesandbox.io/p/devbox/github/statelyai/xstate/tree/main/templates/svelte-ts) [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/statelyai/xstate/tree/main/templates/svelte-ts?file=%2Fsrc%2FfeedbackMachine.ts) - [Svelte](https://svelte.dev/) - XState v5 - TypeScript

Super quick start

npm install xstate
import { createMachine, createActor, assign } from 'xstate';

// State machine
const toggleMachine = createMachine({
  id: 'toggle',
  initial: 'inactive',
  context: {
    count: 0
  },
  states: {
    inactive: {
      on: {
        TOGGLE: { target: 'active' }
      }
    },
    active: {
      entry: assign({ count: ({ context }) => context.count + 1 }),
      on: {
        TOGGLE: { target: 'inactive' }
      }
    }
  }
});

// Actor (instance of the machine logic, like a store)
const toggleActor = createActor(toggleMachine);
toggleActor.subscribe((state) => console.log(state.value, state.context));
toggleActor.start();
// => logs 'inactive', { count: 0 }

toggleActor.send({ type: 'TOGGLE' });
// => logs 'active', { count: 1 }

toggleActor.send({ type: 'TOGGLE' });
// => logs 'inactive', { count: 1 }

@xstate/store: simple state management

Not every app needs all the features of state machines and statecharts. @xstate/store is a separate, extremely small event-based store with first-class TypeScript inference; similar to Redux or Zustand, but with less boilerplate.

Use it on its own, or graduate to full XState machines when your logic gets more complex.

npm install @xstate/store
import { createStore } from '@xstate/store';

const donutStore = createStore({
  context: {
    donuts: 0,
    favoriteFlavor: 'chocolate'
  },
  on: {
    addDonut: (context) => ({ ...context, donuts: context.donuts + 1 }),
    changeFlavor: (context, event: { flavor: string }) => ({
      ...context,
      favoriteFlavor: event.flavor
    }),
    eatAllDonuts: (context) => ({ ...context, donuts: 0 })
  }
});

donutStore.subscribe((snapshot) => {
  console.log(snapshot.context);
});

donutStore.send({ type: 'addDonut' });
// => { donuts: 1, favoriteFlavor: 'chocolate' }

donutStore.send({ type: 'changeFlavor', flavor: 'strawberry' });
// => { donuts: 1, favoriteFlavor: 'strawberry' }

📖 See the @xstate/store README for React/Solid bindings, selectors, and more.


Stately Studio

  • Visually create, edit, and collaborate on state machines
  • Export to many formats, including XState v5
  • Test path & documentation autogeneration
  • Deploy to Stately Sky
  • Generate & modify machines with Stately AI

XState Viz

state.new

Why?

Statecharts are a formalism for modeling stateful, reactive systems. This is useful for declaratively describing the behavior of your application, from the individual components to the overall application logic.

Read 📽 the slides (🎥 video) or check out these resources for learning about the importance of finite state machines and statecharts in user interfaces:

Packages

Package Description
🤖 xstate Core finite state machine and statecharts library + interpreter, including graph traversal and model-based testing utilities
🏪 @xstate/store Simple event-based state management (<1kb) — standalone, works with or without xstate
⚛️ @xstate/react React hooks and utilities for using XState in React applications
💚 @xstate/vue Vue composition functions and utilities for using XState in Vue applications
🎷 @xstate/svelte Svelte utilities for using XState in Svelte applications
🥏 @xstate/solid Solid hooks and utilities for using XState in Solid applications
🔍 @statelyai/inspect Inspection utilities for XState

Finite State Machines

CodeStatechart
import { createMachine, createActor } from 'xstate';

const lightMachine = createMachine({
  id: 'light',
  initial: 'green',
  states: {
    green: {
      on: {
        TIMER: 'yellow'
      }
    },
    yellow: {
      on: {
        TIMER: 'red'
      }
    },
    red: {
      on: {
        TIMER: 'green'
      }
    }
  }
});

const actor = createActor(lightMachine);

actor.subscribe((state) => {
  console.log(state.value);
});

actor.start();
// logs 'green'

actor.send({ type: 'TIMER' });
// logs 'yellow'
Finite states Open in Stately Studio

Hierarchical (Nested) State Machines

CodeStatechart
import { createMachine, createActor } from 'xstate';

const pedestrianStates = {
  initial: 'walk',
  states: {
    walk: {
      on: {
        PED_TIMER: 'wait'
      }
    },
    wait: {
      on: {
        PED_TIMER: 'stop'
      }
    },
    stop: {}
  }
};

const lightMachine = createMachine({
  id: 'light',
  initial: 'green',
  states: {
    green: {
      on: {
        TIMER: 'yellow'
      }
    },
    yellow: {
      on: {
        TIMER: 'red'
      }
    },
    red: {
      on: {
        TIMER: 'green'
      },
      ...pedestrianStates
    }
  }
});

const actor = createActor(lightMachine);

actor.subscribe((state) => {
  console.log(state.value);
});

actor.start();
// logs 'green'

actor.send({ type: 'TIMER' });
// logs 'yellow'

actor.send({ type: 'TIMER' });
// logs { red: 'walk' }

actor.send({ type: 'PED_TIMER' });
// logs { red: 'wait' }
Hierarchical states Open in Stately Studio

Parallel State Machines

CodeStatechart
import { createMachine, createActor } from 'xstate';

const wordMachine = createMachine({
  id: 'word',
  type: 'parallel',
  states: {
    bold: {
      initial: 'off',
      states: {
        on: {
          on: { TOGGLE_BOLD: 'off' }
        },
        off: {
          on: { TOGGLE_BOLD: 'on' }
        }
      }
    },
    underline: {
      initial: 'off',
      states: {
        on: {
          on: { TOGGLE_UNDERLINE: 'off' }
        },
        off: {
          on: { TOGGLE_UNDERLINE: 'on' }
        }
      }
    },
    italics: {
      initial: 'off',
      states: {
        on: {
          on: { TOGGLE_ITALICS: 'off' }
        },
        off: {
          on: { TOGGLE_ITALICS: 'on' }
        }
      }
    },
    list: {
      initial: 'none',
      states: {
        none: {
          on: {
            BULLETS: 'bullets',
            NUMBERS: 'numbers'
          }
        },
        bullets: {
          on: {
            NONE: 'none',
            NUMBERS: 'numbers'
          }
        },
        numbers: {
          on: {
            BULLETS: 'bullets',
            NONE: 'none'
          }
        }
      }
    }
  }
});

const actor = createActor(wordMachine);

actor.subscribe((state) => {
  console.log(state.value);
});

actor.start();
// logs {
//   bold: 'off',
//   italics: 'off',
//   underline: 'off',
//   list: 'none'
// }

actor.send({ type: 'TOGGLE_BOLD' });
// logs {
//   bold: 'on',
//   italics: 'off',
//   underline: 'off',
//   list: 'none'
// }

actor.send({ type: 'TOGGLE_ITALICS' });
// logs {
//   bold: 'on',
//   italics: 'on',
//   underline: 'off',
//   list: 'none'
// }

Extension points exported contracts — how you extend this code

BroadcastStorageOptions (Interface)
Options for `createBroadcastStorage(...)`.
packages/xstate-store/src/persist.ts
Clock (Interface)
(no doc) [1 implementers]
packages/core/src/system.ts
YesNoContext (Interface)
(no doc)
packages/xstate-react/test/types.test.tsx
InspectorOptions (Interface)
(no doc)
packages/xstate-inspect/src/types.ts
MachineContext (Interface)
(no doc)
packages/xstate-solid/test/useActor.test.tsx
MyContext (Interface)
(no doc)
packages/xstate-immer/test/immer.test.ts
Bid (Interface)
(no doc)
examples/workflow-car-auction-bids/main.ts
Process (Interface)
(no doc)
examples/todomvc-react/src/react-app-env.d.ts

Core symbols most depended-on inside this repo

createMachine
called by 1472
packages/core/src/createMachine.ts
createActor
called by 1058
packages/core/src/createActor.ts
start
called by 943
packages/core/src/SimulatedClock.ts
send
called by 874
packages/core/src/createActor.ts
getSnapshot
called by 777
packages/core/src/createActor.ts
assign
called by 390
packages/core/src/actions/assign.ts
fn
called by 284
packages/xstate-store/src/alien.ts
get
called by 264
packages/xstate-store/src/atom.ts

Shape

Function 730
Interface 229
Method 137
Class 38
Enum 3

Languages

TypeScript100%

Modules by API surface

packages/core/src/stateUtils.ts59 symbols
packages/core/src/types.ts55 symbols
packages/xstate-store/src/alien.ts41 symbols
packages/xstate-store/src/persist.ts36 symbols
packages/xstate-store/src/store.ts33 symbols
packages/core/src/createActor.ts26 symbols
packages/xstate-store/src/atom.ts25 symbols
packages/xstate-store/src/types.ts22 symbols
packages/core/src/graph/TestModel.ts21 symbols
packages/core/src/StateMachine.ts20 symbols
packages/core/src/utils.ts17 symbols
packages/xstate-store/src/validate.ts16 symbols

Dependencies from manifests, versioned

@analogjs/vite-plugin-angular1.21.2 · 1×
@angular/build19.0.0 · 1×
@angular/common19.0.0 · 1×
@angular/compiler19.0.0 · 1×
@angular/compiler-cli19.0.0 · 1×
@angular/core19.0.0 · 1×
@angular/platform-browser19.0.0 · 1×
@angular/platform-browser-dynamic19.0.0 · 1×
@babel/core7.23.3 · 1×
@babel/plugin-proposal-class-properties7.18.6 · 1×
@babel/preset-env7.23.3 · 1×
@babel/preset-react7.23.3 · 1×

Datastores touched

(mongodb)Database · 1 repos
creditCheckDatabase · 1 repos

For agents

$ claude mcp add xstate \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact