Skip to content

Repository files navigation

iOS Accessibility for Claude Code, Cursor, Codex, and ChatGPT

Plugin for reviewing and improving accessibility in UIKit and SwiftUI interfaces with Claude Code, Cursor, Codex, or ChatGPT. The plugin is based on Mikhail Rubanov's book "About Accessibility on iOS".

Install

Claude Code

Add the marketplace and install the plugin:

claude plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
claude plugin install ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins in an active session. The commands are namespaced under ios-accessibility, for example:

/ios-accessibility:accessibility review accessibility on ProfileScreen

Cursor

Add the repository as a marketplace:

cursor-agent plugin marketplace add https://github.com/AccessibilityTools/iOSAccessibilitySkill

Run cursor-agent, enter /plugin, open the Marketplace tab, and install ios-accessibility. Cursor discovers the skills automatically; ask the Agent to review a screen or invoke a skill such as /accessibility.

Codex

Add the marketplace and install the plugin:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
codex plugin add ios-accessibility@accessibility-tools

Start a new task and ask Codex to review an iOS screen, or invoke $ios-accessibility:accessibility directly.

ChatGPT

Add the marketplace from a terminal:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill

Restart the ChatGPT desktop app, open the Plugins Directory, select Personal, and install ios-accessibility. ChatGPT and Codex use the same plugin package.

Update

Claude Code

Refresh the marketplace and update the plugin:

claude plugin marketplace update accessibility-tools
claude plugin update ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins to use the updated commands.

Cursor

Refresh the marketplace:

cursor-agent plugin marketplace update accessibility-tools

Then run /plugin and update or reinstall ios-accessibility from the Installed tab. Cursor does not currently provide a non-interactive plugin install command.

Codex and ChatGPT

Refresh the marketplace and reinstall the plugin:

codex plugin marketplace upgrade accessibility-tools
codex plugin add ios-accessibility@accessibility-tools

Start a new Codex task or restart the ChatGPT desktop app to load the updated skills.

Skills

/ios-accessibility:accessibility — Review a screen (main entrance)

The main entry point. Ask it to review accessibility on a screen — e.g. /ios-accessibility:accessibility review accessibility on ProfileScreen — and it audits the screen against the rules, applies fixes, and delegates cells/carousels/Dynamic Type to the focused skills below. Also covers VoiceOver, Voice Control, Switch Control, and overall accessibility for UIKit and SwiftUI:

  • accessibilityLabel, accessibilityValue, accessibilityTraits, and accessibilityHint
  • Element grouping, containers, and focus order control
  • Adjustable elements and custom actions
  • Speech customization (pronunciation, language, pitch)
  • Navigation: notifications, modals, scrub gesture, magic tap, custom rotors
  • Color contrast, Smart Invert, reduce motion
  • Drag and drop accessibility
  • System accessibility settings to respect
  • Testing strategies (manual, automated, snapshot tests)

/ios-accessibility:accessibility-cell — Cell Accessibility

Focused skill for list / table / collection cells — turn a multi-view row into one well-structured element:

  • One element per cell (.combine / .ignore / isAccessibilityElement)
  • Label = main content, value = additional content
  • Hard-to-read values (addresses, ids, timestamps) → accessibilityCustomContent (spoken on demand)
  • All button actions → accessibility actions (primary activation + named custom actions)
  • Input labels with alternatives and synonyms for Voice Control
  • Hiding decorative avatars / icons / chevrons

/ios-accessibility:accessibility-carousel — Carousel Accessibility

Focused skill for horizontally paged banners, card decks, galleries, and onboarding pagers:

  • Adjustable-control vs container-of-pages model
  • Announcing position ("page X of N") and page changes
  • Hiding off-screen pages, accessibilityScroll paging (UIKit)
  • Pausing autoplay under VoiceOver / Switch Control / Reduce Motion

/ios-accessibility:accessibility-dynamic-type — Dynamic Type

Dedicated skill for text scaling and adaptive layout:

  • System and custom font scaling (UIFontMetrics, @ScaledMetric)
  • Adaptive layout (switching axis at accessibility sizes)
  • Self-sizing cells and containers
  • Large Content Viewer for fixed controls
  • Bold text support
  • Limiting Dynamic Type when needed
  • Testing and verification

Usage

Open your iOS project and use a plugin command with any prompt. Cursor uses the skill name without a namespace. Codex uses the $ios-accessibility: namespace. ChatGPT discovers the matching skill from the request.

/ios-accessibility:accessibility review accessibility on ProfileScreen
/ios-accessibility:accessibility Review this file for accessibility issues
/ios-accessibility:accessibility-cell Make this recipient row read as one VoiceOver element
/ios-accessibility:accessibility-cell Move the hard-to-read values in this cell into custom content
/ios-accessibility:accessibility-dynamic-type Add Dynamic Type support to this view
/ios-accessibility:accessibility How should I make this custom slider accessible?
/ios-accessibility:accessibility Review the current screen and suggest grouping improvements

Example workflows

Review a specific file:

/ios-accessibility:accessibility Review Sources/Views/MenuCell.swift for accessibility

Make a screen accessible step by step:

/ios-accessibility:accessibility Walk me through making the checkout screen fully accessible

Adapt a cell:

/ios-accessibility:accessibility-cell Turn OrderCell into one element: label, value, custom content, actions

Fix a specific issue:

/ios-accessibility:accessibility The VoiceOver focus order is wrong on the product detail screen

Generate tests:

/ios-accessibility:accessibility Write accessibility snapshot tests for OrderCell

Auto-apply to every screen (CLAUDE.md rules)

To make Claude automatically check accessibility on every screen you work on, add a CLAUDE.md file to your iOS project root. CLAUDE.md contains instructions Claude Code reads on every conversation.

Basic rule

Create a CLAUDE.md in your project root with:

## Accessibility
When creating or modifying any UIView, UIViewController, or SwiftUI View:
- Run /ios-accessibility:accessibility to review the accessibility of the changed code
- Ensure every interactive element has accessibilityLabel and appropriate traits
- Ensure decorative images are hidden from VoiceOver
- Run /ios-accessibility:accessibility-dynamic-type to review Dynamic Type support
- Ensure Dynamic Type is supported (no fixed heights, use dynamic fonts)

Comprehensive rule

For stricter enforcement:

## Accessibility Requirements
Every UI change MUST pass these checks before being considered complete:
1.**Labels**: Every interactive element has `accessibilityLabel` and appropriate `accessibilityTraits`2.**Grouping**: Related elements are combined (`.accessibilityElement(children: .combine)` in SwiftUI, or `isAccessibilityElement = true` with combined label in UIKit)
3.**Decorative elements**: Hidden from VoiceOver (`isAccessibilityElement = false` / `.accessibilityHidden(true)`)
4.**Dynamic Type**: No fixed heights, use `UIFont.preferredFont(forTextStyle:)` or `.font(.body)`, support `.isAccessibilityCategory` layout changes
5.**Navigation**: Headers marked with `.header` trait, modals set `accessibilityViewIsModal = true`, custom views implement `accessibilityPerformEscape()`6.**State changes**: Dynamic content posts `UIAccessibility.post(notification:)` appropriately
7.**System settings**: Respect `isReduceMotionEnabled`, `shouldDifferentiateWithoutColor`, `isBoldTextEnabled`, and other accessibility preferences
When writing or reviewing UI code, use /ios-accessibility:accessibility and /ios-accessibility:accessibility-dynamic-type to verify compliance.

Per-screen rule (for new features)

You can also scope the rule to specific features:

## Current Sprint: Checkout Redesign
All views in `Sources/Checkout/` must be fully accessible.
Before marking any task as done, run `/ios-accessibility:accessibility Review {filename} for accessibility issues` on every changed view file.

How the skills work

Each skill is a Markdown file that Claude Code and Cursor load when you invoke it or ask for matching work. They contain structured knowledge about iOS accessibility APIs, patterns, and best practices that the agent uses to give accurate, specific advice.

The $ARGUMENTS placeholder at the end of each file is replaced with whatever you type after the command.

FileCommandFocus
plugins/ios-accessibility/skills/accessibility/SKILL.md/ios-accessibility:accessibilityVoiceOver, Voice Control, Switch Control, general accessibility
plugins/ios-accessibility/skills/accessibility-cell/SKILL.md/ios-accessibility:accessibility-cellCell accessibility: label/value/custom-content/actions/input-labels
plugins/ios-accessibility/skills/accessibility-carousel/SKILL.md/ios-accessibility:accessibility-carouselCarousel accessibility: paging model, position, autoplay
plugins/ios-accessibility/skills/accessibility-dynamic-type/SKILL.md/ios-accessibility:accessibility-dynamic-typeFont scaling, adaptive layout, Large Content Viewer

License

The accessibility knowledge is based on the book "About Accessibility on iOS" by Mikhail Rubanov.

About

Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - AccessibilityTools/iOSAccessibilitySkill: Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov · GitHub
Skip to content

