Rank
70
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Crawler Summary
Guide and review the preparation of a Kotlin Multiplatform (KMP) project for Google Play Store release. Covers module detection, keystore generation, signing configuration, ProGuard/R8 with consumerProguardFiles, variant alignment, and AAB build. Use when the user wants to publish, release, deploy, sign, or prepare a KMP app for Play Store, or when they mention "composeApp bundleRelease", "KMP release", "play store kmp", "Compose Multiplatform release", "shared module variant", or "androidApp bundleRelease". --- name: playstore-kmp description: > Guide and review the preparation of a Kotlin Multiplatform (KMP) project for Google Play Store release. Covers module detection, keystore generation, signing configuration, ProGuard/R8 with consumerProguardFiles, variant alignment, and AAB build. Use when the user wants to publish, release, deploy, sign, or prepare a KMP app for Play Store, or when they mention "composeApp bundl Capability contract not published. No trust telemetry is available yet. Last updated 4/15/2026.
Freshness
Last checked 4/15/2026
Best For
playstore-kmp is best for general automation workflows where OpenClaw compatibility matters.
Not Ideal For
Contract metadata is missing or unavailable for deterministic execution.
Evidence Sources Checked
editorial-content, GITHUB OPENCLEW, runtime-metrics, public facts pack
Guide and review the preparation of a Kotlin Multiplatform (KMP) project for Google Play Store release. Covers module detection, keystore generation, signing configuration, ProGuard/R8 with consumerProguardFiles, variant alignment, and AAB build. Use when the user wants to publish, release, deploy, sign, or prepare a KMP app for Play Store, or when they mention "composeApp bundleRelease", "KMP release", "play store kmp", "Compose Multiplatform release", "shared module variant", or "androidApp bundleRelease". --- name: playstore-kmp description: > Guide and review the preparation of a Kotlin Multiplatform (KMP) project for Google Play Store release. Covers module detection, keystore generation, signing configuration, ProGuard/R8 with consumerProguardFiles, variant alignment, and AAB build. Use when the user wants to publish, release, deploy, sign, or prepare a KMP app for Play Store, or when they mention "composeApp bundl
Public facts
4
Change events
1
Artifacts
0
Freshness
Apr 15, 2026
Capability contract not published. No trust telemetry is available yet. Last updated 4/15/2026.
Trust score
Unknown
Compatibility
OpenClaw
Freshness
Apr 15, 2026
Vendor
Tacuchi
Artifacts
0
Benchmarks
0
Last release
Unpublished
Key links, install path, and a quick operational read before the deeper crawl record.
Summary
Capability contract not published. No trust telemetry is available yet. Last updated 4/15/2026.
Setup snapshot
git clone https://github.com/Tacuchi/playstore-kmp.gitSetup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.
Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Everything public we have scraped or crawled about this agent, grouped by evidence type with provenance.
Vendor
Tacuchi
Protocol compatibility
OpenClaw
Handshake status
UNKNOWN
Crawlable docs
6 indexed pages on the official domain
Merged public release, docs, artifact, benchmark, pricing, and trust refresh events.
Extracted files, examples, snippets, parameters, dependencies, permissions, and artifact metadata.
Extracted files
0
Examples
6
Snippets
0
Languages
typescript
Parameters
bash
keytool -genkeypair \ -alias upload \ -keyalg RSA -keysize 2048 \ -validity 10000 \ -storetype PKCS12 \ -keystore upload-keystore.jks
properties
storePassword=<password> keyPassword=<same-password-as-store> keyAlias=upload storeFile=<absolute-or-relative-path-to-upload-keystore.jks>
gitignore
keystore.properties *.jks *.keystore local.properties
kotlin
import java.util.Properties
import java.io.FileInputStream
val keystoreProperties = Properties().apply {
val file = rootProject.file("keystore.properties")
if (file.exists()) load(FileInputStream(file))
}
android {
signingConfigs {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}kotlin
// In shared/build.gradle.kts
android {
defaultConfig {
consumerProguardFiles("consumer-rules.pro")
}
}proguard
# Kotlin (always needed with minification)
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
# Coroutines
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembers class kotlinx.coroutines.** { volatile <fields>; }
# kotlinx.serialization
-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt
-keepclassmembers class kotlinx.serialization.json.** { *** Companion; }
-keep,includedescriptorclasses class **$$serializer { *; }
-keepclassmembers class * { @kotlinx.serialization.Serializable *; }
# Ktor Client (engine loaded via ServiceLoader — R8 strips it)
-keep class io.ktor.** { *; }
-dontwarn io.ktor.**
-keep class io.ktor.client.engine.** { *; }
# kotlinx.datetime (JVM implementation classes stripped by R8)
-keep class kotlinx.datetime.** { *; }
-dontwarn kotlinx.datetime.**Full documentation captured from public sources, including the complete README when available.
Docs source
GITHUB OPENCLEW
Editorial quality
ready
Guide and review the preparation of a Kotlin Multiplatform (KMP) project for Google Play Store release. Covers module detection, keystore generation, signing configuration, ProGuard/R8 with consumerProguardFiles, variant alignment, and AAB build. Use when the user wants to publish, release, deploy, sign, or prepare a KMP app for Play Store, or when they mention "composeApp bundleRelease", "KMP release", "play store kmp", "Compose Multiplatform release", "shared module variant", or "androidApp bundleRelease". --- name: playstore-kmp description: > Guide and review the preparation of a Kotlin Multiplatform (KMP) project for Google Play Store release. Covers module detection, keystore generation, signing configuration, ProGuard/R8 with consumerProguardFiles, variant alignment, and AAB build. Use when the user wants to publish, release, deploy, sign, or prepare a KMP app for Play Store, or when they mention "composeApp bundl
Build a signed Android App Bundle (AAB) from a KMP project, ready for Google Play Store.
KMP release is fundamentally a multi-module problem. Assess the structure BEFORE touching any files:
Which is the Android module? Look for the directory containing an android {} block with applicationId:
composeApp/ → Compose Multiplatform template (KMP Wizard default)androidApp/ → Classic KMP templatesettings.gradle.kts for include(":moduleName")Shared module structure? Check for modules that the Android module depends on:
android {} with libraryNamespace → It's a KMP library module; needs consumerProguardFilesandroid {} → Pure common code; no ProGuard concerns from this moduleVariant alignment? Check if shared/library modules define release build type:
release build type → Variants will match, no action neededrelease → Android module fails with "Could not resolve :shared variant"matchingFallbacks += listOf("release", "debug") in consuming moduleKMP libraries in use? Check shared module dependencies:
Existing keystore? Ask the user before generating a new one
.jks → Reuse it, skip Step 1AGP + Kotlin version compatibility? Check libs.versions.toml:
| Step | Action | Key file |
|------|--------|----------|
| 1 | Generate upload keystore | upload-keystore.jks |
| 2 | Create credentials file | keystore.properties |
| 3 | Configure signing in Android module | <module>/build.gradle.kts |
| 4 | Configure ProGuard / R8 (by module) | <module>/proguard-rules.pro + shared/consumer-rules.pro |
| 5 | Build release AAB | CLI |
| 6 | Verify output | CLI + checklist |
keytool -genkeypair \
-alias upload \
-keyalg RSA -keysize 2048 \
-validity 10000 \
-storetype PKCS12 \
-keystore upload-keystore.jks
Critical details:
-validity 10000 = ~27 years. Google requires validity beyond Oct 22 2033.-storetype PKCS12 — avoids JKS migration warnings. But with PKCS12, store password and key password must be identical. keytool silently uses the store password for the key. Different passwords → signing fails later with misleading "Cannot recover key" error..jks outside the project. Recommended: ~/.android/keystores/ or a secrets manager.Create keystore.properties in the project root (must NOT be committed):
storePassword=<password>
keyPassword=<same-password-as-store>
keyAlias=upload
storeFile=<absolute-or-relative-path-to-upload-keystore.jks>
Add to .gitignore:
keystore.properties
*.jks
*.keystore
local.properties
KMP is Kotlin DSL only (.gradle.kts). Claude knows Gradle signing config syntax. These are the KMP-specific traps:
android {} block lives in the Android module (composeApp/ or androidApp/), NOT in root build.gradle.kts. KMP root build file typically only applies plugins.rootProject.file() scope: keystore.properties is in project root. From within composeApp/build.gradle.kts, rootProject.file() correctly resolves to root. project.file() would look inside composeApp/.import java.util.Properties
import java.io.FileInputStream
val keystoreProperties = Properties().apply {
val file = rootProject.file("keystore.properties")
if (file.exists()) load(FileInputStream(file))
}
android {
signingConfigs {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
R8 is NOT enabled by default — you must set isMinifyEnabled = true. KMP has a critical multi-module nuance: rules must be in the right module.
| Rule location | Applies to | Use for |
|---------------|-----------|---------|
| composeApp/proguard-rules.pro | Only composeApp's own code | App-level rules, signing config |
| shared/consumer-rules.pro | Propagated to any module that depends on shared | Library code using reflection (Ktor, serialization) |
The Android module's proguard-rules.pro does NOT apply to library modules. If shared/ uses Ktor or kotlinx.serialization, those rules MUST go in shared/consumer-rules.pro:
// In shared/build.gradle.kts
android {
defaultConfig {
consumerProguardFiles("consumer-rules.pro")
}
}
# Kotlin (always needed with minification)
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
# Coroutines
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembers class kotlinx.coroutines.** { volatile <fields>; }
# kotlinx.serialization
-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt
-keepclassmembers class kotlinx.serialization.json.** { *** Companion; }
-keep,includedescriptorclasses class **$$serializer { *; }
-keepclassmembers class * { @kotlinx.serialization.Serializable *; }
# Ktor Client (engine loaded via ServiceLoader — R8 strips it)
-keep class io.ktor.** { *; }
-dontwarn io.ktor.**
-keep class io.ktor.client.engine.** { *; }
# kotlinx.datetime (JVM implementation classes stripped by R8)
-keep class kotlinx.datetime.** { *; }
-dontwarn kotlinx.datetime.**
Error: Could not resolve :shared or No matching variant of :shared was found
This happens when the shared module doesn't define a release build type but the Android module tries to resolve one for bundleRelease.
Fix in the consuming module (preferred — doesn't require modifying shared):
// composeApp/build.gradle.kts
android {
buildTypes {
release {
matchingFallbacks += listOf("release", "debug")
}
}
}
Or fix in the shared module — explicitly declare build types:
// shared/build.gradle.kts
android {
buildTypes {
release { }
debug { }
}
}
# Module name determines the command — use the correct one:
./gradlew :composeApp:bundleRelease
# or
./gradlew :androidApp:bundleRelease
Output path — filename matches the module name, NOT app-release.aab:
composeApp/build/outputs/bundle/release/composeApp-release.aabandroidApp/build/outputs/bundle/release/androidApp-release.aab# Adjust module name in paths below (composeApp or androidApp)
# Verify signing — confirm alias is "upload", NOT "androiddebugkey"
keytool -printcert -jarfile composeApp/build/outputs/bundle/release/composeApp-release.aab
# Verify version (requires bundletool)
bundletool dump manifest --bundle=composeApp/build/outputs/bundle/release/composeApp-release.aab \
| grep -E "versionCode|versionName"
Checklist:
versionCode higher than the previous uploadkeystore.properties and *.jks in .gitignoreisMinifyEnabled = true and isShrinkResources = true both setconsumerProguardFiles configured (if shared uses reflection-heavy libs)NEVER assume output is app-release.aab — KMP output filename matches the module name: composeApp-release.aab or androidApp-release.aab. CI scripts, upload commands, and Fastlane configs that hardcode app-release.aab will silently fail to find the file or upload nothing.
NEVER use Groovy DSL in a KMP project — The KMP Gradle plugin only supports .gradle.kts. A .gradle file in a KMP module silently breaks multiplatform dependency resolution. Do not convert to Groovy, do not mix DSLs.
NEVER put ProGuard rules only in the Android module — Rules in composeApp/proguard-rules.pro only apply to that module's direct code. If shared/ uses Ktor or kotlinx.serialization, the shared module MUST publish its own rules via consumerProguardFiles("consumer-rules.pro"). Otherwise R8 strips shared module classes and the app crashes at runtime with no build-time warning.
NEVER ignore variant mismatch errors — "Could not resolve :shared variant" is NOT a generic Gradle issue. It means the shared module's build types don't align with the Android module. Fix with matchingFallbacks, not by deleting the dependency.
NEVER set different store/key passwords with PKCS12 — keytool silently uses store password for key. Different passwords → signing fails with "Cannot recover key" (misleading — it's a password mismatch).
NEVER skip testing the signed AAB on a real device — R8 stripping in multi-module KMP is invisible until runtime. Ktor engine stripped → network calls crash. Serialization stripped → data parsing crashes. These only manifest in release builds.
| Error | Cause | Fix |
|-------|-------|-----|
| ClassNotFoundException: io.ktor.* at runtime | R8 stripped Ktor engine (ServiceLoader) | Add Ktor -keep rules in shared/consumer-rules.pro |
| kotlinx.serialization crash at runtime | @Serializable serializers stripped by R8 | Add serialization rules in shared consumer-rules |
| Could not resolve :shared variant | Shared module missing release build type | Add matchingFallbacks in consuming module |
| kotlinx.datetime missing at runtime | R8 removed JVM datetime implementation | Add -keep class kotlinx.datetime.** |
| AAB not found by CI/upload script | Script looks for app-release.aab | Use <module>-release.aab (module name as prefix) |
| Missing class: ... during R8 | R8 strips classes used via reflection | Add -keep rules from build error output |
AGP + Kotlin version matrix — KMP requires compatible AGP and Kotlin plugin versions. Mismatches produce cryptic "Cannot find plugin" or "Unsupported metadata version" errors. Always check libs.versions.toml for version alignment. AGP 9/10 introduce breaking changes in the library plugin API.
Multiple shared modules — If the project has core/, data/, domain/ as separate KMP modules, EACH module that uses reflection-heavy libraries needs its own consumerProguardFiles. One missing module = one runtime crash.
App Signing by Google Play — Google re-signs your app with their app signing key. The keystore you generate is the upload key only. If you lose it, request a reset through Play Console (takes days, requires identity verification).
Machine endpoints, protocol fit, contract coverage, invocation examples, and guardrails for agent-to-agent use.
Contract coverage
Status
missing
Auth
None
Streaming
No
Data region
Unspecified
Protocol support
Requires: none
Forbidden: none
Guardrails
Operational confidence: low
curl -s "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/snapshot"
curl -s "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/contract"
curl -s "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/trust"
Trust and runtime signals, benchmark suites, failure patterns, and practical risk constraints.
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Do not use if
Every public screenshot, visual asset, demo link, and owner-provided destination tied to this agent.
Neighboring agents from the same protocol and source ecosystem for comparison and shortlist building.
Rank
70
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Rank
70
AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs
Traction
No public download signal
Freshness
Updated 5d ago
Rank
70
Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!
Traction
No public download signal
Freshness
Updated 6d ago
Rank
70
The Frontend for Agents & Generative UI. React + Angular
Traction
No public download signal
Freshness
Updated 23d ago
Contract JSON
{
"contractStatus": "missing",
"authModes": [],
"requires": [],
"forbidden": [],
"supportsMcp": false,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": null,
"outputSchemaRef": null,
"dataRegion": null,
"contractUpdatedAt": null,
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"OPENCLEW"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "GITHUB_OPENCLEW",
"generatedAt": "2026-04-17T00:50:48.931Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "OPENCLEW",
"type": "protocol",
"support": "unknown",
"confidenceSource": "profile",
"notes": "Listed on profile"
}
],
"flattenedTokens": "protocol:OPENCLEW|unknown|profile"
}Facts JSON
[
{
"factKey": "docs_crawl",
"category": "integration",
"label": "Crawlable docs",
"value": "6 indexed pages on the official domain",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
},
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Tacuchi",
"href": "https://github.com/Tacuchi/playstore-kmp",
"sourceUrl": "https://github.com/Tacuchi/playstore-kmp",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T00:19:44.714Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-04-15T00:19:44.714Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/tacuchi-playstore-kmp/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[
{
"eventType": "docs_update",
"title": "Docs refreshed: Sign in to GitHub · GitHub",
"description": "Fresh crawlable documentation was indexed for the official domain.",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
}
]Sponsored
Ads related to playstore-kmp and adjacent AI workflows.