KaMP Kit by Touchlab is a collection of code and tools designed to get your mobile team started quickly with Kotlin Multiplatform.

Last update: Aug 16, 2022

KaMPKit Shared KaMPKit Android KaMPKit iOS

KaMP Kit

KaMP Kit Image

Welcome to the KaMP Kit!

About

Goal

The goal of the KaMP Kit is to facilitate your evaluation of Kotlin Multiplatform (aka KMP). It is a collection of code and tools designed to get you started quickly.

The KMP ecosystem has generated a lot of excitement, and has evolved very rapidly. As a result, there's a lot of old or conflicting documentation, blog posts, tutorials, etc. We, Touchlab, have worked with several teams looking at KMM and KMP, and have found that the primary stumbling block is simply getting started.

The KaMP Kit is designed to get you past that primary stumbling block. You should be able to set up your development environment, clone the repo, and have a running sample app very quickly. From there, you can focus on what you want to build.

Very Important Message!!!

This kit exists because the info you may find from Google about KMM and KMP is likely to be outdated or conflicting with the config here. It is highly recommended that you reach out directly if you run into issues.

Audience

We (Touchlab) are focused primarily on using KMP for native mobile development (now called KMM). As a result, this kit is primarily targeted at native mobile developers (Android or iOS), as well as engineering managers for native mobile teams. You should have little-to-no experience with KMP, although some of the information after setup may be useful if you do have KMP experience.

What's Included?

  1. The Starter App - A native mobile KMP app with a small functional feature set.
  2. Educational Resources - Introductory information on KMP and Kotlin/Native.
  3. Integration Information - If you're integrating shared code into an existing application, guides to assist with that effort.

What's Not Included?

Comprehensive guides, advanced tutorials, or generally support for fixing anything not included in the starter app. The goal is to have a solid starting point from which you can create something meaningful for evaluating KMP. We're intentionally limiting the scope to keep focus.

Getting Help

KaMP Kit support can be found in the Kotlin Community slack. Look for the kampkit-support channel.

To join the Kotlin Community slack, request access here

For direct assistance, please reach out to Touchlab to discuss support options.

The Starter App

The central part of the "Kit" is the starter app. It includes a set of libraries that we use in our apps that provide for much of the architectural needs of a native mobile application. We've also included a simple set of features you can use as a reference when adding your features.

1) Dev Environment and Build Setup

You will need the following:

  • JVM 8
  • Android SDK and the latest stable Android Studio(4.1.3) or IntelliJ(2021.1+)
  • Intellij Kotlin plugin with 1.4.3x support (should be included in the latest Android Studio or IDEA)
  • Mac with Xcode 12+ for the iOS build

For a more detailed guide targetted at iOS developers, see DETAILED_DEV_SETUP.

2) Clone and Build

See APP_BUILD for detailed build instructions. By the end of that doc you should be able to build and run both Android and iOS apps.


Sanity Check

At this point, you should be able to build Android and iOS apps. If you cannot build, you need to get help. This sample app is configured to run out of the box, so if it's not working, you have something wrong with your build setup or config. Please reach out to us so we can improve either the config or troubleshooting docs, and/or the Kotlin Slack group mentioned above.


3) Walk Through App

Take a walk through the app's code and libraries. Make changes, recompile. See how it works.

GENERAL_ARCHITECTURE

4) Background Education

If the app is building, it's a good time to take a break and get some background information.

KMP Intro

It's important to understand not just how to set up the platform, but to get a better perspective on what the tech can do and why we think it'll be very successful. KMP is distinct from other code sharing and "cross platform" systems, and understanding those distinctions is useful.

Longer intro to KaMP Kit - Original version of this doc's intro. Cut because it was pretty long.

Intro to Kotlin Multiplatform - General intro to KMP from Oredev in Nov 2019. Good overall summary of the platform.

Kotlin/Native Concurrency

Kotlin/Native's state and concurrency model is different than the JVM (which includes Android). The goal is "Saner Concurrency" In practice, if you're not writing custom concurrency logic, it's pretty simple, but only if you understand it. You must learn the basics.

Practical Kotlin Native Concurrency - Our recent blog post series. This was written for KaMP KIt, but we published these separately because this is very important for developers to understand.