Repository files navigation

iOS Accessibility for Claude Code, Cursor, Codex, and ChatGPT

Plugin for reviewing and improving accessibility in UIKit and SwiftUI interfaces with Claude Code, Cursor, Codex, or ChatGPT. The plugin is based on Mikhail Rubanov's book "About Accessibility on iOS".

Install

Claude Code

Add the marketplace and install the plugin:

claude plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
claude plugin install ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins in an active session. The commands are namespaced under ios-accessibility, for example:

/ios-accessibility:accessibility review accessibility on ProfileScreen

Cursor

Add the repository as a marketplace:

cursor-agent plugin marketplace add https://github.com/AccessibilityTools/iOSAccessibilitySkill

Run cursor-agent, enter /plugin, open the Marketplace tab, and install ios-accessibility. Cursor discovers the skills automatically; ask the Agent to review a screen or invoke a skill such as /accessibility.

Codex

Add the marketplace and install the plugin:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
codex plugin add ios-accessibility@accessibility-tools

Start a new task and ask Codex to review an iOS screen, or invoke $ios-accessibility:accessibility directly.

ChatGPT

Add the marketplace from a terminal:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill

Restart the ChatGPT desktop app, open the Plugins Directory, select Personal, and install ios-accessibility. ChatGPT and Codex use the same plugin package.

Update

Claude Code

Refresh the marketplace and update the plugin:

claude plugin marketplace update accessibility-tools
claude plugin update ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins to use the updated commands.

Cursor

Refresh the marketplace:

cursor-agent plugin marketplace update accessibility-tools

Then run /plugin and update or reinstall ios-accessibility from the Installed tab. Cursor does not currently provide a non-interactive plugin install command.

Codex and ChatGPT

Refresh the marketplace and reinstall the plugin:

codex plugin marketplace upgrade accessibility-tools
codex plugin add ios-accessibility@accessibility-tools

Start a new Codex task or restart the ChatGPT desktop app to load the updated skills.

Skills

/ios-accessibility:accessibility — Review a screen (main entrance)

The main entry point. Ask it to review accessibility on a screen — e.g. /ios-accessibility:accessibility review accessibility on ProfileScreen — and it audits the screen against the rules, applies fixes, and delegates cells/carousels/Dynamic Type to the focused skills below. Also covers VoiceOver, Voice Control, Switch Control, and overall accessibility for UIKit and SwiftUI:

  • accessibilityLabel, accessibilityValue, accessibilityTraits, and accessibilityHint
  • Element grouping, containers, and focus order control
  • Adjustable elements and custom actions
  • Speech customization (pronunciation, language, pitch)
  • Navigation: notifications, modals, scrub gesture, magic tap, custom rotors
  • Color contrast, Smart Invert, reduce motion
  • Drag and drop accessibility
  • System accessibility settings to respect
  • Testing strategies (manual, automated, snapshot tests)

/ios-accessibility:accessibility-cell — Cell Accessibility

Focused skill for list / table / collection cells — turn a multi-view row into one well-structured element:

  • One element per cell (.combine / .ignore / isAccessibilityElement)
  • Label = main content, value = additional content
  • Hard-to-read values (addresses, ids, timestamps) → accessibilityCustomContent (spoken on demand)
  • All button actions → accessibility actions (primary activation + named custom actions)
  • Input labels with alternatives and synonyms for Voice Control
  • Hiding decorative avatars / icons / chevrons

/ios-accessibility:accessibility-carousel — Carousel Accessibility

Focused skill for horizontally paged banners, card decks, galleries, and onboarding pagers:

  • Adjustable-control vs container-of-pages model
  • Announcing position ("page X of N") and page changes
  • Hiding off-screen pages, accessibilityScroll paging (UIKit)
  • Pausing autoplay under VoiceOver / Switch Control / Reduce Motion

/ios-accessibility:accessibility-dynamic-type — Dynamic Type

Dedicated skill for text scaling and adaptive layout:

  • System and custom font scaling (UIFontMetrics, @ScaledMetric)
  • Adaptive layout (switching axis at accessibility sizes)
  • Self-sizing cells and containers
  • Large Content Viewer for fixed controls
  • Bold text support
  • Limiting Dynamic Type when needed
  • Testing and verification

Usage

Open your iOS project and use a plugin command with any prompt. Cursor uses the skill name without a namespace. Codex uses the $ios-accessibility: namespace. ChatGPT discovers the matching skill from the request.

/ios-accessibility:accessibility review accessibility on ProfileScreen
/ios-accessibility:accessibility Review this file for accessibility issues
/ios-accessibility:accessibility-cell Make this recipient row read as one VoiceOver element
/ios-accessibility:accessibility-cell Move the hard-to-read values in this cell into custom content
/ios-accessibility:accessibility-dynamic-type Add Dynamic Type support to this view
/ios-accessibility:accessibility How should I make this custom slider accessible?
/ios-accessibility:accessibility Review the current screen and suggest grouping improvements

Example workflows

Review a specific file:

/ios-accessibility:accessibility Review Sources/Views/MenuCell.swift for accessibility

Make a screen accessible step by step:

/ios-accessibility:accessibility Walk me through making the checkout screen fully accessible

Adapt a cell:

/ios-accessibility:accessibility-cell Turn OrderCell into one element: label, value, custom content, actions

Fix a specific issue:

/ios-accessibility:accessibility The VoiceOver focus order is wrong on the product detail screen

Generate tests:

/ios-accessibility:accessibility Write accessibility snapshot tests for OrderCell

Auto-apply to every screen (CLAUDE.md rules)

To make Claude automatically check accessibility on every screen you work on, add a CLAUDE.md file to your iOS project root. CLAUDE.md contains instructions Claude Code reads on every conversation.

Basic rule

Create a CLAUDE.md in your project root with:

## Accessibility
When creating or modifying any UIView, UIViewController, or SwiftUI View:
- Run /ios-accessibility:accessibility to review the accessibility of the changed code
- Ensure every interactive element has accessibilityLabel and appropriate traits
- Ensure decorative images are hidden from VoiceOver
- Run /ios-accessibility:accessibility-dynamic-type to review Dynamic Type support
- Ensure Dynamic Type is supported (no fixed heights, use dynamic fonts)

Comprehensive rule

For stricter enforcement:

## Accessibility Requirements
Every UI change MUST pass these checks before being considered complete:
1.**Labels**: Every interactive element has `accessibilityLabel` and appropriate `accessibilityTraits`2.**Grouping**: Related elements are combined (`.accessibilityElement(children: .combine)` in SwiftUI, or `isAccessibilityElement = true` with combined label in UIKit)
3.**Decorative elements**: Hidden from VoiceOver (`isAccessibilityElement = false` / `.accessibilityHidden(true)`)
4.**Dynamic Type**: No fixed heights, use `UIFont.preferredFont(forTextStyle:)` or `.font(.body)`, support `.isAccessibilityCategory` layout changes
5.**Navigation**: Headers marked with `.header` trait, modals set `accessibilityViewIsModal = true`, custom views implement `accessibilityPerformEscape()`6.**State changes**: Dynamic content posts `UIAccessibility.post(notification:)` appropriately
7.**System settings**: Respect `isReduceMotionEnabled`, `shouldDifferentiateWithoutColor`, `isBoldTextEnabled`, and other accessibility preferences
When writing or reviewing UI code, use /ios-accessibility:accessibility and /ios-accessibility:accessibility-dynamic-type to verify compliance.

Per-screen rule (for new features)

You can also scope the rule to specific features:

## Current Sprint: Checkout Redesign
All views in `Sources/Checkout/` must be fully accessible.
Before marking any task as done, run `/ios-accessibility:accessibility Review {filename} for accessibility issues` on every changed view file.

How the skills work

Each skill is a Markdown file that Claude Code and Cursor load when you invoke it or ask for matching work. They contain structured knowledge about iOS accessibility APIs, patterns, and best practices that the agent uses to give accurate, specific advice.

The $ARGUMENTS placeholder at the end of each file is replaced with whatever you type after the command.

FileCommandFocus
plugins/ios-accessibility/skills/accessibility/SKILL.md/ios-accessibility:accessibilityVoiceOver, Voice Control, Switch Control, general accessibility
plugins/ios-accessibility/skills/accessibility-cell/SKILL.md/ios-accessibility:accessibility-cellCell accessibility: label/value/custom-content/actions/input-labels
plugins/ios-accessibility/skills/accessibility-carousel/SKILL.md/ios-accessibility:accessibility-carouselCarousel accessibility: paging model, position, autoplay
plugins/ios-accessibility/skills/accessibility-dynamic-type/SKILL.md/ios-accessibility:accessibility-dynamic-typeFont scaling, adaptive layout, Large Content Viewer

License

The accessibility knowledge is based on the book "About Accessibility on iOS" by Mikhail Rubanov.

About

Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - AccessibilityTools/iOSAccessibilitySkill: Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov · GitHub
Skip to content

Repository files navigation

