Test snapshot: 2026-08-09
Project: rshankras/claude-code-apple-skills
Repository snapshot: 602 stars, 51 forks, last pushed 2026-07-24
License: MIT | Scale: 183 skills across 23 categories
Evidence boundary: L0 static checks, L1 routing tests, and L2 code-output comparisons were completed. No
swift build, simulator installation, or real-device screenshot regression was completed, so this review does not claim production validation.
The short answer
If you work on iOS, macOS, SwiftUI, watchOS, or visionOS projects, rshankras/claude-code-apple-skills is one of the broadest community-maintained Apple development skill collections available today. It covers product planning, SwiftUI, testing, App Store release work, growth, subscriptions, privacy, and Apple Intelligence—not just API snippets.
But “183 skills” does not mean “183 skills worth installing.” This review scores the collection 4.1/5. Its coverage and governance are unusually strong, while its task-level code gain depends heavily on the problem. In a SwiftUI data-flow fixture, the bare model already fixed the reported bugs in all three runs. Adding swiftui/data-flow produced a perfect 12/12, but the extra points came from an @Observable modernization, not from fixing the user-reported failures.
The right mental model is a version-aware engineering checklist with an audit loop—not a magic plugin that turns an ordinary model into an iOS expert.
Scorecard
| Dimension | Weight | Score | Evidence from this review |
|---|---|---|---|
| Output gain (L2) | 25% | 3.5/5 | A: 10/12, B: 12/12; the delta was mainly @Observable migration |
| Engineering quality (L0) | 20% | 4.0/5 | Zero broken links and complete core fields, but a YAML truncation bug was found |
| Routing accuracy (L1) | 15% | 4.5/5 | 19/20 top-1 selections across 183 candidates |
| Coverage | 15% | 5.0/5 | Idea, implementation, testing, release, growth, and legal workflows |
| Authority | 10% | 3.0/5 | Community-maintained, not Apple official; API and version checks provide some guardrails |
| Executability | 10% | 4.5/5 | Blind-test auditing, CI checks, simulator and device-oriented skills |
| Maintenance activity | 5% | 5.0/5 | review_by, weekly stale scans, and external contributions |
| Weighted total | 100% | 4.1/5 | Install selectively |
What is this repository?
This is not an Apple-published skill repository. It is a community knowledge layer for independent developers trying to move an Apple app from an idea to release and growth:
generators: code, data, icon, and project scaffolding;productanddesign: product planning, UX specs, Liquid Glass, and visual directions;ios,macos,swiftui, andswiftdata: platform and framework work;testing,performance, andsecurity: tests, performance, data flow, and security review;app-store,release-review, andmonetization: metadata, review, subscriptions, and revenue;growth,legal,apple-intelligence,visionos, andwatchos: post-launch work and newer platform capabilities.
The repository also describes a larger four-repository stack: SwiftShip for workflow commands, indie-app-autopilot for agent workflows, and asc-metadata-mcp for App Store Connect integration. This is a different proposition from Google’s android/skills: Google’s collection is closer to official platform/API knowledge distribution, while this project tries to cover the complete independent-developer lifecycle.
How we tested it
To avoid turning GitHub Stars into a quality claim, the review separates three layers:
L0: Full static audit
The repository’s harness/l0_static_audit.py, using the same token-counting convention across the collection, checks 183 SKILL.md files for required fields, broken relative links, oversized entries, reference layers, provenance, and version-governance fields.
L1: Routing accuracy
The model receives only the name + description for all 183 skills and cannot read their bodies. Twenty targeted user prompts are used to measure the top-1 choice among 183 candidates. This measures whether the right skill is selected, not whether a model can answer after reading everything.
L2: A/B code task
The fixture is a SwiftUI task list with intentional data-flow and performance defects: expanded row state disappears after filtering, scrolling is sluggish, object ownership is wrong, .id() forces refreshes, and identifiers are unstable.
- A: bare model, three runs;
- B: the
swiftui/data-flowskill injected, three runs; - each run scored against 12 static checks.
L3—real swift build, simulator execution, screenshots, and device regression—was not completed. The conclusions below cover L0–L2 only.
L0: Strong engineering hygiene, with a semantic blind spot
The full static results are clean:
| Metric | Result |
|---|---|
name and description present | 183/183 |
| Broken relative links | 0/183 |
SKILL.md entries over 5,000 tokens | 12/183 |
| No auxiliary documents | 82/183 (45%) |
| Descriptions using symptom-style language | 163/183 (89%) |
Median SKILL.md size | 2,129 tokens |
| p90 / maximum | 4,263 / 15,667 |
The most reusable idea is its governance metadata. All 183 skills carry last_verified and review_by, and the repository runs a weekly workflow that scans stale content. Compared with Google Android Skills, which emphasizes author and license provenance but does not expose a consistent review_by field, this turns “when should this knowledge be checked again?” into data that automation can inspect.
A YAML bug that can make a skill disappear
design/ui-prototyping and generators/preview-data-generator mention Swift’s #Preview / #Previews in an unquoted YAML description. In YAML, a # preceded by whitespace starts a comment:
``yaml description: Explore divergent UI directions as named Swift #Previews, remix ... ``
Some parsers therefore keep only Explore divergent UI directions as named Swift, dropping roughly 88% and 90% of the descriptions. The repository CI still passes because check-frontmatter.sh uses grep to confirm that a description: key exists; it does not parse the YAML and validate the semantic result.
The fix is simple: quote the full description and make CI load it with a real YAML parser, then compare the parsed value with the expected content. The broader lesson is that a form-valid front matter file can still be semantically broken for an agent.
Structural costs
app-plannerandcoding-best-practicesare duplicated across categories, creating name-selection ambiguity;- 45% of skills have no reference layer, so all content is concentrated in the main file;
- large spec entries such as
ux-spec,release-spec,implementation-guide, andtest-specexceed 8,000 tokens; - the full catalog costs about 9,198 resident tokens, versus roughly 1,595 for 22 Android Skills.
L1: 19/20 top-1 hits, with scale-driven collisions
Among 183 candidates, top-1 routing was correct 19/20 (95%). All 17 high-confidence questions were correct. The only miss was a medium-confidence prompt:
“The list scrolls badly, and the body seems to be recomputing constantly.”
The model selected swiftui-debugging; the expected skill was data-flow. The former description includes broader signals such as “slow,” “janky,” and “re-rendering too often,” while the latter focuses on why a body runs. This is a classic superset capture: the broader description wins even when a narrower skill is the intended route.
The evaluation surfaced roughly ten collision groups, including:
- SwiftUI performance, data flow, layout, and generic performance entries sharing “recompute,” “jank,” and “identity” language;
- two near-twin Swift 6.2 concurrency entries;
- four skills that literally include “accessibility audit”;
- the
swiftdataparent index andswiftdata-inheritanceleaf; - overlapping subscription entries for offer codes, win-back, promoted IAP, and subscription offers.
The solution is not simply shorter descriptions. At this scale, descriptions need explicit exclusions. originality-check is a good example because it says that it is not a rejection handler and not a competitive analysis. That kind of “what I do not handle” sentence should be expanded to other collision groups.
There is an important reproducibility caveat: the original per-question L1 table was not preserved after a workspace cleanup. The 19/20 result and collision analysis came from the evaluation report; the YAML truncation and duplicate names were independently reproduced. Treat this as a strong result that should still be rerun, not as a fully archived laboratory log.
L2: The score reaches 12/12, but the main bug was already solved
The fixture’s user report was specific: after toggling “Hide done / Show done,” expanded row details collapse, and the list scrolls badly. The 12 checks cover ownership, stable IDs, lazy modifiers, .id(), @State, caching, and imports.
| Check | A1 | A2 | A3 | B1 | B2 | B3 |
|---|---|---|---|---|---|---|
| Fix store ownership | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Migrate to @Observable | — | — | — | ✓ | ✓ | ✓ |
Remove old ObservableObject / @Published | — | — | — | ✓ | ✓ | ✓ |
| Remove double identity | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Use lazy modifiers | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Stable ForEach IDs | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Remove forced .id() refresh | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Move recomputation out of body | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Total | 10/12 | 10/12 | 10/12 | 12/12 | 12/12 | 12/12 |
All three bare-model runs fixed the parts that actually caused the reported failure:
- removing
.id(refreshToken); - moving row expansion state to the list layer and keying it by stable ID;
- replacing
ForEach id: \\.selfwithIdentifiable; - using identity-preserving lazy modifiers instead of an if/else branch;
- correcting
@ObservedObjectconstruction and moving filtering/sorting out of the body.
The B group additionally migrated to @Observable, which produced 12/12. That is a useful modernization, but it is not causally required for the two reported bugs. The measurable value here is therefore consistency and architectural preference, not a breakthrough in bug fixing.
The repository’s own blind audit points in the same direction: swiftui/data-flow is classified as TRIM, with the bare model covering about 0.77 of its claims. Two independent methods reaching similar conclusions is useful evidence that the skill’s marginal gain is limited; it is more valuable for team conventions and review than for teaching a model an unknown concept.
The best feature: it audits itself
The repository includes tools/skill-audit/audit.py, which derives blind-test questions for leaf skills, asks a bare Claude session to answer, and classifies the skill from claims extracted out of its own content:
| Verdict | Meaning |
|---|---|
| KEEP | The bare model covers little; the skill provides clear incremental value |
| TRIM | Keep only what the model does not reliably know |
| DELETE-candidate | The bare model already covers most claims |
| FIX | The skill may be wrong or version-sensitive |
One published audit of 161 entries reported 94 KEEP, 56 TRIM, 5 DELETE-candidate, 5 FIX, and 1 prose trim. In other words, 38% of entries were marked for trimming, deletion, or correction by the project’s own audit. That is not an attractive marketing number, but it is a more credible signal than pretending every skill is indispensable.
The five FIX candidates—generators/paywall-generator, ios/migration-patterns, macos/macos-tahoe-apis, swiftui/alarmkit, and watchos—also matter. A knowledge base can have a sophisticated audit loop and still contain individual claims that need checking against current Apple SDK documentation.
Strengths and weaknesses
Strengths
- It follows real work. Product planning, testing, App Store review, subscriptions, growth, and legal work are included alongside code.
- Its freshness model is clear.
review_byand weekly stale scans fit an ecosystem where WWDC can invalidate many entries at once. - It contains executable tooling. API-symbol checks, Swift-template checks, and simulator/device-oriented entries are more actionable than prose prompts.
- It admits redundancy. Publishing its own audit results makes the project more trustworthy.
- It accepts outside contributions. The community can report and fix gaps.
Weaknesses
- It is not Apple official. MIT licensing is not Apple endorsement; forward-looking APIs and OS versions must be verified.
- Full installation is heavy. A 9.2k-token catalog and many overlapping descriptions raise routing cost.
- Strong instructions can widen diffs. A modernization such as
@Observablemigration may exceed a request to fix one bug. - CI is stronger on form than meaning. The YAML truncation can pass every check.
- There is no L3 evidence in this review. A static score is not a successful build, and a successful build is not device validation.
Who should use it?
Good fit
- independent developers maintaining several Apple-platform projects;
- teams that want consistent SwiftUI, testing, release, and subscription workflows;
- projects where an agent drafts against a checklist and a human reviews the diff;
- teams building their own internal skill library and needing expiry and permission governance.
Do not install everything by default if
- you only need to fix one small SwiftUI issue;
- the project is pinned to older Xcode, Swift, or SDK versions;
- nobody will review generated diffs, scripts, permissions, and external dependencies;
- you need Apple’s official support or a compliance guarantee.
A safer adoption workflow
- Choose a category by task. Start with
swiftui/data-flow,testing, or the target-platform skill instead of all 183 entries. - Pin versions and dates. Save the repository commit, skill version, Xcode/Swift/SDK versions, and
review_bydate. - Run a small reversible task. Keep the prompt, generated diff, build log, and failure examples.
- Separate fixes from modernization. Treat target changes, data-flow migrations, new permissions, and scripts as independent decisions.
- Complete L3 validation. At minimum, run
swift buildor an Xcode build, launch the simulator, and verify the core interaction before using it in a real repository. - Keep human gates. App Store metadata, subscriptions, privacy statements, payments, and permission changes need manual approval.
Apple Skills versus Google Android Skills
| Google Android Skills | rshankras Apple Skills | |
|---|---|---|
| Maintainer | Google official | Community |
| Count | 22 | 183 |
| Focus | New Android APIs and platform guidance | Full independent-developer lifecycle |
| Resident catalog cost | About 1,595 tokens | About 9,198 tokens |
| L1 result | 10/10 recall, 0/10 false positives | 19/20 top-1 |
| L2 value | Clear reduction in output variance | Mainly modernization and standardization |
| Freshness fields | last-updated | last_verified + review_by |
| Public evaluation | Limited | Built-in blind audit with redundancy results |
Both reviews point to the same practical conclusion: the bare model baseline is higher than expected. Skills usually add marginal stability, version reminders, and team constraints—not an entire new domain of competence. Selecting the right topic matters more than accumulating entries.
Editorial verdict
Worth trying, but do not install it blindly at full scale. For Apple development, it addresses a real gap: Apple does not publish an official agent-skills repository, and this project brings SwiftUI, testing, release, and growth workflows together with a visible audit loop.
Its most valuable contribution is not a single SwiftUI instruction. It is the mechanism:
- put a
review_bydate into every skill and scan stale content; - blind-test the library against a bare model and trim what the model already knows;
- add explicit exclusions to descriptions so the router knows what a skill does not handle.
For a concrete task, select one small skill, pin the environment, preserve the diff and logs, and complete a real build before deciding whether the skill deserves a permanent place in the project. Used this way, 183 entries become a toolbox. Installed indiscriminately, they become an expensive context directory.
Evidence boundary: This review uses the 2026-08-09 snapshot. L0, L1, and L2 results come from the local evaluation and the repository’s published audit; the complete per-question L1 table was not preserved, and L3 build, simulator, and screenshot regression were not completed. Revalidate every production claim against the target project and current SDK.