Kite Ssot Extension
DSL for the kitessot plugin. Applied to the root project only.
Every identity field is optional. Identity reaches a platform only when its propagation toggle is enabled and the value is present. Source-tree migrations, compiler-policy changes, locale packaging filters, and branding are disabled by default and require an explicit opt-in.
App logo: opt in with propagateLogo, then set appLogoPngForeground and exactly one of appLogoPngBackground / appLogoBackgroundColor. Incomplete layer configuration fails only when propagation is enabled. Apple logo installation also requires syncIos. PNG inputs are capped at 32 MiB, 4,096 pixels per dimension, and 16,777,216 decoded pixels.
Properties
Android-only SDK options. See KiteSsotAndroidExtension. Accessed as kiteSsot { android { compileSdk = 36; minSdk = 26 } }. Created as a child extension by KiteSsotPlugin.apply for the same reason as ios.
Typed directory that owns the Android application's src/main tree. By default the plugin resolves it from the uniquely selected/detected Android application project, including custom projectDir mappings.
Resolved Android identifier: bundleIdBase plus androidApplicationIdSuffix.
Suffix appended to bundleIdBase for the Android applicationId. Unset means no suffix.
Exact Android application project paths that may receive app-scoped identity, version, name, and locale-filter values. When empty, a sole detected application is selected automatically; multiple detected applications are accepted only while no app-scoped value needs a target. Android SDK and JVM policy remain global to compatible Android modules and are not restricted by this selector. The single Android logo output sink accepts at most one effective application; with no Android plugin it uses an explicit androidAppDirectory or the legacy directory fallback.
Legacy Android application directory string. Prefer androidAppDirectory; retained as a compatibility fallback for builds without an application plugin.
Fraction of the Android adaptive-icon canvas (108dp) that the foreground is scaled to. The FG is centred on a transparent canvas at this size, so smaller values mean more padding and less chance of the launcher's mask clipping corners.
Solid-colour background, as a hex string #RRGGBB or #AARRGGBB (Android convention — alpha first). Used in place of a BG PNG when the background is just a flat colour. A semi-transparent colour is flattened over white on both platforms (with a warning) so Android and iOS match.
Background layer of the app logo, preferably a square PNG. Alpha is allowed but the BG should be effectively opaque — any transparency reads as white on the iOS flattened output. A flat-colour PNG works fine.
Foreground layer of the app logo, preferably a square PNG with an alpha channel. Designed naturally — fill the canvas like an iOS marketing icon. The plugin handles Android's adaptive-icon safe zone automatically by centring the FG at appLogoAndroidSafeZoneRatio of the adaptive canvas (default 66/108 ~61.1%); for iOS and Android legacy fallbacks, the FG is aspect-fit into each platform's target canvas. A non-square source is contained (never stretched).
Copy a user-owned text target to <file>.kitessot.bak before its first rewrite and preserve first-contact iOS AppIcon files in the checksummed durable .kitessot/recovery area outside build/. Default true. Android legacy takeover always uses its checksummed recovery area when cleanupLegacyLogoArtifacts is enabled.
Runtime build-config codegen. See KiteSsotBuildConfigExtension. Accessed as kiteSsot { buildConfig { enabled = true } }. Created as a child extension by KiteSsotPlugin.apply for the same reason as ios / android / web.
Reverse-DNS identifier stem used by androidApplicationId and iosBundleId. Platform suffixes are appended literally and the resolved identifiers are validated before a consuming adapter or migration runs.
Canonical, de-duplicated supported resource-locale model used by every renderer.
Authorize takeover of pre-FG/BG artefacts, template collisions, and—before the first ownership manifest—unowned paths the current Android installer will claim. Default false. A complete enabled replacement logo is required. When true, kiteSsotSyncAndroidLogo validates/renders the replacement first, then backs up, takes over, and installs in one rollback-capable operation. kiteSsotCleanupLegacyAppLogoArtifacts remains an explicit backup/removal task for manual recovery workflows.
Optional explicit Compose resources directory used for locale discovery.
Preview switch for explicitly invoked migration/install tasks. Text tasks render unified-style diffs and binary installers list planned paths without writing. Generated build outputs ignore this flag. Prefer the read-only kiteSsotPlan task for an initial overview.
Extra opt-in marker FQNs appended to the interop defaults in the same explicitly selected Native compilation scope, e.g. extraOptIns.add("kotlin.experimental.ExperimentalObjCRefinement").
Apply Android packaging resource filters derived from locales. Dangerous optimization; default false.
Exact KMP project paths eligible for Native compiler-policy propagation. Empty falls back to resolvedSharedProjectPath; ambiguity or no selection is an error when propagateInteropOptIns is enabled.
iOS-only options (Info.plist feature flags). See KiteSsotIosExtension. Accessed as kiteSsot { ios { usesNonExemptEncryption = false } }.
Legacy relative path. Prefer iosAppDirectory.
Typed iOS source tree used for narrowly scoped Swift migration. Defaults to iosApp below the root project.
Typed AppIcon.appiconset installation directory. Defaults to iosApp/iosApp/Assets.xcassets/AppIcon.appiconset below the root project.
Path (relative to root project) to the iOS AppIcon.appiconset directory. Defaults to iosApp/iosApp/Assets.xcassets/AppIcon.appiconset. Override for non-standard Xcode group layouts.
Apple build number (CFBundleVersion): one to three numeric components, with widths 4/2/2 and a positive first component. Deliberately independent from Android versionCodeOverride.
Resolved Apple identifier: bundleIdBase plus iosBundleSuffix.
Suffix appended to bundleIdBase for the iOS bundle id. Unset means no suffix.
Typed source XML Info.plist selected for explicit sanitization. Defaults to iosApp/iosApp/Info.plist below the root project.
Legacy relative path. Prefer iosInfoPlistFile.
Apple marketing version (CFBundleShortVersionString). Defaults to versionName and is Apple-validated when iOS version synchronization is enabled.
Typed source project.pbxproj selected for explicit iOS migration. Defaults to iosApp/iosApp.xcodeproj/project.pbxproj below the root project.
Typed Podfile selected for an explicit shared-module migration. Defaults to iosApp/Podfile below the root project.
Legacy relative path. Prefer iosPodfileFile.
Previous CocoaPods/Swift module identifier for an explicit iOS reference migration. Set together with iosSharedModuleName. The plugin never guesses this value from a Podfile.
Legacy relative path. Prefer iosPbxprojFile.
New CocoaPods/Swift module identifier for an explicit iOS reference migration. Set together with iosPreviousSharedModuleName. This is an identifier, not a Gradle project path or filesystem directory.
Java source/target compatibility for classic AGP application/library modules, plus root-global Kotlin JVM target alignment where KGP is visible. The alignment reaches every detected project applying Kotlin Multiplatform, Kotlin/JVM, or Kotlin Android and is not scoped by application, shared, interop, or web selectors. AGP's KMP-native Android library DSL exposes no Java compileOptions, so only its Kotlin compilation can be configured by that module. No default.
Canonical platform-resource locale tags: 2–3 letter language with optional script, region, and variants. General BCP-47 extensions/private-use tags do not map consistently across Android/Xcode and are rejected. Legacy Android qualifiers are accepted and normalized. Defaults to discovery of exact locale-only resource directories (values-en, values-pt-rBR, or values-b+sr+Latn) when a shared project/directory can be resolved. Configuration accepts at most 1,000 entries, each at most 255 characters, before canonicalization.
Legacy compatibility input for iosPreviousSharedModuleName. New builds should use the semantically scoped iOS property instead.
Propagate the android { } SDK knobs (compileSdk/minSdk/targetSdk/ndkVersion). Default true.
Propagate a present appName to selected platform consumers. Default true.
Propagate resolved platform bundle/application identifiers. Default true.
Propagate the interop opt-in markers (ExperimentalForeignApi, ExperimentalObjCName, ExperimentalNativeApi) to Kotlin/Native compilations in interopProjectPaths (or the selected shared project). Default false. Add your own via extraOptIns.
Add requested locale metadata to enabled platform consumers. Default true.
Enable explicitly invoked logo installers. Default false. Android requires this toggle alone; the Apple installer additionally requires syncIos.
Enable the explicit Podfile/Swift shared-module reference migration under syncIos. Default false.
Propagate present platform release versions and build numbers. Default true.
Effective absolute shared-project selector, including the legacy module-name fallback.
Ensure the iOS Info.plist has the SSOT-pointing keys the sync task relies on. Effective only with syncIos. Default false. Run explicitly after reviewing the plan/check output.
Legacy shared module directory/name. Optional. Prefer sharedProjectPath and composeResourcesDirectory when directory, Gradle project, CocoaPod, and Swift framework names differ.
Absolute Gradle project path that owns shared/common generated source, for example :shared.
versionCode: validated versionCodeOverride when set, otherwise derived from versionName via "1" + three zero-padded dot segments. The derivation requires exactly three canonical numeric components in 0..999 (see deriveVersionCode).
Explicit Android versionCode. When set, it is used verbatim and the derivation from versionName is bypassed. Set this when versionName is not a plain numeric x.y.z or when you want full control. Values are validated against Google Play's 1..2_100_000_000 range.
Cross-platform human-readable release version. Android uses it as versionName; Apple iosMarketingVersion defaults to it. Canonical numeric x.y.z is also required when deriving versionCode. When an enabled consumer uses the value, it must be non-blank, contain no control characters, and contain at most 255 characters.
Browser Kotlin/JS options. wasmJs and Node-only targets are unsupported. See KiteSsotWebExtension. Accessed as kiteSsot { web { generateIoWorker = true } }. Created as a child extension by KiteSsotPlugin.apply for the same reason as ios / android.
Functions
Configure the nested Android SDK/release model.
Configure optional common Kotlin constants generation.
Configure the nested Apple-specific model.
Configure optional browser Kotlin/JS source generation.