{"id":17238383,"url":"https://github.com/hoc081098/solivagant","last_synced_at":"2025-04-13T21:41:05.907Z","repository":{"id":220064903,"uuid":"736617487","full_name":"hoc081098/solivagant","owner":"hoc081098","description":"🔆 Compose Multiplatform Navigation library -  🌸 Pragmatic, type safety navigation for Compose Multiplatform. Based on Freeletics Khonshu Navigation. ♥️ ViewModel, SavedStateHandle, Lifecycle, Multi-Backstacks, Transitions, Back-press handling, and more...","archived":false,"fork":false,"pushed_at":"2025-04-09T15:37:00.000Z","size":4205,"stargazers_count":99,"open_issues_count":8,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-09T16:23:43.500Z","etag":null,"topics":["compose-library","compose-multiplatform","compose-multiplatform-desktop","compose-multiplatform-library","compose-multiplatform-navigation","compose-navigation","jetbrains-compose","kmm","kmm-library","kmm-mvvm","kmm-navigation","kmp-compose-navigation","kmp-library","kmp-mvvm","kmp-navigation","kmp-viewmodel","multiplatform-navigation"],"latest_commit_sha":null,"homepage":"https://hoc081098.github.io/solivagant/docs/0.x","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/hoc081098.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["hoc081098"],"custom":["https://www.buymeacoffee.com/hoc081098"]}},"created_at":"2023-12-28T11:48:05.000Z","updated_at":"2025-04-09T15:04:48.000Z","dependencies_parsed_at":"2024-04-20T20:31:55.724Z","dependency_job_id":"8c3d9afa-874b-4ec2-adf6-0ef0dd076bac","html_url":"https://github.com/hoc081098/solivagant","commit_stats":null,"previous_names":["hoc081098/solivagant"],"tags_count":7,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoc081098%2Fsolivagant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoc081098%2Fsolivagant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoc081098%2Fsolivagant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoc081098%2Fsolivagant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hoc081098","download_url":"https://codeload.github.com/hoc081098/solivagant/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248788859,"owners_count":21161726,"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":["compose-library","compose-multiplatform","compose-multiplatform-desktop","compose-multiplatform-library","compose-multiplatform-navigation","compose-navigation","jetbrains-compose","kmm","kmm-library","kmm-mvvm","kmm-navigation","kmp-compose-navigation","kmp-library","kmp-mvvm","kmp-navigation","kmp-viewmodel","multiplatform-navigation"],"created_at":"2024-10-15T05:45:28.818Z","updated_at":"2025-04-13T21:41:05.850Z","avatar_url":"https://github.com/hoc081098.png","language":"Kotlin","funding_links":["https://github.com/sponsors/hoc081098","https://www.buymeacoffee.com/hoc081098"],"categories":[],"sub_categories":[],"readme":"# solivagant 🔆\n\n## [🟢 ACTIVE] 🔆 Compose Multiplatform Navigation library - 🌸 Pragmatic, type safety navigation for Compose Multiplatform. Based on [Freeletics Khonshu Navigation](https://freeletics.github.io/khonshu/navigation/get-started/). ♥️ ViewModel, SavedStateHandle, Lifecycle, Multi-Backstacks, Transitions, Back-press handling, and more...\n\n[![maven-central](https://img.shields.io/maven-central/v/io.github.hoc081098/solivagant-navigation)](https://search.maven.org/search?q=g:io.github.hoc081098%20solivagant-navigation)\n[\u003cimg src=\"https://img.shields.io/nexus/snapshots/https/s01.oss.sonatype.org/io.github.hoc081098/solivagant-navigation.svg?label=latest%20snapshot\"/\u003e](https://s01.oss.sonatype.org/content/repositories/snapshots/io/github/hoc081098/solivagant-navigation)\n[![codecov](https://codecov.io/gh/hoc081098/solivagant/branch/master/graph/badge.svg?token=jBFg12osvP)](https://codecov.io/gh/hoc081098/solivagant)\n[![Build and publish snapshot](https://github.com/hoc081098/solivagant/actions/workflows/build.yml/badge.svg)](https://github.com/hoc081098/solivagant/actions/workflows/build.yml)\n[![Build sample](https://github.com/hoc081098/solivagant/actions/workflows/sample.yml/badge.svg)](https://github.com/hoc081098/solivagant/actions/workflows/sample.yml)\n[![Publish Release](https://github.com/hoc081098/solivagant/actions/workflows/publish-release.yml/badge.svg)](https://github.com/hoc081098/solivagant/actions/workflows/publish-release.yml)\n[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0)\n[![Kotlin version](https://img.shields.io/badge/Kotlin-2.0.0-blueviolet?logo=kotlin\u0026logoColor=white)](https://github.com/JetBrains/kotlin/releases/tag/v2.0.0)\n[![KotlinX Coroutines version](https://img.shields.io/badge/Kotlinx_Coroutines-1.9.0_RC-blueviolet?logo=kotlin\u0026logoColor=white)](https://github.com/Kotlin/kotlinx.coroutines/releases/tag/1.9.0-RC)\n[![Compose Multiplatform version](https://img.shields.io/badge/Compose_Multiplatform-1.6.11-blueviolet?logo=kotlin\u0026logoColor=white)](https://github.com/JetBrains/compose-multiplatform/releases/tag/v1.6.11)\n[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fhoc081098%2Fsolivagant\u0026count_bg=%2379C83D\u0026title_bg=%23555555\u0026icon=\u0026icon_color=%23E7E7E7\u0026title=hits\u0026edge_flat=false)](https://hits.seeyoufarm.com)\n\n![badge][badge-android]\n![badge][badge-jvm]\n![badge][badge-js]\n![badge][badge-js-ir]\n![badge][badge-wasm]\n![badge][badge-nodejs]\n![badge][badge-linux]\n![badge][badge-windows]\n![badge][badge-ios]\n![badge][badge-mac]\n![badge][badge-watchos]\n![badge][badge-tvos]\n![badge][badge-apple-silicon]\n\n- Integrates with `Jetbrains Compose Multiplatform` seamlessly and easily.\n\n- Integrates with [**kmp-viewmodel**](https://github.com/hoc081098/kmp-viewmodel) library seamlessly and smoothly\n  - Stack entry scoped `ViewModel`, exists as long as the\n    stack entry is on the navigation stack, including the configuration changes on `Android`.\n\n  - Supports `SavedStateHandle`, used to save and restore data over configuration changes\n    or process death on `Android`.\n\n- The **navigation stack state** is saved and restored automatically over configuration changes and process\n  death on `Android`.\n  On other platforms, you can use a support class provided by this library to store the navigation stack state\n  as long as you want.\n\n- **Type safety navigation**, easy to pass data between destinations.\n  No more `String` route and dynamic query parameters.\n  The `Solivagant` library uses `NavRoute`s and `NavRoot`s to define routes that can be navigated to.\n  Arguments can be defined as part of the route (a.ka. properties of the route class) and are type safe.\n  Each `NavRoute` and `NavRoot` has a corresponding `NavDestination` that describes the UI (a.k.a `@Composable`) of the\n  route.\n\n- Supports **Multi-Backstacks**, this is most commonly used in apps that use bottom navigation to\n  separate the back stack of each tab.\n  See [Freeletics Khonshu Navigation - Multiple back stacks](https://freeletics.github.io/khonshu/navigation/back-stacks/)\n  for more details.\n\n- Supports `LifecycleOwner`, `Lifecycle` events and states, similar to `AndroidX Lifecycle` library.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://github.com/hoc081098/solivagant/raw/master/logo.png\" width=\"400\"\u003e\n\u003c/p\u003e\n\n\u003e [!NOTE]\n\u003e This library is still in alpha, so the API may change in the future.\n\n## Credits\n\n- Most of the code in `solivagant-khonshu-navigation-core` and `solivagant-navigation` libraries is\n  taken from [Freeletics Khonshu Navigation](https://freeletics.github.io/khonshu/navigation/get-started/),\n  and ported to `Kotlin Multiplatform` and `Compose Multiplatform`.\n\n- The `solivagant-lifecycle` library is inspired\n  by [Essenty Lifecycle](https://github.com/arkivanov/Essenty?tab=readme-ov-file#lifecycle),\n  and [AndroidX Lifecycle](https://developer.android.com/jetpack/androidx/releases/lifecycle).\n\n## Author: [Petrus Nguyễn Thái Học](https://github.com/hoc081098)\n\nLiked some of my work? Buy me a coffee (or more likely a beer)\n\n\u003ca href=\"https://www.buymeacoffee.com/hoc081098\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-blue.png\" alt=\"Buy Me A Coffee\" height=64\u003e\u003c/a\u003e\n\n## Docs \u0026 Installation\n\n### **0.x release** docs: https://hoc081098.github.io/solivagant/docs/0.x\n\n### Snapshot docs: https://hoc081098.github.io/solivagant/docs/latest\n\n### Installation\n\n```kotlin\nallprojects {\n  repositories {\n    [...]\n    mavenCentral()\n  }\n}\n```\n\n```kotlin\nimplementation(\"io.github.hoc081098:solivagant-navigation:0.5.0\")\n```\n\n### Snapshot\n\n\u003cdetails\u003e\n  \u003csummary\u003eSnapshots of the development version are available in Sonatype's snapshots repository.\u003c/summary\u003e\n\n```kotlin\nallprojects {\n  repositories {\n    ...\n    maven(url = \"https://s01.oss.sonatype.org/content/repositories/snapshots/\")\n  }\n}\n\ndependencies {\n  implementation(\"io.github.hoc081098:solivagant-navigation:0.5.1-SNAPSHOT\")\n}\n```\n\n\u003c/details\u003e\n\n## Getting started\n\nThe library is ported from `Freeletics Khonshu Navigation` library, so the concepts is similar.\nYou can read the [Freeletics Khonshu Navigation](https://freeletics.github.io/khonshu/navigation/get-started/) to\nunderstand\nthe concepts.\n\n👉 Full samples are available [here](#Samples).\n\n### 1. Create `NavRoot`s, `NavRoute`s\n\n```kotlin\n@Immutable\n@Parcelize\ndata object StartScreenRoute : NavRoot\n\n@Immutable\n@Parcelize\ndata object SearchProductScreenRoute : NavRoute\n```\n\n\u003e [!NOTE]\n\u003e `@Parcelize` is provided by `kmp-viewmodel-savedstate` library.\n\u003e See [kmp-viewmodel-savedstate](https://github.com/hoc081098/kmp-viewmodel?tab=readme-ov-file#2-kmp-viewmodel-savedstate-library) for more details.\n\n### 2. Create `NavDestination`s along with `Composable`s and `ViewModel`s\n\n###### StartScreen.kt\n\n```kotlin\n\n@JvmField\nval StartScreenDestination: NavDestination =\n  ScreenDestination\u003cStartScreenRoute\u003e { StartScreen() }\n\n@Composable\ninternal fun StartScreen(\n  modifier: Modifier = Modifier,\n  // kmpViewModel or kojectKmpViewModel can be used instead.\n  viewModel: StartViewModel = koinKmpViewModel(),\n) {\n  // UI Composable\n}\n\ninternal class StartViewModel(\n  // used to trigger navigation actions from outside the view layer (e.g. from a ViewModel).\n  // Usually, it is singleton object, or the host Activity retained scope.\n  private val navigator: NavEventNavigator,\n) : ViewModel() {\n  internal fun navigateToProductsScreen() = navigator.navigateTo(ProductsScreenRoute)\n  internal fun navigateToSearchProductScreen() = navigator.navigateTo(SearchProductScreenRoute)\n}\n```\n\n###### SearchProductScreen.kt\n\n```kotlin\n@JvmField\nval SearchProductScreenDestination: NavDestination =\n  ScreenDestination\u003cSearchProductScreenRoute\u003e { SearchProductsScreen() }\n\n@Composable\ninternal fun SearchProductsScreen(\n  modifier: Modifier = Modifier,\n  // kmpViewModel or kojectKmpViewModel can be used instead.\n  viewModel: SearchProductsViewModel = koinKmpViewModel\u003cSearchProductsViewModel\u003e(),\n) {\n  // UI Composable\n}\n\ninternal class SearchProductsViewModel(\n  private val searchProducts: SearchProducts,\n  private val savedStateHandle: SavedStateHandle,\n  // used to trigger navigation actions from outside the view layer (e.g. from a ViewModel).\n  // Usually, it is singleton object, or the host Activity retained scope.\n  private val navigator: NavEventNavigator,\n) : ViewModel() {\n  fun navigateToProductDetail(id: Int) {\n    navigator.navigateTo(ProductDetailScreenRoute(id))\n  }\n}\n```\n\n### 3. Setup\n\n#### 3.1. NavHost\n\nGather all `NavDestination`s in a set and use `NavEventNavigator` to trigger navigation actions.\n\n###### MyAwesomeApp.kt\n\n```kotlin\n@Stable\nprivate val AllDestinations: ImmutableSet\u003cNavDestination\u003e = persistentSetOf(\n  StartScreenDestination,\n  SearchProductScreenDestination,\n  // and more ...\n)\n\n@Composable\nfun MyAwesomeApp(\n  // used to trigger navigation actions from outside the view layer (e.g. from a ViewModel).\n  // Usually, it is singleton object, or the host Activity retained scope.\n  navigator: NavEventNavigator = koinInject(),\n  modifier: Modifier = Modifier,\n) {\n  // BaseRoute is the parent interface of NavRoute and NavRoot.\n  // It implements Parcelable so that it can be used with rememberSavable.\n  var currentRoute: BaseRoute? by rememberSavable { mutableStateOf(null) }\n\n  NavHost(\n    modifier = modifier,\n    // route to the screen that should be shown initially\n    startRoute = StartScreenRoute,\n    // should contain all destinations that can be navigated to\n    destinations = AllDestinations,\n    // when passing a NavEventNavigator to NavHost, NavHost will take care of setting up the navigator by calling `NavigationSetup(navigator)`\n    navEventNavigator = navigator,\n    destinationChangedCallback = { currentRoute = it },\n  )\n}\n```\n\n\u003e [!IMPORTANT]\n\u003e When passing a `NavEventNavigator` to `NavHost` composable, the NavHost will take care of setting up the navigator by calling `NavigationSetup(navigator)`.\n\u003e\n\u003e If you don't pass a \"global\" `NavEventNavigator` to `NavHost` composable, make sure there are property calls to `NavigationSetup(navigator)`.\n\u003e For example, we can call `NavigationSetup(navigator)` in each destination composable.\n\u003e\n\u003e ```kotlin\n\u003e @JvmField\n\u003e val StartScreenDestination: NavDestination = ScreenDestination\u003cStartScreenRoute\u003e {\n\u003e   NavigationSetup(navigator = koinInject())\n\u003e   StartScreen()\n\u003e }\n\u003e\n\u003e @JvmField\n\u003e val SearchProductScreenDestination: NavDestination = ScreenDestination\u003cSearchProductScreenRoute\u003e {\n\u003e   NavigationSetup(navigator = koinInject())\n\u003e   SearchProductsScreen()\n\u003e }\n\u003e ```\n\u003e\n\u003e 👉 Check out [scoped navigator sample](https://github.com/hoc081098/solivagant/blob/88e75468659fa3185edc47ef6b043ca86aaeee16/samples/simple/shared/src/commonMain/kotlin/com/hoc081098/solivagant/sample/simple/ui/detail/DetailNavigator.kt#L17C7-L17C22) for more information.\n\n#### 3.2. Android\n\nTo display `MyAwesomeApp` on `Android`, use `setContent` in `Activity` / `Fragment`.\n\n###### MainActivity.kt\n\n```kotlin\nclass MainActivity : ComponentActivity() {\n  override fun onCreate(savedInstanceState: Bundle) {\n    super.onCreate()\n\n    // navigator can be retrieved from the DI container, such as Koin, Dagger Hilt, etc...\n    setContent {\n      MyAwesomeApp()\n    }\n  }\n}\n```\n\n#### 3.3. Desktop\n\nTo display `MyAwesomeApp` on `Desktop`, use `androidx.compose.ui.window.application` and `Window` composable:\n\n###### main.kt\n\n```kotlin\nfun main() {\n  val lifecycleRegistry = LifecycleRegistry()\n  val savedStateSupport = SavedStateSupport()\n\n  application {\n    val windowState = rememberWindowState()\n    val lifecycleOwner = rememberLifecycleOwner(lifecycleRegistry)\n    LifecycleControllerEffect(\n      lifecycleRegistry = lifecycleRegistry,\n      windowState = windowState,\n    )\n\n    savedStateSupport.ClearOnDispose()\n\n    Window(\n      onCloseRequest = ::exitApplication,\n      title = \"Solivagant sample\",\n      state = windowState,\n    ) {\n      LifecycleOwnerProvider(lifecycleOwner) {\n        // navigator can be retrieved from the DI container, such as Koin, Koject, etc...\n        savedStateSupport.ProvideCompositionLocals { MyAwesomeApp() }\n      }\n    }\n  }\n}\n```\n\n\u003e [!TIP]\n\u003e For more information please check out [Desktop sample main.kt](https://github.com/hoc081098/solivagant/blob/2eb1ef4beee875d63aaa882f7198cc738638ad75/samples/sample/desktop/src/commonMain/kotlin/com/hoc081098/solivagant/sample/main.kt#L18-L49)\n\n#### 3.4. iOS / tvOS / watchOS\n\nTo display `MyAwesomeApp` on `iOS/tvOS/watchOS`, use `ComposeUIViewController` (Kotlin - iosMain SourceSet) and `UIViewControllerRepresentable` (Swift - native code):\n\n###### MainViewController.kt\n\n```kotlin\nval AppLifecycleOwner by lazy { AppLifecycleOwner() }\n\nfun MainViewController(savedStateSupport: SavedStateSupport): UIViewController {\n  val lifecycleOwnerUIVcDelegate =\n    LifecycleOwnerComposeUIViewControllerDelegate(hostLifecycleOwner = AppLifecycleOwner)\n      .apply { bindTo(savedStateSupport) }\n      .apply { lifecycle.subscribe(LifecycleObserver) }\n\n  return ComposeUIViewController(\n    configure = { delegate = lifecycleOwnerUIVcDelegate },\n  ) {\n    LifecycleOwnerProvider(lifecycleOwnerUIVcDelegate) {\n      savedStateSupport.ProvideCompositionLocals { MyAwesomeApp() }\n    }\n  }\n}\n```\n\n###### ComposeView.swift\n\n```swift\nprivate struct ComposeView: UIViewControllerRepresentable {\n  let savedStateSupport: NavigationSavedStateSupport\n\n  func makeUIViewController(context: Context) -\u003e UIViewController {\n    MainViewControllerKt.MainViewController(savedStateSupport: savedStateSupport)\n  }\n\n  func updateUIViewController(_ uiViewController: UIViewController, context: Context) { }\n}\n\nprivate class ComposeViewViewModel: ObservableObject {\n  let savedStateSupport = NavigationSavedStateSupport()\n  deinit {\n    self.savedStateSupport.clear()\n  }\n}\n\nstruct ComposeViewContainer: View {\n  @StateObject private var viewModel = ComposeViewViewModel()\n\n  var body: some View {\n    ComposeView(savedStateSupport: viewModel.savedStateSupport)\n      .ignoresSafeArea(.keyboard) // Compose has own keyboard handler\n  }\n}\n```\n\n\u003e [!TIP]\n\u003e For more information please check out [iOS sample MainViewController.kt](https://github.com/hoc081098/solivagant/blob/master/samples/sample/shared/src/iosMain/kotlin/com/hoc081098/solivagant/sample/MainViewController.kt)\n\u003e and [iosApp sample ComposeView.swift](https://github.com/hoc081098/solivagant/blob/master/samples/sample/iosApp/iosApp/ComposeView.swift)\n\n### 4. Use `NavEventNavigator` in `ViewModel` s / `@Composable` s to trigger navigation actions\n\n```kotlin\n// navigate to the destination that the given route leads to\nnavigator.navigateTo(DetailScreenRoute(\"some-id\"))\n// navigate up in the hierarchy\nnavigator.navigateUp()\n// navigate to the previous destination in the backstack\nnavigator.navigateBack()\n// navigate back to the destination belonging to the referenced route and remove all destinations\n// in between from the back stack, depending on inclusive the destination\nnavigator.navigateBackTo\u003cMainScreenRoute\u003e(inclusive = false)\n```\n\n## Samples\n\n- [Complete sample - Products app](https://github.com/hoc081098/solivagant/tree/master/samples/sample): a complete sample\n  that demonstrates how to use `solivagant-navigation` in `Compose Multiplatform (Android, Desktop, iOS)`\n  - `solivagant-navigation` for navigation in Compose Multiplatform.\n  - `kmp-viewmodel` to share `ViewModel` and `SavedStateHandle`.\n  - `Koin DI`.\n\n  ###### Desktop\n\n  https://github.com/user-attachments/assets/8b2d806f-3650-47ed-96a2-d9bc72342d25\n\n- [Simple sample - Multibackstacks sample](https://github.com/hoc081098/solivagant/tree/master/samples/simple): a simple sample\n  that demonstrates how to use `solivagant-navigation` in `Compose Multiplatform (Android, Desktop, iOS)` to\n  switch between tabs (bottom navigation), but can keep the back stack state of each tab.\n  Basically, it's a **multi-backstack** demo sample.\n\n    ###### Desktop\n  \n    https://github.com/user-attachments/assets/300d7153-ccc0-49b3-a272-ff4f22f66e03\n\n- [Compose Multiplatform KmpViewModel KMM Unsplash Sample](https://github.com/hoc081098/Compose-Multiplatform-KmpViewModel-KMM-Unsplash-Sample): A KMP template of the Unsplash App using Compose multiplatform for Android, Desktop, iOS. Share everything including data, domain, presentation, and UI.\n\n- [Compose Multiplatform Todo solivagant Sample](https://github.com/hoc081098/Compose-Multiplatform-Todo-solivagant-Sample): A KMP template of the Todo App using Compose multiplatform for Android, Desktop, iOS and Web. Share everything including data, domain, presentation, and UI.\n\n- [Solivagant Wasm Sample](https://github.com/hoc081098/solivagant/tree/master/samples/solivagant-wasm-sample).\n\n- [Kotlin Multiplatform app template with shared UI, using solivagant-navigation](https://github.com/hoc081098/KMP-App-Template-solivagant).\n\n## Roadmap\n\n- [ ] Add more tests\n- [x] Add more samples\n- [ ] Add docs\n- [x] Review supported targets\n- [ ] Polish and improve the implementation and the public API\n- [x] Support transition when navigating (since [0.1.0](https://github.com/hoc081098/solivagant/releases/tag/0.1.0)).\n- [x] Support more targets such as wasm, watchOS, tvOS, etc... (since [0.2.0](https://github.com/hoc081098/solivagant/releases/tag/0.2.0)).\n\n## 🟢 Active status\n\nThis library is actively maintained and updated with new features and bug fixes.\n\n## License\n\n```license\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n```\n\n[badge-android]: http://img.shields.io/badge/-android-6EDB8D.svg?style=flat\n\n[badge-android-native]: http://img.shields.io/badge/support-[AndroidNative]-6EDB8D.svg?style=flat\n\n[badge-wearos]: http://img.shields.io/badge/-wearos-8ECDA0.svg?style=flat\n\n[badge-jvm]: http://img.shields.io/badge/-jvm-DB413D.svg?style=flat\n\n[badge-js]: http://img.shields.io/badge/-js-F8DB5D.svg?style=flat\n\n[badge-js-ir]: https://img.shields.io/badge/support-[IR]-AAC4E0.svg?style=flat\n\n[badge-nodejs]: https://img.shields.io/badge/-nodejs-68a063.svg?style=flat\n\n[badge-linux]: http://img.shields.io/badge/-linux-2D3F6C.svg?style=flat\n\n[badge-windows]: http://img.shields.io/badge/-windows-4D76CD.svg?style=flat\n\n[badge-wasm]: https://img.shields.io/badge/-wasm-624FE8.svg?style=flat\n\n[badge-apple-silicon]: http://img.shields.io/badge/support-[AppleSilicon]-43BBFF.svg?style=flat\n\n[badge-ios]: http://img.shields.io/badge/-ios-CDCDCD.svg?style=flat\n\n[badge-mac]: http://img.shields.io/badge/-macos-111111.svg?style=flat\n\n[badge-watchos]: http://img.shields.io/badge/-watchos-C0C0C0.svg?style=flat\n\n[badge-tvos]: http://img.shields.io/badge/-tvos-808080.svg?style=flat\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoc081098%2Fsolivagant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhoc081098%2Fsolivagant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoc081098%2Fsolivagant/lists"}