{"id":19811718,"url":"https://github.com/kbiakov/unidirectional-architecture-on-mobile","last_synced_at":"2025-05-01T08:33:07.963Z","repository":{"id":84494305,"uuid":"113551804","full_name":"kbiakov/unidirectional-architecture-on-mobile","owner":"kbiakov","description":"Dive into :iphone: Unidirectional Architecture!","archived":false,"fork":false,"pushed_at":"2022-01-16T05:42:04.000Z","size":60,"stargazers_count":146,"open_issues_count":0,"forks_count":17,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-06T11:51:51.169Z","etag":null,"topics":["android","android-architecture","architecture","elm-architecture","ios","ios-architecture","kotlin","model-view-intent","model-view-update","mvi","mvi-clean-architecture","redux","rxfeedback","rxjava","swift","tea","undirectional","unidirectional-data-flow","unidirectional-dataflow"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kbiakov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-08T08:38:37.000Z","updated_at":"2025-03-20T16:26:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"b7ac2ea3-6d2d-4a02-b472-1a1b62c5c1c3","html_url":"https://github.com/kbiakov/unidirectional-architecture-on-mobile","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbiakov%2Funidirectional-architecture-on-mobile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbiakov%2Funidirectional-architecture-on-mobile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbiakov%2Funidirectional-architecture-on-mobile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kbiakov%2Funidirectional-architecture-on-mobile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kbiakov","download_url":"https://codeload.github.com/kbiakov/unidirectional-architecture-on-mobile/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251847846,"owners_count":21653583,"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","android-architecture","architecture","elm-architecture","ios","ios-architecture","kotlin","model-view-intent","model-view-update","mvi","mvi-clean-architecture","redux","rxfeedback","rxjava","swift","tea","undirectional","unidirectional-data-flow","unidirectional-dataflow"],"created_at":"2024-11-12T09:27:34.485Z","updated_at":"2025-05-01T08:33:07.957Z","avatar_url":"https://github.com/kbiakov.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Unidirectional Architecture on :iphone:\n\n## Videos \u0026 books\n\n* :clapper: [Unidirectional data flow architectures](https://www.youtube.com/watch?v=1c6XiQsnh_U) and :page_facing_up: [Unidirectional User Interface Architectures](https://staltz.com/unidirectional-user-interface-architectures.html) by [Andre Staltz](https://github.com/staltz)\n* :bookmark_tabs: [Reactive apps with Model-View-Intent](http://hannesdorfmann.com/android/mosby3-mvi-1) by [Hannes Dorfmann](https://github.com/sockeqwe)\n* :clapper: [Model-View-Intent for Android](https://www.youtube.com/watch?v=PXBXcHQeDLE) _(Droidcon NYC 2017)_ and :page_facing_up: [briefly](https://proandroiddev.com/the-contract-of-the-model-view-intent-architecture-777f95706c1e) by [Benoît Quenaudon](https://github.com/oldergod)\n* :clapper: [Model View Intent, Embracing Reactive UI's](https://www.youtube.com/watch?v=8JewfcZl5TQ) _(Droidcon NYC 2017)_ by [Yousuf Haque](https://github.com/yousuf-haque)\n* :clapper: [Simple MVI Architecture for Android](https://www.youtube.com/watch?v=A2xyPZyoFUo) _(DevFestMN 2018)_ by [Etienne Caron](https://github.com/kanawish)\n* :books: [Introducing Model-View-Intent](https://commonsware.com/AndroidArch/previews/introducing-model-view-intent) (_[Android's Architecture Components](https://commonsware.com/AndroidArch) book_) by [Mark Murphy](https://github.com/commonsguy)\n* :books: [MVI-related chapters](https://store.raywenderlich.com/products/advanced-android-app-architecture) (_[Advanced Android App Architecture](https://store.raywenderlich.com/products/advanced-android-app-architecture) book_) by [raywenderlich.com](https://www.raywenderlich.com)\n* :clapper: :page_facing_up: [Driving View-State through data](https://academy.realm.io/posts/try-swift-nyc-2017-matt-gallagher-driving-view-state-through-data/) _(Realm.io)_ by [Matt Gallagher](https://github.com/mattgallagher)\n* :clapper: :page_facing_up: [Redux-ing UI bugs to Make Native Better](https://academy.realm.io/posts/kau-lee-kase-reduxing-ui-borrowing-from-web/) _(Realm.io)_ by [Christina Lee](https://github.com/christinalee) \u0026 [Brandon Kase](https://github.com/bkase)\n* :clapper: :page_facing_up: [Modern RxSwift Architectures](https://academy.realm.io/posts/try-swift-nyc-2017-krunoslav-zaher-modern-rxswift-architectures/) _(Realm.io)_ by [Krunoslav Zaher](https://github.com/kzaher)\n* :clapper: :ru: [Data-Driven View Controllers](https://www.youtube.com/watch?v=MrFuKB3HY9o) _(DevFest Minsk 2017)_, [Data-driven UI: безграничная власть](https://www.youtube.com/watch?v=tnKeUr5tRUg) _(Mobius 2018)_ by [Alexey Demedeckiy](https://github.com/AlexeyDemedetskiy)\n* :clapper: [Managing State with RxJava](https://www.youtube.com/watch?v=0IKHxjkgop4) by [Jake Wharton](https://github.com/JakeWharton)\n\n## Articles\n\n* :page_facing_up: [Unidirectional data flow on Android using Kotlin](https://proandroiddev.com/unidirectional-data-flow-on-android-the-blog-post-part-1-cadcf88c72f5) (Part [1](https://proandroiddev.com/unidirectional-data-flow-on-android-the-blog-post-part-1-cadcf88c72f5), [2](https://proandroiddev.com/unidirectional-data-flow-on-android-the-blog-post-part-2-b8cfedb1265a)) by [Cesar Valiente](https://github.com/CesarValiente)\n* :page_facing_up: [Flux Android Architecture Components using Kotlin](https://medium.com/lewisrhine/flux-android-architecture-components-using-kotlin-a1c933ebf883) by [Lewis Rhine](https://github.com/LewisRhine)\n* :page_facing_up: [Uni-Directional Architecture on Android Using Realm](https://academy.realm.io/posts/eric-maxwell-uni-directional-architecture-android-using-realm/) _(Realm.io)_ by [Eric Maxwell](https://emaxwell.info/)\n* :page_facing_up: [How to make your Views a function of State in Kotlin](https://medium.com/@liviucoman/how-to-make-your-views-a-function-of-state-in-kotlin-f95a3b130cd6)\n\n### MVI\n* :page_facing_up: [MVI — another member of the MV* band](https://proandroiddev.com/mvi-a-new-member-of-the-mv-band-6f7f0d23bc8a)\n* :page_facing_up: [From MVP to MVI — Model-View-Intent Journey](https://android.jlelse.eu/from-mvp-to-mvi-model-view-intent-journey-part-i-8542f9fe7ef7)\n* :page_facing_up: [Build Your own MVI Framework](https://medium.com/appnroll-publication/build-your-own-mvi-framework-a76d72c6e8e7)\n* :page_facing_up: [Android MVI explained in MVP terms](https://rongi.github.io/kotlin-blog/rx-presenter.html)\n* :page_facing_up: [Presenter as a Function: Reactive MVP for Android Using Kotlin Coroutines](https://rw.co/our-thinking/presenter-as-a-function-reactive-mvp-for-android-using-kotlin-coroutines/)\n* :page_facing_up: [MVI beyond state reducers](https://badootech.badoo.com/a-modern-kotlin-based-mvi-architecture-9924e08efab1)\n* :page_facing_up: [Building a system of reactive components with Kotlin](https://badootech.badoo.com/building-a-system-of-reactive-components-with-kotlin-ff56981e92cf)\n* :page_facing_up: [Android MVI with Jetpack Compose](https://medium.com/swlh/android-mvi-with-jetpack-compose-b0890f5156ac)\n* :page_facing_up: [Model-View-Intent \u0026 Data Binding](https://proandroiddev.com/model-view-intent-data-binding-39c7a6a6512f)\n* :page_facing_up: [Moving to Model-View-Intent (MVI) using ReactorKit on iOS](https://blog.getdoctalk.com/moving-to-model-view-intent-mvi-on-ios-2146e0c07d1c)\n* :page_facing_up: [Building MVI apps with Roxie](https://proandroiddev.com/unidirectional-data-flow-with-roxie-bec546c18598)\n* :page_facing_up: :ru: [MVIDroid: обзор новой библиотеки MVI (Model-View-Intent)](https://habr.com/post/417763/)\n* :bookmark_tabs: [Links related to MVI](https://github.com/CodyEngel/MVI)\n\n### Next steps\n* :page_facing_up: [RxJava \u0026 State: The Basics](https://tech.instacart.com/rxjava-state-the-basics-f842eaee7ee1)\n* :page_facing_up: [Grox: The Art of the State](https://medium.com/groupon-eng/grox-the-art-of-the-state-b5223f48d696)\n* :page_facing_up: [iOS Architecture: A State Container based approach](https://jobandtalent.engineering/ios-architecture-an-state-container-based-approach-4f1a9b00b82e)\n* :page_facing_up: [Taming state in Android with Elm Architecture and Kotlin](https://proandroiddev.com/taming-state-in-android-with-elm-architecture-and-kotlin-part-1-566caae0f706) (Part [1](https://proandroiddev.com/taming-state-in-android-with-elm-architecture-and-kotlin-part-1-566caae0f706), [2](https://proandroiddev.com/taming-state-in-android-with-elm-architecture-and-kotlin-part-2-c709f75f7596), [3](https://proandroiddev.com/taming-state-in-android-with-elm-architecture-and-kotlin-part-3-f37a7a630ec1)) by [Sergey Grekov](https://github.com/sgrekov)\n* :chart_with_upwards_trend: [Elm lifecycle diagram](https://github.com/plaxdan/elm-lifecycle)\n* :page_facing_up: [RxRedux](https://freeletics.engineering/2018/08/16/rxredux.html) by [Hannes Dorfmann](https://github.com/sockeqwe)\n* :page_facing_up: [Android.apply{ Redux }](https://blog.shazam.com/android-apply-redux-2ad0f7355e0)\n* :page_facing_up: [Reactive State Mutations via CQRS](https://arturdryomov.online/posts/reactive-state-mutations/)\n* :page_facing_up: [DiffUtil — performant one way data flow with RxJava and Kotlin](https://medium.com/@ZakTaccardi/diffutil-one-way-data-flow-with-rxjava-and-kotlin-6e17f0cdef0c)\n* :page_facing_up: [Refactoring RecyclerView adapter to data binding](https://blog.untitledkingdom.com/refactoring-recyclerview-adapter-to-data-binding-5631f239095f)\n\n## Libraries :books:\n\n#### MVI\n* :books: [Mosby](https://github.com/sockeqwe/mosby) :fire: by [Hannes Dorfmann](https://github.com/sockeqwe)\n* :books: [MVICore](https://github.com/badoo/MVICore) :fire: by [Badoo Tech](https://github.com/badoo)\n* :books: [MvRx](https://github.com/airbnb/MvRx) :fire: by [Airbnb](https://github.com/airbnb)\n* :books: [Reaktor](https://github.com/floschu/Reaktor) :fire:\n* :books: [Kaskade](https://github.com/gumil/Kaskade)\n* :books: [Vector](https://github.com/haroldadmin/Vector)\n* :books: [android-mvi](https://github.com/memtrip/android-mvi)\n* :books: [Reamp](https://github.com/eastbanctechru/Reamp)\n#### Redux\n* :books: [RxRedux](https://github.com/freeletics/RxRedux) \u0026 [CoRedux](https://github.com/freeletics/CoRedux) :fire: by [Hannes Dorfmann](https://github.com/sockeqwe)\n* :books: [KUnidirectional](https://github.com/CesarValiente/KUnidirectional) :fire: by [Cesar Valiente](https://github.com/CesarValiente)\n* :books: [Roxie](https://github.com/ww-tech/roxie) :fire:\n* :books: [Suas-Android](https://github.com/zendesk/Suas-Android) :fire:\n* :books: [redux-kotlin](https://github.com/pardom/redux-kotlin)\n* :books: [RxRedux](https://github.com/Zeyad-37/RxRedux)\n* :books: [reductor](https://github.com/Yarikx/reductor)\n* :books: [Droidux](https://github.com/izumin5210/Droidux)\n#### TEA/Elm-architecture\n* :books: [elmo](https://github.com/bobymicroby/elmo)\n* :books: [cyklic](https://github.com/bkase/cyklic)\n#### State machine\n* :books: [StateMachine](https://github.com/Tinder/StateMachine) :fire: by [Tinder](https://github.com/Tinder)\n* :books: [Workflow](https://github.com/square/workflow) :fire: by [Square](https://github.com/square)\n* :books: [RxFeedback](https://github.com/NoTests/RxFeedback.kt)\n#### State container\n* :books: [Grox](https://github.com/groupon/grox) :fire:\n* :books: [Eiffel](https://github.com/etiennelenhart/Eiffel) :fire:\n* :books: [RxPM](https://github.com/dmdevgo/RxPM)\n* :books: [Bansa](https://github.com/brianegan/bansa)\n* :books: [Reduks](https://github.com/beyondeye/Reduks)\n#### Flux\n* :books: [Reark](https://github.com/reark/reark)\n* :books: [Fluxxan](https://github.com/thedumbtechguy/Fluxxan)\n* :books: [AndroidReactor](https://github.com/floschu/AndroidReactor)\n\n### iOS\n\n#### Redux\n* :books: [ReSwift](https://github.com/ReSwift/ReSwift) :fire:\n* :books: [Katana](https://github.com/BendingSpoons/katana-swift) :fire:\n* :books: [RxAutomaton](https://github.com/inamiy/RxAutomaton)\n#### State machine\n* :books: [RxFeedback](https://github.com/NoTests/RxFeedback.swift) :fire:\n* :books: [Stateful](https://github.com/albertodebortoli/Stateful)\n#### State container\n* :books: [Dispatch](https://github.com/alexdrone/Dispatch)\n* :books: [Delta](https://github.com/thoughtbot/Delta)\n#### Flux\n* :books: [ReactorKit](https://github.com/ReactorKit/ReactorKit) :fire:\n* :books: [Reactor](https://github.com/ReactorSwift/Reactor)\n* :books: [RxState](https://github.com/RxSwiftCommunity/RxState)\n\n## Examples :file_folder:\n\n### Android\n\n#### MVI\n* :file_folder: [MVI (general)](https://github.com/kaushikgopal/movies-usf) :fire: by [Kaushik Gopal](https://github.com/kaushikgopal)\n* :file_folder: [MVI + ViewModel (AAC)](https://github.com/oldergod/android-architecture) :fire: by [Benoît Quenaudon](https://github.com/oldergod)\n* :file_folder: [MVI + Clean Architecture + AAC (boilerplate)](https://github.com/bufferapp/android-clean-architecture-mvi-boilerplate)\n* :file_folder: [MVI + Clean Architecture (TODO app, advanced)](https://github.com/iPoli/iPoli-android)\n* :file_folder: [MVI (sample app)](https://github.com/kanawish/android-mvi-sample)\n* :file_folder: [MVI + RxPresenter](https://github.com/rongi/rx-presenter-example)\n#### TEA/Elm-architecture\n* :file_folder: [Counter (simple)](https://github.com/glung/elm-architecture-android)\n* :file_folder: [TEA/Litho, 1](https://github.com/p69/Elma)\n* :file_folder: [TEA/Litho, 2](https://github.com/y2k/litho-elmish)\n* :file_folder: [TEA + ViewModel (AAC)](https://github.com/InventiDevelopment/Elmdroid)\n* :file_folder: [TEA + MVP](https://github.com/sgrekov/Android-Elm-Architecture-Sample)\n* :file_folder: [TradingApp (advanced)](https://github.com/futtetennista/TradingApp)\n#### Flux\n* :file_folder: [Firebase Chat (advanced)](https://github.com/FrangSierra/KotlinFirechat)\n\n### iOS\n\n`TODO`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkbiakov%2Funidirectional-architecture-on-mobile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkbiakov%2Funidirectional-architecture-on-mobile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkbiakov%2Funidirectional-architecture-on-mobile/lists"}