SkillAgentSearch skills...

Xstate

State machines, statecharts, and actors for complex logic

Install / Use

/learn @statelyai/Xstate

README

<p align="center"> <br /> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/statelyai/public-assets/main/logos/xstate-logo-white-nobg.svg"> <img alt="XState logotype" src="https://raw.githubusercontent.com/statelyai/public-assets/main/logos/xstate-logo-black-nobg.svg" width="200"> </picture> <br /> <strong>Actor-based state management & orchestration for complex app logic.</strong> <a href="https://stately.ai/docs">→ Documentation</a> <br /> <br /> </p>

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

Sponsors

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

<img src="https://opencollective.com/xstate/tiers/backer/badge.svg?label=sponsors&color=brightgreen" /> <a href="https://transloadit.com/?utm_source=xstate&utm_medium=referral&utm_campaign=sponsorship&utm_content=github"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://assets.transloadit.com/assets/images/sponsorships/logo-dark.svg"> <source media="(prefers-color-scheme: light)" srcset="https://assets.transloadit.com/assets/images/sponsorships/logo-default.svg"> <img src="https://assets.transloadit.com/assets/images/sponsorships/logo-default.svg" alt="Transloadit Logo"> </picture> </a>

Templates

Get started by forking one of these templates on CodeSandbox:

<table> <thead> <tr><th>Template</th><th></th></tr> </thead> <tbody> <tr> <td>

🤖 XState Template (CodeSandbox)

Open in StackBlitz

</td> <td>
  • XState v5
  • TypeScript
  • No framework
</td> </tr> <tr> <td>

⚛️ XState + React Template (CodeSandbox)

Open in StackBlitz

</td> <td>
  • React
  • XState v5
  • TypeScript
</td> </tr> <tr> <td>

💚 XState + Vue Template (CodeSandbox)

Open in StackBlitz

</td> <td>
  • Vue
  • XState v5
  • TypeScript
</td> </tr> <tr> <td>

🧡 XState + Svelte Template (CodeSandbox)

Open in StackBlitz

</td> <td> </td> </tr> </tbody> </table>

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 }

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
<a href="stately.ai/registry/new?ref=github" title="Stately Studio"> <img src="https://github.com/statelyai/xstate/assets/1093738/74ed9cbc-b824-4ed7-a16d-f104947af8a7" alt="XState Viz" width="800" /> </a>

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/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 | | 🏪 @xstate/store | Small library for simple state management |

Finite State Machines

<table> <thead><tr><th>Code</th><th>Statechart</th></tr></thead> <tbody> <tr> <td>
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'
</td> <td> <a href="https://stately.ai/registry/editor/fa443471-b416-4014-8e6f-12417863e4d4?mode=design&machineId=27e86036-f2f7-40f1-9d1e-66ce6e1accc0" title="Finite states"> <img src="https://github.com/statelyai/xstate/assets/1093738/36d4b6b5-e3d0-4c19-9f41-2e3425ceac88" alt="Finite states" width="400" /> <br /> Open in Stately Studio </a> <br /> </td> </tbody> </table>

Hierarchical (Nested) State Machines

<table> <thead><tr><th>Code</th><th>Statechart</th></tr></thead> <tbody> <tr> <td>
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 a
View on GitHub
GitHub Stars29.4k
CategoryDevelopment
Updated3h ago
Forks1.4k

Languages

TypeScript

Security Score

100/100

Audited on Apr 1, 2026

No findings