Library / SDK
badoo/MVIKotlin avatar
badoo/MVIKotlin

MVIKotlin: unidirectional data flow for shared Kotlin Multiplatform code

Extendable MVI framework for Kotlin Multiplatform with powerful debugging tools (logging and time travel), inspired by Badoo MVICore library

829 stars58 forksKotlinApache-2.0

At a glance

What is it?
A Kotlin Multiplatform framework that keeps state in one place and ships logging and time travel tooling with it. The Badoo repository is not maintained, and the author continues the work on a fork.
Who is it for?
MVIKotlin suits a team with a shared Kotlin codebase that wants one state holder and lifecycle aware bindings without committing to a reactive library, and that values the time travel debugging tools. It does not suit a new project, because the README states this repository is not maintained and the tagged releases stop at 3.0.0-alpha02 in 2021.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 23 days ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One state holder, one direction of data flow

MVIKotlin implements the Model-View-Intent pattern for Kotlin Multiplatform, and the README explains the pattern in one sentence: data circulates between Model and View in one direction only, from Model to View and from View to Model. The framework exists so that the same shared code can hold that state on every target. What makes it interesting is what it refuses to do. The core does not depend on any reactive library and does not depend on coroutines; extensions for Reaktive and for kotlinx.coroutines are published as separate modules that you opt into. That is a deliberate reversal of the usual Kotlin Multiplatform pattern, where a reactive runtime is pulled in by the architecture layer, and it means the framework can be introduced into an existing codebase without replacing the reactive stack the team already uses.

A small scope stated explicitly in the README

The README is unusually clear about responsibility, and the scope is three items. First, a single source of truth for State, with the scope deliberately left undefined, since it can be a whole app, a screen, a feature or part of a feature. Second, an abstraction for the UI with efficient updates, marked as not obligatory, because you can use whatever you want. Third, lifecycle aware connections, called bindings, between inputs and outputs, again not obligatory. Everything else is out of scope, and the README says there are no definitions of screens, features or modules, and no particular reactive framework is enforced or exposed. The consequence for an adopter is that MVIKotlin does not dictate your architecture, it can be introduced incrementally in a small feature and expanded later, and the sample repository shows one possible arrangement rather than a template you must follow.

Eight published modules and one deprecated one

The library ships as a set of Maven Central artifacts rather than a single jar, so you take only what you need. The list in the README runs from mvikotlin, which holds the core interfaces, through mvikotlin-main with the default Store implementation, mvikotlin-logging for the logging functionality, mvikotlin-timetravel for the time travel feature, and the two extension modules for Reaktive and for coroutines. Two older entries are worth noting. The keepers module, which provided StateKeeper and InstanceKeeper for state preservation and object retention, is marked deprecated and struck through in the list. The rx module survives as a tiny abstraction layer over Rx and coroutines. The dependency is added in a standard Gradle line:

text
implementation "com.arkivanov.mvikotlin:<module-name>:<version>"

The recommended minimum Gradle version is 5.3, and the README asks you to read the Kotlin documentation on metadata publishing mode first. The repository root confirms the module layout on disk, with directories named after each artifact plus internal ones for the time travel protocol and the test helpers.

Time travel is the reason to pick this framework

Most MVI libraries are thin, and the thing that separates MVIKotlin is its debugging layer. The logging module provides a customizable logger and formatter. The time travel module records state transitions so that a session can be replayed, and it is described as multiplatform for all supported targets, with a plug-and-play user interface on Android and a similar one for iOS that is copied into the sample app. Events can be exported and imported on Android, and there is a JetBrains plugin for IntelliJ IDEA and Android Studio plus a desktop client application for Android, Java and native Apple targets including iOS, watchOS, tvOS and macOS. For a team debugging a state machine on a device, replaying a recorded session is a different experience from reading logs.

The maintained version lives in a fork, not here

The most important line in the repository is the maintenance notice near the top of the README, which states that this repository is not maintained and that Arkadii Ivanov continued the work on the fork arkivanov/MVIKotlin. The repository is not archived and the last push was on 2026-09-30, but the tagged releases tell the other half of the story: the latest is 3.0.0-alpha02 from 2021-10-19, preceded by 3.0.0-alpha01 in August 2021 and 2.0.4 in June 2021. So the codebase has been touched recently while the published version numbers have not moved in five years. The licence is Apache 2.0, which is permissive enough for commercial use in a closed source application, and the framework's inspiration is stated as the Badoo MVICore library, which also explains why this repository sits under the Badoo organisation.

Samples for Android, iOS and JavaScript

The sample project is a todo list with a details view, and it is split by the reactive stack each target uses, which makes it a practical reference rather than a toy. The shared module using Reaktive and the shared module using coroutines live in separate directories, and there are complete applications for Android with both implementations plus logging and time travel, for iOS with the Reaktive implementation only, and for JavaScript with both implementations and the debugging tools. The listed target platforms are Android, JVM, JavaScript, iosX64, iosArm64, macosX64 and linuxX64, and the framework is described as multithreading friendly, freezable in Kotlin Native where that is needed. For getting started quickly, the README also points at IDEA live templates for creating stores, and a Slack channel, #mvikotlin on the Kotlin workspace, for questions.

Editorial conclusion

MVIKotlin suits a team with a shared Kotlin codebase that wants one state holder and lifecycle aware bindings without committing to a reactive library, and that values the time travel debugging tools. It does not suit a new project, because the README states this repository is not maintained and the tagged releases stop at 3.0.0-alpha02 in 2021. Before adopting, look at the arkivanov/MVIKotlin fork the author points to, and check that your Gradle version, at least 5.3, and your targets match the listed platforms.

Frequently asked questions

Is MVIKotlin still maintained?

The README carries a maintenance notice stating that this repository is not maintained, and that Arkadii Ivanov continued the work on the fork arkivanov/MVIKotlin. The last push here was on 2026-09-30, and the latest tagged release is 3.0.0-alpha02 from 2021.

Does MVIKotlin require coroutines or a reactive library?

No. The README states that the main functionality of the framework does not depend on any reactive or coroutines library, with extensions for Reaktive and for coroutines provided as separate modules.

Which platforms does MVIKotlin support?

The README lists Android, JVM, JavaScript, iosX64, iosArm64, macosX64 and linuxX64, and the time travel feature is described as multiplatform for all supported targets.

How do I add MVIKotlin to a Gradle project?

Add the required modules with implementation "com.arkivanov.mvikotlin:<module-name>:<version>" in the module's build.gradle file. The recommended minimum Gradle version is 5.3.

What does the MVIKotlin time travel feature do?

It records state transitions so a session can be replayed, with a plug-and-play user interface for Android and iOS, event export and import on Android, a JetBrains plugin for IntelliJ IDEA and Android Studio, and a desktop client application.

Official sources

  1. badoo/MVIKotlin on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/badoo-mvikotlin.svg)](https://hysenlabs.com/projects/badoo-mvikotlin)

Was this useful?