Senior Mobile
borghei/Claude-Skills
A skill your agent uses when the user asks to "build a mobile app", "scaffold React Native project", "create SwiftUI views", "set up Jetpack Compose", "optimize mobile performance", "configure Expo…
A skill your agent uses to generate and measure Jetpack Compose Baseline Profiles end-to-end with the AGP 8.2+ Baseline Profile Generator module and the Macrobenchmark harness.
$ npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install rosuH/EasyWatermark generating-baseline-profiles --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/generating-baseline-profiles .claude/skills/generating-baseline-profiles && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "generating-baseline-profiles" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/generating-baseline-profiles into .claude/skills/generating-baseline-profiles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generating-baseline-profiles", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/generating-baseline-profilesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install rosuH/EasyWatermark generating-baseline-profiles --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/generating-baseline-profiles .agents/skills/generating-baseline-profiles && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "generating-baseline-profiles" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/generating-baseline-profiles into .agents/skills/generating-baseline-profiles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generating-baseline-profiles", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install rosuH/EasyWatermark generating-baseline-profiles --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/generating-baseline-profiles .cursor/skills/generating-baseline-profiles && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "generating-baseline-profiles" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/generating-baseline-profiles into .cursor/skills/generating-baseline-profiles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generating-baseline-profiles", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/rosuH/EasyWatermark.git --path .agents/skills/generating-baseline-profiles--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install rosuH/EasyWatermark generating-baseline-profiles --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/generating-baseline-profiles .gemini/skills/generating-baseline-profiles && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "generating-baseline-profiles" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/generating-baseline-profiles into .gemini/skills/generating-baseline-profiles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generating-baseline-profiles", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install rosuH/EasyWatermark generating-baseline-profilesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/generating-baseline-profiles .github/skills/generating-baseline-profiles && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "generating-baseline-profiles" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/generating-baseline-profiles into .github/skills/generating-baseline-profiles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generating-baseline-profiles", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install rosuH/EasyWatermark generating-baseline-profiles --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rosuH/EasyWatermark.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/generating-baseline-profiles .opencode/skills/generating-baseline-profiles && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "generating-baseline-profiles" agent skill from https://github.com/rosuH/EasyWatermark/tree/master/.agents/skills/generating-baseline-profiles into .opencode/skills/generating-baseline-profiles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generating-baseline-profiles", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
generating-baseline-profilesA skill your agent uses to generate and measure Jetpack Compose Baseline Profiles end-to-end with the AGP 8.2+ Baseline Profile Generator module and the Macrobenchmark harness.
Generating Baseline Profiles is an agent skill from rosuH/EasyWatermark. Use this skill to generate and measure Jetpack Compose Baseline Profiles end-to-end with the AGP 8.2+ Baseline Profile Generator module and the Macrobenchmark harness. Covers writing the BaselineProfileRule journey for cold startup plus first-scroll, generating baseline-prof.txt, verifying it shipped at assets/dexopt/baseline.prof, measuring with MacrobenchmarkRule under CompilationMode.Partial(BaselineProfileMode.Require), and emitting accurate time-to-fully-drawn via ReportDrawn / ReportDrawnWhen /…
Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/macrobenchmark-harness.md`).
It sits in Mobile, covering App store release, Android development and Mobile performance. It works with Android and Jetpack Compose. The repository describes itself as: 🔒 🖼 Securely, easily add a watermark to your sensitive photos. 安全、简单地为你的敏感照片添加水印,防止被人泄露、利用. The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 61223db. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are kotlin and bash).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
developer.android.commedium.comgetstream.ioFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Generating Baseline Profiles loads about 5k tokens when it runs, and up to ~7.8k if it reads all its reference files. Until then it costs about 241 tokens; SKILL.md has 1,407 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from rosuH/EasyWatermark at commit 61223db, republished under its Apache-2.0 licence (© rosuH). 1,407 words, ~5,020 tokens.
.claude/skills/generating-baseline-profiles/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Baseline Profiles ship an AOT compilation hint list inside the APK so ART pre-compiles hot Compose code paths on install instead of relying on JIT during the first runs. Cited gains: roughly 30% faster cold startup and 40% smoother first-scroll on the journeys that were profiled. Compose ships unbundled from the platform, so every Compose UI app benefits — there is no version of Android where Compose is already AOT-compiled by the system image.
This skill is the measurement spine for the rest of the performance work. Profiles are generated with BaselineProfileRule from androidx.benchmark:benchmark-macro-junit4 and measured with MacrobenchmarkRule from the same artifact. Generation and measurement are two distinct @Test files in a separate :baselineprofile module that AGP 8.2+ scaffolds via New Module → Baseline Profile Generator.
LazyColumn / LazyVerticalGrid is janky on real devices even after stability fixes.aosp_cf_x86_64_phone-userdebug, or "ReportDrawn".../../recomposition/debugging-recompositions/SKILL.md (debug Layout Inspector) or ../tracing-recompositions-at-runtime/SKILL.md (release @TraceRecomposition).../../stability/enforcing-stability-in-ci/SKILL.md. Baseline Profiles measure runtime; stabilityCheck measures compile-time skippability.../testing-compose-in-release-mode/SKILL.md.androidx.baselineprofile Gradle plugin and a :baselineprofile module).aosp_cf_x86_64_phone-userdebug). High-end pixel devices mask perf wins; emulators with default API images are not representative.isMinifyEnabled = true, isShrinkResources = true, proguard-android-optimize.txt). Debug builds are not measurable. See ../../build/configuring-r8-for-compose/SKILL.md for R8 setup if missing.<profileable android:shell="true"/> in the app AndroidManifest.xml under <application> so the Macrobenchmark process can attach simpleperf. The android: namespace prefix is required — without it, manifest merger fails.../../stability/diagnosing-compose-stability/SKILL.md and ../../recomposition/debugging-recompositions/SKILL.md if startup is dominated by avoidable recomposition rather than initial composition.In Android Studio: File → New → New Module → Baseline Profile Generator. Pick the target application module. AGP scaffolds:
:baselineprofile module with the androidx.baselineprofile Gradle plugin applied.BaselineProfileGenerator.kt skeleton with a BaselineProfileRule @Test.StartupBenchmarks.kt skeleton with a MacrobenchmarkRule @Test.androidx.baselineprofile plugin applied in the app module too, so ./gradlew :app:generateBaselineProfile is wired up.If editing manually instead of using the template, add to :baselineprofile/build.gradle.kts:
plugins {
id("com.android.test")
id("org.jetbrains.kotlin.android")
id("androidx.baselineprofile")
}
android { targetProjectPath = ":app" }
dependencies {
implementation("androidx.benchmark:benchmark-macro-junit4:1.3.0")
implementation("androidx.test.ext:junit:1.2.1")
implementation("androidx.test.uiautomator:uiautomator:2.3.0")
implementation("androidx.test.espresso:espresso-core:3.6.1")
}And to :app/build.gradle.kts:
plugins { id("androidx.baselineprofile") }
dependencies { baselineProfile(project(":baselineprofile")) }See references/macrobenchmark-harness.md for the full Gradle + manifest setup including <profileable>.
The generator is a @Test using BaselineProfileRule.collect. MUST cover startup plus at least one scroll — startup-only profiles leave first-scroll cold.
@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
@get:Rule val rule = BaselineProfileRule()
@Test
fun startupAndScroll() = rule.collect(packageName = "com.example") {
startActivityAndWait()
val feed = device.findObject(By.res("feed"))
feed.setGestureMargin(device.displayWidth / 5)
feed.fling(Direction.DOWN)
feed.fling(Direction.DOWN)
device.findObject(By.res("feed_item_0"))?.click()
device.wait(Until.hasObject(By.res("detail")), 3_000)
device.pressBack()
}
}Use Modifier.testTag("feed") in the Compose source so By.res("feed") resolves. A gesture margin of displayWidth / 5 keeps flings off the system gesture area.
./gradlew :app:generateBaselineProfileFor a specific variant: ./gradlew :app:generateReleaseBaselineProfile.
Output lands at:
app/src/<variant>/generated/baselineProfiles/baseline-prof.txt(e.g. app/src/release/generated/baselineProfiles/baseline-prof.txt. On older AGP layouts the file may instead land at app/src/main/generated/baselineProfiles/baseline-prof.txt — AGP writes the variant-specific path; merge to main for shipping if all variants share a profile.)
Build → Analyze APK on the release .apk / .aab and confirm:
assets/dexopt/baseline.prof
assets/dexopt/baseline.profmIf those files are missing, the profile was generated but not packaged — usually because baselineProfile(project(":baselineprofile")) was not added to the app module's dependencies. Without these files in the APK, ART has nothing to AOT-compile and the perf gain is zero.
A separate @Test, in the same :baselineprofile module, using MacrobenchmarkRule. The compilation mode must be CompilationMode.Partial(BaselineProfileMode.Require) so the test fails loudly if the profile is missing rather than silently measuring an unprofiled build.
@RunWith(AndroidJUnit4::class)
class StartupBenchmarks {
@get:Rule val rule = MacrobenchmarkRule()
@Test
fun startupCompilationBaselineProfiles() = rule.measureRepeated(
packageName = "com.example",
metrics = listOf(StartupTimingMetric()),
iterations = 10,
startupMode = StartupMode.COLD,
compilationMode = CompilationMode.Partial(BaselineProfileMode.Require),
) {
pressHome()
startActivityAndWait()
}
}For an A/B comparison, add a sibling @Test with compilationMode = CompilationMode.None and compare medians. This is the only way to prove the profile moved the number.
@Test
fun feedScrollPerformance() = rule.measureRepeated(
packageName = "com.example",
metrics = listOf(FrameTimingMetric()),
iterations = 5,
compilationMode = CompilationMode.Partial(BaselineProfileMode.Require),
) {
startActivityAndWait()
val feed = device.findObject(By.res("feed"))
feed.setGestureMargin(device.displayWidth / 5)
feed.fling(Direction.DOWN)
feed.fling(Direction.DOWN)
}FrameTimingMetric reports frameDurationCpuMs percentiles (P50 / P90 / P95 / P99) and frameOverrunMs (negative = on time, positive = missed deadline). The headline number is P95 frameOverrunMs — the worst-case missed-deadline frame in the high tail of a scroll.
StartupTimingMetric reports timeToInitialDisplay by default. For timeToFullDisplay (TTFD) — the number that actually matches user perception — the app must call ReportDrawn once the first meaningful screen state is rendered. Without it, TTFD falls back to timeToInitialDisplay and undercounts.
import androidx.activity.compose.ReportDrawn
import androidx.activity.compose.ReportDrawnWhen
import androidx.activity.compose.ReportDrawnAfter
@Composable
fun Feed(state: FeedState) {
ReportDrawnWhen { state.items.isNotEmpty() }
LazyColumn { items(state.items, key = { it.id }) { SnackRow(it) } }
}ReportDrawn — fire immediately on composition (use when the first frame is the meaningful frame).ReportDrawnWhen { predicate } — fire when the predicate first turns true (typical case: state hydrated).ReportDrawnAfter { suspend block } — fire after the suspend block completes (typical case: an explicit awaitFirstFrame()).Run on a connected physical device or aosp_cf_x86_64_phone-userdebug Cuttlefish via ./gradlew :baselineprofile:connectedReleaseAndroidTest. Report medians across iterations, not means — Macrobenchmark logs both, and means are sensitive to a single thermal-throttled run. The IDE displays a result table; the JSON lives at :baselineprofile/build/outputs/connected_android_test_additional_output/.
See references/macrobenchmark-harness.md for parsing the JSON in CI.
// WRONG
@Test fun startup() = rule.collect(packageName = "com.example") {
startActivityAndWait()
}
// WRONG because: only the startup code paths get AOT-compiled. First-scroll, list-item
// composition, and detail-screen entry stay interpreted on first run, which is exactly
// where the user perceives jank. Profile every hot user journey, not just launch.// RIGHT
@Test fun startupAndScroll() = rule.collect(packageName = "com.example") {
startActivityAndWait()
val feed = device.findObject(By.res("feed"))
feed.setGestureMargin(device.displayWidth / 5)
feed.fling(Direction.DOWN)
feed.fling(Direction.DOWN)
}// WRONG
compilationMode = CompilationMode.Partial(BaselineProfileMode.UseIfAvailable)
// WRONG because: UseIfAvailable silently falls back to no profile if assets/dexopt/baseline.prof
// is missing. The Macrobench then measures an unprofiled build and the developer thinks
// the profile is working when it is not. Use Require to fail loudly.// RIGHT
compilationMode = CompilationMode.Partial(BaselineProfileMode.Require)// WRONG
@Composable
fun Feed(state: FeedState) {
LazyColumn { items(state.items) { SnackRow(it) } }
}
// WRONG because: TTFD is reported when the first frame draws. An empty LazyColumn draws
// a frame too — TTFD then matches timeToInitialDisplay and undercounts the time the user
// actually waited for content. Add ReportDrawnWhen { state.items.isNotEmpty() }.// RIGHT
@Composable
fun Feed(state: FeedState) {
ReportDrawnWhen { state.items.isNotEmpty() }
LazyColumn { items(state.items, key = { it.id }) { SnackRow(it) } }
}# WRONG
"./gradlew :app:installDebug && adb shell am start … && record startup with systrace"
# WRONG because: debug builds run Compose interpreted, with Live Literals turning constants
# into getters that defeat compile-time folding. Cold-start numbers are inflated 2–4×;
# scroll FrameTiming numbers are dominated by the interpreter overhead, not by the code.
# Measurement only counts on release + R8 + real device. Cross-link
# ../testing-compose-in-release-mode/SKILL.md.# RIGHT
"./gradlew :baselineprofile:connectedReleaseAndroidTest" on a physical device, with
release variant minified, baseline profile generated, BaselineProfileMode.Require asserting it.# WRONG
"Mean cold startup with profile: 412 ms (5 iterations)."
# WRONG because: a single thermal-throttled iteration drags the mean. Macrobenchmark
# reports min / median / max; the median is the resilient summary. 5 iterations is also
# thin for startup variance — use ≥10 for StartupTimingMetric, ≥5 for FrameTimingMetric.# RIGHT
"Median cold startup, 10 iterations: BaselineProfile 318 ms vs None 462 ms (–31%).
P95 frameOverrunMs scrolling 30 items: BaselineProfile –6 ms vs None +9 ms."// WRONG
val feed = device.findObject(By.res("feed"))
feed.fling(Direction.DOWN)
// WRONG because: on gesture-nav devices, a fling that starts inside the system gesture area
// is intercepted as a back-swipe or recents-swipe and the scroll never happens.
// Macrobenchmark then measures an idle screen and reports artificially-good numbers.// RIGHT
val feed = device.findObject(By.res("feed"))
feed.setGestureMargin(device.displayWidth / 5)
feed.fling(Direction.DOWN)aosp_cf_x86_64_phone-userdebug Cuttlefish. High-end devices mask the perf delta; default API emulator images are not representative.CompilationMode.Partial(BaselineProfileMode.Require) in the measurement test so a missing or stale profile fails the test loudly. BaselineProfileMode.UseIfAvailable silently measures an unprofiled build.ReportDrawn / ReportDrawnWhen / ReportDrawnAfter from androidx.activity.compose to mark the meaningful first-drawn moment. Without it timeToFullDisplay undercounts.../testing-compose-in-release-mode/SKILL.md.assets/dexopt/baseline.prof must exist after ./gradlew :app:assembleRelease. If absent, the baselineProfile(project(":baselineprofile")) wiring on the app module is missing.StartupTimingMetric, ≥5 for FrameTimingMetric.CompilationMode.None so every PR can prove the profile is still moving the number.Modifier.testTag("feed") (or whatever ID the journey uses) in the Compose source rather than relying on text matchers — text changes with localization, test tags do not.:baselineprofile module exists with the androidx.baselineprofile plugin applied.:app/build.gradle.kts has baselineProfile(project(":baselineprofile")) in dependencies../gradlew :app:generateBaselineProfile produces baseline-prof.txt under app/src/<variant>/generated/baselineProfiles/ (or app/src/main/generated/baselineProfiles/).assets/dexopt/baseline.prof and assets/dexopt/baseline.profm.@Test covers cold startup AND at least one scroll fling.@Test uses CompilationMode.Partial(BaselineProfileMode.Require).ReportDrawn / ReportDrawnWhen / ReportDrawnAfter is invoked from a composable that renders only when the screen is meaningfully complete.CompilationMode.None.aosp_cf_x86_64_phone-userdebug, not a stock API emulator.androidx.activity.compose.ReportDrawn reference — https://developer.android.com/reference/kotlin/androidx/activity/compose/package-summaryreferences/macrobenchmark-harness.md — full Gradle + manifest harness setup, the metric catalogue (StartupTimingMetric, FrameTimingMetric, TraceSectionMetric, MemoryUsageMetric, PowerMetric), and how to parse the JSON output for CI dashboards.For confirming that a generated profile actually moved the recomposition count of a specific composable in release, see ../tracing-recompositions-at-runtime/SKILL.md. For why debug numbers are not measurement evidence, see ../testing-compose-in-release-mode/SKILL.md. For the build-time R8 setup that release measurement assumes, see ../../build/configuring-r8-for-compose/SKILL.md. For preventing stability regressions between profile-generation runs, see ../../stability/enforcing-stability-in-ci/SKILL.md.
© rosuH, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .agents/skills/generating-baseline-profiles of rosuH/EasyWatermark.
Open the folder on GitHubat commit 61223db
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in rosuH/EasyWatermark, which our catalogue first saw on October 7, 2026.
Generating Baseline Profiles next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Generating Baseline Profiles this skillrosuH/EasyWatermark | 1.9k | 1 repos | ~5k | Automated safety check: Pass | Apache-2.0 | |
| Senior Mobileborghei/Claude-Skills | 881 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Android App FactoryJasonColapietro/suede-creator-skills | 127 | — | ~2.6k | Automated safety check: Pass | MIT | |
| Android Designhashgraph-online/awesome-codex-plugins | 1.2k | — | ~2.5k | Automated safety check: Pass | Apache-2.0 | |
| Android Readme Screenshot Studiopermissionlesstech/bitchat-android | 7.8k | — | ~3k | Automated safety check: Pass | GPL-3.0 | |
| Compose Multiplatform Patternsmonta-app/ocpp-emulator | 180 | 5 repos | ~2k | Automated safety check: Pass | Apache-2.0 |
borghei/Claude-Skills
A skill your agent uses when the user asks to "build a mobile app", "scaffold React Native project", "create SwiftUI views", "set up Jetpack Compose", "optimize mobile performance", "configure Expo…
JasonColapietro/suede-creator-skills
Takes a native Android app from product idea to Google Play release, covering Compose architecture, policy checks, privacy, billing, testing, signing and rollout.
hashgraph-online/awesome-codex-plugins
A skill your agent uses when the user asks for an Android app, Compose UI, Material 3, Material You, Material 3 Expressive, Pixel-style app, foldable/adaptive layout, Play Store deliverable, React…
permissionlesstech/bitchat-android
Create or refresh polished, high-resolution screenshots of the Bitchat Android app for README and repository showcase use.
monta-app/ocpp-emulator
Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.
dpconde/claude-android-skill
Create production-quality Android applications following Google's official architecture guidance and NowInAndroid best practices.
rosuH/EasyWatermark
A skill your agent uses to push frequently-changing Jetpack Compose state reads (scroll position, animation values, drag offsets) out of the Composition phase and down into Layout or Draw using…
rosuH/EasyWatermark
A skill your agent uses to diagnose Jetpack Compose stability problems by enabling and reading the Compose Compiler Reports (classes.txt, composables.txt, composables.csv, module.json).
rosuH/EasyWatermark
A skill your agent uses to author new custom Jetpack Compose modifiers and migrate legacy ones from Modifier.composed { } to Modifier.Node + ModifierNodeElement<T.
rosuH/EasyWatermark
Analyzes Android codebases to implement ML Kit GenAI Prompt API.
rosuH/EasyWatermark
A skill your agent uses to fix unstable Jetpack Compose types once a stability diagnosis has identified them.
rosuH/EasyWatermark
A skill your agent uses to explain why the Compose compiler classified a class or composable parameter as stable, runtime, unknown, or unstable.
Works with
Categories
A skill your agent uses to generate and measure Jetpack Compose Baseline Profiles end-to-end with the AGP 8.2+ Baseline Profile Generator module and the Macrobenchmark harness. Generating Baseline Profiles is an agent skill from rosuH/EasyWatermark.2+ Baseline Profile Generator module and the Macrobenchmark harness.
Generating Baseline Profiles fits situations like: the user mentions baseline profile; slow cold startup; first-scroll jank; startupTimingMetric.
Run `npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a claude-code`. Or copy the skill folder (.agents/skills/generating-baseline-profiles in rosuH/EasyWatermark) into .claude/skills/generating-baseline-profiles in your project. Claude Code loads it when a task matches its description.
Run `npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a codex`. Or copy the skill folder (.agents/skills/generating-baseline-profiles in rosuH/EasyWatermark) into .agents/skills/generating-baseline-profiles in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add rosuH/EasyWatermark --skill generating-baseline-profiles -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/generating-baseline-profiles, .gemini/skills/generating-baseline-profiles, .github/skills/generating-baseline-profiles and .opencode/skills/generating-baseline-profiles in your project.
SKILL.md names no scripts, command-line tools or credentials: Generating Baseline Profiles is instructions for the agent only.
SKILL.md names 3 domains. As links in the text: developer.android.com, medium.com and getstream.io. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Generating Baseline Profiles is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Generating Baseline Profiles: Senior Mobile (borghei/Claude-Skills, 881 stars), Android App Factory (JasonColapietro/suede-creator-skills, 127 stars), Android Design (hashgraph-online/awesome-codex-plugins, 1.2k stars) and Android Readme Screenshot Studio (permissionlesstech/bitchat-android, 7.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
rosuH (a GitHub user) maintains it in rosuH/EasyWatermark, which has 1,894 GitHub stars. The repository holds 28 skills in this directory. The repository was last updated on October 6, 2026.
Source: rosuH/EasyWatermark on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.