{"adoption": {"forks": 87, "observed_at": "2026-08-28T04:04:25.544981+00:00", "stars": 1336}, "canonical_url": "https://ross.abutalabs.com/products/orbit-mvi", "card": {"archived": false, "artifact_type": "framework", "description": "A simple MVI framework for Kotlin Multiplatform and Android", "domain": ["mobile-development", "frontend", "cross-platform", "developer-tools"], "enriched": true, "function": ["state-management", "web-framework", "testing"], "health_score": 98, "homepage": "https://orbit-mvi.org", "language": "Kotlin", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["orbit-mvi/orbit-mvi"], "name": "orbit-mvi/orbit-mvi", "platform": ["jvm", "cross-platform"], "pushed_at": "2026-08-08T06:50:51+00:00", "repo": "orbit-mvi/orbit-mvi", "stars": 1336, "tags": ["mvi", "kotlin-multiplatform", "coroutines", "jetpack-compose", "redux", "unidirectional-data-flow", "viewmodel", "android", "ios", "desktop"], "topics": ["mvi", "mvi-android", "mvi-coroutines-flow-kotlin", "mvi-coroutines-flow", "hacktoberfest"], "urls": [], "use_cases": ["manage app state with MVI architecture in Kotlin", "share ViewModel business logic between Android and iOS", "implement unidirectional data flow with coroutines and flows", "integrate state management with Jetpack Compose and Compose Multiplatform", "unit test state and side effect flows in ViewModels", "prevent memory leaks when collecting infinite flows", "save and restore UI state across platforms"], "what_it_is": "Orbit is a simple, type-safe MVI framework for Kotlin Multiplatform that implements Redux-inspired unidirectional data flow for shared business logic across Android, iOS and desktop. It provides lifecycle-safe flows, a multiplatform ViewModel with SavedState support, Compose Multiplatform integration, and testing utilities.", "when_to_avoid": ["your project is not on Kotlin/JVM or Kotlin Multiplatform", "you prefer other architecture patterns like MVP or plain MVVM without MVI", "you need a framework with a much larger ecosystem or community than MVI-specific libraries"], "when_to_choose": ["you build Kotlin Multiplatform or Android apps and want a lightweight, type-safe MVI pattern", "you want Redux-style unidirectional data flow integrated with ViewModel and Compose", "you need lifecycle-safe flow collection and state persistence out of the box"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/orbit-mvi", "repo": "orbit-mvi/orbit-mvi", "role": "main", "score": 85}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "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:04:25.544981+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:25.544981+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:44:16.278091+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9e2657e810af773b5810673852bc5d0c92a1d85322e37c566d259020e4ea02b8", "fetched_at": "2026-08-28T04:04:25.544981+00:00", "kind": "readme", "missing": false, "url": "https://github.com/orbit-mvi/orbit-mvi"}, {"content_hash": "3ff44f9148bc9f1b02d5f380f34cc4ecde6a72fee89142569529a0161d78a07c", "fetched_at": "2026-08-29T12:03:29.204221+00:00", "kind": "homepage", "missing": false, "url": "https://orbit-mvi.org"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 96, "longevity": 100, "rhythm": 61}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2080, "days_push": 25, "days_rel": 51, "gap_med": 208.0, "n_releases_24m": 3}, "score": 85, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}