iOS Accessibility for Claude Code, Cursor, Codex, and ChatGPT

Plugin for reviewing and improving accessibility in UIKit and SwiftUI interfaces with Claude Code, Cursor, Codex, or ChatGPT. The plugin is based on Mikhail Rubanov's book "About Accessibility on iOS".

Install

Claude Code

Add the marketplace and install the plugin:

claude plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
claude plugin install ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins in an active session. The commands are namespaced under ios-accessibility, for example:

/ios-accessibility:accessibility review accessibility on ProfileScreen

Cursor

Add the repository as a marketplace:

cursor-agent plugin marketplace add https://github.com/AccessibilityTools/iOSAccessibilitySkill

Run cursor-agent, enter /plugin, open the Marketplace tab, and install ios-accessibility. Cursor discovers the skills automatically; ask the Agent to review a screen or invoke a skill such as /accessibility.

Codex

Add the marketplace and install the plugin:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
codex plugin add ios-accessibility@accessibility-tools

Start a new task and ask Codex to review an iOS screen, or invoke $ios-accessibility:accessibility directly.

ChatGPT

Add the marketplace from a terminal:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill

Restart the ChatGPT desktop app, open the Plugins Directory, select Personal, and install ios-accessibility. ChatGPT and Codex use the same plugin package.

Update

Claude Code

Refresh the marketplace and update the plugin:

claude plugin marketplace update accessibility-tools
claude plugin update ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins to use the updated commands.

Cursor

Refresh the marketplace:

cursor-agent plugin marketplace update accessibility-tools

Then run /plugin and update or reinstall ios-accessibility from the Installed tab. Cursor does not currently provide a non-interactive plugin install command.

Codex and ChatGPT

Refresh the marketplace and reinstall the plugin:

codex plugin marketplace upgrade accessibility-tools
codex plugin add ios-accessibility@accessibility-tools

Start a new Codex task or restart the ChatGPT desktop app to load the updated skills.

Skills

/ios-accessibility:accessibility — Review a screen (main entrance)

The main entry point. Ask it to review accessibility on a screen — e.g. /ios-accessibility:accessibility review accessibility on ProfileScreen — and it audits the screen against the rules, applies fixes, and delegates cells/carousels/Dynamic Type to the focused skills below. Also covers VoiceOver, Voice Control, Switch Control, and overall accessibility for UIKit and SwiftUI:

  • accessibilityLabel, accessibilityValue, accessibilityTraits, and accessibilityHint
  • Element grouping, containers, and focus order control
  • Adjustable elements and custom actions
  • Speech customization (pronunciation, language, pitch)
  • Navigation: notifications, modals, scrub gesture, magic tap, custom rotors
  • Color contrast, Smart Invert, reduce motion
  • Drag and drop accessibility
  • System accessibility settings to respect
  • Testing strategies (manual, automated, snapshot tests)

/ios-accessibility:accessibility-cell — Cell Accessibility

Focused skill for list / table / collection cells — turn a multi-view row into one well-structured element:

  • One element per cell (.combine / .ignore / isAccessibilityElement)
  • Label = main content, value = additional content
  • Hard-to-read values (addresses, ids, timestamps) → accessibilityCustomContent (spoken on demand)
  • All button actions → accessibility actions (primary activation + named custom actions)
  • Input labels with alternatives and synonyms for Voice Control
  • Hiding decorative avatars / icons / chevrons

/ios-accessibility:accessibility-carousel — Carousel Accessibility

Focused skill for horizontally paged banners, card decks, galleries, and onboarding pagers:

  • Adjustable-control vs container-of-pages model
  • Announcing position ("page X of N") and page changes
  • Hiding off-screen pages, accessibilityScroll paging (UIKit)
  • Pausing autoplay under VoiceOver / Switch Control / Reduce Motion

/ios-accessibility:accessibility-dynamic-type — Dynamic Type

Dedicated skill for text scaling and adaptive layout:

  • System and custom font scaling (UIFontMetrics, @ScaledMetric)
  • Adaptive layout (switching axis at accessibility sizes)
  • Self-sizing cells and containers
  • Large Content Viewer for fixed controls
  • Bold text support
  • Limiting Dynamic Type when needed
  • Testing and verification

Usage

Open your iOS project and use a plugin command with any prompt. Cursor uses the skill name without a namespace. Codex uses the $ios-accessibility: namespace. ChatGPT discovers the matching skill from the request.

/ios-accessibility:accessibility review accessibility on ProfileScreen
/ios-accessibility:accessibility Review this file for accessibility issues
/ios-accessibility:accessibility-cell Make this recipient row read as one VoiceOver element
/ios-accessibility:accessibility-cell Move the hard-to-read values in this cell into custom content
/ios-accessibility:accessibility-dynamic-type Add Dynamic Type support to this view
/ios-accessibility:accessibility How should I make this custom slider accessible?
/ios-accessibility:accessibility Review the current screen and suggest grouping improvements

Example workflows

Review a specific file:

/ios-accessibility:accessibility Review Sources/Views/MenuCell.swift for accessibility

Make a screen accessible step by step:

/ios-accessibility:accessibility Walk me through making the checkout screen fully accessible

Adapt a cell:

/ios-accessibility:accessibility-cell Turn OrderCell into one element: label, value, custom content, actions

Fix a specific issue:

/ios-accessibility:accessibility The VoiceOver focus order is wrong on the product detail screen

Generate tests:

/ios-accessibility:accessibility Write accessibility snapshot tests for OrderCell

Auto-apply to every screen (CLAUDE.md rules)

To make Claude automatically check accessibility on every screen you work on, add a CLAUDE.md file to your iOS project root. CLAUDE.md contains instructions Claude Code reads on every conversation.

Basic rule

Create a CLAUDE.md in your project root with:

## Accessibility
When creating or modifying any UIView, UIViewController, or SwiftUI View:
- Run /ios-accessibility:accessibility to review the accessibility of the changed code
- Ensure every interactive element has accessibilityLabel and appropriate traits
- Ensure decorative images are hidden from VoiceOver
- Run /ios-accessibility:accessibility-dynamic-type to review Dynamic Type support
- Ensure Dynamic Type is supported (no fixed heights, use dynamic fonts)

Comprehensive rule

For stricter enforcement:

## Accessibility Requirements
Every UI change MUST pass these checks before being considered complete:
1.**Labels**: Every interactive element has `accessibilityLabel` and appropriate `accessibilityTraits`2.**Grouping**: Related elements are combined (`.accessibilityElement(children: .combine)` in SwiftUI, or `isAccessibilityElement = true` with combined label in UIKit)
3.**Decorative elements**: Hidden from VoiceOver (`isAccessibilityElement = false` / `.accessibilityHidden(true)`)
4.**Dynamic Type**: No fixed heights, use `UIFont.preferredFont(forTextStyle:)` or `.font(.body)`, support `.isAccessibilityCategory` layout changes
5.**Navigation**: Headers marked with `.header` trait, modals set `accessibilityViewIsModal = true`, custom views implement `accessibilityPerformEscape()`6.**State changes**: Dynamic content posts `UIAccessibility.post(notification:)` appropriately
7.**System settings**: Respect `isReduceMotionEnabled`, `shouldDifferentiateWithoutColor`, `isBoldTextEnabled`, and other accessibility preferences
When writing or reviewing UI code, use /ios-accessibility:accessibility and /ios-accessibility:accessibility-dynamic-type to verify compliance.

Per-screen rule (for new features)

You can also scope the rule to specific features:

## Current Sprint: Checkout Redesign
All views in `Sources/Checkout/` must be fully accessible.
Before marking any task as done, run `/ios-accessibility:accessibility Review {filename} for accessibility issues` on every changed view file.

How the skills work

Each skill is a Markdown file that Claude Code and Cursor load when you invoke it or ask for matching work. They contain structured knowledge about iOS accessibility APIs, patterns, and best practices that the agent uses to give accurate, specific advice.

The $ARGUMENTS placeholder at the end of each file is replaced with whatever you type after the command.

FileCommandFocus
plugins/ios-accessibility/skills/accessibility/SKILL.md/ios-accessibility:accessibilityVoiceOver, Voice Control, Switch Control, general accessibility
plugins/ios-accessibility/skills/accessibility-cell/SKILL.md/ios-accessibility:accessibility-cellCell accessibility: label/value/custom-content/actions/input-labels
plugins/ios-accessibility/skills/accessibility-carousel/SKILL.md/ios-accessibility:accessibility-carouselCarousel accessibility: paging model, position, autoplay
plugins/ios-accessibility/skills/accessibility-dynamic-type/SKILL.md/ios-accessibility:accessibility-dynamic-typeFont scaling, adaptive layout, Large Content Viewer

License

The accessibility knowledge is based on the book "About Accessibility on iOS" by Mikhail Rubanov.

About

Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - AccessibilityTools/iOSAccessibilitySkill: Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov · GitHub
Skip to content

Repository files navigation