Kotlinconf 2019: Kotlin Native Concurrency Explained - Deeper dive talk from Kotlinconf.

We cannot stress this enough. If you're going to build anything significant, you need at least a basic understanding of the concurrency model.

We should also point out, the version of coroutines we're using in native is still a preview release. We discuss that in the docs linked above, and more detail in GENERAL_ARCHITECTURE.

"Selling" KMP

KaMPKit can help you demonstrate to management and other stakeholders of the value of sharing code with KMP. Check out these resources for more advice on pitching KMP to your team: Building a Business Case for KMP 7 ways to convince your engineering manager to pilot Kotlin Multiplatform

Xcode Debugging

For information on how to debug kotlin in Xcode, check out the Debugging Kotlin In Xcode doc.

5) Integrating 'shared' With Existing Apps

As part of your evaluation, you'll need to decide if you're going to integrate KMP into existing apps. Some teams feel integrating with their production apps is a better demonstration of KMP's viability. While KMP's interop is great, relative to other technologies, integrating anything into a production app build process can be a difficult task. Once integrated, development is generally smooth, but modifying production build systems can be a time consuming task.

Android

The Android side is somewhat more straightforward. Kotlin is the preffered language for Android, and the library can be integrated as just another module library. We'll be updating soon with a general Android integration doc. In the meantime, the simplest method would be to copy the shared module into your standard Android build, and use the app module as a reference for dependency resolution.

iOS

The iOS integration process is relatively new and has been iterating fast. Be prepared to spend more time with config related issues when integrating with a production build.

You can integrate with Cocoapods, or by directly including the Xcode framework. If you are an Android developer without extensive iOS build experience, be aware that this is a risky option. Production build systems, for any ecosystem, tend to be complex. You'll almost certainly need to recruit somebody with experience maintaining your iOS build.

See IOS_PROJ_INTEGRATION.md for iOS integration information.

If you are attempting to integrate your KMP project with a production iOS application, please let us know what issues you run into and reach out with questions if stuck. This is an ongoing area of improvement for the KMP platform and we'd like to help make this as smooth as possible.


Troubleshooting

TROUBLESHOOTING - We'll be growing this file over time, with your help. Please make sure to document any issues you run into and let us know.

More To Come!

KaMP Kit is just the beginning. Our hope is that after KaMP Kit you’ll have a better sense of what a possible KMP implementation might look like.

Primary Maintainer

Brady Aiello

Ping me on twitter @AielloBrady if you don't get a timely reply! -Brady


About Touchlab

Touchlab is a mobile-focused development agency based in NYC. We have been working on Android since the beginning, and have worked on a wide range of mobile and hardware projects for the past decade. Over the past few years, we have invested significantly on R&D for code sharing technologies. We believe strongly in KMP's future and are making the Kotlin platform the focus of our business.

About The Kit

We talked to a few teams early on who got to do a "hack week" with KMP. A common story was, if they didn't abandon the project altogether, they didn't have anything running till the week was half over. Even then, picking libraries and architecture ate the rest of the time. Inevitably the result was, "KMP isn't ready". We know that once you're past the setup phase, KMP is really amazing tech. This Kit exists so you're evaluating KMP on Monday afternoon, not Thursday.

What We Can Do For You

We have made KMP the focus of Touchlab. We had possibly the first KMP* app published in the iOS App Store, and have extensive experience in building libraries and the Kotlin platform, including contributions to Kotlin/Native itself. We can establish and accelerate your adoption of shared Kotlin code. See touchlab.co for more info.

We're Hiring!

Touchlab is looking for a Mobile Developer, with Android/Kotlin experience, who is eager to dive into Kotlin Multiplatform Mobile (KMM) development. Come join the remote-first team putting KMM in production. More info here.

Touchlab

GitHub

