Server-driven remote configuration: fetch, evaluate and render server-authored UI (dialogs, banners, sheets, full-screen) matching app Material theme; headless core, dynamic renderer, dashboard/backend integration.
Server-driven remote config for Kotlin Multiplatform — change what your app shows without shipping a release.
Point the SDK at a publishable key, drop one composable in your tree, and a dialog, bottom sheet, banner or full-screen takeover renders from the server in your app's own Material theme:
RemoteConfigHost(screen = "home")
⚠️ Status: pre-release. This repo was split out of KmpToolkit and the control plane is still being built. The code here is the KmpToolkit3.5.28lineage: the publishable-key, screen-filter and template work described below is not implemented yet —RemoteConfigHosttakes noscreenparameter and configuration still wants a Supabase URL + anon key.
4.0.0-alpha01is on Maven Central but was published by accident (2026-10-05): this repo's genesis push matched the inherited publish trigger and released it unattended. It is the 3.5.28 code under a 4.x version number. Do not read the version as a signal that the rework landed. See Relationship to KmpToolkit.
Three pieces that ship as one product:
| Piece | Where | What it does |
|---|---|---|
| SDK |
cmp-remote-config + cmp-remote-config-compose
|
Fetch, evaluate, render. Headless core + Compose surface |
| Backend | supabase/ |
Schema + Edge Functions: the key registry, targeting, templates, impressions |
| Dashboard | dashboard/ |
Operator UI — author a config from a template form, target it, schedule it |
Why the SDK is two artifacts: the Compose compiler plugin applies to every compilation and fails on any target without the Compose runtime on the class path. Splitting the renderer out is what lets a server, CLI or watch complication evaluate a config at all.
| Module | Artifact | Description | Latest |
|---|---|---|---|
| cmp-remote-config | io.github.mobilebytelabs:cmp-remote-config |
Headless — fetch, evaluate, server-driven UI document model. 15 KMP targets | |
| cmp-remote-config-compose | io.github.mobilebytelabs:cmp-remote-config-compose |
RemoteConfigHost + dialog / bottom-sheet / banner / full-screen presentations, dynamic UI renderer, Module.remoteConfig { } Koin DSL. 7 Compose-MP targets |
Target support: TARGET_MATRIX.md is the single source of truth for which KMP targets each module ships and why — measured, with JetBrains' tier list as the upstream reference.
Both modules ship together at the unified kmpremoteconfig.version:
# gradle/libs.versions.toml
[versions]
kmpRemoteConfig = "LATEST" # see the Maven Central badge above
[libraries]
cmp-remote-config = { module = "io.github.mobilebytelabs:cmp-remote-config", version.ref = "kmpRemoteConfig" }
cmp-remote-config-compose = { module = "io.github.mobilebytelabs:cmp-remote-config-compose", version.ref = "kmpRemoteConfig" }cmp-remote-config-compose exposes the core types as api, so depending on it alone is enough to
use the whole library. Add the headless module directly only on a target with no renderer.
📖 Docs site · 🚀 Releases · 📦 Maven Central
Per-module API reference ships as Dokka HTML inside each -javadoc.jar, so IntelliJ and Android
Studio surface it in hover popups automatically.
These two modules lived in KmpToolkit through
3.5.28. They moved here because remote config grew a server and a dashboard, which do not belong
in a general-purpose library collection.
The artifact coordinates are deliberately unchanged — a consumer migrates a version, not a dependency id. Three things follow from that:
4.0.0 is a major bump because the SDK's entry point changes:
remoteConfig { supabaseUrl; supabaseKey } becomes a single publishableKey.3.5.x on them while this repo owns 4.x. Central accepts both, so nothing errors — the versions
just interleave across two sources.4.0.0-alpha01 was released from here unintentionally (see Status above). Central does not allow
deletion, so the 4.x line starts at -alpha02.Publishing is now gated: publish.yml has no cron schedules and fires only on a manual dispatch or
a push to the release branch. A push to dev cannot publish, whatever it touches.
cmp-observe is not vendored here — it stays published from KmpToolkit and is consumed as
io.github.mobilebytelabs:cmp-observe. A second copy of a published module would drift.
CONTRIBUTING.md · docs conventions in docs/DEVELOPMENT.md.
./gradlew build # compile + test every target this host can build
./gradlew fix # apply Spotless formatting
./gradlew detekt # static analysis
./gradlew koverHtmlReportCopyright 2026 MobileByteLabs
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
See LICENSE for details.
Server-driven remote config for Kotlin Multiplatform — change what your app shows without shipping a release.
Point the SDK at a publishable key, drop one composable in your tree, and a dialog, bottom sheet, banner or full-screen takeover renders from the server in your app's own Material theme:
RemoteConfigHost(screen = "home")
⚠️ Status: pre-release. This repo was split out of KmpToolkit and the control plane is still being built. The code here is the KmpToolkit3.5.28lineage: the publishable-key, screen-filter and template work described below is not implemented yet —RemoteConfigHosttakes noscreenparameter and configuration still wants a Supabase URL + anon key.
4.0.0-alpha01is on Maven Central but was published by accident (2026-10-05): this repo's genesis push matched the inherited publish trigger and released it unattended. It is the 3.5.28 code under a 4.x version number. Do not read the version as a signal that the rework landed. See Relationship to KmpToolkit.
Three pieces that ship as one product:
| Piece | Where | What it does |
|---|---|---|
| SDK |
cmp-remote-config + cmp-remote-config-compose
|
Fetch, evaluate, render. Headless core + Compose surface |
| Backend | supabase/ |
Schema + Edge Functions: the key registry, targeting, templates, impressions |
| Dashboard | dashboard/ |
Operator UI — author a config from a template form, target it, schedule it |
Why the SDK is two artifacts: the Compose compiler plugin applies to every compilation and fails on any target without the Compose runtime on the class path. Splitting the renderer out is what lets a server, CLI or watch complication evaluate a config at all.
| Module | Artifact | Description | Latest |
|---|---|---|---|
| cmp-remote-config | io.github.mobilebytelabs:cmp-remote-config |
Headless — fetch, evaluate, server-driven UI document model. 15 KMP targets | |
| cmp-remote-config-compose | io.github.mobilebytelabs:cmp-remote-config-compose |
RemoteConfigHost + dialog / bottom-sheet / banner / full-screen presentations, dynamic UI renderer, Module.remoteConfig { } Koin DSL. 7 Compose-MP targets |
Target support: TARGET_MATRIX.md is the single source of truth for which KMP targets each module ships and why — measured, with JetBrains' tier list as the upstream reference.
Both modules ship together at the unified kmpremoteconfig.version:
# gradle/libs.versions.toml
[versions]
kmpRemoteConfig = "LATEST" # see the Maven Central badge above
[libraries]
cmp-remote-config = { module = "io.github.mobilebytelabs:cmp-remote-config", version.ref = "kmpRemoteConfig" }
cmp-remote-config-compose = { module = "io.github.mobilebytelabs:cmp-remote-config-compose", version.ref = "kmpRemoteConfig" }cmp-remote-config-compose exposes the core types as api, so depending on it alone is enough to
use the whole library. Add the headless module directly only on a target with no renderer.
📖 Docs site · 🚀 Releases · 📦 Maven Central
Per-module API reference ships as Dokka HTML inside each -javadoc.jar, so IntelliJ and Android
Studio surface it in hover popups automatically.
These two modules lived in KmpToolkit through
3.5.28. They moved here because remote config grew a server and a dashboard, which do not belong
in a general-purpose library collection.
The artifact coordinates are deliberately unchanged — a consumer migrates a version, not a dependency id. Three things follow from that:
4.0.0 is a major bump because the SDK's entry point changes:
remoteConfig { supabaseUrl; supabaseKey } becomes a single publishableKey.3.5.x on them while this repo owns 4.x. Central accepts both, so nothing errors — the versions
just interleave across two sources.4.0.0-alpha01 was released from here unintentionally (see Status above). Central does not allow
deletion, so the 4.x line starts at -alpha02.Publishing is now gated: publish.yml has no cron schedules and fires only on a manual dispatch or
a push to the release branch. A push to dev cannot publish, whatever it touches.
cmp-observe is not vendored here — it stays published from KmpToolkit and is consumed as
io.github.mobilebytelabs:cmp-observe. A second copy of a published module would drift.
CONTRIBUTING.md · docs conventions in docs/DEVELOPMENT.md.
./gradlew build # compile + test every target this host can build
./gradlew fix # apply Spotless formatting
./gradlew detekt # static analysis
./gradlew koverHtmlReportCopyright 2026 MobileByteLabs
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
See LICENSE for details.