{"id":29666749,"url":"https://github.com/galex/yamvil","last_synced_at":"2026-05-18T00:08:58.640Z","repository":{"id":241051542,"uuid":"799153870","full_name":"galex/yamvil","owner":"galex","description":"Yamvil is a library and compiler plugin that helps developers build Android and Compose Multiplatform apps using the MVI Architecture.","archived":false,"fork":false,"pushed_at":"2024-05-25T06:02:46.000Z","size":309,"stargazers_count":23,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-22T15:51:41.398Z","etag":null,"topics":["android","kotlin","kotlin-multiplatform","kotlin-multiplatform-library","mvi","mvi-android","mvi-architecture"],"latest_commit_sha":null,"homepage":"https://docs.galex.dev/yamvil","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/galex.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2024-05-11T10:16:05.000Z","updated_at":"2025-04-10T07:40:55.000Z","dependencies_parsed_at":"2024-05-22T06:44:32.958Z","dependency_job_id":null,"html_url":"https://github.com/galex/yamvil","commit_stats":null,"previous_names":["galex/yamvil"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/galex/yamvil","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galex%2Fyamvil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galex%2Fyamvil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galex%2Fyamvil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galex%2Fyamvil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/galex","download_url":"https://codeload.github.com/galex/yamvil/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/galex%2Fyamvil/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33160168,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"ssl_error","status_checked_at":"2026-05-17T22:39:10.741Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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","kotlin","kotlin-multiplatform","kotlin-multiplatform-library","mvi","mvi-android","mvi-architecture"],"created_at":"2025-07-22T15:39:48.642Z","updated_at":"2026-05-18T00:08:58.625Z","avatar_url":"https://github.com/galex.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Yamvil\n\n[![Maven Central Version](https://img.shields.io/maven-central/v/dev.galex.yamvil/runtime)](https://central.sonatype.com/search?q=dev.galex.yamvil)\n[![CI](https://github.com/galex/yamvil/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/galex/yamvil/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/github/galex/yamvil/branch/main/graph/badge.svg?token=ML8EN8PYP0)](https://codecov.io/github/galex/yamvil)\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\nYamvil is a library and a compiler plugin bringing MVI Infrastructure to ViewModels, Fragments and Jetpack Compose, for Android and Compose Multiplatform apps.\n\n\u003e ⚠️ **This is a work in progress**: Yamvil is still in early development and is not ready for production use. The API is subject to change and only Android Studio Nightly shows the errors thrown by the compiler plugin.\n\n## Documentation\n\nThe full documentation of Yamvil [is available here](https://docs.galex.dev/yamvil/).\n\n## To the Point\n\nWrite MVI ViewModels like this:\n```kotlin\nclass DashboardViewModel: MVIViewModel\u003cDashboardUiState, DashboardUiEvent\u003e() {\n\n    override fun initializeUiState(): DashboardUiState {\n        return DashboardUiState(state = DashboardUiState.ContentState.Loading)\n    }\n    override fun handleEvent(event: DashboardUiEvent) {\n        when (event) {\n            is DashboardUiEvent.ClickOnNext -\u003e onClickOnNext()\n        }\n    }\n\n    private fun onClickOnNext() {\n        update { copy(action = Consumable(DashboardUiAction.NavigateToNext)) }\n    }\n}\n```\nThen use your MVI ViewModel in a Composable like this:\n```kotlin\n@Composable\nfun DashboardScreen(\n    uiState: DashboardUiState,\n    handleEvent: (DashboardUiEvent) -\u003e Unit,\n    modifier: Modifier = Modifier\n) {\n    when (uiState.state) {\n        is DashboardUiState.ContentState.Loading -\u003e DashboardLoadingContent()\n        is DashboardUiState.ContentState.Error -\u003e DashboardErrorContent()\n        is DashboardUiState.ContentState.Content -\u003e DashboardContent(uiState.state)\n    }\n\n    LaunchedActionEffect(uiState) { action: DashboardUiAction -\u003e\n        when (action) {\n            DashboardUiAction.NavigateToNext -\u003e {}\n        }\n    }\n}\n// (...)\n```\nOr if you're using Fragments, like this:\n```kotlin\nclass DashboardFragment: MVIFragment\u003cDashboardUiState, DashboardUiEvent\u003e() {\n\n    override val viewModel: DashboardViewModel by viewModels()\n    override fun observeUiState(uiState: DashboardUiState) {\n        when (uiState.state) {\n            DashboardUiState.ContentState.Loading -\u003e onLoading()\n            is DashboardUiState.ContentState.Content -\u003e onContent(uiState.state)\n            DashboardUiState.ContentState.Error -\u003e onError()\n        }\n\n        uiState.onAction { action -\u003e\n            when (action) {\n                DashboardUiAction.NavigateToNext -\u003e navigateToNext()\n            }\n        }\n    }\n    // (...)\n}\n```\n\n## Installation\n\nIn your libs.version.toml, add the following:\n\n```toml\n[versions]\nyamvil = \"0.0.2\"\n\n[libraries]\nyamvil = { group = \"dev.galex.yamvil\", name = \"runtime\", version.ref = \"yamvil\" }\n\n[plugins]\nyamvil = { id = \"dev.galex.yamvil\", version.ref = \"yamvil\" }\n```\n\nThen add those to your project:\n```kotlin\n// Root build.gradle.kts\nplugins {\n    alias(libs.plugins.yamvil) apply false\n}\n// In your app/build.gradle.kts\nplugins {\n    alias(libs.plugins.yamvil)\n}\n\ndependencies {\n    implementation(libs.yamvil)\n}\n```\n## Configuration\n\n```kotlin\nyamvil {\n    level = YamvilLevel.Error // or Warning\n    compose {\n        screenSuffix = \"Screen\"\n        uiStateParameterName = \"uiState\"\n        handleEventParameterMame = \"onEvent\"\n    }\n}\n```\n## Publishing\n\nRun `./gradlew publishToMavenLocal` to publish all the artefacts locally.\n\nRun `./gradlew publishAndReleaseToMavenCentral --no-configuration-cache` to publish all artefacts to Maven Central.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgalex%2Fyamvil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgalex%2Fyamvil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgalex%2Fyamvil/lists"}