uikit-max — Claude Code skill: UIKit code review
Reviews UIKit code for deprecated APIs, Auto Layout mistakes and retain cycles. Useful when you touch UIViewController or UITableView screens.
npx skills add tornikegomareli/UIKit-Agent-Skill --skill uikit-max -a claude-codeWhat uikit-max does
The skill walks Swift code through twelve areas: deprecated APIs, UIView lifecycle, layout, controller architecture, navigation, table and collection views, accessibility, performance, concurrency. Each area lives in its own file under references/, so a partial review loads only what it needs. Findings come grouped by file, with the line, the rule that was broken and a short before/after snippet. A prioritized summary closes the report.
The author suggests targeting iOS 17 as the minimum for new code and Swift 6.2 with modern concurrency. Your project may sit on an older target, and the skill then insists on checking API availability and wrapping newer calls in if #available. That is the practical catch: without a stated deployment target, suggestions built on recent APIs may not compile.
It will not push SwiftUI replacements unless you ask, and it does not pull in third-party frameworks on its own. SwiftUI-only projects and Combine-only logic with no UIKit dependency are out of scope. For new code the author prefers programmatic UI with layout anchors over Storyboards and XIBs, unless the project already leans on Interface Builder.
What it helps with
- sweep out deprecated UIKit calls like UIAlertView
- track down constraint conflicts from a missing translatesAutoresizingMaskIntoConstraints
- break up a massive view controller
- move table views onto diffable data sources
- check Dynamic Type and VoiceOver before shipping
Example prompts for the agent
- Review ProfileViewController.swift with uikit-max and list issues by line
- Run uikit-max over the folder with my UITableView screens
- Check this code for retain cycles using the uikit-max rules
How to install uikit-max
1Skills CLI (Vercel)
npx skills add tornikegomareli/UIKit-Agent-Skill --skill uikit-max -a claude-code2Manually: put the files in place
~/.claude/skills/uikit-max/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/uikit-max/
1Skills CLI (Vercel)
npx skills add tornikegomareli/UIKit-Agent-Skill --skill uikit-max -a codex2Manually: put the files in place
.agents/skills/uikit-max/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add tornikegomareli/UIKit-Agent-Skill --skill uikit-max -a cursor2Manually: put the files in place
.cursor/skills/uikit-max/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install tornikegomareli/UIKit-Agent-Skill uikit-max2Manually: put the files in place
.github/skills/uikit-max/SKILL.md1Skills CLI (Vercel)
npx skills add tornikegomareli/UIKit-Agent-Skill --skill uikit-max -a gemini-cli2Platform CLI
gemini skills install https://github.com/tornikegomareli/UIKit-Agent-Skill --path uikit-maxManually: put the files in place
.devin/skills/uikit-max/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add tornikegomareli/UIKit-Agent-Skill --skill uikit-max -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about uikit-max
How do I install uikit-max in Claude?
Run npx skills add tornikegomareli/UIKit-Agent-Skill --skill uikit-max -a claude-code. The skill file then lands at ~/.claude/skills/uikit-max/SKILL.md.
What does uikit-max do?
It reviews UIKit code for deprecated APIs, Auto Layout problems, controller architecture, accessibility and performance, then returns a prioritized list of findings.
Does it work on a SwiftUI project?
No. SwiftUI-only projects and Combine-only logic without a UIKit dependency are outside what it covers.
Source text
SKILL.md · MIT
---
name: uikit-max
description: >-
Comprehensively reviews UIKit code for best practices on modern APIs,
architecture, and performance. Use when reading, writing, or reviewing
UIKit-based iOS projects, including UIViewController, UITableView,
UICollectionView, Auto Layout, or programmatic UI code. Also use when
migrating legacy UIKit patterns to modern equivalents. Do not use for
SwiftUI-only projects or Combine-only logic with no UIKit dependency.
license: MIT
metadata:
author: tgomareli
version: "1.0"
---
Review Swift and UIKit code for correctness, modern API usage, and adherence to project conventions. Report only genuine problems — do not nitpick or invent issues.
Review process:
1. Check for deprecated API using `references/api.md`.
1. Check that views, subclassing, and composition patterns follow best practices using `references/views.md`.
1. Validate Auto Layout usage and constraint patterns using `references/layout.md`.
1. Ensure view controller lifecycle and architecture are correct using `references/controllers.md`.
1. Ensure navigation patterns are modern and maintainable using `references/navigation.md`.
1. Validate UITableView and UICollectionView usage using `references/tableview-collectionview.md`.
1. Ensure the code uses designs that are accessible and compliant with Apple's Human Interface Guidelines using `references/design.md`.
1. Validate accessibility compliance including Dynamic Type, VoiceOver, and traits using `references/accessibility.md`.
1. Ensure the code runs efficiently using `references/performance.md`.
1. Check concurrency and thread safety using `references/concurrency.md`.
1. Quick validation of Swift code using `references/swift.md`.
1. Final code hygiene check using `references/hygiene.md`.
If doing a partial review, load only the relevant reference files.
## Core Instructions
- iOS 26 exists and is the latest iOS version. Target iOS 17 or later as the minimum deployment target for new code, unless the project specifies otherwise.
- Target Swift 6.2 or later, using modern Swift concurrency.
- **Respect the project's deployment target.** Before suggesting a modern API, check its availability. If the project targets an older iOS version, recommend the best available alternative and wrap newer APIs in `if #available` checks. Reference files mark key APIs with their iOS version (e.g., "iOS 15+"). Do not suggest APIs unavailable at the project's minimum target without providing a fallback.
- As a UIKit developer, the user expects UIKit patterns. Do not suggest SwiftUI replacements unless explicitly requested.
- Do not introduce third-party frameworks without asking first.
- Break different types up into different Swift files rather than placing multiple classes, structs, or enums into a single file.
- Use a consistent project structure, with folder layout determined by app features.
- Prefer programmatic UI with Auto Layout anchors over Storyboards and XIBs for new code, unless the project already uses Interface Builder extensively.
## Output Format
Organize findings by file. For each issue:
1. State the file and relevant line(s).
2. Name the rule being violated (e.g., "Use `UIAlertController` instead of `UIAlertView`").
3. Show a brief before/after code fix.
Skip files with no issues. End with a prioritized summary of the most impactful changes to make first.
Example output:
### ProfileViewController.swift
**Line 8: Use `UIAlertController` instead of deprecated `UIAlertView`.**
```swift
// Before
let alert = UIAlertView(title: "Error", message: msg, delegate: self, cancelButtonTitle: "OK")
alert.show()
// After
let alert = UIAlertController(title: "Error", message: msg, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
```
**Line 24: Batch constraint activation with `NSLayoutConstraint.activate`.**
```swift
// Before
label.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
label.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
// After
NSLayoutConstraint.activate([
label.topAnchor.constraint(equalTo: view.topAnchor),
label.leadingAnchor.constraint(equalTo: view.leadingAnchor)
])
```
**Line 42: Set `translatesAutoresizingMaskIntoConstraints = false` before adding constraints.**
```swift
// Before
view.addSubview(label)
label.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
// After
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.topAnchor.constraint(equalTo: view.topAnchor)
])
```
### Summary
1. **Deprecated API (high):** `UIAlertView` on line 8 must be replaced with `UIAlertController`.
2. **Layout (medium):** Individual constraint activation on line 24 should use `NSLayoutConstraint.activate`.
3. **Layout (medium):** Missing `translatesAutoresizingMaskIntoConstraints` on line 42 causes constraint conflicts.
End of example.
## References
- `references/api.md` — deprecated UIKit APIs and their modern replacements.
- `references/views.md` — UIView lifecycle, composition, subclassing, and custom drawing.
- `references/layout.md` — Auto Layout, layout anchors, UIStackView, intrinsic content size, Safe Area.
- `references/controllers.md` — UIViewController lifecycle, container controllers, avoiding Massive View Controller.
- `references/navigation.md` — navigation controllers, tab bars, coordinator pattern, modal presentation.
- `references/tableview-collectionview.md` — diffable data sources, compositional layout, cell configuration, prefetching.
- `references/design.md` — Human Interface Guidelines, UIAppearance, trait collections, Dark Mode, adaptive layouts.
- `references/accessibility.md` — VoiceOver, Dynamic Type, accessibility traits, labels, and hints.
- `references/performance.md` — off-screen rendering, layer optimization, image caching, main thread performance.
- `references/concurrency.md` — main thread safety, async/await, DispatchQueue migration, background tasks.
- `references/swift.md` — modern Swift code, Swift concurrency, Objective-C interop.
- `references/hygiene.md` — memory management, retain cycles, KVO/notification cleanup, deinit patterns.
© tgomareli · MIT · tornikegomareli/UIKit-Agent-Skill