ios-dev
Skill2 starsChanged 9 months agoMITView on GitHub
iOS development workflow for building, running, testing, debugging, and fixing iOS apps using Xcode, Simulator, screenshots, and Maestro UI automation. Use when: building an iOS app, running on simulator, taking simulator screenshots, navigating app UI, debugging iOS issues, creating Xcode projects, writing SwiftUI or UIKit code, running xcodebuild, using xcrun simctl, or any iOS/iPhone/iPad development task.
3 other projects use a version of this.
Adopted by
Most recently taken up by
- OpenMinis/MinisSkillstheir own version, first seen Oct 25, 2026
- Prisma-Labs-Dev/apple-skillstheir own version, first seen Apr 14, 2026
- Sean-Michael/skillstheir own version, first seen Mar 18, 2026
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- OpenMinis/MinisSkills★ 602same name
- Prisma-Labs-Dev/apple-skills★ 336same name
- Sean-Michael/skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. 0 are common, 10 are distinctive, and 4 are very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
10
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 29
If it reports BLOCKED, fix the issues before proceeding.
- Distinctive: line 47
If found, discover schemes:
- Distinctive: line 54
If no project exists, create one as needed for the task.
- Distinctive: line 88
On build failure: Read the error output, fix the source code, rebuild.
- Distinctive: line 110
ALWAYS use the screenshot script: Never take a raw screenshot without resizing.
- Very specific: line 128
Use descriptive names: home_screen, login_form, after_submit, error_state, detail_view.
- Distinctive: line 133
Write a temporary Maestro flow file and run it:
- Distinctive: line 155
Use the Read tool to view them.
- Distinctive: line 201
When asked to build, test, or fix an iOS app, follow this exact sequence:
- Distinctive: line 221
ALWAYS: use the Read tool to view screenshots after taking them -- this is how you see the app
- Distinctive: line 222
NEVER: ask the user to manually interact with the simulator -- do everything programmatically
- Very specific: line 224
ALWAYS: use CODE_SIGNING_ALLOWED=NO for simulator builds
- Very specific: line 225
ALWAYS: use -derivedDataPath .claude-ios/build to keep build artifacts in the project
- Distinctive: line 226
ALWAYS: run preflight checks at the start of a session
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
iOS Development Skill
You are an expert iOS developer with full autonomous control of the Xcode build pipeline, iOS Simulator, screenshot capture, Maestro UI automation, and debug log analysis. Follow these procedures exactly.
1. Pre-flight Checks
On every invocation, run the preflight script first. Locate this skill's scripts directory:
SKILL_SCRIPTS=$(find -L .claude/skills .agents/skills -path "*/ios-dev/scripts" -type d 2>/dev/null | head -1)
bash "$SKILL_SCRIPTS/preflight.sh"If it reports BLOCKED, fix the issues before proceeding. If Maestro is missing, the script auto-installs it. Always ensure ~/.maestro/bin is in PATH:
export PATH="$HOME/.maestro/bin:$PATH"2. Project Discovery
Auto-detect the Xcode project:
# Prefer workspace (supports CocoaPods)
find . -maxdepth 3 -name "*.xcworkspace" -not -path "*/DerivedData/*" -not -path "*/.build/*" -not -path "*/Pods/*" 2>/dev/null | head -1
# Fall back to project file
find . -maxdepth 3 -name "*.xcodeproj" -not -path "*/DerivedData/*" -not -path "*/Pods/*" 2>/dev/null | head -1If found, discover schemes:
xcodebuild -list -project <path> 2>/dev/null
# or
xcodebuild -list -workspace <path> 2>/dev/nullIf no project exists, create one as needed for the task.
3. Simulator Management
Select a simulator
# Check if one is already booted -- use it
xcrun simctl list devices booted 2>/dev/null
# If none booted, list available iPhone simulators and pick the newest iPhone Pro:
xcrun simctl list devices available 2>/dev/null | grep "iPhone"Selection priority: booted device > newest iPhone Pro > newest iPhone > any available.
Boot and open
xcrun simctl boot <UDID>
open -a Simulator
sleep 3 # Wait for simulator to fully boot4. Build
xcodebuild -project <path.xcodeproj> -scheme <scheme> -sdk iphonesimulator -destination 'platform=iOS Simulator,id=<UDID>' -configuration Debug -derivedDataPath .claude-ios/build CODE_SIGNING_ALLOWED=NO build 2>&1Note: The xcodebuild command must be on a single line when executed via Bash tool. Backslash line continuations may cause
Unknown build action ''errors in agent environments.
For workspaces, use -workspace instead of -project.
On build failure: Read the error output, fix the source code, rebuild. Retry up to 3 times.
The built .app bundle will be at:
.claude-ios/build/Build/Products/Debug-iphonesimulator/<AppName>.app5. Install & Launch
xcrun simctl install booted .claude-ios/build/Build/Products/Debug-iphonesimulator/<AppName>.app
xcrun simctl launch booted <bundle.identifier>
sleep 3 # Wait for app to loadFind the bundle identifier:
defaults read .claude-ios/build/Build/Products/Debug-iphonesimulator/<AppName>.app/Info.plist CFBundleIdentifier6. Screenshots (CRITICAL)
ALWAYS use the screenshot script. Never take a raw screenshot without resizing.
SKILL_SCRIPTS=$(find -L .claude/skills .agents/skills -path "*/ios-dev/scripts" -type d 2>/dev/null | head -1)
bash "$SKILL_SCRIPTS/screenshot.sh" <descriptive_name>This captures the simulator screen, resizes to max 1568px (Claude API limit), and saves to .claude-ios/screenshots/<name>.png.
After every screenshot, ALWAYS use the Read tool to view it:
Read tool -> .claude-ios/screenshots/<name>.pngThis is how you see the app. Analyze what is on screen and decide next actions.
Screenshot naming convention
Use descriptive names: home_screen, login_form, after_submit, error_state, detail_view.
7. UI Navigation with Maestro
Quick single actions
Write a temporary Maestro flow file and run it:
# .claude-ios/flow.yaml
appId: <bundle.identifier>
---
- tapOn: "Button Text"
- inputText: "Hello"
- assertVisible: "Expected Result"
- takeScreenshot: .claude-ios/screenshots/after_actionexport PATH="$HOME/.maestro/bin:$PATH"
MAESTRO_CLI_NO_ANALYTICS=1 maestro test .claude-ios/flow.yamlAfter Maestro runs
- Resize any screenshots Maestro took (it does NOT auto-resize):
sips --resampleHeightWidthMax 1568 .claude-ios/screenshots/<name>.png - Use the Read tool to view them.
Key Maestro commands
tapOn: "text"-- tap a button/label by its texttapOn: { id: "accessibilityId" }-- tap by accessibility identifierinputText: "text"-- type into focused fieldassertVisible: "text"-- verify element existsscroll/swipe-- navigate listswaitForAnimationToEnd-- wait after transitions- See
references/maestro-guide.mdfor the full command reference.
8. Video Recording
SKILL_SCRIPTS=$(find -L .claude/skills .agents/skills -path "*/ios-dev/scripts" -type d 2>/dev/null | head -1)
# Start recording
bash "$SKILL_SCRIPTS/record.sh" start <name>
# ... perform actions ...
# Stop recording
bash "$SKILL_SCRIPTS/record.sh" stopVideos are saved to .claude-ios/videos/.
9. Debug Logs
View recent logs
xcrun simctl spawn booted log show --last 5m --predicate 'process == "<AppName>"' --style compactStream logs in real-time
xcrun simctl spawn booted log stream --predicate 'process == "<AppName>"' --level debug --timeout 10Check for crash logs
xcrun simctl spawn booted log show --last 2m --predicate 'process == "<AppName>" AND messageType == 16' --style compact10. The Autonomous Build-Run-Verify Loop
When asked to build, test, or fix an iOS app, follow this exact sequence:
- Preflight -- Run
preflight.sh, fix any blockers - Discover -- Find or create the Xcode project
- Build --
xcodebuildfor simulator - If build fails -- Read errors, fix code, rebuild (up to 3 retries)
- Simulator -- Boot if needed, select best device
- Install -- Install
.appon simulator - Launch -- Start the app
- Screenshot -- Take screenshot via
screenshot.sh, view with Read tool - Verify -- Analyze the screenshot. Does the UI look correct?
- If UI is wrong -- Diagnose from screenshot, fix code, rebuild from step 3
- Navigate -- If needed, use Maestro to tap/type/swipe through the app
- Screenshot again -- Capture and view each significant state
- Debug -- If something is off, check logs for errors
- Iterate -- Repeat until the app works correctly
11. Rules (Non-negotiable)
- NEVER view a screenshot without resizing first -- always use
screenshot.shorsips --resampleHeightWidthMax 1568 - ALWAYS use the Read tool to view screenshots after taking them -- this is how you see the app
- NEVER ask the user to manually interact with the simulator -- do everything programmatically
- ALWAYS store artifacts in
.claude-ios/screenshots/and.claude-ios/videos/ - ALWAYS use
CODE_SIGNING_ALLOWED=NOfor simulator builds - ALWAYS use
-derivedDataPath .claude-ios/buildto keep build artifacts in the project - ALWAYS run preflight checks at the start of a session
- For troubleshooting, see
references/troubleshooting.md
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

