Connect Apps with Composio
ComposioHQ/awesome-claude-skills
Connects an agent to 1000+ external apps through the Composio Tool Router plugin, so it can actually send emails, create issues and post messages instead of only drafting them.
Mobile browser and native app automation via ATL (iOS Simulator).
$ npx skills add LeoYeAI/openclaw-master-skills --skill atl-browser -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills atl-browser --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/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/atl-mobile .claude/skills/atl-browser && 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 "atl-browser" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/atl-mobile into .claude/skills/atl-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atl-browser", 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/LeoYeAI/openclaw-master-skills/tree/main/skills/atl-mobileType 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 LeoYeAI/openclaw-master-skills --skill atl-browser -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills atl-browser --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/atl-mobile .agents/skills/atl-browser && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "atl-browser" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/atl-mobile into .agents/skills/atl-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atl-browser", 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 LeoYeAI/openclaw-master-skills --skill atl-browser -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills atl-browser --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/atl-mobile .cursor/skills/atl-browser && 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 "atl-browser" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/atl-mobile into .cursor/skills/atl-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atl-browser", 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/LeoYeAI/openclaw-master-skills.git --path skills/atl-mobile--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 LeoYeAI/openclaw-master-skills --skill atl-browser -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills atl-browser --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/atl-mobile .gemini/skills/atl-browser && 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 "atl-browser" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/atl-mobile into .gemini/skills/atl-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atl-browser", 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 LeoYeAI/openclaw-master-skills atl-browserInstalls 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 LeoYeAI/openclaw-master-skills --skill atl-browser -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/atl-mobile .github/skills/atl-browser && 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 "atl-browser" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/atl-mobile into .github/skills/atl-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atl-browser", 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 LeoYeAI/openclaw-master-skills --skill atl-browser -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills atl-browser --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/atl-mobile .opencode/skills/atl-browser && 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 "atl-browser" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/atl-mobile into .opencode/skills/atl-browser/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "atl-browser", 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.
atl-browserMobile browser and native app automation via ATL (iOS Simulator).
Atl Browser is an agent skill from LeoYeAI/openclaw-master-skills. Mobile browser and native app automation via ATL (iOS Simulator). Navigate, click, screenshot, and automate web and native app tasks on iPhone/iPad simulators.
Its SKILL.md is about 6.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including scripts (for example `_meta.json` and `scripts/setup.sh`).
It sits in Productivity & Automation, covering App automation through connectors. It works with iOS. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e5199b5. 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.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
curlxcrunjqxcodebuildFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
store.comapple.comAlso links to:
github.comFrom 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.
Atl Browser loads about 6.5k tokens when it runs. Until then it costs about 43 tokens; SKILL.md has 1,119 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); the scripts in this folder are not scanned.
The full file from LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its MIT licence (© LeoYeAI). 1,119 words, ~6,532 tokens.
.claude/skills/atl-browser/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.The automation layer between AI agents and iOS
ATL provides HTTP-based automation for iOS Simulator — both browser (mobile Safari) and native apps. Think Playwright, but for mobile.
ATL uses two separate servers for browser and native app automation:
| Server | Port | Use Case | Key Commands |
|---|---|---|---|
| Browser | 9222 | Web automation in mobile Safari | goto, markElements, clickMark, evaluate |
| Native | 9223 | iOS app automation (Settings, Contacts, any app) | openApp, snapshot, tapRef, find |
┌─────────────────────────────────────────────────────────────┐
│ BROWSER SERVER (9222) │ NATIVE SERVER (9223) │
│ (mobile Safari/WebView) │ (iOS apps via XCTest) │
│ │ │
│ markElements + clickMark │ snapshot + tapRef │
│ CSS selectors │ accessibility tree │
│ DOM evaluation │ element references │
│ tap, swipe, screenshot │ tap, swipe, screenshot │
└─────────────────────────────────────────────────────────────┘Why two ports? Native app automation requires XCTest APIs (XCUIApplication, XCUIElement) which are only available in UI Test bundles. The native server runs as a UI Test that exposes an HTTP API.
# Browser server (starts automatically with AtlBrowser app)
xcrun simctl launch booted com.atl.browser
curl http://localhost:9222/ping # → {"status":"ok"}
# Native server (run as UI Test)
cd ~/Atl/core/AtlBrowser
xcodebuild test -workspace AtlBrowser.xcworkspace \
-scheme AtlBrowser \
-destination 'id=<SIMULATOR_UDID>' \
-only-testing:AtlBrowserUITests/NativeServer/testNativeServer &
# Wait for it to start, then:
curl http://localhost:9223/ping # → {"status":"ok","mode":"native"}| Task | Port | Example |
|---|---|---|
| Browse websites | 9222 | curl localhost:9222/command -d '{"method":"goto",...}' |
| Open native app | 9223 | curl localhost:9223/command -d '{"method":"openApp",...}' |
| Screenshot (browser) | 9222 | curl localhost:9222/command -d '{"method":"screenshot"}' |
| Screenshot (native) | 9223 | curl localhost:9223/command -d '{"method":"screenshot"}' |
Native automation uses port 9223 and automates any iOS app using the accessibility tree — no DOM, no JavaScript, just direct element interaction.
# Open an app by bundle ID
curl -s -X POST http://localhost:9223/command \
-d '{"method":"openApp","params":{"bundleId":"com.apple.Preferences"}}'
# → {"success":true,"result":{"bundleId":"com.apple.Preferences","mode":"native","state":"running"}}
# Check current app state
curl -s -X POST http://localhost:9223/command \
-d '{"method":"appState"}'
# → {"success":true,"result":{"mode":"native","bundleId":"com.apple.Preferences","state":"running"}}
# Close current app
curl -s -X POST http://localhost:9223/command \
-d '{"method":"closeApp"}'
# → {"success":true,"result":{"closed":true}}| App | Bundle ID |
|---|---|
| Settings | com.apple.Preferences |
| Contacts | com.apple.MobileAddressBook |
| Calculator | com.apple.calculator |
| Calendar | com.apple.mobilecal |
| Photos | com.apple.mobileslideshow |
| Notes | com.apple.mobilenotes |
| Reminders | com.apple.reminders |
| Clock | com.apple.mobiletimer |
| Maps | com.apple.Maps |
| Safari | com.apple.mobilesafari |
snapshot Commandsnapshot returns the accessibility tree — all visible elements with their properties and tap-able references.
curl -s -X POST http://localhost:9223/command \
-d '{"method":"snapshot","params":{"interactiveOnly":true}}' | jq '.result'Example output:
{
"count": 12,
"elements": [
{
"ref": "e0",
"type": "cell",
"label": "Wi-Fi",
"value": "MyNetwork",
"identifier": "",
"x": 0,
"y": 142,
"width": 393,
"height": 44,
"isHittable": true,
"isEnabled": true
},
{
"ref": "e1",
"type": "cell",
"label": "Bluetooth",
"value": "On",
"identifier": "",
"x": 0,
"y": 186,
"width": 393,
"height": 44,
"isHittable": true,
"isEnabled": true
},
{
"ref": "e2",
"type": "button",
"label": "Back",
"value": null,
"identifier": "Back",
"x": 0,
"y": 44,
"width": 80,
"height": 44,
"isHittable": true,
"isEnabled": true
}
]
}Parameters:
interactiveOnly (bool, default: false) — Only return hittable elementsmaxDepth (int, optional) — Limit tree traversal depthtapRef CommandTap an element by its reference from the last snapshot:
# Take snapshot first
curl -s -X POST http://localhost:9223/command \
-d '{"method":"snapshot","params":{"interactiveOnly":true}}'
# Tap element e0 (Wi-Fi cell from example above)
curl -s -X POST http://localhost:9223/command \
-d '{"method":"tapRef","params":{"ref":"e0"}}'
# → {"success":true}find CommandFind and interact with elements by text — no need to parse snapshot manually:
# Find and tap "Wi-Fi"
curl -s -X POST http://localhost:9223/command \
-d '{"method":"find","params":{"text":"Wi-Fi","action":"tap"}}'
# → {"success":true,"result":{"found":true,"ref":"e0"}}
# Check if an element exists
curl -s -X POST http://localhost:9223/command \
-d '{"method":"find","params":{"text":"Bluetooth","action":"exists"}}'
# → {"success":true,"result":{"found":true,"ref":"e1"}}
# Find and fill a text field
curl -s -X POST http://localhost:9223/command \
-d '{"method":"find","params":{"text":"First name","action":"fill","value":"John"}}'
# Get element info without interacting
curl -s -X POST http://localhost:9223/command \
-d '{"method":"find","params":{"text":"Cancel","action":"get"}}'
# → {"success":true,"result":{"found":true,"ref":"e5","element":{...}}}Parameters:
text (string) — Text to search for (matches label, value, or identifier)action (string) — One of: tap, fill, exists, getvalue (string, optional) — Text to fill (required for action:"fill")by (string, optional) — Narrow search: label, value, identifier, type, or any (default)Here's a complete flow: open Settings, navigate to Wi-Fi, take a screenshot:
# 1. Open Settings app
curl -s -X POST http://localhost:9223/command \
-d '{"method":"openApp","params":{"bundleId":"com.apple.Preferences"}}'
# 2. Wait for app to launch
sleep 1
# 3. Take snapshot to see available elements
curl -s -X POST http://localhost:9223/command \
-d '{"method":"snapshot","params":{"interactiveOnly":true}}' | jq '.result.elements[:5]'
# 4. Find and tap Wi-Fi
curl -s -X POST http://localhost:9223/command \
-d '{"method":"find","params":{"text":"Wi-Fi","action":"tap"}}'
# 5. Wait for navigation
sleep 0.5
# 6. Take screenshot of Wi-Fi settings
curl -s -X POST http://localhost:9223/command \
-d '{"method":"screenshot"}' | jq -r '.result.data' | base64 -d > /tmp/wifi-settings.png
# 7. Navigate back (swipe right from left edge)
curl -s -X POST http://localhost:9223/command \
-d '{"method":"swipe","params":{"direction":"right"}}'
# 8. Close the app
curl -s -X POST http://localhost:9223/command \
-d '{"method":"closeApp"}'source ~/.openclaw/skills/atl-browser/scripts/atl-helper.sh
atl_openapp "com.apple.Preferences"
sleep 1
atl_find "Wi-Fi" tap
sleep 0.5
atl_screenshot /tmp/wifi-settings.png
atl_swipe right
atl_closeappATL's killer feature is spatial understanding without vision models:
┌─────────────────────────────────────────────────────────────┐
│ markElements + captureForVision = COMPLETE PAGE KNOWLEDGE │
└─────────────────────────────────────────────────────────────┘
1. markElements → Numbers every interactive element [1] [2] [3]
2. captureForVision → PDF with text layer + element coordinates
3. tap x=234 y=567 → Pixel-perfect touch at exact positionWhy this matters:
# 1. Mark elements (adds numbered labels + stores coordinates)
curl -s -X POST http://localhost:9222/command \
-d '{"id":"1","method":"markElements","params":{}}'
# 2. Capture PDF with text layer (machine-readable, has coordinates)
curl -s -X POST http://localhost:9222/command \
-d '{"id":"2","method":"captureForVision","params":{"savePath":"/tmp","name":"page"}}' \
| jq -r '.result.path'
# → /tmp/page.pdf (text-selectable, contains element positions)
# 3. Get specific element's position by mark label
curl -s -X POST http://localhost:9222/command \
-d '{"id":"3","method":"getMarkInfo","params":{"label":5}}' | jq '.result'
# → {"label":5, "tag":"button", "text":"Add to Cart", "x":187, "y":432, "width":120, "height":44}
# 4. Tap at exact coordinates
curl -s -X POST http://localhost:9222/command \
-d '{"id":"4","method":"tap","params":{"x":187,"y":432}}'The marks tell you WHERE everything is. The PDF tells you WHAT everything says. Together = full page understanding.
When automation gets stuck, escalate through these levels:
┌─────────────────────────────────────────────────────────────┐
│ Level 1: COORDINATES (fast, cheap, no API calls) │
│ markElements → getMarkInfo → tap x,y │
│ │
│ ↓ If stuck after 2-3 tries... │
│ │
│ Level 2: VISION FALLBACK (screenshot to understand state) │
│ screenshot → analyze UI → identify blockers (modals, etc) │
│ │
│ ↓ If still stuck... │
│ │
│ Level 3: JS INJECTION (direct DOM manipulation) │
│ evaluate → dispatchEvent → force interactions │
└─────────────────────────────────────────────────────────────┘| Symptom | Likely Cause | Action |
|---|---|---|
| Tap succeeds but nothing changes | Modal/overlay opened | Screenshot → find new button |
| Cart count doesn't update | Site needs login or has bot detection | Try JS click with events |
| Element not found after scroll | Marks are page-relative, not viewport | Use getBoundingClientRect via evaluate |
| Same error 3+ times | UI state changed unexpectedly | Screenshot to see actual state |
# 1. Search and find product
atl_goto "https://store.com/search?q=headphones"
atl_mark
# 2. First, dismiss any modals/banners (ALWAYS DO THIS)
# Look for: close, dismiss, continue, accept, no thanks, got it
CLOSE=$(atl_find "close")
[ -n "$CLOSE" ] && atl_click $CLOSE
# 3. Find and click Add to Cart
ATC=$(atl_find "Add to cart")
atl_click $ATC
# 4. Wait, then CHECK if it worked
sleep 2
atl_screenshot /tmp/after-click.png
# 5. If cart didn't update, LOOK at the screenshot
# Maybe a "Choose options" modal opened - find the NEW Add to Cart button
# This is the vision fallback - you need to SEE what happenedWhen you click "Add to cart" on sites like Target, Amazon, etc., they often:
Your original tap WORKED — you just can't see the result without a screenshot.
# 1. Setup (boots sim, installs ATL)
~/.openclaw/skills/atl-browser/scripts/setup.sh
# 2. Navigate somewhere
curl -s -X POST http://localhost:9222/command \
-d '{"id":"1","method":"goto","params":{"url":"https://example.com"}}'
# 3. Mark elements (shows [1], [2], [3] labels)
curl -s -X POST http://localhost:9222/command \
-d '{"id":"2","method":"markElements","params":{}}'
# 4. Take screenshot
curl -s -X POST http://localhost:9222/command \
-d '{"id":"3","method":"screenshot","params":{}}' | jq -r '.result.data' | base64 -d > /tmp/page.png
# 5. Click element [1]
curl -s -X POST http://localhost:9222/command \
-d '{"id":"4","method":"clickMark","params":{"label":1}}'Or use the helper functions:
source ~/.openclaw/skills/atl-browser/scripts/atl-helper.sh
atl_goto "https://example.com"
atl_mark
atl_screenshot /tmp/page.png
atl_click 1Base URL: http://localhost:9222
# Check if ATL is running
curl -s http://localhost:9222/ping
# Navigate to URL
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"1","method":"goto","params":{"url":"https://example.com"}}'
# Wait for page ready
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"2","method":"waitForReady","params":{"timeout":10}}'
# Take screenshot (returns base64 PNG)
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"3","method":"screenshot","params":{}}' | jq -r '.result.data' | base64 -d > screenshot.png
# Mark interactive elements (shows numbered labels)
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"4","method":"markElements","params":{}}'
# Click by mark label
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"5","method":"clickMark","params":{"label":3}}'
# Scroll page
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"6","method":"evaluate","params":{"script":"window.scrollBy(0, 500)"}}'
# Type text
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"7","method":"type","params":{"text":"Hello world"}}'
# Click by CSS selector
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"8","method":"click","params":{"selector":"button.submit"}}'# Boot iPhone 17 simulator (or another device)
xcrun simctl boot "iPhone 17"
# Open Simulator app
open -a Simulatorcd ~/Atl/core/AtlBrowser
# Build for simulator (RECOMMENDED: target by UDID)
# Why: name-based destinations can cause Xcode to pick an older iOS runtime (15/16)
# and fail if AtlBrowser has an iOS 17+ deployment target.
#
# 1) Find a suitable simulator UDID (iOS 17+):
# xcrun simctl list devices available
#
# 2) Build targeting that UDID:
xcodebuild -workspace AtlBrowser.xcworkspace \
-scheme AtlBrowser \
-destination 'id=<SIM_UDID>' \
-derivedDataPath /tmp/atl-dd \
build
# Install to a specific simulator (preferred)
xcrun simctl install <SIM_UDID> \
/tmp/atl-dd/Build/Products/Debug-iphonesimulator/AtlBrowser.app
# Launch the app
xcrun simctl launch <SIM_UDID> com.atl.browsercurl -s http://localhost:9222/ping
# Should return: {"status":"ok"}| Method | Params | Mode | Description |
|---|---|---|---|
openApp | {bundleId} | Any→Native | Open app, switch to native mode |
closeApp | - | Native | Close current app, return to browser mode |
appState | - | Any | Get current mode and bundleId |
openBrowser | - | Native→Browser | Switch back to browser mode |
| Method | Params | Mode | Description |
|---|---|---|---|
snapshot | {interactiveOnly?, maxDepth?} | Native | Get accessibility tree |
tapRef | {ref} | Native | Tap element by ref (e.g., "e0") |
find | {text, action, value?, by?} | Native | Find element and interact |
fillRef | {ref, text} | Native | Tap element and type text |
focusRef | {ref} | Native | Focus element without typing |
| Method | Params | Mode | Description |
|---|---|---|---|
goto | {url} | Browser | Navigate to URL |
reload | - | Browser | Reload page |
goBack | - | Browser | Go back |
goForward | - | Browser | Go forward |
getURL | - | Browser | Get current URL |
getTitle | - | Browser | Get page title |
| Method | Params | Mode | Description |
|---|---|---|---|
click | {selector} | Browser | Click element |
doubleClick | {selector} | Browser | Double-click |
type | {text} | Both | Type text |
fill | {selector, value} | Browser | Fill input field |
press | {key} | Both | Press key |
hover | {selector} | Browser | Hover over element |
scrollIntoView | {selector} | Browser | Scroll to element |
| Method | Params | Mode | Description |
|---|---|---|---|
markElements | - | Browser | Mark visible interactive elements |
markAll | - | Browser | Mark ALL interactive elements |
unmarkElements | - | Browser | Remove marks |
clickMark | {label} | Browser | Click by label number |
getMarkInfo | {label} | Browser | Get element info by label |
| Method | Params | Mode | Description |
|---|---|---|---|
screenshot | {fullPage?, selector?} | Both | Take screenshot |
captureForVision | {savePath?, name?} | Browser | Full page PDF |
captureJPEG | {quality?, fullPage?} | Both | JPEG capture |
captureLight | - | Browser | Text + interactives only |
| Method | Params | Mode | Description |
|---|---|---|---|
waitForSelector | {selector, timeout?} | Browser | Wait for element |
waitForNavigation | - | Browser | Wait for navigation |
waitForReady | {timeout?, stabilityMs?} | Browser | Wait for page ready |
waitForAny | {selectors, timeout?} | Browser | Wait for any selector |
| Method | Params | Mode | Description |
|---|---|---|---|
evaluate | {script} | Browser | Run JavaScript |
querySelector | {selector} | Browser | Find element |
querySelectorAll | {selector} | Browser | Find all elements |
getDOMSnapshot | - | Browser | Get page HTML |
| Method | Params | Mode | Description |
|---|---|---|---|
getCookies | - | Browser | Get all cookies |
setCookies | {cookies} | Browser | Set cookies |
deleteCookies | - | Browser | Delete all cookies |
| Method | Params | Mode | Description |
|---|---|---|---|
tap | {x, y} | Both | Tap at coordinates |
longPress | {x, y, duration?} | Both | Long press (default 0.5s) |
swipe | {direction} | Both | Swipe up/down/left/right |
swipe | {fromX, fromY, toX, toY} | Both | Swipe between points |
pinch | {scale, duration?} | Both | Pinch zoom (scale > 1 = zoom in) |
# Swipe up (scroll down)
curl -s -X POST http://localhost:9222/command \
-d '{"id":"1","method":"swipe","params":{"direction":"up"}}'
# Swipe left (next page in carousel)
curl -s -X POST http://localhost:9222/command \
-d '{"id":"2","method":"swipe","params":{"direction":"left","distance":400}}'
# Custom swipe path
curl -s -X POST http://localhost:9222/command \
-d '{"id":"3","method":"swipe","params":{"fromX":200,"fromY":600,"toX":200,"toY":200}}'
# Long press for context menu
curl -s -X POST http://localhost:9222/command \
-d '{"id":"4","method":"longPress","params":{"x":150,"y":300,"duration":1.0}}'
# Pinch to zoom in
curl -s -X POST http://localhost:9222/command \
-d '{"id":"5","method":"pinch","params":{"scale":2.0}}'# 1. Navigate to site
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"1","method":"goto","params":{"url":"https://www.apple.com/shop"}}'
# 2. Wait for page to load
sleep 2
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"2","method":"waitForReady","params":{"timeout":10}}'
# 3. Mark elements to see what's clickable
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"3","method":"markElements","params":{}}'
# 4. Take screenshot to see the marks
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"4","method":"screenshot","params":{}}' | jq -r '.result.data' | base64 -d > /tmp/page.png
# 5. Click a marked element (e.g., label 14)
curl -s -X POST http://localhost:9222/command \
-H "Content-Type: application/json" \
-d '{"id":"5","method":"clickMark","params":{"label":14}}'
# 6. Repeat as neededKnown issue: goto command may return success without navigating. Use JS workaround:
# Instead of goto, use evaluate to navigate
curl -s -X POST http://localhost:9222/command -H "Content-Type: application/json" \
-d '{"id":"1","method":"evaluate","params":{"script":"location.href = \"https://example.com\"; true"}}'
# Wait for page load
sleep 3
curl -s -X POST http://localhost:9222/command -H "Content-Type: application/json" \
-d '{"id":"2","method":"waitForReady","params":{"timeout":10}}'# Check if app is running
xcrun simctl listapps booted | grep atl
# Restart the app
xcrun simctl terminate booted com.atl.browser
xcrun simctl launch booted com.atl.browser
# Check logs
xcrun simctl spawn booted log show --predicate 'process == "AtlBrowser"' --last 1mcd ~/Atl/core/AtlBrowser
xcodebuild -workspace AtlBrowser.xcworkspace -scheme AtlBrowser -sdk iphonesimulator build
xcrun simctl install booted ~/Library/Developer/Xcode/DerivedData/AtlBrowser-*/Build/Products/Debug-iphonesimulator/AtlBrowser.app
xcrun simctl launch booted com.atl.browserThe ATL server runs inside the simulator app. If port 9222 is blocked, check for other processes:
lsof -i :9222Real users dismiss popups. You should too.
# Before any workflow, check for and dismiss:
# - Cookie consent banners
# - Newsletter popups
# - Health/privacy consent modals
# - "Download our app" prompts
atl_mark
for KEYWORD in "close" "dismiss" "no thanks" "accept" "got it" "continue"; do
LABEL=$(atl_find "$KEYWORD")
[ -n "$LABEL" ] && atl_click $LABEL && sleep 1
doneDon't assume — confirm.
atl_click $ADD_TO_CART
sleep 2
# Check if cart updated
CART=$(atl_find "cart [1-9]")
if [ -z "$CART" ]; then
# Didn't work - take screenshot to see why
atl_screenshot /tmp/debug.png
echo "Action may have opened a modal - check screenshot"
fiMarks give page-relative coordinates. For tap to work, the element must be visible.
# Option A: Scroll element into view first
curl -s -X POST http://localhost:9222/command -H "Content-Type: application/json" \
-d '{"id":"1","method":"evaluate","params":{"script":"document.querySelector(\"#my-button\").scrollIntoView()"}}'
# Option B: Get viewport-relative coords via JS
curl -s -X POST http://localhost:9222/command -H "Content-Type: application/json" \
-d '{"id":"2","method":"evaluate","params":{"script":"var r = document.querySelector(\"#my-button\").getBoundingClientRect(); JSON.stringify({x: r.x + r.width/2, y: r.y + r.height/2})"}}'When in doubt, look.
atl_screenshot /tmp/current-state.png
# Then analyze with vision or just open the filebase64 -d to decodeSee examples/ folder:
test-browse.sh - Quick bash test workflowFor machine-readable API spec, see openapi.yaml — includes all commands, parameters, and response schemas.
© LeoYeAI, MIT. 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 2 other files (scripts) in skills/atl-mobile of LeoYeAI/openclaw-master-skills.
Open the folder on GitHubat commit e5199b5
Atl Browser 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 |
|---|---|---|---|---|---|---|
| Atl Browser this skillLeoYeAI/openclaw-master-skills | 2.2k | — | ~6.5k | Automated safety check: Pass | MIT | |
| Connect Apps with ComposioComposioHQ/awesome-claude-skills | 77k | 3 repos | ~557 | Automated safety check: Pass | None | |
| Interceptor iOSHacker-Valley-Media/Interceptor | 522 | — | ~1.9k | Automated safety check: Pass | Custom licence | |
| Add Connection Typebagofwords1/bagofwords | 459 | — | ~2.3k | Automated safety check: Pass | Custom licence | |
| Composio Cloud Toolsquarqlabs/argus | 279 | — | ~543 | Automated safety check: Pass | Apache-2.0 | |
| Phone And Simulator GUI ControlCore-Mate/OpenGUI | 1.8k | — | ~7.9k | Automated safety check: Warn | Custom licence |
ComposioHQ/awesome-claude-skills
Connects an agent to 1000+ external apps through the Composio Tool Router plugin, so it can actually send emails, create issues and post messages instead of only drafting them.
Hacker-Valley-Media/Interceptor
Drive any installed app on an owned, unlocked, Developer-Mode iPhone via interceptor ios : ref-tagged element trees, deterministic coordinate taps (click), reliable text entry (type/keys), scroll…
bagofwords1/bagofwords
Add a new data source / connection type (e.g. An agent skill from bagofwords1/bagofwords.
quarqlabs/argus
Routes requests to external SaaS apps such as GitHub, Gmail, Google Calendar, Slack, Notion and Linear through cloud tools, with safeguards on irreversible actions.
Core-Mate/OpenGUI
Completes an already-authorized task on a real Android phone or a macOS iOS simulator one screenshot-driven action at a time.
ComposioHQ/awesome-claude-skills
Automate Cloudflare API tasks via Rube MCP (Composio). An agent skill from ComposioHQ/awesome-claude-skills.
LeoYeAI/openclaw-master-skills
Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.
LeoYeAI/openclaw-master-skills
Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.
LeoYeAI/openclaw-master-skills
Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.
LeoYeAI/openclaw-master-skills
Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.
LeoYeAI/openclaw-master-skills
Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.
LeoYeAI/openclaw-master-skills
Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.
Works with
Categories
Mobile browser and native app automation via ATL (iOS Simulator). Atl Browser is an agent skill from LeoYeAI/openclaw-master-skills. Mobile browser and native app automation via ATL (iOS Simulator).
Atl Browser fits situations like: tasks that involve App automation through connectors.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill atl-browser -a claude-code`. Or copy the skill folder (skills/atl-mobile in LeoYeAI/openclaw-master-skills) into .claude/skills/atl-browser in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill atl-browser -a codex`. Or copy the skill folder (skills/atl-mobile in LeoYeAI/openclaw-master-skills) into .agents/skills/atl-browser 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 LeoYeAI/openclaw-master-skills --skill atl-browser -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/atl-browser, .gemini/skills/atl-browser, .github/skills/atl-browser and .opencode/skills/atl-browser in your project.
Going by SKILL.md and its folder, Atl Browser needs a shell for the scripts in its folder and the command-line tools its instructions call (curl, xcrun, jq and xcodebuild). Our summary lists: A Bash shell.
SKILL.md names 3 domains. In commands or code: store.com and apple.com; the agent is likely to contact these when it follows the instructions. As links in the text: github.com. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Atl Browser is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.5k tokens (SKILL.md is roughly 26k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Atl Browser: Connect Apps with Composio (ComposioHQ/awesome-claude-skills, 77k stars), Interceptor iOS (Hacker-Valley-Media/Interceptor, 522 stars), Add Connection Type (bagofwords1/bagofwords, 459 stars) and Composio Cloud Tools (quarqlabs/argus, 279 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,161 GitHub stars. The repository holds 1,235 skills in this directory. The repository was last updated on July 20, 2026.
Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.