iOS Accessibility for Claude Code, Cursor, Codex, and ChatGPT

Plugin for reviewing and improving accessibility in UIKit and SwiftUI interfaces with Claude Code, Cursor, Codex, or ChatGPT. The plugin is based on Mikhail Rubanov's book "About Accessibility on iOS".

Install

Claude Code

Add the marketplace and install the plugin:

claude plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
claude plugin install ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins in an active session. The commands are namespaced under ios-accessibility, for example:

/ios-accessibility:accessibility review accessibility on ProfileScreen

Cursor

Add the repository as a marketplace:

cursor-agent plugin marketplace add https://github.com/AccessibilityTools/iOSAccessibilitySkill

Run cursor-agent, enter /plugin, open the Marketplace tab, and install ios-accessibility. Cursor discovers the skills automatically; ask the Agent to review a screen or invoke a skill such as /accessibility.

Codex

Add the marketplace and install the plugin:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
codex plugin add ios-accessibility@accessibility-tools

Start a new task and ask Codex to review an iOS screen, or invoke $ios-accessibility:accessibility directly.

ChatGPT

Add the marketplace from a terminal:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill

Restart the ChatGPT desktop app, open the Plugins Directory, select Personal, and install ios-accessibility. ChatGPT and Codex use the same plugin package.

Update

Claude Code

Refresh the marketplace and update the plugin:

claude plugin marketplace update accessibility-tools
claude plugin update ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins to use the updated commands.

Cursor

Refresh the marketplace:

cursor-agent plugin marketplace update accessibility-tools

Then run /plugin and update or reinstall ios-accessibility from the Installed tab. Cursor does not currently provide a non-interactive plugin install command.

Codex and ChatGPT

Refresh the marketplace and reinstall the plugin:

codex plugin marketplace upgrade accessibility-tools
codex plugin add ios-accessibility@accessibility-tools

Start a new Codex task or restart the ChatGPT desktop app to load the updated skills.

Skills

/ios-accessibility:accessibility — Review a screen (main entrance)

The main entry point. Ask it to review accessibility on a screen — e.g. /ios-accessibility:accessibility review accessibility on ProfileScreen — and it audits the screen against the rules, applies fixes, and delegates cells/carousels/Dynamic Type to the focused skills below. Also covers VoiceOver, Voice Control, Switch Control, and overall accessibility for UIKit and SwiftUI:

  • accessibilityLabel, accessibilityValue, accessibilityTraits, and accessibilityHint
  • Element grouping, containers, and focus order control
  • Adjustable elements and custom actions
  • Speech customization (pronunciation, language, pitch)
  • Navigation: notifications, modals, scrub gesture, magic tap, custom rotors
  • Color contrast, Smart Invert, reduce motion
  • Drag and drop accessibility
  • System accessibility settings to respect
  • Testing strategies (manual, automated, snapshot tests)

/ios-accessibility:accessibility-cell — Cell Accessibility

Focused skill for list / table / collection cells — turn a multi-view row into one well-structured element:

  • One element per cell (.combine / .ignore / isAccessibilityElement)
  • Label = main content, value = additional content
  • Hard-to-read values (addresses, ids, timestamps) → accessibilityCustomContent (spoken on demand)
  • All button actions → accessibility actions (primary activation + named custom actions)
  • Input labels with alternatives and synonyms for Voice Control
  • Hiding decorative avatars / icons / chevrons

/ios-accessibility:accessibility-carousel — Carousel Accessibility

Focused skill for horizontally paged banners, card decks, galleries, and onboarding pagers:

  • Adjustable-control vs container-of-pages model
  • Announcing position ("page X of N") and page changes
  • Hiding off-screen pages, accessibilityScroll paging (UIKit)
  • Pausing autoplay under VoiceOver / Switch Control / Reduce Motion

/ios-accessibility:accessibility-dynamic-type — Dynamic Type

Dedicated skill for text scaling and adaptive layout:

  • System and custom font scaling (UIFontMetrics, @ScaledMetric)
  • Adaptive layout (switching axis at accessibility sizes)
  • Self-sizing cells and containers
  • Large Content Viewer for fixed controls
  • Bold text support
  • Limiting Dynamic Type when needed
  • Testing and verification

Usage

Open your iOS project and use a plugin command with any prompt. Cursor uses the skill name without a namespace. Codex uses the $ios-accessibility: namespace. ChatGPT discovers the matching skill from the request.

/ios-accessibility:accessibility review accessibility on ProfileScreen
/ios-accessibility:accessibility Review this file for accessibility issues
/ios-accessibility:accessibility-cell Make this recipient row read as one VoiceOver element
/ios-accessibility:accessibility-cell Move the hard-to-read values in this cell into custom content
/ios-accessibility:accessibility-dynamic-type Add Dynamic Type support to this view
/ios-accessibility:accessibility How should I make this custom slider accessible?
/ios-accessibility:accessibility Review the current screen and suggest grouping improvements

Example workflows

Review a specific file:

/ios-accessibility:accessibility Review Sources/Views/MenuCell.swift for accessibility

Make a screen accessible step by step:

/ios-accessibility:accessibility Walk me through making the checkout screen fully accessible

Adapt a cell:

/ios-accessibility:accessibility-cell Turn OrderCell into one element: label, value, custom content, actions

Fix a specific issue:

/ios-accessibility:accessibility The VoiceOver focus order is wrong on the product detail screen

Generate tests:

/ios-accessibility:accessibility Write accessibility snapshot tests for OrderCell

Auto-apply to every screen (CLAUDE.md rules)

To make Claude automatically check accessibility on every screen you work on, add a CLAUDE.md file to your iOS project root. CLAUDE.md contains instructions Claude Code reads on every conversation.

Basic rule

Create a CLAUDE.md in your project root with:

## Accessibility
When creating or modifying any UIView, UIViewController, or SwiftUI View:
- Run /ios-accessibility:accessibility to review the accessibility of the changed code
- Ensure every interactive element has accessibilityLabel and appropriate traits
- Ensure decorative images are hidden from VoiceOver
- Run /ios-accessibility:accessibility-dynamic-type to review Dynamic Type support
- Ensure Dynamic Type is supported (no fixed heights, use dynamic fonts)

Comprehensive rule

For stricter enforcement:

## Accessibility Requirements
Every UI change MUST pass these checks before being considered complete:
1.**Labels**: Every interactive element has `accessibilityLabel` and appropriate `accessibilityTraits`2.**Grouping**: Related elements are combined (`.accessibilityElement(children: .combine)` in SwiftUI, or `isAccessibilityElement = true` with combined label in UIKit)
3.**Decorative elements**: Hidden from VoiceOver (`isAccessibilityElement = false` / `.accessibilityHidden(true)`)
4.**Dynamic Type**: No fixed heights, use `UIFont.preferredFont(forTextStyle:)` or `.font(.body)`, support `.isAccessibilityCategory` layout changes
5.**Navigation**: Headers marked with `.header` trait, modals set `accessibilityViewIsModal = true`, custom views implement `accessibilityPerformEscape()`6.**State changes**: Dynamic content posts `UIAccessibility.post(notification:)` appropriately
7.**System settings**: Respect `isReduceMotionEnabled`, `shouldDifferentiateWithoutColor`, `isBoldTextEnabled`, and other accessibility preferences
When writing or reviewing UI code, use /ios-accessibility:accessibility and /ios-accessibility:accessibility-dynamic-type to verify compliance.

Per-screen rule (for new features)

You can also scope the rule to specific features:

## Current Sprint: Checkout Redesign
All views in `Sources/Checkout/` must be fully accessible.
Before marking any task as done, run `/ios-accessibility:accessibility Review {filename} for accessibility issues` on every changed view file.

How the skills work

Each skill is a Markdown file that Claude Code and Cursor load when you invoke it or ask for matching work. They contain structured knowledge about iOS accessibility APIs, patterns, and best practices that the agent uses to give accurate, specific advice.

The $ARGUMENTS placeholder at the end of each file is replaced with whatever you type after the command.

FileCommandFocus
plugins/ios-accessibility/skills/accessibility/SKILL.md/ios-accessibility:accessibilityVoiceOver, Voice Control, Switch Control, general accessibility
plugins/ios-accessibility/skills/accessibility-cell/SKILL.md/ios-accessibility:accessibility-cellCell accessibility: label/value/custom-content/actions/input-labels
plugins/ios-accessibility/skills/accessibility-carousel/SKILL.md/ios-accessibility:accessibility-carouselCarousel accessibility: paging model, position, autoplay
plugins/ios-accessibility/skills/accessibility-dynamic-type/SKILL.md/ios-accessibility:accessibility-dynamic-typeFont scaling, adaptive layout, Large Content Viewer

License

The accessibility knowledge is based on the book "About Accessibility on iOS" by Mikhail Rubanov.

About

Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - AccessibilityTools/iOSAccessibilitySkill: Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov · GitHub
Skip to content

Repository files navigation

iOS Accessibility for Claude Code, Cursor, Codex, and ChatGPT

