Look at Coroutines, and using either IO Dispatcher or perhaps your own single-background-threaded Dispatcher. This is now well supported across all the Kotlin Multiplatform targets, so you could expect to write all your sync logic once in common code. If you pair it with the equally multiplatform ready Ktor HTTP client, you'll be sharing all your network calls too.