Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add ThomasSweet/a11y-foundation --skill llmsgit clone --depth 1 https://github.com/ThomasSweet/a11y-foundationWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/thomassweet/a11y-foundation/llms)<a href="https://agentmods.dev/skills/thomassweet/a11y-foundation/llms"><img src="https://agentmods.dev/badge/skills/thomassweet/a11y-foundation/llms/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/thomassweet/a11y-foundation/llms"><img src="https://agentmods.dev/badge/skills/thomassweet/a11y-foundation/llms.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00082 | $0.02063 |
| Opus 5.5 | $0.00033 | $0.00825 |
| Sonnet 5.5 | $0.00016 | $0.00413 |
| Haiku 4.5 | $0.00008 | $0.00206 |
Grade A, and why
accessible-by-default scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 12d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
Copies of this mod
1 near-identical copy found in the catalogue:
- accessible-by-default — 100% identical, 0 lines differ
How it starts
The opening of the file, as written. The whole thing — 169 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Accessible by default
The web platform ships most of accessibility already built in. Most barriers
are not missing ARIA — they are a native element that was replaced by a div,
and then partially rebuilt.
So the rule is: use the thing that already does the job, and don't break what it gives you. Everything below follows from that.
Before building a component, check what already exists
| You need | Use | Not |
|---|---|---|
| A modal | <dialog> + showModal() |
div + focus-trap library |
| A menu, tooltip, or any transient overlay | popover attribute (+ anchor positioning) |
div + click-outside handler |
| Expand/collapse | <details> / <summary> |
div + aria-expanded + height JS |
| A dropdown | <select> (customisable <select> if you must restyle) |
div + listbox roles |
| Any clickable thing | <button> |
<div onclick> |
| Anything that navigates | <a href> |
<button> + router.push |
| A form field label | <label for> |
placeholder, aria-label |
| Grouped controls | <fieldset> + <legend> |
div + aria-labelledby |
| Field validation styling | :user-valid / :user-invalid |
JS class toggling on every keystroke |
| A progress or loading state | <progress>, aria-busy |
animated div with no name |
Each native element brings keyboard behaviour, focus management, a role, an accessible name, and platform conventions the user already knows. A rebuilt version starts at zero and has to earn all of it back.
The first rule of ARIA: if a native element gives you the semantics, use it instead of the ARIA attribute. No ARIA is better than bad ARIA — a wrong role overrides what the element correctly reported.
Non-negotiables in anything you write
- Never remove focus visibility.
outline: noneis only acceptable when the same rule paints a visible replacement. Style:focus-visible, keep it at least 3:1 against what surrounds it, and never let sticky headers cover the focused element (WCAG 2.2 adds 2.4.11 for exactly this). An outline is drawn outside its element, further out with a positiveoutline-offset, and any ancestor that clips (overflowother thanvisible,contain: paint,content-visibility: auto) cuts it at the padding edge: give that ancestor padding of at least the ring's width plus its offset. - Keyboard reaches everything, in a sensible order. Reading order is DOM
order; CSS reordering (
order,grid-area,flex-direction: row-reverse) desyncs the two. Never usetabindexgreater than 0. - Never signal with color alone. Pair it with text, an icon, or a shape.
- Text contrast 4.5:1, large text 3:1, and 3:1 for the visual boundary of any control or meaningful graphic.
- Pointer targets at least 24x24 CSS pixels, or spaced far enough apart to amount to the same thing. 44px is the comfortable choice.
- Reflow at 320 CSS pixels — equivalently 400% zoom — without a second
scroll direction. Logical properties, intrinsic grids, and
min-inline-size: 0on flex/grid children get you most of the way. - Never disable zoom. No
user-scalable=no, nomaximum-scale=1. - Every image, icon, and control has a name, and decorative ones are
explicitly empty (
alt="") rather than unnamed.
What ships with it
3 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 12d ago Changed · +15 lines 452b1c4ae92e
- 25d ago Changed 5ee3c4ac5dcc
- 1mo ago First seen · 154 lines · 82 tokens per session scan A b4bdda94c075
accessible-by-default is a skill published in the GitHub repository ThomasSweet/a11y-foundation (23 stars, last pushed today), licensed MIT. It adds 82 tokens to every session and 2,063 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
implement-component
Implements production-ready UI using DB UX Design System – Generation 3 components, tokens, and icons with a discovery-first approach.
migrate-to-generation-3
Migrates legacy Generation 2 (aka DB UI) code (cmp-, elm-, rea- classes, Web Components, db-color- tokens) to DB UX Design System – Generation 3.
designlang-tokens
Use when styling UI for cal.com — references the extracted design system tokens instead of inventing colors, spacing, or typography.
accessibility
Use when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast, tap-target size. NOT palette or visual intent (that is design), NOT test-runner setup (that is testing-web), NOT LCP/page-speed (that is…
kb-email-accessibility
Reference data, not a reviewer. HTML email accessibility: table layouts, inline styles, dark mode, image fallbacks, and email client rendering constraints.
cognitive-accessibility
Plain language, WCAG 2.2 cognitive criteria, COGA guidance and auth UX.