Plugin for reviewing and improving accessibility in UIKit and SwiftUI interfaces with Claude Code, Cursor, Codex, or ChatGPT. The plugin is based on Mikhail Rubanov's book "About Accessibility on iOS".

Install

Claude Code

Add the marketplace and install the plugin:

claude plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
claude plugin install ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins in an active session. The commands are namespaced under ios-accessibility, for example:

/ios-accessibility:accessibility review accessibility on ProfileScreen

Cursor

Add the repository as a marketplace:

cursor-agent plugin marketplace add https://github.com/AccessibilityTools/iOSAccessibilitySkill

Run cursor-agent, enter /plugin, open the Marketplace tab, and install ios-accessibility. Cursor discovers the skills automatically; ask the Agent to review a screen or invoke a skill such as /accessibility.

Codex

Add the marketplace and install the plugin:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
codex plugin add ios-accessibility@accessibility-tools

Start a new task and ask Codex to review an iOS screen, or invoke $ios-accessibility:accessibility directly.

ChatGPT

Add the marketplace from a terminal:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill

Restart the ChatGPT desktop app, open the Plugins Directory, select Personal, and install ios-accessibility. ChatGPT and Codex use the same plugin package.

Update

Claude Code

Refresh the marketplace and update the plugin:

claude plugin marketplace update accessibility-tools
claude plugin update ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins to use the updated commands.

Cursor

Refresh the marketplace:

cursor-agent plugin marketplace update accessibility-tools

Then run /plugin and update or reinstall ios-accessibility from the Installed tab. Cursor does not currently provide a non-interactive plugin install command.

Codex and ChatGPT

Refresh the marketplace and reinstall the plugin:

codex plugin marketplace upgrade accessibility-tools
codex plugin add ios-accessibility@accessibility-tools

Start a new Codex task or restart the ChatGPT desktop app to load the updated skills.

Skills

/ios-accessibility:accessibility — Review a screen (main entrance)

The main entry point. Ask it to review accessibility on a screen — e.g. /ios-accessibility:accessibility review accessibility on ProfileScreen — and it audits the screen against the rules, applies fixes, and delegates cells/carousels/Dynamic Type to the focused skills below. Also covers VoiceOver, Voice Control, Switch Control, and overall accessibility for UIKit and SwiftUI:

  • accessibilityLabel, accessibilityValue, accessibilityTraits, and accessibilityHint
  • Element grouping, containers, and focus order control
  • Adjustable elements and custom actions
  • Speech customization (pronunciation, language, pitch)
  • Navigation: notifications, modals, scrub gesture, magic tap, custom rotors
  • Color contrast, Smart Invert, reduce motion
  • Drag and drop accessibility
  • System accessibility settings to respect
  • Testing strategies (manual, automated, snapshot tests)

/ios-accessibility:accessibility-cell — Cell Accessibility

Focused skill for list / table / collection cells — turn a multi-view row into one well-structured element:

  • One element per cell (.combine / .ignore / isAccessibilityElement)
  • Label = main content, value = additional content
  • Hard-to-read values (addresses, ids, timestamps) → accessibilityCustomContent (spoken on demand)
  • All button actions → accessibility actions (primary activation + named custom actions)
  • Input labels with alternatives and synonyms for Voice Control
  • Hiding decorative avatars / icons / chevrons

/ios-accessibility:accessibility-carousel — Carousel Accessibility

Focused skill for horizontally paged banners, card decks, galleries, and onboarding pagers:

  • Adjustable-control vs container-of-pages model
  • Announcing position ("page X of N") and page changes
  • Hiding off-screen pages, accessibilityScroll paging (UIKit)
  • Pausing autoplay under VoiceOver / Switch Control / Reduce Motion

/ios-accessibility:accessibility-dynamic-type — Dynamic Type

Dedicated skill for text scaling and adaptive layout:

  • System and custom font scaling (UIFontMetrics, @ScaledMetric)
  • Adaptive layout (switching axis at accessibility sizes)
  • Self-sizing cells and containers
  • Large Content Viewer for fixed controls
  • Bold text support
  • Limiting Dynamic Type when needed
  • Testing and verification

Usage

Open your iOS project and use a plugin command with any prompt. Cursor uses the skill name without a namespace. Codex uses the $ios-accessibility: namespace. ChatGPT discovers the matching skill from the request.

/ios-accessibility:accessibility review accessibility on ProfileScreen
/ios-accessibility:accessibility Review this file for accessibility issues
/ios-accessibility:accessibility-cell Make this recipient row read as one VoiceOver element
/ios-accessibility:accessibility-cell Move the hard-to-read values in this cell into custom content
/ios-accessibility:accessibility-dynamic-type Add Dynamic Type support to this view
/ios-accessibility:accessibility How should I make this custom slider accessible?
/ios-accessibility:accessibility Review the current screen and suggest grouping improvements

Example workflows

Review a specific file:

/ios-accessibility:accessibility Review Sources/Views/MenuCell.swift for accessibility

Make a screen accessible step by step:

/ios-accessibility:accessibility Walk me through making the checkout screen fully accessible

Adapt a cell:

/ios-accessibility:accessibility-cell Turn OrderCell into one element: label, value, custom content, actions

Fix a specific issue:

/ios-accessibility:accessibility The VoiceOver focus order is wrong on the product detail screen

Generate tests:

/ios-accessibility:accessibility Write accessibility snapshot tests for OrderCell

Auto-apply to every screen (CLAUDE.md rules)

To make Claude automatically check accessibility on every screen you work on, add a CLAUDE.md file to your iOS project root. CLAUDE.md contains instructions Claude Code reads on every conversation.

Basic rule

Create a CLAUDE.md in your project root with:

## Accessibility
When creating or modifying any UIView, UIViewController, or SwiftUI View:
- Run /ios-accessibility:accessibility to review the accessibility of the changed code
- Ensure every interactive element has accessibilityLabel and appropriate traits
- Ensure decorative images are hidden from VoiceOver
- Run /ios-accessibility:accessibility-dynamic-type to review Dynamic Type support
- Ensure Dynamic Type is supported (no fixed heights, use dynamic fonts)

Comprehensive rule

For stricter enforcement:

## Accessibility Requirements
Every UI change MUST pass these checks before being considered complete:
1.**Labels**: Every interactive element has `accessibilityLabel` and appropriate `accessibilityTraits`2.**Grouping**: Related elements are combined (`.accessibilityElement(children: .combine)` in SwiftUI, or `isAccessibilityElement = true` with combined label in UIKit)
3.**Decorative elements**: Hidden from VoiceOver (`isAccessibilityElement = false` / `.accessibilityHidden(true)`)
4.**Dynamic Type**: No fixed heights, use `UIFont.preferredFont(forTextStyle:)` or `.font(.body)`, support `.isAccessibilityCategory` layout changes
5.**Navigation**: Headers marked with `.header` trait, modals set `accessibilityViewIsModal = true`, custom views implement `accessibilityPerformEscape()`6.**State changes**: Dynamic content posts `UIAccessibility.post(notification:)` appropriately
7.**System settings**: Respect `isReduceMotionEnabled`, `shouldDifferentiateWithoutColor`, `isBoldTextEnabled`, and other accessibility preferences
When writing or reviewing UI code, use /ios-accessibility:accessibility and /ios-accessibility:accessibility-dynamic-type to verify compliance.

Per-screen rule (for new features)

You can also scope the rule to specific features:

## Current Sprint: Checkout Redesign
All views in `Sources/Checkout/` must be fully accessible.
Before marking any task as done, run `/ios-accessibility:accessibility Review {filename} for accessibility issues` on every changed view file.

How the skills work

Each skill is a Markdown file that Claude Code and Cursor load when you invoke it or ask for matching work. They contain structured knowledge about iOS accessibility APIs, patterns, and best practices that the agent uses to give accurate, specific advice.

The $ARGUMENTS placeholder at the end of each file is replaced with whatever you type after the command.

FileCommandFocus
plugins/ios-accessibility/skills/accessibility/SKILL.md/ios-accessibility:accessibilityVoiceOver, Voice Control, Switch Control, general accessibility
plugins/ios-accessibility/skills/accessibility-cell/SKILL.md/ios-accessibility:accessibility-cellCell accessibility: label/value/custom-content/actions/input-labels
plugins/ios-accessibility/skills/accessibility-carousel/SKILL.md/ios-accessibility:accessibility-carouselCarousel accessibility: paging model, position, autoplay
plugins/ios-accessibility/skills/accessibility-dynamic-type/SKILL.md/ios-accessibility:accessibility-dynamic-typeFont scaling, adaptive layout, Large Content Viewer

License

The accessibility knowledge is based on the book "About Accessibility on iOS" by Mikhail Rubanov.

About

Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - AccessibilityTools/iOSAccessibilitySkill: Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov · GitHub
Skip to content

Repository files navigation

iOS Accessibility for Claude Code, Cursor, Codex, and ChatGPT

