Awesome Open Source
Awesome Open Source


Build Status Download Android Arsenal codecov Codacy Badge

State Container for Kotlin and Android.

The name comes from cascade, a waterfall, which reflects the objective of the library to make flows easier with unidirectional data flow.

Inspired by MVI or Model View Intent.


Why Kaskade?

  • Lightweight - enforces unidirectional data flow without the use of external dependencies.
  • Modular - can be easily substituted to different implementation with or without the use of another library.
  • Extendable - in relation to modular and lightweight, it's important to extend the API and create user defined implementation to fit specific requirements.
  • Unidirectional - data flows in one direction.
  • Predictable - control on state changes and action triggers.
  • DSL - able to hide complexity in a fluent way.
  • Multiplatform - built for JVM, iOS, and Javascript.


  1. Add to settings.gradle
  1. Add the dependency
dependencies {
  // core module
  implementation 'dev.gumil.kaskade:core:0.x.y'
  // coroutines module
  implementation 'dev.gumil.kaskade:coroutines:0.x.y'
  // rx module
  implementation 'dev.gumil.kaskade:rx:0.x.y'
  // livedata module
  implementation 'dev.gumil.kaskade:livedata:0.x.y'

(Please replace x and y with the latest version numbers: Download )


Create the Action and State objects.

Note: objects are only used here for simplicity in real projects data classes are more appropriate

internal sealed class TestState : State {
    object State1 : TestState()
    object State2 : TestState()
    object State3 : TestState()

internal sealed class TestAction : Action {
    object Action1 : TestAction()
    object Action2 : TestAction()
    object Action3 : TestAction()

Create Kaskade with TestState.State1 as initial state

val kaskade = Kaskade.create<TestAction, TestState>(TestState.State1) {
    on<TestAction.Action1> {

    on<TestAction.Action2> {

    on<TestAction.Action3> {

Adding actions to Action with parameter ActionState

on<TestAction.Action1> { actionState ->
    // do any side effects when returning a new state

Observing states

kaskade.onStateChanged = {
    // Do something with new state

Observing states with Emitter

kaskade.stateEmitter().subscribe {
    // Do something with new state

Executing actions



Check out the wiki for documentation.

Some of the topics covered are:

Sample projects

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Kotlin (58,704
Android (40,520
Coroutines (1,324
Flow (1,089
State (821
Machine (580
Multi Platform (530
Mvi (155
Related Projects