{"adoption": {"forks": 43, "observed_at": "2026-08-28T04:03:17.295665+00:00", "stars": 1028}, "canonical_url": "https://ross.abutalabs.com/products/mvikotlin", "card": {"archived": false, "artifact_type": "framework", "description": "Extendable MVI framework for Kotlin Multiplatform with powerful debugging tools (logging and time travel)", "domain": ["mobile-development", "frontend", "cross-platform", "developer-tools"], "enriched": true, "function": ["state-management", "logging", "developer-tools"], "health_score": 96, "homepage": "https://arkivanov.github.io/MVIKotlin", "language": "Kotlin", "license": "Apache-2.0", "license_family": "permissive", "maturity": "stable", "member_repos": ["arkivanov/MVIKotlin"], "name": "arkivanov/MVIKotlin", "platform": ["jvm", "cross-platform"], "pushed_at": "2026-08-09T00:48:24+00:00", "repo": "arkivanov/MVIKotlin", "stars": 1028, "tags": ["mvi", "kotlin-multiplatform", "unidirectional-data-flow", "time-travel-debugging", "jetpack-compose", "android", "ios"], "topics": [], "urls": [], "use_cases": ["manage app state with MVI pattern in Kotlin Multiplatform", "share business logic between Android and iOS apps", "time travel debugging for state changes", "incrementally adopt MVI in an existing app feature", "use MVI with Jetpack Compose or declarative UI frameworks", "bind lifecycle-aware inputs and outputs between UI and stores"], "what_it_is": "MVIKotlin is an extendable Kotlin Multiplatform framework implementing the Model-View-Intent (MVI) architectural pattern with unidirectional data flow. It includes powerful debugging tools such as logging and time travel, and works with any reactive framework via optional Reaktive and Coroutines extension modules.", "when_to_avoid": ["you prefer opinionated full architectures with screens and navigation built in", "your project is not on Kotlin or Kotlin Multiplatform", "you need a batteries-included framework with routing and DI"], "when_to_choose": ["building Kotlin Multiplatform apps needing shared state management", "you want MVI with unidirectional data flow and no enforced reactive library", "you need time travel or logging debug tooling for state", "you want to adopt state management incrementally in a feature"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/mvikotlin", "repo": "arkivanov/MVIKotlin", "role": "main", "score": 80}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:17.295665+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:07:43.946133+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d41e1568867974c71de798d6d4acaee0ff87e5580510c1ca2d4cda16688c5671", "fetched_at": "2026-08-28T04:03:17.295665+00:00", "kind": "readme", "missing": false, "url": "https://github.com/arkivanov/MVIKotlin"}, {"content_hash": "d1082fc1725dcc0241272ec4ee6f17498ab308670fe6cead8b12e1479a6fea93", "fetched_at": "2026-08-29T13:07:30.377025+00:00", "kind": "homepage", "missing": false, "url": "https://arkivanov.github.io/MVIKotlin"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 96, "longevity": 100, "rhythm": 49}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1727, "days_push": 25, "days_rel": 130, "gap_med": 463, "n_releases_24m": 2}, "score": 80, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}