Plugin for reviewing and improving accessibility in UIKit and SwiftUI interfaces with Claude Code, Cursor, Codex, or ChatGPT. The plugin is based on Mikhail Rubanov's book "About Accessibility on iOS".

Install

Claude Code

Add the marketplace and install the plugin:

claude plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
claude plugin install ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins in an active session. The commands are namespaced under ios-accessibility, for example:

/ios-accessibility:accessibility review accessibility on ProfileScreen

Cursor

Add the repository as a marketplace:

cursor-agent plugin marketplace add https://github.com/AccessibilityTools/iOSAccessibilitySkill

Run cursor-agent, enter /plugin, open the Marketplace tab, and install ios-accessibility. Cursor discovers the skills automatically; ask the Agent to review a screen or invoke a skill such as /accessibility.

Codex

Add the marketplace and install the plugin:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
codex plugin add ios-accessibility@accessibility-tools

Start a new task and ask Codex to review an iOS screen, or invoke $ios-accessibility:accessibility directly.

ChatGPT

Add the marketplace from a terminal:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill

Restart the ChatGPT desktop app, open the Plugins Directory, select Personal, and install ios-accessibility. ChatGPT and Codex use the same plugin package.

Update

Claude Code

Refresh the marketplace and update the plugin:

claude plugin marketplace update accessibility-tools
claude plugin update ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins to use the updated commands.

Cursor

Refresh the marketplace:

cursor-agent plugin marketplace update accessibility-tools

Then run /plugin and update or reinstall ios-accessibility from the Installed tab. Cursor does not currently provide a non-interactive plugin install command.

Codex and ChatGPT

Refresh the marketplace and reinstall the plugin:

codex plugin marketplace upgrade accessibility-tools
codex plugin add ios-accessibility@accessibility-tools

Start a new Codex task or restart the ChatGPT desktop app to load the updated skills.

Skills

/ios-accessibility:accessibility — Review a screen (main entrance)

The main entry point. Ask it to review accessibility on a screen — e.g. /ios-accessibility:accessibility review accessibility on ProfileScreen — and it audits the screen against the rules, applies fixes, and delegates cells/carousels/Dynamic Type to the focused skills below. Also covers VoiceOver, Voice Control, Switch Control, and overall accessibility for UIKit and SwiftUI:

  • accessibilityLabel, accessibilityValue, accessibilityTraits, and accessibilityHint
  • Element grouping, containers, and focus order control
  • Adjustable elements and custom actions
  • Speech customization (pronunciation, language, pitch)
  • Navigation: notifications, modals, scrub gesture, magic tap, custom rotors
  • Color contrast, Smart Invert, reduce motion
  • Drag and drop accessibility
  • System accessibility settings to respect
  • Testing strategies (manual, automated, snapshot tests)

/ios-accessibility:accessibility-cell — Cell Accessibility

Focused skill for list / table / collection cells — turn a multi-view row into one well-structured element:

  • One element per cell (.combine / .ignore / isAccessibilityElement)
  • Label = main content, value = additional content
  • Hard-to-read values (addresses, ids, timestamps) → accessibilityCustomContent (spoken on demand)
  • All button actions → accessibility actions (primary activation + named custom actions)
  • Input labels with alternatives and synonyms for Voice Control
  • Hiding decorative avatars / icons / chevrons

/ios-accessibility:accessibility-carousel — Carousel Accessibility

Focused skill for horizontally paged banners, card decks, galleries, and onboarding pagers:

  • Adjustable-control vs container-of-pages model
  • Announcing position ("page X of N") and page changes
  • Hiding off-screen pages, accessibilityScroll paging (UIKit)
  • Pausing autoplay under VoiceOver / Switch Control / Reduce Motion

/ios-accessibility:accessibility-dynamic-type — Dynamic Type

Dedicated skill for text scaling and adaptive layout:

  • System and custom font scaling (UIFontMetrics, @ScaledMetric)
  • Adaptive layout (switching axis at accessibility sizes)
  • Self-sizing cells and containers
  • Large Content Viewer for fixed controls
  • Bold text support
  • Limiting Dynamic Type when needed
  • Testing and verification

Usage

Open your iOS project and use a plugin command with any prompt. Cursor uses the skill name without a namespace. Codex uses the $ios-accessibility: namespace. ChatGPT discovers the matching skill from the request.

/ios-accessibility:accessibility review accessibility on ProfileScreen
/ios-accessibility:accessibility Review this file for accessibility issues
/ios-accessibility:accessibility-cell Make this recipient row read as one VoiceOver element
/ios-accessibility:accessibility-cell Move the hard-to-read values in this cell into custom content
/ios-accessibility:accessibility-dynamic-type Add Dynamic Type support to this view
/ios-accessibility:accessibility How should I make this custom slider accessible?
/ios-accessibility:accessibility Review the current screen and suggest grouping improvements

Example workflows

Review a specific file:

/ios-accessibility:accessibility Review Sources/Views/MenuCell.swift for accessibility

Make a screen accessible step by step:

/ios-accessibility:accessibility Walk me through making the checkout screen fully accessible

Adapt a cell:

/ios-accessibility:accessibility-cell Turn OrderCell into one element: label, value, custom content, actions

Fix a specific issue:

/ios-accessibility:accessibility The VoiceOver focus order is wrong on the product detail screen

Generate tests:

/ios-accessibility:accessibility Write accessibility snapshot tests for OrderCell

Auto-apply to every screen (CLAUDE.md rules)

To make Claude automatically check accessibility on every screen you work on, add a CLAUDE.md file to your iOS project root. CLAUDE.md contains instructions Claude Code reads on every conversation.

Basic rule

Create a CLAUDE.md in your project root with:

## Accessibility
When creating or modifying any UIView, UIViewController, or SwiftUI View:
- Run /ios-accessibility:accessibility to review the accessibility of the changed code
- Ensure every interactive element has accessibilityLabel and appropriate traits
- Ensure decorative images are hidden from VoiceOver
- Run /ios-accessibility:accessibility-dynamic-type to review Dynamic Type support
- Ensure Dynamic Type is supported (no fixed heights, use dynamic fonts)

Comprehensive rule

For stricter enforcement:

## Accessibility Requirements
Every UI change MUST pass these checks before being considered complete:
1.**Labels**: Every interactive element has `accessibilityLabel` and appropriate `accessibilityTraits`2.**Grouping**: Related elements are combined (`.accessibilityElement(children: .combine)` in SwiftUI, or `isAccessibilityElement = true` with combined label in UIKit)
3.**Decorative elements**: Hidden from VoiceOver (`isAccessibilityElement = false` / `.accessibilityHidden(true)`)
4.**Dynamic Type**: No fixed heights, use `UIFont.preferredFont(forTextStyle:)` or `.font(.body)`, support `.isAccessibilityCategory` layout changes
5.**Navigation**: Headers marked with `.header` trait, modals set `accessibilityViewIsModal = true`, custom views implement `accessibilityPerformEscape()`6.**State changes**: Dynamic content posts `UIAccessibility.post(notification:)` appropriately
7.**System settings**: Respect `isReduceMotionEnabled`, `shouldDifferentiateWithoutColor`, `isBoldTextEnabled`, and other accessibility preferences
When writing or reviewing UI code, use /ios-accessibility:accessibility and /ios-accessibility:accessibility-dynamic-type to verify compliance.

Per-screen rule (for new features)

You can also scope the rule to specific features:

## Current Sprint: Checkout Redesign
All views in `Sources/Checkout/` must be fully accessible.
Before marking any task as done, run `/ios-accessibility:accessibility Review {filename} for accessibility issues` on every changed view file.

How the skills work

Each skill is a Markdown file that Claude Code and Cursor load when you invoke it or ask for matching work. They contain structured knowledge about iOS accessibility APIs, patterns, and best practices that the agent uses to give accurate, specific advice.

The $ARGUMENTS placeholder at the end of each file is replaced with whatever you type after the command.

FileCommandFocus
plugins/ios-accessibility/skills/accessibility/SKILL.md/ios-accessibility:accessibilityVoiceOver, Voice Control, Switch Control, general accessibility
plugins/ios-accessibility/skills/accessibility-cell/SKILL.md/ios-accessibility:accessibility-cellCell accessibility: label/value/custom-content/actions/input-labels
plugins/ios-accessibility/skills/accessibility-carousel/SKILL.md/ios-accessibility:accessibility-carouselCarousel accessibility: paging model, position, autoplay
plugins/ios-accessibility/skills/accessibility-dynamic-type/SKILL.md/ios-accessibility:accessibility-dynamic-typeFont scaling, adaptive layout, Large Content Viewer

License

The accessibility knowledge is based on the book "About Accessibility on iOS" by Mikhail Rubanov.

About

Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - AccessibilityTools/iOSAccessibilitySkill: Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov · GitHub
Skip to content

Repository files navigation

iOS Accessibility for Claude Code, Cursor, Codex, and ChatGPT