https://github.com/touchlab/KaMPKit
Comments
  • 1. Removed jcenter references

    Issue: None associated

    Platform

    • [x] iOS
    • [x] Android
    • [x] KMP

    Summary

    JCenter is shutting down, which means that active projects should not rely on it. All of KaMPKit's dependencies are now available through other artifact repositories which means it's safe to remove JCenter from this project.

    Fix

    Removed references to JCenter.

    Testing

    Checked if syncing Gradle fails.

    Reviewed by shalomhalbert at 2021-03-25 10:59
  • 2. Issue-194: Remove Bintray dependencies and update to latest Koin release

    Closes #194

    [Platform]

    • [x] iOS
    • [x] Android
    • [x] KMP

    [Summary]

    We were still reading Koin from Bintray (oops!)

    [Fix]

    Update to release version of Koin which is published to Maven Central, and remove remaining stray Bintray dependencies

    [Testing]

    Unit tests still pass, and ran App on both platforms with no issues.

    Reviewer Tips:
    * Use "Nitpick:" if it's a minor non-crucial request.
    * If you're done with comments either end with a review or comment something helpful like "done with comments for now"
    Reviewed by russhwolf at 2021-05-03 16:56
  • 3. KaMPKitDB is not accessible from common or Android module

    Project is building and running fine (tested on Android), however, IDE (Android Studio 4.1) is having issues with resolving imports from db package from common and Android code, and as a result, IDE is underlining all the time those files and doesn't autocomple when typing their names. Invalidating cache/restart doesn't solve this issue. image image image

    Reviewed by tajchert at 2020-11-03 10:04
  • 4. Not possible to debug suspend functions

    Whenever I try to debug a suspend function I get the following error:

    image

    From what I've read online it used to not be possible to debug suspend functions but apparently this has been resolved now. Is it still impossible for MPP?

    Reviewed by mpivchev at 2020-06-28 13:18
  • 5. Kotlin code not highlighted nor debuggable in XCode

    I followed the instructions to open KaMPKitiOS in XCode 12. However, the Kotlin code isn't highlighted, nor can I put breakpoints in it. See screenshot: Screen Shot 2021-04-19 at 3 26 03 PM

    Reviewed by IgorGanapolsky at 2021-04-19 19:27
  • 6. the dreaded NDK version is UNKNOWN

    Hi,

    Apologies if this is too generic and/or ignorant, but both my clones in the latest OSX and Windows Android Studio would fail at syncing with the

    NDK Resolution Outcome: Project settings: Gradle model version=5.6.2, NDK version is UNKNOWN

    This failure persisted after setting the NDK path under Project Structure, in Windows there is a "Download" button to get the NDK, in MacOS I pointed to a manually unpacked NDK.

    The "sync" and eventually the build completed successfully after closing the projects on both platforms and clicking Import Project, which revealed that the UKNOWN message is still in the log, but somehow not the showstopper that it was before the import, no clue what is happening there. I am also confused why Android Studio does not automagically fetch and configure an NDK when required in a project, is it possible that KaMPKit is using an antipattern here, or hitting a Google bug (I saw there is an open issue in Google's Issue Tracker)?

    Thanks!

    Reviewed by trurebel at 2020-02-11 15:09
  • 7. ViewModel Refactor Concept - Expect/Actual

    This is another proposal of a shared ViewModel.

    Common ViewModel concept

    Using the expect/actual modifiers provided by Kotlin, we can create a common ViewModel declaration. It can be pretty straightforward, with just one method that will run when the view is being destroyed to finish any work in progress.

    This proposal keeps the Android standard of using the onCleared to perform such action.

    expect abstract class PlatformViewModel() {
        protected open fun onCleared()
    }
    

    To provide the correct coroutine scope in the shared code, we will have an extension function (using expect/actual), similar to what is done by Android Lifecycle Components.

    actual val PlatformViewModel.coroutineScope: CoroutineScope
    

    This abstract class will be used to implement a shared ViewModel (like a CommonBreedViewModel). But it will not be visible for the apps. Each platform will have to implement a subclass from this ViewModel exposing the data so that the platform's native language can access.

    abstract class CommonBreedViewModel : PlatformViewModel(), KoinComponent {
        protected val _breedStateFlow: MutableStateFlow<DataState<ItemDataSummary>> =
            MutableStateFlow(DataState(loading = true))
    
        fun fetch() {
            // TODO: Fetch data and post to _breedStateFlow
        }
    }
    

    We can have an Android implementation that just exposes some StateFlow (or LiveData/Rx):

    class BreedViewModel : CommonBreedViewModel() {
        val breedStateFlow: StateFlow<DataState<ItemDataSummary>> = _breedStateFlow
    }
    

    And on iOS, we can use constructor callbacks (or SwiftCoroutines/Hyperdrive):

    class BreedViewModel(
        private val onDataState: (DataState<ItemDataSummary>) -> Unit,
    ) : CommonBreedViewModel() {
        init {
            coroutineScope.launch {
                _breedStateFlow.collect { dataState ->
                    onDataState(dataState)
                }
            }
        }
    }
    

    Pain points

    During the development of this PoC, I was able to experience some pain points that need to be discussed and stress the current (and other possible) solutions. All of them are placed as comments in the code, but here are a few of them:

    Dependencies

    The first problem I had with it was about having the dependencies in the common code. The problems are:

    1. If you add them as constructor parameters, you will not be able to create a new instance without using Koin (or other dependency injection lib) to inject that on the iOS side;
      1. If you consider the callback approach, things can be a bit more complicated;
      2. Maybe having a generated ViewModelProvider (or similar) for iOS would help
    2. If you set them as abstract, for some reason, the app crashes if you use any of them in the init from the common class;

    The solution used here was to make the CommonViewModel a KoinComponent, with that, we can call by inject() directly in the shared code.

    Native Coroutine Scope

    Right now, the MainScope class depends on Kermit to run. To avoid forcing the user to import unwanted libraries, I created a new class that provides the coroutine scope called NativeCoroutineScope. It now does not depend on any external library, but we lose the logging capability.

    Some solutions for that are:

    • Having an internal Logger class that we send as a parameter for the native ViewModel may be a solution.
    • Implementing a more complex ViewModel that stores values for keys (like Android) is another solution, but much more complex.

    iOS Lifecycle

    In this implementation, we need to manually call the .destroy() function on the iOS side to dispose of the ViewModel. A way to attach to a ViewController lifecycle would be helpful.

    Pros

    • Allows you to share more code with the multiple targets
    • Flexible in a way that each platform can expose that as they need
      • Including the name that it will use. Some iOS devs prefer to call these "Service", which will not be a problem in this format
    • All Android ViewModel features are kept and can be used in the android SourceSet
    • The "ViewModel" model is simple and provides everything we need
      • Right now is just the coroutine scope, but we can add more stuff with expect extensions

    Cons

    • Handling dependencies in the shared code (Pain Point 1)
    • Native Coroutine Scope (Pain Point 2)
    • Error-Prone in the iOS Side (Pain Point 3)
    • It's not as flexible for extension as the Android ViewModel
      • We could add the same "mBagOfTags" that Android has on the shared code to fix this. But we would need to depend on atomic (which may have some performance impacts)
    Reviewed by faogustavo at 2021-10-04 23:40
  • 8. Firebase libraries

    Hello,

    I would like to add the Firebase database library in the shared modules for begin test use KMM for app Android and iOs

    want use : implementation("dev.gitlive:firebase-database:1.4.2")

    but have this error : org.gradle.internal.resolve.ArtifactNotFoundException: Could not find firebase-app-debug.aar (dev.gitlive:firebase-app-android-debug:1.4.2).

    Do I am using the correct Firebase library ? Do you have any example to connect and use firebase database ?

    Thanks!

    Reviewed by TienHai at 2021-09-14 11:28
  • 9. Slow build and failed tests

    I am trying to have 1st build of KaMPKit. I was able to successfully build and run it in Android Studio.

    Now I am trying to run 1st optional step of iOS build. I have already downloaded and run XCode 11.5.

    For unknown reasons the build takes too long and all tests are failing.

    Just in case I am running the build on MacBook Pro 16" (2019), MacOS Catalina 10.15.4.

    $ ./gradlew clean build
    > Task :shared:testReleaseUnitTest
    
    ...
    
    > Task :shared:testReleaseUnitTest
    
    co.touchlab.kampkit.KoinTest > checkAllModules FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    co.touchlab.kampkit.ConcurrencyTest > testMain FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    co.touchlab.kampkit.BreedModelTest > updateFavoriteTest FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    co.touchlab.kampkit.BreedModelTest > notifyErrorOnException FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    co.touchlab.kampkit.BreedModelTest > staleDataCheckTest FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    co.touchlab.kampkit.SqlDelightTest > Select All Items Success FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    co.touchlab.kampkit.SqlDelightTest > Update Favorite Success FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    co.touchlab.kampkit.SqlDelightTest > Select Item by Id Success FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    co.touchlab.kampkit.SqlDelightTest > Delete All Success FAILED
        org.apache.tools.ant.BuildException
            Caused by: org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException
    
    9 tests completed, 9 failed
    
    > Task :shared:testReleaseUnitTest FAILED
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':shared:testReleaseUnitTest'.
    > There were failing tests. See the report at: file:///Users/otrotsenko/dev/repos/3rd_party/kmp/KaMPKit/shared/build/reports/tests/testReleaseUnitTest/index.html
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    * Get more help at https://help.gradle.org
    
    BUILD FAILED in 47m 53s
    

    And then in the index.html for each test I see the same:

    Unable to resolve artifact: Missing:
    ----------
    1) org.robolectric:android-all:jar:4.1.2_r1-robolectric-r1
    
      Try downloading the file manually from the project website.
    
      Then, install it using the command: 
          mvn install:install-file -DgroupId=org.robolectric -DartifactId=android-all -Dversion=4.1.2_r1-robolectric-r1 -Dpackaging=jar -Dfile=/path/to/file
    
      Alternatively, if you host your own repository you can deploy the file there: 
          mvn deploy:deploy-file -DgroupId=org.robolectric -DartifactId=android-all -Dversion=4.1.2_r1-robolectric-r1 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
    
      Path to dependency: 
      	1) org.apache.maven:super-pom:pom:2.0
      	2) org.robolectric:android-all:jar:4.1.2_r1-robolectric-r1
    
    ----------
    1 required artifact is missing.
    
    for artifact: 
      org.apache.maven:super-pom:pom:2.0
    
    from the specified remote repositories:
      adeya.central (https://nexus.adeya.ch/content/repositories/adeya.central/)
    
    
    	at org.apache.maven.artifact.ant.DependenciesTask.doExecuteResolution(DependenciesTask.java:268)
    
    Reviewed by AlexTrotsenko at 2020-08-01 14:00
  • 10. jdk7?

    is there a reason why you use jdk7 instead of jdk8 ?

    from your build.gradle.kts:

    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72")

    Reviewed by dbaroncelli at 2020-06-12 22:11
  • 11. [ios] Allow injection into Koin from iOS

    This updates the project to allow injection directly from iOS similar to how Android can as seen in: MainApp.kt. Fixes #113

    NOTES: These changes introduce a library to allow us to have a shared object while still being able to mutate it. I think it's not the most ideal setup but it's a good tradeoff for the clean interface to the developer and seeing that this will only be set once. However, I'm open to other suggestions.

    Reviewed by dcvz at 2020-07-22 11:47
  • 12. Compatibility with the new Kotlin/Native memory model

    When using the new Kotlin/Native memory model, kotlinx-coroutines and ktor, KaMPKit is failing at runtime due to incompatibility of SQLDelight coroutines extensions with the new memory model:

    kotlin.native.concurrent.FreezingException: freezing of [email protected] has failed, first blocker is [email protected]
        at 0   shared                              0x0000000106cf1931 kfun:kotlin.Throwable#<init>(kotlin.String?){} + 97 (/opt/buildAgent/work/c75bfccfe067806/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Throwable.kt:24:56)
        at 1   shared                              0x0000000106ce9f3d kfun:kotlin.Exception#<init>(kotlin.String?){} + 93 (/opt/buildAgent/work/c75bfccfe067806/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:23:58)
        at 2   shared                              0x0000000106cea16d kfun:kotlin.RuntimeException#<init>(kotlin.String?){} + 93 (/opt/buildAgent/work/c75bfccfe067806/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/Exceptions.kt:34:58)
        at 3   shared                              0x0000000106d26c5e kfun:kotlin.native.concurrent.FreezingException#<init>(kotlin.Any;kotlin.Any){} + 654 (/opt/buildAgent/work/c75bfccfe067806/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Freezing.kt:17:9)
        at 4   shared                              0x0000000106d28169 ThrowFreezingException + 233 (/opt/buildAgent/work/c75bfccfe067806/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Internal.kt:104:15)
        at 5   shared                              0x00000001073a0c38 FreezeSubgraph + 40
        at 6   shared                              0x00000001073cbb06 Kotlin_Worker_freezeInternal + 38
        at 7   shared                              0x0000000106d269a0 kfun:kotlin.native.concurrent#freeze__at__0:0(){0§<kotlin.Any?>}0:0 + 64 (/opt/buildAgent/work/c75bfccfe067806/kotlin/kotlin-native/runtime/src/main/kotlin/kotlin/native/concurrent/Freezing.kt:37:2)
        at 8   shared                              0x0000000106f3f9d5 kfun:kotlinx.coroutines.internal.LockFreeLinkedListNode#tryCondAddNext(kotlinx.coroutines.internal.LockFreeLinkedListNode;kotlinx.coroutines.internal.LockFreeLinkedListNode;kotlinx.coroutines.internal.LockFreeLinkedListNode.CondAddOp){}kotlin.Int + 1285 (/opt/buildAgent/work/44ec6e850d5c63f0/kotlinx-coroutines-core/concurrent/src/internal/LockFreeLinkedList.kt:228:71)
    ...
    

    Workaround: disable freezing as described here. Fork with all necessary changes is here. The corresponding SQLDelight issue with the root cause description is here.

    Reviewed by sbogolepov at 2021-08-31 14:53
  • 13. Add UI for Loading and Empty DataStates for Android and iOS

    DataState is defined with 4 subclasses:

    • Error
    • Loading
    • Success
    • Empty

    But we are only changing the UI for 2 states: Success and Error in iOS and Android

    Loading should show a Swipe-refresh style spinner Empty (different issue) should just a TextView saying that there weren't any breeds, and perhaps to try again later.

    Reviewed by brady-aiello at 2021-01-21 19:29
  • 14. Refactor/Rename How-To

    This is a fantastic starter kit and I thank you all for putting this together for all of us!

    Would it be possible to add a "How-To refactor/rename" best practices doc for packages, app name, dependencies, etc. so we're not always using co/touchlab/kampstarter / co.touchlab.kampstarter and we don't break gradle, Xcode, Android builds?

    Reviewed by rodrigo-lima at 2020-02-16 22:08
The goal of the KaMP Kit is to facilitate your evaluation of Kotlin Multiplatform
The goal of the KaMP Kit is to facilitate your evaluation of Kotlin Multiplatform

KaMP Kit Welcome to the KaMP Kit! About Goal The goal of the KaMP Kit is to facilitate your evaluation of Kotlin Multiplatform (aka KMP). It is a coll

Nov 11, 2021
Reapp is everything you need to build amazing apps with React: a collection of packages that work together, our UI kit, and a CLI that scaffolds your app and includes a server and build system.
Reapp is everything you need to build amazing apps with React: a collection of packages that work together, our UI kit, and a CLI that scaffolds your app and includes a server and build system.

What is it? Reapp is everything you need to build amazing apps with React: a collection of packages that work together, our UI kit, and a CLI that sca

Aug 12, 2022
A set of highly-opinionated, batteries-included gradle plugins to get you started building delicious multi-module Kotlin projects

Sourdough Gradle What is Sourdough Gradle? Sourdough is a set of highly opinionated gradle plugins that aim to act as the starter for your Kotlin proj

Jan 10, 2022
Example mod with Mixin to help you to get started with creating a mod with mixins.

ExampleMixinMod Example mod with Mixin to help you to get started with creating a mod with mixins. For usage of mixins, see here. Also, remember to tu

Dec 16, 2021
Kotlin Multiplatform Mobile + Mobile Declarative UI Framework (Jetpack Compose and SwiftUI)

Kotlin Multiplatform Mobile + Mobile Declarative UI Framework (Jetpack Compose and SwiftUI)

Dec 15, 2021
KMM RSS Reader: an open-source, mobile, cross-platform application built with Kotlin Multiplatform Mobile.
KMM RSS Reader: an open-source, mobile, cross-platform application built with Kotlin Multiplatform Mobile.

KMM RSS Reader This is an open-source, mobile, cross-platform application built with Kotlin Multiplatform Mobile. It's a simple RSS reader, and you ca

Aug 17, 2022
An awesome collaborative collection of Kotlin Multiplatform libraries

Awesome Kotlin Multiplatform Awesome Projects Updated 33 November 21, 2021 Contents Guides Dependency Injection Database NoSQL SQL Extension Reactive

Apr 25, 2022
TensorFlow Lite Helper for Android to help getting started with TesnorFlow.

TensorFlow Lite Helper for Android This library helps with getting started with TensorFlow Lite on Android. Inspired by TensorFlow Lite Android image

Sep 22, 2021
Framework for quickly creating connected applications in Kotlin with minimal effort
Framework for quickly creating connected applications in Kotlin with minimal effort

Ktor is an asynchronous framework for creating microservices, web applications and more. Written in Kotlin from the ground up. import io.ktor.server.n

Aug 12, 2022
Opinionated Redux-like implementation backed by Kotlin Coroutines and Kotlin Multiplatform Mobile

CoRed CoRed is Redux-like implementation that maintains the benefits of Redux's core idea without the boilerplate. No more action types, action creato

Feb 27, 2022
A collection of hand-crafted extensions for your Kotlin projects.

Splitties Splitties is a collection of small Kotlin multiplatform libraries (with Android as first target). These libraries are intended to reduce the

Aug 16, 2022
An app architecture for Kotlin/Native on Android/iOS. Use Kotlin Multiplatform Mobile.
An app architecture for Kotlin/Native on Android/iOS. Use Kotlin Multiplatform Mobile.

An app architecture for Kotlin/Native on Android/iOS. Use Kotlin Multiplatform Mobile. 项目架构主要分为原生系统层、Android/iOS业务SDK层、KMM SDK层、KMM业务逻辑SDK层、iOS sdkfra

Feb 21, 2022
Location Service Manager for Kotlin Multiplatform Mobile iOS and android
Location Service Manager for Kotlin Multiplatform Mobile iOS and android

Location Service Manager for Kotlin Multiplatform Mobile iOS and android Features Provides simple permission settings Dramatically reduce the amount o

Aug 8, 2022
Kotlin Multiplatform Mobile demo for Android and iOS - app for viewing Cat pictures
Kotlin Multiplatform Mobile demo for Android and iOS - app for viewing Cat pictures

CatViewerDemo Android demo iOS demo Kotlin Multiplatform Mobile demo for Android and iOS. App for viewing Cat pictures from Cats API. This sample show

Jul 28, 2022
A local storage management library for Kotlin Multiplatform Mobile iOS and android
A local storage management library for Kotlin Multiplatform Mobile iOS and android

A local storage management library for Kotlin Multiplatform Mobile iOS and android Features iOS and Android local storage in one interface Provides ge

Apr 26, 2022
MangaKu App Powered by Kotlin Multiplatform Mobile, Jetpack Compose, and SwiftUI
MangaKu App Powered by Kotlin Multiplatform Mobile, Jetpack Compose, and SwiftUI

MangaKu ?? Introduction MangaKu App Powered by Kotlin Multiplatform Mobile, Jetpack Compose, and SwiftUI Module core: data and domain layer iosApp: io

Aug 9, 2022
Kotlin Multiplatform is an SDK for cross-platform mobile development, which enables teams to use the same business logic in both Android and iOS client applications.
Kotlin Multiplatform is an SDK for cross-platform mobile development, which enables teams to use the same business logic in both Android and iOS client applications.

Kotlin Multiplatform is an SDK for cross-platform mobile development, which enables teams to use the same business logic in both Android and iOS client applications.

Feb 11, 2022
Starter Kit for Android projects.

About Android Starter Kit was created as a way to save time when starting a new Android project. It is a simple native single-module app based on MVVM

Oct 12, 2021
Beautifully designed Pokémon Database app for Android based on PokéAPI and powered by Kotlin.
Beautifully designed Pokémon Database app for Android based on PokéAPI and powered by Kotlin.

PokéFacts PokéFacts is an open-source Pokémon Database app for Android based on PokéAPI and powered by Kotlin. The app allows users to view Pokémons,

May 25, 2022