Official agent skill

Compose UI Control

by JetBrains in JetBrains/skills

Control a running Compose Desktop application via HTTP. An agent skill from JetBrains/skills.

OfficialMITAuto-check passed

Install Compose UI Control

skills CLI
$ npx skills add JetBrains/skills --skill compose-ui-control -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install JetBrains/skills compose-ui-control --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/compose-ui-test-server .claude/skills/compose-ui-control && rm -rf skills-src

Use ~/.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/

Facts

Skill name
compose-ui-control
GitHub stars
364
Token cost
~1.5k tokens
SKILL.md length
339 words
Files
34
Skills in repo
77
Repo updated
First seen
Licence
MIT

At a glance

Control a running Compose Desktop application via HTTP. An agent skill from JetBrains/skills.

  • Works in 3 steps: Add the dependency → Update the main function → Add test tags to UI elements
  • You need to interact with UI elements
  • SKILL.md covers Checking If Already Installed, Installing in a Compose…, Starting the Application and Verifying the Server, plus 5 more sections
  • Runs Batch scripts from its folder; calls curl

What it does

Compose UI Control is an agent skill from JetBrains/skills, published by the product's own GitHub organization. Control a running Compose Desktop application via HTTP. Use when you need to interact with UI elements, click buttons, enter text, wait for elements to appear, or capture screenshots in a Compose Desktop app that has compose-ui-test-server enabled.

Its SKILL.md is about 1.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 38 other files (for example `.github/dependabot.yml`, `.github/workflows/build.yml` and `.github/workflows/junie.yml`).

It works with Gradle and GitHub. The repository describes itself as: Curated agent skills collection verified by JetBrains. The licence is MIT.

When your agent uses it

  • You need to interact with UI elements
  • Wait for elements to appear
  • Capture screenshots in a Compose Desktop app that has compose-ui-test-server enabled

Example prompts

  • “/compose-ui-control”

Workflow steps

3 steps, taken from the step headings in SKILL.md.

  1. Add the dependency
  2. Update the main function
  3. Add test tags to UI elements

What it can do on your machine

Read from SKILL.md and the folder at commit e0f258b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships script files (Batch, from the files we listed), which the agent can run.

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Compose UI Control loads about 1.5k tokens when it runs. Until then it costs about 67 tokens; SKILL.md has 339 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~67
When it runs · the whole SKILL.md, loaded when a task matches
~1.5k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from JetBrains/skills at commit e0f258b, republished under its MIT licence (© JetBrains). 339 words, ~1,535 tokens.

Download SKILL.mdSave it as .claude/skills/compose-ui-control/SKILL.md (or your agent's skills folder). This skill also uses 33 other files; get the full folder from GitHub.
name
compose-ui-control
description
Control a running Compose Desktop application via HTTP. Use when you need to interact with UI elements, click buttons, enter text, wait for elements to appear, or capture screenshots in a Compose Desktop app that has compose-ui-test-server enabled.
argument-hint
[action] [target]
metadata.short-description
Drive Compose Desktop apps over HTTP
metadata.author
Forketyfork
metadata.source
https://github.com/forketyfork/compose-ui-test-server/blob/main/SKILL.md

compose-ui-test-server

A library that enables AI coding agents to control Compose Desktop applications at runtime via HTTP.

Checking If Already Installed

Before setting up, check if the project already has the library:

bash
grep -r "compose-ui-test-server\|composeuittest" --include="*.gradle*" --include="*.kt" .

Look for:

  • Dependency on io.github.forketyfork:compose-ui-test-server
  • Imports from io.github.forketyfork.composeuittest

If found, skip to Starting the Application.

Installing in a Compose Desktop Project

Step 1: Add the dependency

Find the app's build.gradle.kts and locate the desktop source set dependencies. Add compose-ui-test-server and compose.uiTest:

kotlin
kotlin {
    sourceSets {
        val desktopMain by getting {
            dependencies {
                // Existing dependencies...

                // Add these two:
                implementation("io.github.forketyfork:compose-ui-test-server:0.2.0")
                @OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
                implementation(compose.uiTest)
            }
        }
    }
}

For projects using version catalogs, add to gradle/libs.versions.toml:

toml
[libraries]
compose-ui-test-server = { module = "io.github.forketyfork:compose-ui-test-server", version = "0.2.0" }

Then reference in build.gradle.kts:

kotlin
implementation(libs.compose.ui.test.server)
Step 2: Update the main function

Find the application's main() function (usually in Main.kt or similar). Replace the standard Compose Desktop launcher with runApplication:

Before (typical Compose Desktop main):

kotlin
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application

fun main() = application {
    Window(onCloseRequest = ::exitApplication, title = "My App") {
        App()
    }
}

After (with agent control support):

kotlin
import io.github.forketyfork.composeuittest.WindowConfig
import io.github.forketyfork.composeuittest.runApplication

fun main() =
    runApplication(
        windowConfig = WindowConfig(
            title = "My App",
            minimumWidth = 1024,
            minimumHeight = 768,
        ),
    ) {
        App()
    }

The app now runs normally by default, but supports agent control when launched with COMPOSE_UI_TEST_SERVER_ENABLED=true.

Step 3: Add test tags to UI elements

For agents to interact with specific UI elements, add test tags:

kotlin
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag

Button(
    onClick = { /* ... */ },
    modifier = Modifier.testTag("login_button")
) {
    Text("Login")
}

TextField(
    value = username,
    onValueChange = { username = it },
    modifier = Modifier.testTag("username_field")
)

Starting the Application

bash
# Normal mode (no server)
./gradlew run

# Agent-controlled mode (server enabled)
COMPOSE_UI_TEST_SERVER_ENABLED=true ./gradlew run

# With custom port (default is 54345)
COMPOSE_UI_TEST_SERVER_ENABLED=true COMPOSE_UI_TEST_SERVER_PORT=8080 ./gradlew run

Verifying the Server

Always check health first:

bash
curl http://localhost:54345/health
# Expected: "OK"

Available Endpoints

EndpointDescription
GET /healthHealth check
GET /onNodeWithTag/{tag}/performClickClick element by test tag
GET /onNodeWithTag/{tag}/performTextInput?text=...Enter text (URL-encode the text!)
GET /onNodeWithText/{text}/performClickClick element by display text
GET /waitUntilExactlyOneExists/tag/{tag}?timeout=5000Wait for element by tag
GET /waitUntilExactlyOneExists/text/{text}?exact=true&timeout=5000Wait for element by text
GET /waitForIdleWait for UI to stabilize
GET /captureScreenshot?path=screenshot.pngCapture screenshot

Workflow Pattern

Follow this sequence for reliable interactions:

bash
# 1. Verify server is running
curl http://localhost:54345/health

# 2. Wait for UI to be ready
curl http://localhost:54345/waitForIdle

# 3. Perform action
curl "http://localhost:54345/onNodeWithTag/username/performTextInput?text=myuser"

# 4. Wait for UI to settle
curl http://localhost:54345/waitForIdle

# 5. Perform next action
curl http://localhost:54345/onNodeWithTag/login_button/performClick

# 6. Wait for result
curl "http://localhost:54345/waitUntilExactlyOneExists/tag/dashboard?timeout=10000"

# 7. Capture screenshot to verify
curl "http://localhost:54345/captureScreenshot?path=result.png"

Finding Test Tags

Search the codebase for existing test tags:

bash
grep -r "testTag\|Modifier.testTag" --include="*.kt" .

Also check:

  • CLAUDE.md for documented test tags
  • Test files in src/*Test/ directories

Important Notes

  • Always URL-encode special characters in text: space→%20, @→%40, &→%26
  • Use waitForIdle between operations for stability
  • Check HTTP status codes: 200=success, 400=bad request, 500=error
  • Use appropriate timeouts for waits (default 5000ms may be too short)
  • Screenshots require absolute paths

Error Handling

If an endpoint returns an error:

  1. Check the element exists (search for its test tag in code)
  2. Ensure UI has finished loading (waitForIdle)
  3. Verify the server is still running (/health)
  4. Try with a longer timeout for wait operations

© JetBrains, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 33 other files in compose-ui-test-server of JetBrains/skills.

  • SKILL.md
  • .github/dependabot.yml
  • .github/workflows/build.yml
  • .github/workflows/junie.yml
  • .github/workflows/release.yml
  • .gitignore
  • CLAUDE.md
  • LICENSE
  • README.md
  • build.gradle.kts
  • docs/PUBLICATION.md
  • gradle/libs.versions.toml
  • gradle/wrapper/gradle-wrapper.properties
  • gradlew
  • gradlew.bat
  • settings.gradle.kts
  • … and 18 more

Open the folder on GitHubat commit e0f258b

Compare with similar skills

Compose UI Control 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.

Compose UI Control compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Compose UI Control this skillJetBrains/skills364—~1.5kAutomated safety check: PassMIT
Exposed Bug Fix WorkflowJetBrains/Exposed9.3k—~3.8kAutomated safety check: PassApache-2.0
Test Metro LocallyZacSweers/metro1.4k—~1.2kAutomated safety check: PassApache-2.0
Release New Versionniki914/zafiro227—~2kAutomated safety check: PassMIT
Minecraft CI ReleaseJahrome907/minecraft-agent-skills166—~3.6kAutomated safety check: PassMIT
Releasesol4k/sol4k135—~949Automated safety check: PassApache-2.0

Similar skills

  • Exposed Bug Fix Workflow

    JetBrains/Exposed

    Official

    Takes a GitHub or YouTrack issue for the Exposed project through reproduction, a failing test, a fix, validation and a pull request.

    9.3k GitHub stars~3.8k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Test Metro Locally

    ZacSweers/metro

    Publish the current Metro checkout to Maven Local and verify it in an external consumer or reproducer.

    1.4k GitHub stars~1.2k tokensUpdated today
    MobileAuto-check passed
  • Release New Version

    niki914/zafiro

    A skill your agent uses when the user wants to release a new Zafiro version — drafting bilingual release notes, deciding the next version number, bumping app/build.gradle.kts, tagging, and…

    227 GitHub stars~2k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Minecraft CI Release

    Jahrome907/minecraft-agent-skills

    Set up and review CI, artifact publishing, versioning, and release management for Minecraft 26.x or legacy 1.21.x mods and Paper plugins.

    166 GitHub stars~3.6k tokensUpdated 25 days ago
    DevelopmentAuto-check passed
  • Release

    sol4k/sol4k

    Bump the sol4k library version everywhere, open a release PR, and draft GitHub release notes.

    135 GitHub stars~949 tokensUpdated 10 days ago
    DevelopmentAuto-check passed
  • 对 DevUtils 工程(DEPSROOT=file/gradle、DEPSMANIFEST=file/deps)中定义的第三方库 GAV 依赖做版本查证与升级;结合 Maven Central、Google Maven、Gradle Plugin Portal、 JitPack 与 GitHub Releases/README 交叉校验「最新可用版本」;必要时修正…

    1.6k GitHub stars~1.2k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed

More from JetBrains/skills

All 77 skills in this repo
  • Playwright

    JetBrains/skills

    Official

    A skill your agent uses when the task requires automating a real browser from the terminal (navigation, form filling, snapshots, screenshots, data extraction, UI-flow debugging) via playwright-cli…

    364 GitHub starsUsed in 12 repos~986 tokens
    Auto-check passed
  • Skill Creator

    JetBrains/skills

    Official

    Guide for creating effective skills. An agent skill from JetBrains/skills.

    364 GitHub starsUsed in 122 repos~4.7k tokens
    Auto-check passed
  • Transcribe

    JetBrains/skills

    Official

    Transcribe audio files to text with optional diarization and known-speaker hints.

    364 GitHub starsUsed in 5 repos~776 tokens
    Auto-check passed
  • Imagegen

    JetBrains/skills

    Official

    A skill your agent uses when the user asks to generate or edit images via the OpenAI Image API (for example: generate image, edit/inpaint/mask, background removal or replacement, transparent…

    364 GitHub starsUsed in 4 repos~2.5k tokens
    Auto-check passed
  • Speech

    JetBrains/skills

    Official

    A skill your agent uses when the user asks for text-to-speech narration or voiceover, accessibility reads, audio prompts, or batch speech generation via the OpenAI Audio API; run the bundled CLI…

    364 GitHub starsUsed in 4 repos~1.9k tokens
    Auto-check passed
  • Screenshot

    JetBrains/skills

    Official

    A skill your agent uses when the user explicitly asks for a desktop or system screenshot (full screen, specific app or window, or a pixel region), or when tool-specific capture capabilities are…

    364 GitHub starsUsed in 6 repos~2k tokens
    Auto-check passed

Works with

Questions about Compose UI Control

What does Compose UI Control do?

Control a running Compose Desktop application via HTTP. An agent skill from JetBrains/skills. Compose UI Control is an agent skill from JetBrains/skills, published by the product's own GitHub organization. Control a running Compose Desktop application via HTTP.

When should I use Compose UI Control?

Compose UI Control fits situations like: you need to interact with UI elements; wait for elements to appear; capture screenshots in a Compose Desktop app that has compose-ui-test-server enabled.

How do I install Compose UI Control in Claude Code?

Run `npx skills add JetBrains/skills --skill compose-ui-control -a claude-code`. Or copy the skill folder (compose-ui-test-server in JetBrains/skills) into .claude/skills/compose-ui-control in your project. Claude Code loads it when a task matches its description.

How do I install Compose UI Control in Codex?

Run `npx skills add JetBrains/skills --skill compose-ui-control -a codex`. Or copy the skill folder (compose-ui-test-server in JetBrains/skills) into .agents/skills/compose-ui-control in your project. Codex loads it when a task matches its description.

Can I use Compose UI Control in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add JetBrains/skills --skill compose-ui-control -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/compose-ui-control, .gemini/skills/compose-ui-control, .github/skills/compose-ui-control and .opencode/skills/compose-ui-control in your project.

What does Compose UI Control need to run?

Going by SKILL.md and its folder, Compose UI Control needs Windows cmd for the scripts in its folder and the command-line tools its instructions call (curl).

Does Compose UI Control access the network?

SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.

Is Compose UI Control safe to install?

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.

What licence does Compose UI Control use?

Compose UI Control is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Compose UI Control use?

About 1.5k tokens (SKILL.md is roughly 6.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Compose UI Control?

Skills that share tags, products or a category with Compose UI Control: Exposed Bug Fix Workflow (JetBrains/Exposed, 9.3k stars), Test Metro Locally (ZacSweers/metro, 1.4k stars), Release New Version (niki914/zafiro, 227 stars) and Minecraft CI Release (Jahrome907/minecraft-agent-skills, 166 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Compose UI Control?

JetBrains (a GitHub organization, an official publisher) maintains it in JetBrains/skills, which has 364 GitHub stars. The repository holds 77 skills in this directory. The repository was last updated on June 29, 2026.

Source: JetBrains/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.