Plugin for reviewing and improving accessibility in UIKit and SwiftUI interfaces with Claude Code, Cursor, Codex, or ChatGPT. The plugin is based on Mikhail Rubanov's book "About Accessibility on iOS".

Install

Claude Code

Add the marketplace and install the plugin:

claude plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
claude plugin install ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins in an active session. The commands are namespaced under ios-accessibility, for example:

/ios-accessibility:accessibility review accessibility on ProfileScreen

Cursor

Add the repository as a marketplace:

cursor-agent plugin marketplace add https://github.com/AccessibilityTools/iOSAccessibilitySkill

Run cursor-agent, enter /plugin, open the Marketplace tab, and install ios-accessibility. Cursor discovers the skills automatically; ask the Agent to review a screen or invoke a skill such as /accessibility.

Codex

Add the marketplace and install the plugin:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
codex plugin add ios-accessibility@accessibility-tools

Start a new task and ask Codex to review an iOS screen, or invoke $ios-accessibility:accessibility directly.

ChatGPT

Add the marketplace from a terminal:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill

Restart the ChatGPT desktop app, open the Plugins Directory, select Personal, and install ios-accessibility. ChatGPT and Codex use the same plugin package.

Update

Claude Code

Refresh the marketplace and update the plugin:

claude plugin marketplace update accessibility-tools
claude plugin update ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins to use the updated commands.

Cursor

Refresh the marketplace:

cursor-agent plugin marketplace update accessibility-tools

Then run /plugin and update or reinstall ios-accessibility from the Installed tab. Cursor does not currently provide a non-interactive plugin install command.

Codex and ChatGPT

Refresh the marketplace and reinstall the plugin:

codex plugin marketplace upgrade accessibility-tools
codex plugin add ios-accessibility@accessibility-tools

Start a new Codex task or restart the ChatGPT desktop app to load the updated skills.

Skills

/ios-accessibility:accessibility — Review a screen (main entrance)

The main entry point. Ask it to review accessibility on a screen — e.g. /ios-accessibility:accessibility review accessibility on ProfileScreen — and it audits the screen against the rules, applies fixes, and delegates cells/carousels/Dynamic Type to the focused skills below. Also covers VoiceOver, Voice Control, Switch Control, and overall accessibility for UIKit and SwiftUI:

  • accessibilityLabel, accessibilityValue, accessibilityTraits, and accessibilityHint
  • Element grouping, containers, and focus order control
  • Adjustable elements and custom actions
  • Speech customization (pronunciation, language, pitch)
  • Navigation: notifications, modals, scrub gesture, magic tap, custom rotors
  • Color contrast, Smart Invert, reduce motion
  • Drag and drop accessibility
  • System accessibility settings to respect
  • Testing strategies (manual, automated, snapshot tests)

/ios-accessibility:accessibility-cell — Cell Accessibility

Focused skill for list / table / collection cells — turn a multi-view row into one well-structured element:

  • One element per cell (.combine / .ignore / isAccessibilityElement)
  • Label = main content, value = additional content
  • Hard-to-read values (addresses, ids, timestamps) → accessibilityCustomContent (spoken on demand)
  • All button actions → accessibility actions (primary activation + named custom actions)
  • Input labels with alternatives and synonyms for Voice Control
  • Hiding decorative avatars / icons / chevrons

/ios-accessibility:accessibility-carousel — Carousel Accessibility

Focused skill for horizontally paged banners, card decks, galleries, and onboarding pagers:

  • Adjustable-control vs container-of-pages model
  • Announcing position ("page X of N") and page changes
  • Hiding off-screen pages, accessibilityScroll paging (UIKit)
  • Pausing autoplay under VoiceOver / Switch Control / Reduce Motion

/ios-accessibility:accessibility-dynamic-type — Dynamic Type

Dedicated skill for text scaling and adaptive layout:

  • System and custom font scaling (UIFontMetrics, @ScaledMetric)
  • Adaptive layout (switching axis at accessibility sizes)
  • Self-sizing cells and containers
  • Large Content Viewer for fixed controls
  • Bold text support
  • Limiting Dynamic Type when needed
  • Testing and verification

Usage

Open your iOS project and use a plugin command with any prompt. Cursor uses the skill name without a namespace. Codex uses the $ios-accessibility: namespace. ChatGPT discovers the matching skill from the request.

/ios-accessibility:accessibility review accessibility on ProfileScreen
/ios-accessibility:accessibility Review this file for accessibility issues
/ios-accessibility:accessibility-cell Make this recipient row read as one VoiceOver element
/ios-accessibility:accessibility-cell Move the hard-to-read values in this cell into custom content
/ios-accessibility:accessibility-dynamic-type Add Dynamic Type support to this view
/ios-accessibility:accessibility How should I make this custom slider accessible?
/ios-accessibility:accessibility Review the current screen and suggest grouping improvements

Example workflows

Review a specific file:

/ios-accessibility:accessibility Review Sources/Views/MenuCell.swift for accessibility

Make a screen accessible step by step:

/ios-accessibility:accessibility Walk me through making the checkout screen fully accessible

Adapt a cell:

/ios-accessibility:accessibility-cell Turn OrderCell into one element: label, value, custom content, actions

Fix a specific issue:

/ios-accessibility:accessibility The VoiceOver focus order is wrong on the product detail screen

Generate tests:

/ios-accessibility:accessibility Write accessibility snapshot tests for OrderCell

Auto-apply to every screen (CLAUDE.md rules)

To make Claude automatically check accessibility on every screen you work on, add a CLAUDE.md file to your iOS project root. CLAUDE.md contains instructions Claude Code reads on every conversation.

Basic rule

Create a CLAUDE.md in your project root with:

## Accessibility
When creating or modifying any UIView, UIViewController, or SwiftUI View:
- Run /ios-accessibility:accessibility to review the accessibility of the changed code
- Ensure every interactive element has accessibilityLabel and appropriate traits
- Ensure decorative images are hidden from VoiceOver
- Run /ios-accessibility:accessibility-dynamic-type to review Dynamic Type support
- Ensure Dynamic Type is supported (no fixed heights, use dynamic fonts)

Comprehensive rule

For stricter enforcement:

## Accessibility Requirements
Every UI change MUST pass these checks before being considered complete:
1.**Labels**: Every interactive element has `accessibilityLabel` and appropriate `accessibilityTraits`2.**Grouping**: Related elements are combined (`.accessibilityElement(children: .combine)` in SwiftUI, or `isAccessibilityElement = true` with combined label in UIKit)
3.**Decorative elements**: Hidden from VoiceOver (`isAccessibilityElement = false` / `.accessibilityHidden(true)`)
4.**Dynamic Type**: No fixed heights, use `UIFont.preferredFont(forTextStyle:)` or `.font(.body)`, support `.isAccessibilityCategory` layout changes
5.**Navigation**: Headers marked with `.header` trait, modals set `accessibilityViewIsModal = true`, custom views implement `accessibilityPerformEscape()`6.**State changes**: Dynamic content posts `UIAccessibility.post(notification:)` appropriately
7.**System settings**: Respect `isReduceMotionEnabled`, `shouldDifferentiateWithoutColor`, `isBoldTextEnabled`, and other accessibility preferences
When writing or reviewing UI code, use /ios-accessibility:accessibility and /ios-accessibility:accessibility-dynamic-type to verify compliance.

Per-screen rule (for new features)

You can also scope the rule to specific features:

## Current Sprint: Checkout Redesign
All views in `Sources/Checkout/` must be fully accessible.
Before marking any task as done, run `/ios-accessibility:accessibility Review {filename} for accessibility issues` on every changed view file.

How the skills work

Each skill is a Markdown file that Claude Code and Cursor load when you invoke it or ask for matching work. They contain structured knowledge about iOS accessibility APIs, patterns, and best practices that the agent uses to give accurate, specific advice.

The $ARGUMENTS placeholder at the end of each file is replaced with whatever you type after the command.

FileCommandFocus
plugins/ios-accessibility/skills/accessibility/SKILL.md/ios-accessibility:accessibilityVoiceOver, Voice Control, Switch Control, general accessibility
plugins/ios-accessibility/skills/accessibility-cell/SKILL.md/ios-accessibility:accessibility-cellCell accessibility: label/value/custom-content/actions/input-labels
plugins/ios-accessibility/skills/accessibility-carousel/SKILL.md/ios-accessibility:accessibility-carouselCarousel accessibility: paging model, position, autoplay
plugins/ios-accessibility/skills/accessibility-dynamic-type/SKILL.md/ios-accessibility:accessibility-dynamic-typeFont scaling, adaptive layout, Large Content Viewer

License

The accessibility knowledge is based on the book "About Accessibility on iOS" by Mikhail Rubanov.

About

Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - AccessibilityTools/iOSAccessibilitySkill: Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov · GitHub
Skip to content

Repository files navigation

iOS Accessibility for Claude Code, Cursor, Codex, and ChatGPT

