As for IO, you only need to offload blocking IO out of the main thread. If your IO is non blocking (all represented as suspending functions) then you can use it from UI-confined coroutines directly. It becomes really easy to program if everything is non-blocking.