by abacusai
Simulator-free, headless SwiftUI checks for AI coding agents: render screens as accessibility trees and hot-reload views in ~2 s, without the iOS Simulator.
# Add to your Claude Code skills
git clone https://github.com/abacusai/simlessSee how simless compares with popular alternatives.
simless is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by abacusai. Simulator-free, headless SwiftUI checks for AI coding agents: render screens as accessibility trees and hot-reload views in ~2 s, without the iOS Simulator. It has 50 GitHub stars.
simless's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/abacusai/simless" and add it to your Claude Code skills directory (see the Installation section above).
simless is primarily written in Swift. It is open-source under abacusai on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh simless against similar tools.
No comments yet. Be the first to share your thoughts!
Available after the catalog security scan passes.
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Check SwiftUI screens and run your iOS tests without the iOS Simulator. Built for AI coding agents, fast enough for CI, and nothing to set up beyond Xcode.
simless runs your real iOS app natively on a Mac, as an invisible host. An agent can render any screen as a compact accessibility tree in milliseconds, hot-reload the views it edits in about 2 seconds, and run your unit tests and your existing XCUITest UI tests. No simulator boots, no window opens, and many agents can work in parallel on one Mac.
$ simless render Settings --png out/
Settings · light · iphone 402×874 · 131 ms
traits: compact/regular size class, idiom pad, safe area top 62 bottom 34
switch "Push notifications" = "1" @16,208.5 370×58
switch "Weekly summary" = "0" @16,266.5 370×58
button "Theme, System" @32,397.5 338×34.5
button "Text size: 3, Decrement" = "3" #Decrement @276,462 47×32
button "Text size: 3, Increment" = "3" #Increment @323,462 47×32
button "Sign out" @16,544 370×52
header "Notifications" @16,168 370×40.5
header "Appearance" @16,342 370×40.5
text "Version 1.0 (demo)" @16,596 370×30
header "Settings" @16,119 133×40.5
png: out/Settings-iphone.png
issues (1):
⚠ button "Theme, System" tap target 338×34 is smaller than 44×44
The agent reads the tree on the left, about 150 tokens per screen. The PNG on the right is only made when it's asked for.
| 2.2 s | from an edit to a verified screen, 10× faster than a simulator round trip, and it stays at 2.2 s with 5 agents in parallel |
| 75× less memory | 5 agents hold 0.15 GB in 6 processes, instead of 11.2 GB in 1,071 processes with 5 simulators |
| 2.3× faster UI tests | your XCUITest code runs unchanged in hidden hosts, no simulator clones |
| Zero setup | no certificate, provisioning profile, Full Disk Access or login session. It runs the same on a laptop, over SSH, in a VM and on a GitHub-hosted runner |
# Install (once per machine)
git clone https://github.com/abacusai/simless && cd simless
swift build -c release
ln -s "$PWD/.build/release/simless" ~/.local/bin/simless # any directory on your PATH
simless skill install # optional: the Claude Code skill
# Set up your app (once per repository)
cd <your-app-repo>
simless init # writes .simless.json, the render host kit and a fixtures file
simless up # builds the app and starts its host
# Use it
simless render all --matrix # every screen, light and dark, iPhone, small iPhone and iPad
simless reload --render Settings # after an edit: hot reload and render in about 2 s
simless test all # unit tests, local packages included
simless test ui # your XCUITest UI tests
Coding agents check UI changes by building for the iOS Simulator, installing, launching and taking a screenshot. Every agent pays for its own booted simulator (we measured about 2.2 GB of private memory and 210 processes per simulator running a real app) plus its own xcodebuild. With 4 or 5 agents in parallel, a 32 GB Mac starts swapping and everything slows to a crawl.
simless replaces that loop:
Measured on a production SwiftUI app (about 280 Swift files and several large Swift packages) on an M2 Pro MacBook Pro with 32 GB of RAM. Legacy means one iOS Simulator per agent, with an incremental xcodebuild, install, launch and screenshot for every check.
| Legacy (simulator) | simless | ||
|---|---|---|---|
| Edit → verified screen, 1 agent | 21.9 s | 2.2 s | 10× |
| Edit → verified screen, 5 agents in parallel | 37.4 s | 2.2 s | 17× |
| 5 agents start cold at once (per agent) | 732 s | 344 s | 2.1× |
| Memory held by 5 agents (steady state) | 11.2 GB, 1,071 processes | 0.15 GB, 6 processes | ~75× |
| Peak load average, 5 agents starting cold | ~1,010 | ~82 | 12× |
| Unit tests (2 classes) | 13.1 s | 5.6 s | 2.3× |
| Unit tests, whole suite (2,280 tests), nothing built, empty caches | 8.2 min | 7.9 min | 1.0× |
| Unit tests, whole suite, already built | 6.3 min | 5.5 to 6.5 min | 1.1× |
| 20 named tests, nothing rebuilt | 25.5 s | about 1 s | 25× |
| UI tests (106 XCUITests, iPhone and iPad, 5 simulator clones vs. 4 hidden hosts) | 19.2 min | 7.5 to 9.4 min | 2.3× |
The legacy loop gets slower with every agent you add, simless stays at about 2 s per edit. The test rows come from a second production app (about 2,200 unit tests across 41 targets, most of them in a local Swift package), against an iPhone 17 simulator on iOS 26.5, with the same result for every test. One CPU-heavy test target sets the time of the whole unit suite, because the Mac's Swift runtime runs it slower than the simulator does (see Unit tests). Full method, caveats and how to reproduce it: docs/benchmarks.md.
Since 0.6.0 hosts run unsigned. Compared with the signed "Designed for iPad" install of earlier versions, on the second production app with every host stopped between runs (M-series Mac, 10 cores):
| 0.5 (signed) | 0.6 (unsigned) | ||
|---|---|---|---|
Warm simless up |
53.2 s | 25.9 to 29.4 s | 1.9× |
| 107 UI tests | 545 s | 432 s | 1.3× |
| 2,345 unit tests | 320 s | 303 to 327 s | same |
| What the Mac needs | certificate, wildcard profile, Full Disk Access | Xcode |
Every test has the same outcome as before and the renders are the same. PNGs also line up with the tree's frames exactly now. Part of the warm up gain is that simless no longer changes the test bundles Xcode built: it signs a clone of each, so Xcode doesn't link all 40 package test bundles again on every build, and nothing needs signing again when nothing changed.
Mostly. Here are screens from the demo app, rendered by the iOS Simulator and by simless:
| Welcome: iOS Simulator | Welcome: simless | Settings: iOS Simulator | Settings: simless |
|---|---|---|---|
| ✓ matches within 2 pt | ✗ toggle rows 6 pt taller, Mac accent color |
8 of 14 demo renders (7 screens, light and dark) match within 2 pt. The rest differ in the row heights of List and Form, line breaks in long centered text, and system accent colors. docs/fidelity.md shows every screen side by side, and simless calibrate --png <dir> makes the same comparison for your own app.
.xcodeproj, at the repository root or in a subfolder such as ios/. Views can live in the app target or in local Swift packages, and both hot-reload. Swift 5 and Swift 6 language modes are supported, with or without MainActor default isolation. A unit-test target is optional: simless test runs it when there is one.That's all. Older versions ran the app as a signed "Designed for iPad" install, which needed an Apple Development certificate and a wildcard profile that includes the Mac. That mode is still there ("mode": "dfi", see Options), but nothing needs it.
simless init creates:
.simless.json<App>/Simless/SimlessKit.swift: the render host. It's generated, #if DEBUG only, and does nothing unless simless launches the app.<App>/Simless/SimlessFixtures.swift: your screens.It also adds one call to your @main App's init() (pass --no-hook to skip that):
#if DEBUG && os(iOS)
SimlessHost.startIfRequested()
#endif
Some fixtures come for free. root is the app's first window, as its @main App builds it, and every #Preview block (and PreviewProvider) is a fixture named <File>.<preview name or number>, like LoginView.Error or NoteRow.2. simless up compiles them against the build, and simless render all lists them after yours. A preview that can't be built outside Xcode is left out, and up says whi