Plugin for reviewing and improving accessibility in UIKit and SwiftUI interfaces with Claude Code, Cursor, Codex, or ChatGPT. The plugin is based on Mikhail Rubanov's book "About Accessibility on iOS".

Install

Claude Code

Add the marketplace and install the plugin:

claude plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
claude plugin install ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins in an active session. The commands are namespaced under ios-accessibility, for example:

/ios-accessibility:accessibility review accessibility on ProfileScreen

Cursor

Add the repository as a marketplace:

cursor-agent plugin marketplace add https://github.com/AccessibilityTools/iOSAccessibilitySkill

Run cursor-agent, enter /plugin, open the Marketplace tab, and install ios-accessibility. Cursor discovers the skills automatically; ask the Agent to review a screen or invoke a skill such as /accessibility.

Codex

Add the marketplace and install the plugin:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill
codex plugin add ios-accessibility@accessibility-tools

Start a new task and ask Codex to review an iOS screen, or invoke $ios-accessibility:accessibility directly.

ChatGPT

Add the marketplace from a terminal:

codex plugin marketplace add AccessibilityTools/iOSAccessibilitySkill

Restart the ChatGPT desktop app, open the Plugins Directory, select Personal, and install ios-accessibility. ChatGPT and Codex use the same plugin package.

Update

Claude Code

Refresh the marketplace and update the plugin:

claude plugin marketplace update accessibility-tools
claude plugin update ios-accessibility@accessibility-tools

Restart Claude Code or run /reload-plugins to use the updated commands.

Cursor

Refresh the marketplace:

cursor-agent plugin marketplace update accessibility-tools

Then run /plugin and update or reinstall ios-accessibility from the Installed tab. Cursor does not currently provide a non-interactive plugin install command.

Codex and ChatGPT

Refresh the marketplace and reinstall the plugin:

codex plugin marketplace upgrade accessibility-tools
codex plugin add ios-accessibility@accessibility-tools

Start a new Codex task or restart the ChatGPT desktop app to load the updated skills.

Skills

/ios-accessibility:accessibility — Review a screen (main entrance)

The main entry point. Ask it to review accessibility on a screen — e.g. /ios-accessibility:accessibility review accessibility on ProfileScreen — and it audits the screen against the rules, applies fixes, and delegates cells/carousels/Dynamic Type to the focused skills below. Also covers VoiceOver, Voice Control, Switch Control, and overall accessibility for UIKit and SwiftUI:

  • accessibilityLabel, accessibilityValue, accessibilityTraits, and accessibilityHint
  • Element grouping, containers, and focus order control
  • Adjustable elements and custom actions
  • Speech customization (pronunciation, language, pitch)
  • Navigation: notifications, modals, scrub gesture, magic tap, custom rotors
  • Color contrast, Smart Invert, reduce motion
  • Drag and drop accessibility
  • System accessibility settings to respect
  • Testing strategies (manual, automated, snapshot tests)

/ios-accessibility:accessibility-cell — Cell Accessibility

Focused skill for list / table / collection cells — turn a multi-view row into one well-structured element:

  • One element per cell (.combine / .ignore / isAccessibilityElement)
  • Label = main content, value = additional content
  • Hard-to-read values (addresses, ids, timestamps) → accessibilityCustomContent (spoken on demand)
  • All button actions → accessibility actions (primary activation + named custom actions)
  • Input labels with alternatives and synonyms for Voice Control
  • Hiding decorative avatars / icons / chevrons

/ios-accessibility:accessibility-carousel — Carousel Accessibility

Focused skill for horizontally paged banners, card decks, galleries, and onboarding pagers:

  • Adjustable-control vs container-of-pages model
  • Announcing position ("page X of N") and page changes
  • Hiding off-screen pages, accessibilityScroll paging (UIKit)
  • Pausing autoplay under VoiceOver / Switch Control / Reduce Motion

/ios-accessibility:accessibility-dynamic-type — Dynamic Type

Dedicated skill for text scaling and adaptive layout:

  • System and custom font scaling (UIFontMetrics, @ScaledMetric)
  • Adaptive layout (switching axis at accessibility sizes)
  • Self-sizing cells and containers
  • Large Content Viewer for fixed controls
  • Bold text support
  • Limiting Dynamic Type when needed
  • Testing and verification

Usage

Open your iOS project and use a plugin command with any prompt. Cursor uses the skill name without a namespace. Codex uses the $ios-accessibility: namespace. ChatGPT discovers the matching skill from the request.

/ios-accessibility:accessibility review accessibility on ProfileScreen
/ios-accessibility:accessibility Review this file for accessibility issues
/ios-accessibility:accessibility-cell Make this recipient row read as one VoiceOver element
/ios-accessibility:accessibility-cell Move the hard-to-read values in this cell into custom content
/ios-accessibility:accessibility-dynamic-type Add Dynamic Type support to this view
/ios-accessibility:accessibility How should I make this custom slider accessible?
/ios-accessibility:accessibility Review the current screen and suggest grouping improvements

Example workflows

Review a specific file:

/ios-accessibility:accessibility Review Sources/Views/MenuCell.swift for accessibility

Make a screen accessible step by step:

/ios-accessibility:accessibility Walk me through making the checkout screen fully accessible

Adapt a cell:

/ios-accessibility:accessibility-cell Turn OrderCell into one element: label, value, custom content, actions

Fix a specific issue:

/ios-accessibility:accessibility The VoiceOver focus order is wrong on the product detail screen

Generate tests:

/ios-accessibility:accessibility Write accessibility snapshot tests for OrderCell

Auto-apply to every screen (CLAUDE.md rules)

To make Claude automatically check accessibility on every screen you work on, add a CLAUDE.md file to your iOS project root. CLAUDE.md contains instructions Claude Code reads on every conversation.

Basic rule

Create a CLAUDE.md in your project root with:

## Accessibility
When creating or modifying any UIView, UIViewController, or SwiftUI View:
- Run /ios-accessibility:accessibility to review the accessibility of the changed code
- Ensure every interactive element has accessibilityLabel and appropriate traits
- Ensure decorative images are hidden from VoiceOver
- Run /ios-accessibility:accessibility-dynamic-type to review Dynamic Type support
- Ensure Dynamic Type is supported (no fixed heights, use dynamic fonts)

Comprehensive rule

For stricter enforcement:

## Accessibility Requirements
Every UI change MUST pass these checks before being considered complete:
1.**Labels**: Every interactive element has `accessibilityLabel` and appropriate `accessibilityTraits`2.**Grouping**: Related elements are combined (`.accessibilityElement(children: .combine)` in SwiftUI, or `isAccessibilityElement = true` with combined label in UIKit)
3.**Decorative elements**: Hidden from VoiceOver (`isAccessibilityElement = false` / `.accessibilityHidden(true)`)
4.**Dynamic Type**: No fixed heights, use `UIFont.preferredFont(forTextStyle:)` or `.font(.body)`, support `.isAccessibilityCategory` layout changes
5.**Navigation**: Headers marked with `.header` trait, modals set `accessibilityViewIsModal = true`, custom views implement `accessibilityPerformEscape()`6.**State changes**: Dynamic content posts `UIAccessibility.post(notification:)` appropriately
7.**System settings**: Respect `isReduceMotionEnabled`, `shouldDifferentiateWithoutColor`, `isBoldTextEnabled`, and other accessibility preferences
When writing or reviewing UI code, use /ios-accessibility:accessibility and /ios-accessibility:accessibility-dynamic-type to verify compliance.

Per-screen rule (for new features)

You can also scope the rule to specific features:

## Current Sprint: Checkout Redesign
All views in `Sources/Checkout/` must be fully accessible.
Before marking any task as done, run `/ios-accessibility:accessibility Review {filename} for accessibility issues` on every changed view file.

How the skills work

Each skill is a Markdown file that Claude Code and Cursor load when you invoke it or ask for matching work. They contain structured knowledge about iOS accessibility APIs, patterns, and best practices that the agent uses to give accurate, specific advice.

The $ARGUMENTS placeholder at the end of each file is replaced with whatever you type after the command.

FileCommandFocus
plugins/ios-accessibility/skills/accessibility/SKILL.md/ios-accessibility:accessibilityVoiceOver, Voice Control, Switch Control, general accessibility
plugins/ios-accessibility/skills/accessibility-cell/SKILL.md/ios-accessibility:accessibility-cellCell accessibility: label/value/custom-content/actions/input-labels
plugins/ios-accessibility/skills/accessibility-carousel/SKILL.md/ios-accessibility:accessibility-carouselCarousel accessibility: paging model, position, autoplay
plugins/ios-accessibility/skills/accessibility-dynamic-type/SKILL.md/ios-accessibility:accessibility-dynamic-typeFont scaling, adaptive layout, Large Content Viewer

License

The accessibility knowledge is based on the book "About Accessibility on iOS" by Mikhail Rubanov.

About

Claude Code skill for iOS accessibility based on the book 'About accessibility on iOS' by Mikhail Rubanov

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors