Statecharts: hierarchical state machines

(statecharts.dev)

126 points | by sph 4 hours ago

13 comments

  • davidkpiano 2 hours ago
    Glad to see statecharts still getting attention!

    I created XState, a JS/TS library for authoring, executing, and visualizing state machines/statecharts: https://github.com/statelyai/xstate

    I've been working on it for 10+ years. The main thing I've learned is that statecharts are most valuable when they're treated as executable behavior, not just documentation.

    That doesn't mean you need to use them everywhere or model everything with them. They're most useful when you have behavior where the answer to "what happens next?" depends on both the current state & the event. A statechart can act as an oracle for questions like: "Given I'm in this state, when this event happens, what is the next state, and what effects should run?"

    I'm close to releasing an alpha of the next major version of XState, focused on better ergonomics, type safety, and composability, as well as a new visualizer/editor.

    There's also an open-source basic statechart visualizer here: https://sketch.stately.ai

    For the formal/spec side, SCXML is worth reading: https://www.w3.org/TR/scxml

    Also worth reading the original paper by David Harel: https://www.weizmann.ac.il/math/harel/sites/math.harel/files...

    • kayo_20211030 1 hour ago
      For the clojure folks there's https://github.com/fulcrologic/statecharts which a pretty sophisticated implementation that removes the XML requirement (particularly for executable content), yet remaining close to SCXML. XState even gets a reference in the prior art section.
    • chrisweekly 10 minutes ago
      XState is an awesome library! Stoked to hear there's a new major version and visualizer coming. :)
    • egeozcan 1 hour ago
      I had used (and would gladly still use) XState, without even knowing about what "statecharts" even means.

      I used it with lit.js to help with a drawer-like navigation component that reacts to page width and has many props and internal states. I can't even think how horrible it'd have been without XState. Thank you very much!

  • embedding-shape 2 hours ago
    2 hours and not a single comment yet?! At one point, Statecharts seemed to be getting traction in the frontend/UI ecosystem, albeit tiny traction. Leveraging state machines (and particular Statecharts, which is basically compositions of state machines) for UI interactions makes complex flows so much easier to reason about! However, seems the traction eventually disappeared for unknown reasons, sadly.

    If this is the first time you're hearing about Statecharts, I highly recommend the book "Constructing the user interface with statecharts" by Ian Horrucks (https://archive.org/details/isbn_9780201342789/mode/2up) which yes, is from 1999, but probably the best introduction for how to actually apply and use Statecharts.

    • davidkpiano 2 hours ago
      Statecharts are still getting some traction! XState has over 4 million weekly npm downloads. Animation tools like Rive & LottieFiles heavily advertise state machine capabilities. AI tools like LangGraph are built on state machine foundations.

      It'll take some time for those apps/tools to realize the full potential of statecharts, but it's a good start.

      • embedding-shape 1 hour ago
        No doubt state machines are as popular as they've always been :) I was talking about statecharts specifically, not just state machines in general.
    • sph 2 hours ago
      > Statecharts seemed to be getting traction in the frontend/UI ecosystem

      Yes, I stumbled upon statecharts checking out this Godot plugin: https://github.com/derkork/godot-statecharts

      • brandensilva 2 hours ago
        I've been wanting to code up an AI flavor wrapper around state machines that will be visible as an AI generated image in PRs.

        I often have my AI code output one just to make sure my logic feels more sound. Along with mermaid charts if I need to toy around or drop into stately for more power.

        • ZihangZ 1 hour ago
          Small caution from using agents here: the useful chart is the one generated from code, tests, or traces, not the one the model draws from its own explanation.

          I've had models produce very reasonable Mermaid diagrams that matched the intended design but not the actual program. It felt helpful until I realized I was reviewing the plan twice and the implementation zero times.

          For PRs I'd rather render the diagram from the executable state machine itself — at least then drift in the chart means drift in behavior, and you can't review one without the other.

  • hasyimibhar 2 hours ago
    I wonder if it's possible to combine statecharts with durable execution engines like Temporal, DBOS, Restate, etc. At work we use Cloudflare Workflows for managing onboarding and payment workflows. It generates flowchart diagram that is useful for quickly reasoning about what the workflow does, which I guess is what statecharts is trying to achieve.
    • apsurd 16 minutes ago
      When you say "it generates flowchart diagrams…" what exactly is generating them? Is it built into cloudflare workers or is it something your team created?
  • MeteorMarc 2 hours ago
    The title contains hierarchical, which does not come back in the post. You probably need hierarchy, otherwise state charts become unweildingly large.
    • embedding-shape 11 minutes ago
      A statechart without hierarchy is just a state machine. It's the composition and hierarchy that turns a state machine into a statechart.
  • dflock 47 minutes ago
    I've tried to use state charts for frontend development a couple of times, but bounced off. IIRC, I was using xstate with vue, and I found that they were hard to retrofit to existing systems, and where I tried, I found that the boundary between the part of the system controlled by xstate and the rest of the system problematic. It felt like it would work better with everything "inside" the statechart, but that's a big lift for an existing codebase.
  • rleigh 1 hour ago
    Let me just throw in:

    ETL State Chart and Hierarchial FSM https://www.etlcpp.com/state_chart.html and https://www.etlcpp.com/hfsm.html

    Quantum Leaps https://www.state-machine.com

    I've used them primarily in safety-critical systems where complexity, timing and the ability to effectively verify behaviour is obviously important. Being able to separate the decision-making from the actions is a great aid. Having to strip back the decision making to "what do I do next" when I'm in this state and this event occurs is a bit different to how most programs are structured, but really does aid separation and makes it easy to reason about behaviour under different conditions.

  • ciarcode 1 hour ago
    Well, this is used in the automotive domain for long time now. Look at matlab/simulink: you can draw your algorithm as a state machine and generate the code out of it. Recently I implemented a state machine to manage a quite complex react component, who moves from one visual state to another through some css transitions. It’s not a difficult state machine, but I think people are not so well versed in it.
    • renticulous 56 minutes ago
      I assume game engines might already have this or sophisticated version of this already implemented.
      • fmbb 41 minutes ago
        Sure. State machines are often useful.

        A general framework is I think more rarely useful.

        Unreal Engine is a popular game engine and it seems to contain dozens of different state machine frameworks.

  • brandensilva 2 hours ago
    I've always been a fan of state machines and have hoped for their adoption to grow.

    Having visual understanding of state is becoming increasingly important for AI generated code you don't nearly understand as well as the human variety.

    It seems many still favor store based reactivity state in frontend frameworks.

    I contribute to it being the default so why change and because libraries like xstate are far more difficult to learn the syntax and are more verbose. But with AI that's hardly an issue, so I wonder if there is more to it I don't see and we just haven't seen the state chart reach it's peak yet.

    • davidkpiano 2 hours ago
      The next version of XState will be much more ergonomic, with a reduced API surface area, lower learning curve, and much easier for devs (and agents) to author.

      But at the same time, frontier models are very good at writing XState.

  • sghiassy 2 hours ago
    One of my favorite data structures

    Created StateKit for ObjC/Swift some time ago, it’s been production tested in some very large apps: https://github.com/sghiassy/StateKit

    Such a cool data structure

  • atoav 16 minutes ago
    I have used nested state machines for a while now and they are really good if you have realtime needs, e.g. controlling motors, animations, audio/video playbsck and so on.

    The statemachine itself also forces you to think about which transitions between which states are possible and whst you may need to consider when such a state change happens.

  • pbw 1 hour ago
    I’m going to give this URL to Claude, ask it to propose uses of state charts in my codebase. Yes, it already has this in its training data, but I find giving it a URL brings it to top of mind.
  • cubefox 1 hour ago
    Hierarchical state charts have been formalized as a type of UML diagram. Details:

    https://en.wikipedia.org/wiki/UML_state_machine

    • embedding-shape 9 minutes ago
      I think it's either "hierarchical state machines" or just "statecharts", otherwise it's a bit like saying ATM machine or CC card.
  • empiricus 2 hours ago
    "No statechart will survive contact with real world applications". I mean, when you have external dependencies, multilayer protocols, multithreading, perf requirements, the state will becomes an ugly mess. One can only dream of a clean statechart.
    • hogehoge51 1 hour ago
      Hierarchical state machines are common in hardware development. I've also used them for embedded systems, and dug my way out of spaghetti nightmares in distributed systems by reworking a system into a set of state machines.

      Is it clean? Not always, it gets messy. On the other hand it is deterministic and traceable to specifications. Specifications as state machines can be easier understood and shared than raw code or raw prose.

      I also think more effort is needed to synthesize a clean set of state machines with hierarchy for a system at scale and I'm sure there are times when that effort is not warranted.

    • sghiassy 56 minutes ago
      I’ve used state charts in multi-billion legacy apps and they’ve stayed quite clean.

      Just don’t use one state chart for everything. Just like any data structure, use multiple of them scoped appropriately