
Unified API for scheduling and managing background tasks—one‑off, periodic, exact and chained jobs—featuring advanced triggers, structured logging, event‑driven completion, demo UI and docs.
📦 MOVED TO NEW HOME: This library has been superseded by KMP WorkManager.
Please migrate to the new library for better iOS reliability, thread-safety, and enterprise features.
The original vietnguyentuan2019/KMPTaskManager library has evolved into a production-ready, enterprise-grade solution under the Brewkits organization. Here's what you gain by migrating:
Map<String, Any>
kotlinx.serialization with reified inline functionsWorkerProgress with TaskProgressBus for live UI updatesOld (vietnguyentuan2019/KMPTaskManager):
dependencies {
implementation("io.kmp.worker:kmpworker:0.x.x")
}New (brewkits/kmpworkmanager):
kotlin {
sourceSets {
commonMain.dependencies {
implementation("io.brewkits:kmpworkmanager:1.1.0")
}
}
}Old:
import io.kmp.worker.BackgroundTaskScheduler
import io.kmp.worker.domain.TaskTrigger
import io.kmp.worker.domain.ConstraintsNew:
import io.brewkits.kmpworkmanager.background.domain.BackgroundTaskScheduler
import io.brewkits.kmpworkmanager.background.domain.TaskTrigger
import io.brewkits.kmpworkmanager.background.domain.ConstraintsThe new library uses a cleaner factory pattern:
Old:
class MyWorkerFactory : WorkerFactory {
override fun createWorker(className: String): Worker? {
// ...
}
}New (Android):
class MyWorkerFactory : AndroidWorkerFactory {
override fun createWorker(workerClassName: String): AndroidWorker? {
return when (workerClassName) {
"SyncWorker" -> SyncWorker()
else -> null
}
}
}New (iOS):
class MyWorkerFactory : IosWorkerFactory {
override fun createWorker(workerClassName: String): IosWorker? {
return when (workerClassName) {
"SyncWorker" -> SyncWorker()
else -> null
}
}
}Old:
startKoin {
modules(workerModule(MyWorkerFactory()))
}New (Android):
startKoin {
androidContext(this@MyApp)
modules(kmpWorkerModule(
workerFactory = MyWorkerFactory()
))
}New (iOS):
KoinModuleKt.doInitKoinIos(workerFactory: MyWorkerFactory())Enable Progress Tracking:
class DownloadWorker(
private val progressListener: ProgressListener?
) : AndroidWorker {
override suspend fun doWork(input: String?): Boolean {
progressListener?.onProgressUpdate(
WorkerProgress(
progress = 50,
message = "Downloaded 5MB / 10MB"
)
)
return true
}
}Listen to Progress in UI:
@Composable
fun DownloadScreen() {
val progressFlow = TaskProgressBus.events
.filterIsInstance<TaskProgressEvent>()
.filter { it.taskId == "download-task" }
val progress by progressFlow.collectAsState(initial = null)
LinearProgressIndicator(
progress = (progress?.progress?.progress ?: 0) / 100f
)
}| Old API | New API | Notes |
|---|---|---|
io.kmp.worker.* |
io.brewkits.kmpworkmanager.* |
Package renamed |
WorkerFactory |
AndroidWorkerFactory / IosWorkerFactory
|
Platform-specific factories |
workerModule() |
kmpWorkerModule() |
Koin module renamed |
Worker.doWork(): Boolean |
Same | No change |
TaskTrigger.StorageLow → Use Constraints(systemConstraints = setOf(SystemConstraint.ALLOW_LOW_STORAGE))
TaskTrigger.BatteryLow → Use Constraints(systemConstraints = setOf(SystemConstraint.ALLOW_LOW_BATTERY))
TaskTrigger.DeviceIdle → Use Constraints(systemConstraints = setOf(SystemConstraint.DEVICE_IDLE))
| Feature | Old Library | New Library (v1.1.0) |
|---|---|---|
| Android Support | ✅ | ✅ |
| iOS Support | ✅ | ✅ |
| Periodic Tasks | ✅ | ✅ |
| One-Time Tasks | ✅ | ✅ |
| Exact Alarms | ✅ | ✅ |
| Task Chains | ✅ | ✅ + State Restoration |
| Constraints | ✅ | ✅ + More options |
| Event Bus | ✅ | ✅ + Persistence |
| Progress Tracking | ❌ | ✅ Built-in |
| Type-Safe Input | ✅ Automatic | |
| iOS File Storage | ❌ UserDefaults | ✅ Atomic Files |
| Chain Restoration | ❌ | ✅ Resume from checkpoint |
| Test Coverage | ✅ 200+ tests | |
| Documentation | ✅ Comprehensive | |
| Production Ready | ✅ |
vietnguyentuan2019/KMPTaskManager developmentQ: Will the old library receive updates? A: No. All development has moved to brewkits/kmpworkmanager. This repository is archived.
Q: Can I still use the old library? A: Yes, but it won't receive bug fixes or new features. We strongly recommend migrating.
Q: How long will migration take? A: Most projects can migrate in 1-2 hours. It's mostly package rename and minor API updates.
Q: What if I encounter issues during migration?
A: Open an issue in the new repository with the migration label.
Q: Is the license the same? A: Yes, both are Apache 2.0 licensed.
Original README content preserved below for historical reference...
Thank you for using KMPTaskManager! 🙏
We appreciate your support. Please give the new library a star on GitHub if it helps your project!
⭐ Star the new repo: brewkits/kmpworkmanager
Made with ❤️ by Nguyễn Tuấn Việt at Brewkits
📦 MOVED TO NEW HOME: This library has been superseded by KMP WorkManager.
Please migrate to the new library for better iOS reliability, thread-safety, and enterprise features.
The original vietnguyentuan2019/KMPTaskManager library has evolved into a production-ready, enterprise-grade solution under the Brewkits organization. Here's what you gain by migrating:
Map<String, Any>
kotlinx.serialization with reified inline functionsWorkerProgress with TaskProgressBus for live UI updatesOld (vietnguyentuan2019/KMPTaskManager):
dependencies {
implementation("io.kmp.worker:kmpworker:0.x.x")
}New (brewkits/kmpworkmanager):
kotlin {
sourceSets {
commonMain.dependencies {
implementation("io.brewkits:kmpworkmanager:1.1.0")
}
}
}Old:
import io.kmp.worker.BackgroundTaskScheduler
import io.kmp.worker.domain.TaskTrigger
import io.kmp.worker.domain.ConstraintsNew:
import io.brewkits.kmpworkmanager.background.domain.BackgroundTaskScheduler
import io.brewkits.kmpworkmanager.background.domain.TaskTrigger
import io.brewkits.kmpworkmanager.background.domain.ConstraintsThe new library uses a cleaner factory pattern:
Old:
class MyWorkerFactory : WorkerFactory {
override fun createWorker(className: String): Worker? {
// ...
}
}New (Android):
class MyWorkerFactory : AndroidWorkerFactory {
override fun createWorker(workerClassName: String): AndroidWorker? {
return when (workerClassName) {
"SyncWorker" -> SyncWorker()
else -> null
}
}
}New (iOS):
class MyWorkerFactory : IosWorkerFactory {
override fun createWorker(workerClassName: String): IosWorker? {
return when (workerClassName) {
"SyncWorker" -> SyncWorker()
else -> null
}
}
}Old:
startKoin {
modules(workerModule(MyWorkerFactory()))
}New (Android):
startKoin {
androidContext(this@MyApp)
modules(kmpWorkerModule(
workerFactory = MyWorkerFactory()
))
}New (iOS):
KoinModuleKt.doInitKoinIos(workerFactory: MyWorkerFactory())Enable Progress Tracking:
class DownloadWorker(
private val progressListener: ProgressListener?
) : AndroidWorker {
override suspend fun doWork(input: String?): Boolean {
progressListener?.onProgressUpdate(
WorkerProgress(
progress = 50,
message = "Downloaded 5MB / 10MB"
)
)
return true
}
}Listen to Progress in UI:
@Composable
fun DownloadScreen() {
val progressFlow = TaskProgressBus.events
.filterIsInstance<TaskProgressEvent>()
.filter { it.taskId == "download-task" }
val progress by progressFlow.collectAsState(initial = null)
LinearProgressIndicator(
progress = (progress?.progress?.progress ?: 0) / 100f
)
}| Old API | New API | Notes |
|---|---|---|
io.kmp.worker.* |
io.brewkits.kmpworkmanager.* |
Package renamed |
WorkerFactory |
AndroidWorkerFactory / IosWorkerFactory
|
Platform-specific factories |
workerModule() |
kmpWorkerModule() |
Koin module renamed |
Worker.doWork(): Boolean |
Same | No change |
TaskTrigger.StorageLow → Use Constraints(systemConstraints = setOf(SystemConstraint.ALLOW_LOW_STORAGE))
TaskTrigger.BatteryLow → Use Constraints(systemConstraints = setOf(SystemConstraint.ALLOW_LOW_BATTERY))
TaskTrigger.DeviceIdle → Use Constraints(systemConstraints = setOf(SystemConstraint.DEVICE_IDLE))
| Feature | Old Library | New Library (v1.1.0) |
|---|---|---|
| Android Support | ✅ | ✅ |
| iOS Support | ✅ | ✅ |
| Periodic Tasks | ✅ | ✅ |
| One-Time Tasks | ✅ | ✅ |
| Exact Alarms | ✅ | ✅ |
| Task Chains | ✅ | ✅ + State Restoration |
| Constraints | ✅ | ✅ + More options |
| Event Bus | ✅ | ✅ + Persistence |
| Progress Tracking | ❌ | ✅ Built-in |
| Type-Safe Input | ✅ Automatic | |
| iOS File Storage | ❌ UserDefaults | ✅ Atomic Files |
| Chain Restoration | ❌ | ✅ Resume from checkpoint |
| Test Coverage | ✅ 200+ tests | |
| Documentation | ✅ Comprehensive | |
| Production Ready | ✅ |
vietnguyentuan2019/KMPTaskManager developmentQ: Will the old library receive updates? A: No. All development has moved to brewkits/kmpworkmanager. This repository is archived.
Q: Can I still use the old library? A: Yes, but it won't receive bug fixes or new features. We strongly recommend migrating.
Q: How long will migration take? A: Most projects can migrate in 1-2 hours. It's mostly package rename and minor API updates.
Q: What if I encounter issues during migration?
A: Open an issue in the new repository with the migration label.
Q: Is the license the same? A: Yes, both are Apache 2.0 licensed.
Original README content preserved below for historical reference...
Thank you for using KMPTaskManager! 🙏
We appreciate your support. Please give the new library a star on GitHub if it helps your project!
⭐ Star the new repo: brewkits/kmpworkmanager
Made with ❤️ by Nguyễn Tuấn Việt at Brewkits