Web Interface Guidelines Reviewer
vercel-labs/openreview
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my…
Optimize web content for screen reader compatibility using semantic HTML, ARIA patterns, and live region management, with testing workflows for NVDA, VoiceOver, and JAWS.
$ npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install FerroxLabs/wayland screen-reader-optimizer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .claude/skills && cp -r skills-src/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer .claude/skills/screen-reader-optimizer && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "screen-reader-optimizer" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer into .claude/skills/screen-reader-optimizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "screen-reader-optimizer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install FerroxLabs/wayland screen-reader-optimizer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .agents/skills && cp -r skills-src/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer .agents/skills/screen-reader-optimizer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "screen-reader-optimizer" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer into .agents/skills/screen-reader-optimizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "screen-reader-optimizer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install FerroxLabs/wayland screen-reader-optimizer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer .cursor/skills/screen-reader-optimizer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "screen-reader-optimizer" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer into .cursor/skills/screen-reader-optimizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "screen-reader-optimizer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/FerroxLabs/wayland.git --path src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install FerroxLabs/wayland screen-reader-optimizer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer .gemini/skills/screen-reader-optimizer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "screen-reader-optimizer" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer into .gemini/skills/screen-reader-optimizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "screen-reader-optimizer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install FerroxLabs/wayland screen-reader-optimizerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .github/skills && cp -r skills-src/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer .github/skills/screen-reader-optimizer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "screen-reader-optimizer" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer into .github/skills/screen-reader-optimizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "screen-reader-optimizer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install FerroxLabs/wayland screen-reader-optimizer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FerroxLabs/wayland.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer .opencode/skills/screen-reader-optimizer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "screen-reader-optimizer" agent skill from https://github.com/FerroxLabs/wayland/tree/main/src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer into .opencode/skills/screen-reader-optimizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "screen-reader-optimizer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
screen-reader-optimizerOptimize web content for screen reader compatibility using semantic HTML, ARIA patterns, and live region management, with testing workflows for NVDA, VoiceOver, and JAWS.
Screen Reader Optimizer is an agent skill from FerroxLabs/wayland. Optimize web content for screen reader compatibility using semantic HTML, ARIA patterns, and live region management, with testing workflows for NVDA, VoiceOver, and JAWS. Use when the user asks about screen reader optimizer, related techniques, best practices, or needs guidance in this domain. Do NOT use when the request is outside the scope of screen reader optimizer or requires a different specialized skill.
Its SKILL.md is about 4.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering Accessibility. The repository describes itself as: Wayland - The AI Agent That Perceives. Reasons. Acts. Evolves. The licence is Apache-2.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 4c030c7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are html, javascript, css and template).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Screen Reader Optimizer loads about 4.4k tokens when it runs. Until then it costs about 109 tokens; SKILL.md has 1,233 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from FerroxLabs/wayland at commit 4c030c7, republished under its Apache-2.0 licence (© FerroxLabs). 1,233 words, ~4,399 tokens.
.claude/skills/screen-reader-optimizer/SKILL.md (or your agent's skills folder).You are an expert in screen reader accessibility, specializing in making web interfaces fully usable through NVDA, VoiceOver, JAWS, and TalkBack. You understand how assistive technology parses the accessibility tree, when ARIA is necessary versus harmful, and how to test efficiently across the major screen reader and browser combinations.
Use this skill when:
Do NOT use when:
Screen readers do not read the DOM. They read the accessibility tree - a parallel structure the browser builds from your HTML and ARIA attributes. Every optimization you make is about shaping this tree.
Visual DOM Accessibility Tree
----------- ------------------
<nav> --> navigation landmark
<ul> --> list (3 items)
<li><a href="/"> --> link "Home"
<li><a href="/about">--> link "About"
<li><a href="/blog"> --> link "Blog"For every node: Name, Role, State, and Value.
| Property | Source | Example |
|---|---|---|
| Name | Text content, aria-label, aria-labelledby, alt, <label> | "Submit order" |
| Role | HTML element or role attribute | button, link, heading, dialog |
| State | HTML attributes or aria-* states | disabled, expanded, checked, selected |
| Value | Input value, aria-valuenow | "42", "50%" |
Native HTML elements have built-in roles, states, keyboard behavior, and screen reader announcements. ARIA should only fill gaps that HTML cannot.
<!-- WRONG: div with ARIA trying to be a button -->
<div role="button" tabindex="0" aria-pressed="false"
onclick="toggle()" onkeydown="handleKey(event)">
Toggle Setting
</div>
<!-- RIGHT: native button with full behavior for free -->
<button type="button" aria-pressed="false" onclick="toggle()">
Toggle Setting
</button>| Instead of... | Use... | Why |
|---|---|---|
<div onclick> | <button> | Keyboard, role, focus for free |
<span class="link"> | <a href> | Announced as link, Enter activates |
<div class="header"> | <h1>-<h6> | Heading navigation (H key in screen readers) |
<div class="nav"> | <nav> | Landmark navigation |
<div class="list"> | <ul> / <ol> | "List, 5 items" announcement |
<div class="table"> | <table> with <th> | Cell-to-header association |
<div class="input"> | <input> / <select> | Form mode, label association |
When native HTML is insufficient, follow the ARIA Authoring Practices Guide (APG) patterns exactly.
<div role="tablist" aria-label="Account settings">
<button role="tab" id="tab-1" aria-selected="true"
aria-controls="panel-1" tabindex="0">
Profile
</button>
<button role="tab" id="tab-2" aria-selected="false"
aria-controls="panel-2" tabindex="-1">
Security
</button>
<button role="tab" id="tab-3" aria-selected="false"
aria-controls="panel-3" tabindex="-1">
Notifications
</button>
</div>
<div role="tabpanel" id="panel-1" aria-labelledby="tab-1" tabindex="0">
<!-- Profile content -->
</div>
<div role="tabpanel" id="panel-2" aria-labelledby="tab-2" tabindex="0" hidden>
<!-- Security content -->
</div>
<div role="tabpanel" id="panel-3" aria-labelledby="tab-3" tabindex="0" hidden>
<!-- Notifications content -->
</div>Keyboard behavior:
tabindex="0"); others are tabindex="-1"const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
tab.addEventListener('keydown', (e) => {
const index = Array.from(tabs).indexOf(e.target);
let newIndex;
switch (e.key) {
case 'ArrowRight':
newIndex = (index + 1) % tabs.length;
break;
case 'ArrowLeft':
newIndex = (index - 1 + tabs.length) % tabs.length;
break;
case 'Home':
newIndex = 0;
break;
case 'End':
newIndex = tabs.length - 1;
break;
default:
return;
}
e.preventDefault();
activateTab(tabs[newIndex]);
});
});
function activateTab(tab) {
tabs.forEach(t => {
t.setAttribute('aria-selected', 'false');
t.setAttribute('tabindex', '-1');
document.getElementById(t.getAttribute('aria-controls')).hidden = true;
});
tab.setAttribute('aria-selected', 'true');
tab.setAttribute('tabindex', '0');
tab.focus();
document.getElementById(tab.getAttribute('aria-controls')).hidden = false;
}<div role="dialog" aria-modal="true" aria-labelledby="dialog-title"
aria-describedby="dialog-desc">
<h2 id="dialog-title">Confirm Deletion</h2>
<p id="dialog-desc">
This will permanently delete 3 files. This action cannot be undone.
</p>
<div class="dialog-actions">
<button type="button" onclick="closeDialog()">Cancel</button>
<button type="button" onclick="confirmDelete()" class="danger">
Delete Files
</button>
</div>
</div>Required behavior:
<div class="accordion">
<h3>
<button aria-expanded="false" aria-controls="sect1-content"
id="sect1-header">
Shipping Information
</button>
</h3>
<div id="sect1-content" role="region" aria-labelledby="sect1-header"
hidden>
<p>We ship to all 50 states...</p>
</div>
</div><label for="city-input">City</label>
<div class="combobox-wrapper">
<input type="text" id="city-input" role="combobox"
aria-expanded="false" aria-autocomplete="list"
aria-controls="city-listbox" aria-activedescendant="">
<ul id="city-listbox" role="listbox" hidden>
<li role="option" id="city-1">Chicago</li>
<li role="option" id="city-2">Charlotte</li>
<li role="option" id="city-3">Charleston</li>
</ul>
</div>When suggestions appear, set aria-expanded="true", show the listbox, and update aria-activedescendant to the highlighted option's ID as the user arrows through.
Live regions announce dynamic content changes without moving focus.
<!-- Polite: announced after current speech finishes -->
<div aria-live="polite" aria-atomic="true">
3 results found
</div>
<!-- Assertive: interrupts current speech immediately -->
<div aria-live="assertive" aria-atomic="true">
Error: Session expired. Please log in again.
</div>
<!-- Status role: implicit aria-live="polite" -->
<div role="status">
File uploaded successfully
</div>
<!-- Alert role: implicit aria-live="assertive" -->
<div role="alert">
Payment failed. Please check your card details.
</div>
<!-- Log role: implicit aria-live="polite", aria-relevant="additions" -->
<div role="log" aria-label="Chat messages">
<!-- New messages appended here -->
</div>
<!-- Progress updates -->
<div role="progressbar" aria-valuenow="65" aria-valuemin="0"
aria-valuemax="100" aria-label="Upload progress">
</div>aria-atomic="true" when the entire region should be re-readpolite for most updates; assertive only for errors or critical alerts// Debounced live region update
const statusRegion = document.getElementById('search-status');
let debounceTimer;
function updateResultCount(count) {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
statusRegion.textContent = `${count} results found`;
}, 1000);
}aria-labelledby (references another element's text)aria-label (string directly on element)<label>, alt, <caption>, <legend>)title attribute (last resort, inconsistent support)<!-- Multiple labels composed together -->
<h2 id="billing">Billing Address</h2>
<label id="street-label" for="street">Street</label>
<input id="street" type="text" aria-labelledby="billing street-label">
<!-- Screen reader announces: "Billing Address Street, edit text" -->
<!-- Icon-only button -->
<button aria-label="Close dialog">
<svg aria-hidden="true"><!-- X icon --></svg>
</button>
<!-- Redundant link with image and text -->
<a href="/profile">
<img src="avatar.jpg" alt="">
My Profile
</a>
<!-- alt="" prevents "avatar.jpg My Profile" double announcement -->
<!-- Group of radio buttons -->
<fieldset>
<legend>Preferred contact method</legend>
<label><input type="radio" name="contact" value="email"> Email</label>
<label><input type="radio" name="contact" value="phone"> Phone</label>
<label><input type="radio" name="contact" value="text"> Text message</label>
</fieldset>| Technique | Visible | In Accessibility Tree | Use For |
|---|---|---|---|
display: none | No | No | Fully hidden from everyone |
visibility: hidden | No | No | Same as display:none |
hidden attribute | No | No | Same, HTML native |
aria-hidden="true" | Yes | No | Decorative visuals, icons with labels |
.sr-only class | No | Yes | Screen-reader-only text |
role="presentation" | Yes | Stripped | Remove semantic meaning |
/* Screen-reader only utility class */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}| Action | Keys |
|---|---|
| Read next item | Down Arrow |
| Read previous item | Up Arrow |
| Next heading | H |
| List all headings | NVDA+F7 |
| Next landmark | D |
| Next form field | F |
| Activate link/button | Enter |
| Toggle forms mode | NVDA+Space |
| Read current line | NVDA+L |
| Read entire page | NVDA+Down Arrow |
| Action | Keys |
|---|---|
| Next item | VO+Right |
| Previous item | VO+Left |
| Activate | VO+Space |
| Rotor | VO+U |
| Read from cursor | VO+A |
| Web rotor navigation | VO+Cmd+H (headings), VO+Cmd+J (form controls) |
VO = Control+Option
| Action | Keys |
|---|---|
| Virtual cursor on/off | JAWS+Z |
| Headings list | JAWS+F6 |
| Next heading | H |
| Next region/landmark | R |
| Forms list | JAWS+F5 |
| Read from cursor | JAWS+Down Arrow |
For each page or component, verify:
aria-label on <div> or <span> is ignoredFix: Only use aria-label on interactive elements or landmark roles.
list-style: noneFix: Add role="list" explicitly on the <ul>.
/* This causes VoiceOver to drop list semantics */
ul { list-style: none; }<!-- Fix -->
<ul role="list" style="list-style: none;">aria-live region does not announce on first insertionFix: Ensure the container element is in the DOM on page load, then inject text content into it.
display:none to display:block transition not announcedFix: Keep the element visible but empty, then change its text content.
Fix: Add aria-hidden="true" to decorative SVGs and focusable="false" for IE/Edge legacy.
<svg aria-hidden="true" focusable="false">
<!-- decorative SVG -->
</svg>// Announce route changes in single-page apps
import { useEffect, useRef } from 'react';
import { useLocation } from 'react-router-dom';
function RouteAnnouncer() {
const location = useLocation();
const announcerRef = useRef(null);
useEffect(() => {
const pageTitle = document.title;
if (announcerRef.current) {
announcerRef.current.textContent = `Navigated to ${pageTitle}`;
}
}, [location]);
return (
<div
ref={announcerRef}
role="status"
aria-live="polite"
aria-atomic="true"
className="sr-only"
/>
);
}Use :aria-pressed="isActive.toString()" on toggle buttons. Bind ARIA attributes reactively using Vue's :aria-* syntax.
Use Angular CDK's LiveAnnouncer service to announce dynamic content changes: this.liveAnnouncer.announce('N results found', 'polite').
## Screen Reader Optimizer Analysis
### Assessment
[Key findings and observations]
### Recommendations
1. [Primary recommendation]
2. [Secondary recommendation]
3. [Additional suggestions]
### Action Items
- [ ] [First action step]
- [ ] [Second action step]
- [ ] [Follow-up task]Input: "Help me with screen reader optimizer for my current situation"
Output:
Based on your situation, here is a structured approach to screen reader optimizer:
© FerroxLabs, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer of FerroxLabs/wayland.
Open the folder on GitHubat commit 4c030c7
Screen Reader Optimizer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Screen Reader Optimizer this skillFerroxLabs/wayland | 608 | — | ~4.4k | Automated safety check: Pass | Apache-2.0 | |
| Web Interface Guidelines Reviewervercel-labs/openreview | 1.7k | 98 repos | ~308 | Automated safety check: Pass | None | |
| Accessibility Reviewmarkmead/hyperui | 12k | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Web Animation DesignbaptisteArno/typebot.io | 11k | 2 repos | ~2.7k | Automated safety check: Pass | Custom licence | |
| Accessibility Fixeribelick/ui-skills | 9.4k | 4 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Wcag Audit PatternsvmDeshpande/ai-agent-automation | 178 | 10 repos | ~610 | Automated safety check: Pass | Apache-2.0 |
vercel-labs/openreview
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my…
markmead/hyperui
Run a WCAG 2.1 AA accessibility audit on a design or page. An agent skill from markmead/hyperui.
baptisteArno/typebot.io
Guides easing, timing and animation choices for UI motion, based on a web animation course, and reviews existing animations in a before-and-after table.
ibelick/ui-skills
Audits and fixes HTML accessibility problems such as ARIA labels, keyboard navigation, focus management, contrast and form errors with minimal changes.
vmDeshpande/ai-agent-automation
Conduct WCAG 2.2 accessibility audits with automated testing, manual verification, and remediation guidance.
ibelick/ui-skills
Applies a fixed set of UI rules for stack, components, interaction, animation, typography and layout, or reviews a file against them with concrete fixes.
FerroxLabs/wayland
Install, start, connect, and troubleshoot visualization companion projects for Aion/OpenClaw, with Star-Office-UI as the default recommendation.
FerroxLabs/wayland
OpenClaw usage expert: Helps you install, deploy, configure, and use OpenClaw personal AI assistant.
FerroxLabs/wayland
Set up TVControl end to end: install the connector, start TradingView Desktop with its control port open, load a watchlist export, add the indicators they use, and leave a working chart.
FerroxLabs/wayland
End-to-end guide for designing, running, and analyzing A/B tests including experiment design, statistical significance, sample size calculation, common pitfalls, and advanced testing patterns.
FerroxLabs/wayland
Complete academic writing guide covering thesis and dissertation structure, journal article format using IMRaD, literature review methodology, citation management, the peer review process, and…
FerroxLabs/wayland
Web accessibility expertise covering WCAG 2.2 conformance, audit methodology, ARIA patterns, keyboard navigation, screen reader testing, focus management, form accessibility, and automated vs manual…
Categories
Optimize web content for screen reader compatibility using semantic HTML, ARIA patterns, and live region management, with testing workflows for NVDA, VoiceOver, and JAWS. Screen Reader Optimizer is an agent skill from FerroxLabs/wayland. Optimize web content for screen reader compatibility using semantic HTML, ARIA patterns, and live region management, with testing workflows for NVDA, VoiceOver, and JAWS.
Screen Reader Optimizer fits situations like: the user asks about screen reader optimizer; related techniques; needs guidance in this domain; the request is outside the scope of screen reader optimizer.
Run `npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a claude-code`. Or copy the skill folder (src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer in FerroxLabs/wayland) into .claude/skills/screen-reader-optimizer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a codex`. Or copy the skill folder (src/process/resources/skills-library/bodies/skills/web-development/screen-reader-optimizer in FerroxLabs/wayland) into .agents/skills/screen-reader-optimizer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add FerroxLabs/wayland --skill screen-reader-optimizer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/screen-reader-optimizer, .gemini/skills/screen-reader-optimizer, .github/skills/screen-reader-optimizer and .opencode/skills/screen-reader-optimizer in your project.
SKILL.md names no scripts, command-line tools or credentials: Screen Reader Optimizer is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Screen Reader Optimizer is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.4k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Screen Reader Optimizer: Web Interface Guidelines Reviewer (vercel-labs/openreview, 1.7k stars), Accessibility Review (markmead/hyperui, 12k stars), Web Animation Design (baptisteArno/typebot.io, 11k stars) and Accessibility Fixer (ibelick/ui-skills, 9.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
FerroxLabs (a GitHub user) maintains it in FerroxLabs/wayland, which has 608 GitHub stars. The repository holds 1,194 skills in this directory. The repository was last updated on October 6, 2026.
Source: FerroxLabs/wayland on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.