Apache Stateful Functions is one of the quietly powerful frameworks in the Flink ecosystem - durable per-key state, exactly-once messaging, polyglot remote functions, all on top of Apache Flink. It's also been functionally dormant since October 2024 , and it doesn't run on Flink 2.x. We needed it on Flink 2.x. So we maintained the continuation: kzmlabs/flink-statefun . This post is the why and the how it's different . If you're already running upstream and wondering whether to migrate, or you're picking a stateful-actor framework today and trying to understand the landscape, read on. What StateFun gives you If you've never touched Stateful Functions, here's the elevator version. Compare a hand-written keyed Flink job: public final class CounterFunction extends KeyedProcessFunction < String , Event , Result > { private static final long serialVersionUID = 1L ; private static final ValueStateDescriptor < Long > COUNT_DESCRIPTOR = new ValueStateDescriptor <>( "count" , Types .…