{"id":15069234,"url":"https://github.com/badoo/mvikotlin","last_synced_at":"2025-04-13T02:16:41.340Z","repository":{"id":39912274,"uuid":"135858329","full_name":"badoo/MVIKotlin","owner":"badoo","description":"Extendable MVI framework for Kotlin Multiplatform with powerful debugging tools (logging and time travel), inspired by Badoo MVICore library","archived":false,"fork":false,"pushed_at":"2021-12-22T18:30:27.000Z","size":5022,"stargazers_count":830,"open_issues_count":10,"forks_count":63,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-04-13T02:16:34.361Z","etag":null,"topics":["android","framework","hacktoberfest","ios","jvm","kotlin","kotlin-multiplatform","multiplatform","mvi","native"],"latest_commit_sha":null,"homepage":"https://arkivanov.github.io/MVIKotlin","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/badoo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"custom":["https://www.buymeacoffee.com/arkivanov"]}},"created_at":"2018-06-02T23:07:22.000Z","updated_at":"2025-02-14T15:24:23.000Z","dependencies_parsed_at":"2022-08-09T15:36:23.359Z","dependency_job_id":null,"html_url":"https://github.com/badoo/MVIKotlin","commit_stats":null,"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badoo%2FMVIKotlin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badoo%2FMVIKotlin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badoo%2FMVIKotlin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/badoo%2FMVIKotlin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/badoo","download_url":"https://codeload.github.com/badoo/MVIKotlin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248654104,"owners_count":21140237,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","framework","hacktoberfest","ios","jvm","kotlin","kotlin-multiplatform","multiplatform","mvi","native"],"created_at":"2024-09-25T01:41:14.941Z","updated_at":"2025-04-13T02:16:41.308Z","avatar_url":"https://github.com/badoo.png","language":"Kotlin","readme":"\u003cimg src=\"https://raw.githubusercontent.com/arkivanov/MVIKotlin/master/docs/media/logo/landscape/png/mvikotlin_coloured.png\" height=\"64\"\u003e\n\n[![Maven Central](https://img.shields.io/maven-central/v/com.arkivanov.mvikotlin/mvikotlin?color=blue)](https://search.maven.org/artifact/com.arkivanov.mvikotlin/mvikotlin)\n[![License](https://img.shields.io/badge/License-Apache/2.0-blue.svg)](https://github.com/arkivanov/MVIKotlin/blob/master/LICENSE)\n[![kotlinlang|MVIKotlin](https://img.shields.io/badge/kotlinlang-mvikotlin-blue?logo=slack)](https://kotlinlang.slack.com/archives/C01403U1ZGW)\n\n## Maintenance notice\n\n**This repository is not maintained. [Arkadii Ivanov](https://github.com/arkivanov) continued to work on the fork [arkivanov/MVIKotlin](https://github.com/arkivanov/MVIKotlin).**\n\n## Inspiration\n\nThis project is inspired by [Badoo MVICore](https://github.com/badoo/MVICore) library.\n\n## Overview\n\nShould you have any questions or ideas please welcome to the Slack channel: [#mvikotlin](https://kotlinlang.slack.com/archives/C01403U1ZGW)\n\n### What is MVI\nMVI stands for Model-View-Intent. It is an architectural pattern that utilizes unidirectional data flow. The data circulates between `Model` and `View` only in one direction - from `Model` to `View` and from `View` to `Model`.\n\n\u003cimg src=\"docs/media/mvi.jpg\" alt=\"MVI\" width=\"300\"/\u003e\n\n### What is MVIKotlin\nMVIKotlin is a Kotlin Multiplatform framework that provides a way of (not only) writing\nshared code using MVI pattern. It also includes powerful debug tools like\nlogging and time travel. The main functionality of the framework does not depend on any\nreactive nor coroutines library. Extensions for [Reaktive](https://github.com/badoo/Reaktive)\nand for [Coroutines](https://github.com/Kotlin/kotlinx.coroutines) libraries are \nprovided as separate modules.  \n\n\u003cimg src=\"docs/media/mvikotlin.jpg\" alt=\"MVIKotlin\" width=\"600\"/\u003e\n\n\n#### Responsibility\nMVIKotlin does not bring or enforce any particular architecture. Its responsibility can be described as follows:\n\n- To provide a single source of truth for `State` (the scope is not defined, it can be a whole app, a screen, a feature, or a part of a feature);\n- To provide an abstraction for UI with efficient updates (however this is not obligatory, you can use whatever you want);\n- To provide lifecycle aware connections (binding) between inputs and outputs (again this is not obligatory in any way).\n\nEverything else is out of scope of the library, there are no definitions for \"screens\", \"features\", \"modules\", etc. Also, no particular reactive framework is enforced/exposed. This gives a lot of flexibility:\n\n- MVIKotlin can be introduced incrementally (e.g. you can start using it in a small feature and then expand gradually);\n- You can use/experiment with different architectures, approaches and/or libraries for navigation, UI, modularization, etc;\n- Use whatever reactive framework you like or don't use it at all.\n\nYou can find one of the architecture options in the [samples](https://github.com/arkivanov/MVIKotlin/tree/master/sample). Again, this is just an example of one possible solution.\n\n## Setup\nRecommended minimum Gradle version is 5.3. Please read first the documentation about\n[metadata publishing mode](https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#experimental-metadata-publishing-mode).\n\nThere are a number of modules published to Maven Central:\n\n- `mvikotlin` - core interfaces and functionality (multiplatform)\n- `mvikotlin-main` - the main module with the default `Store` implementation (mutiplatform)\n- `mvikotlin-logging` - logging functionality (mutiplatform)\n- `mvikotlin-timetravel` - time travel feature (mutiplatform)\n- `mvikotlin-extensions-reaktive` - extensions set for Reaktive library (multiplatform)\n- `mvikotlin-extensions-coroutines` - extensions set for coroutines (multiplatform)\n- ~~`keepers` - provides `StateKeeper` and `InstanceKeeper` API for state preservation and objects retaining~~ (deprecated)\n- `rx` - a tiny module with abstractions over rx and coroutines (multiplatform)\n\nAdd required modules to your module`s build.gradle file:\n```groovy\nimplementation \"com.arkivanov.mvikotlin:\u003cmodule-name\u003e:\u003cversion\u003e\"\n```\n\n### IDEA Live Templates\n\nTo speed up the creation of new Stores, you can use the following [IDEA Live Templates](https://gist.github.com/arkivanov/34bb84e73e56c22a4e7c752421d5f02c).\n\n## Features\n* Multiplatform: Android, JVM, JavaScript, iosX64, iosArm64, macosX64, linuxX64\n* Does not depend on any reactive library or coroutines\n* Extensions for [Reaktive](https://github.com/badoo/Reaktive) library\n* Extensions for [Coroutines](https://github.com/Kotlin/kotlinx.coroutines)\n* Multithreading friendly (freezable in Kotlin Native if needed)\n* Lifecycle-aware connections (bindins) between inputs and outputs\n* Logging functionality with customizable logger and formatter\n* Time travel feature:\n    * Multiplatform for all supported targets\n    * Plug-and-play UI for Android\n    * Plug-and-play UI for iOS (copy-paste from the sample app)\n    * Export/import events for Android\n    * IntelliJ IDEA and Android Studio [plugin](https://plugins.jetbrains.com/plugin/14241-mvikotlin-time-travel) for Android apps\n    * Desktop [client application](mvikotlin-timetravel-client/app-desktop) for Android, Java and native Apple (iOS, watchOS, tvOS, macOS) apps\n\n## Documentation\n\n[https://arkivanov.github.io/MVIKotlin](https://arkivanov.github.io/MVIKotlin)\n\n## Sample project\n\nThe sample project is a todo list with details view.\n* Shared module using Reaktive is [here](sample/todo-reaktive)\n* Shared module using coroutines is [here](sample/todo-coroutines)\n* Sample Android application with both Reaktive and coroutines implementations, plus logging and time travel is [here](sample/todo-app-android)\n* Sample iOS application with Reaktive implementation only, plus logging and time travel is [here](sample/todo-app-ios)\n* Sample JavaScript application with both Reaktive and coroutines implementations, plus logging and time travel is [here](sample/todo-app-js)\n\n## Author\n\nTwitter: [@arkann1985](https://twitter.com/arkann1985)\n\nIf you like this project you can always \u003ca href=\"https://www.buymeacoffee.com/arkivanov\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-blue.png\" alt=\"Buy Me A Coffee\" height=32\u003e\u003c/a\u003e ;-)\n\n## Watch video (time travel, logs, debug, etc.)\n\n#### Debugging Android application with MVIKotlin\n[![Debugging Android application with MVIKotlin](https://img.youtube.com/vi/_bbxR503-u0/0.jpg)](https://youtu.be/_bbxR503-u0)\n\n#### Debugging iOS application with MVIKotlin\n[![Debugging iOS application with MVIKotlin](https://img.youtube.com/vi/MJCYQzeL-w8/0.jpg)](https://youtu.be/MJCYQzeL-w8)\n\n#### Debugging Android application with IntelliJ IDEA time travel plugin\n[![Debugging Android application with IntelliJ IDEA time travel plugin](https://img.youtube.com/vi/Tr2ayOcVU34/0.jpg)](https://youtu.be/Tr2ayOcVU34)\n\n#### Debugging iOS application using MVIKotlin time travel client app\n[![Debugging iOS application using MVIKotlin time travel client app](https://img.youtube.com/vi/rj6GwA2ZQkk/0.jpg)](https://youtu.be/rj6GwA2ZQkk)\n","funding_links":["https://www.buymeacoffee.com/arkivanov"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbadoo%2Fmvikotlin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbadoo%2Fmvikotlin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbadoo%2Fmvikotlin/lists"}