Kite Ssot Extension
The single source of truth for your app's identity. Apply to the root project.
The law
Facts always flow. A declared fact reaches every platform found, on every build, in memory or as files under
build/. Declaring it is the consent.skip()andonly()beside the fact are the only flow control.rewrite { }is the only word that acts on YOUR files. It arms a by-name task that edits source. dryRun, backups, andonConflictalways apply.One topic, one block. Platform corners nest inside topics. Platform blocks hold only platform-exclusive things.
Three lines are a complete setup:
kiteSsot {
appName = "Jetzy"
version = "1.4.0"
id = "com.example.jetzy"
}Locales auto-detect from Compose resources, the shared module and the app modules are detected too. Everything else below is optional.
The full surface
kiteSsot {
appName("Jetzy") {
ios("Jetzy Lite") // platform value override
skip(desktop) // this fact does not flow there
}
jvmTarget = 21 // Java + Kotlin JVM level, whole build
id("com.example.jetzy") {
android { suffix = ".android" } // applicationId = base + suffix
ios { suffix = ".ios" } // bundle id = base + suffix
desktop { suffix = ".desktop" }
}
version("1.4.0") {
// formula { v -> ... } // optional: your own build-number formula
android {
reupload = 1 // re-upload same version to Play
shipped = 1001003090 // highest code ever shipped, guard
}
ios { shipped = "1001003090" }
desktop { shipped = "1001003090" }
}
locales {
pin("en", "ar", "fr") // hand list, detection skipped
filterAndroidRes = true // drop Android res outside the list
}
logo {
foreground = file("art/logo-fg.png")
backgroundColor = "#0B0B0F"
android { safeZone = 0.611 }
desktop { roundMac = true } // desktop icons flow from presence
rewrite { replaceOld = true } // arms kiteRewriteLogo (source edits)
}
splash {
// empty block already works: art defaults to logo, plate to its color
dark { backgroundColor = "#000000" }
android { theme = "AppTheme" } // your app theme; the generated
// KiteSplash style inherits it
rewrite { } // arms the iOS launch-screen delivery
}
optIns {
add("kotlinx.cinterop.ExperimentalForeignApi")
}
android { sdk(min = 26, target = 36, compile = 36) }
ios {
deploymentTarget = "15.0"
rewrite { // arms kiteRewriteXcode (source edits)
targets("iosApp")
cleanPlist = true
}
}
desktop { linuxPackageName = "jetzy" }
web { ioWorker { targets("js") } }
buildConfig { // presence generates into build/
packageName = "com.example.jetzy"
stringField("API_HOST", "api.jetzy.app")
}
modules { shared = ":shared" } // only when detection guesses wrong
dryRun = false
backups = true
// ignoreVersionGuards = true // off the tested AGP/KGP/Compose matrix, on your own head
}What you can inject where
| You can inject | Works in | Meaning |
|---|---|---|
skip(p...) / only(p...) | root, appName, id, version, locales, logo, splash | flow control, at root = platform master |
android("v") / ios("v") / desktop("v") | appName | platform value override |
android { } / ios { } / desktop { } corner | id, version, logo | platform detail scope |
pin | version corners, locales | manual value, machinery skipped |
reupload, shipped, formula | version and its corners | store counter, guard floor, number formula |
suffix | id corners | appended to the base id |
rewrite { } | logo, splash, ios | the only acting word, arms a task |
dark { } | splash | dark-mode variant |
typed *Field(...) | buildConfig | generated constants |
Tasks
kiteCheck, kiteDoctor, kiteVerify, kitePlan are read-only and always safe. kiteRewriteLogo and kiteRewriteXcode run only when armed by a rewrite { } block and only when you invoke them. CLI overrides: -Pkitessot.dryRun=true, -Pkitessot.backups=false.
Read-back
Every fact is a lazy Gradle Property. Resolved derived providers: androidApplicationId, iosBundleId, desktopBundleId, versionCode, canonicalLocales, resolvedSharedProjectPath.
See also
for name overrides and flow.
for identity suffix corners.
for the formula and version corners.
for the pinned list and the Android res filter.
for icon art and the armed logo rewrite.
for launch-screen art on all three platforms.
for the build-number formula input.
Properties
Android-only settings. Configure with kiteSsot { android { } }.
Android application id: id plus its android corner suffix.
Generated runtime constants for commonMain. Configure with kiteSsot { buildConfig { } }.
Normalized, de-duplicated locale tags.
Compose Desktop settings. Configure with kiteSsot { desktop { } }.
Desktop bundle id: id plus its desktop corner suffix.
Treat AGP, KGP, and Compose versions outside the tested range as supported.
Apple-only settings. Configure with kiteSsot { ios { } }.
Apple bundle id: id plus its ios corner suffix.
App icon installation. Configure with kiteSsot { logo { } }.
Where your modules live. Configure with kiteSsot { modules { } }.
Kotlin/Native interop opt-in markers. Configure with kiteSsot { optIns { } }.
The selected shared KMP project path.
The one formula that turns version into a store build number.
The resolved Android versionCode for this build.
Browser Kotlin/JS helpers. Configure with kiteSsot { web { } }.
Functions
Configure SDK levels, the Android id suffix, and the Play re-upload dial.
Detailed form of appName: per-platform overrides and flow modifiers.
Generate a Kotlin object of public runtime configuration.
Apply app identity, versions, and installer values to Compose Desktop.
Detailed form of id: per-platform suffix corners and flow modifiers.
Configure the Apple bundle suffix, build number, paths, and source sync.
The locales topic: pinned list, Android res filter, and flow modifiers.
Point KiteSSOT at your foreground and background art.
Tell KiteSSOT where the shared and Android application projects are.
This fact flows only to the given platforms.
Add opt-in markers to the selected Kotlin/Native compilations.
Set the shared build-number formula. See scheme.
This fact does not flow to the given platforms.
The splash topic: launch-screen art. Presence flows Android and desktop.
Detailed form of version: the shared formula and platform corners.
Configure optional browser Kotlin/JS source generation.