#408 by GitHub stars
addyosmani/web-quality-skills
Agent Skills for optimizing web quality based on Lighthouse and Core Web Vitals.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
skills/accessibility/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Network or broad shell
afa8da942115 → afa8da942115
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → afa8da942115
No earlier version was observed for comparison.
skills/best-practices/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
afa8da942115 → afa8da942115
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → afa8da942115
No earlier version was observed for comparison.
skills/core-web-vitals/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
afa8da942115 → afa8da942115
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → afa8da942115
No earlier version was observed for comparison.
skills/performance/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
afa8da942115 → afa8da942115
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → afa8da942115
No earlier version was observed for comparison.
skills/seo/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
afa8da942115 → afa8da942115
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → afa8da942115
No earlier version was observed for comparison.
skills/web-quality-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
afa8da942115 → afa8da942115
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → afa8da942115
No earlier version was observed for comparison.
Verified commit afa8da942115f2961fdbfa80807ea0b232ff6c00
git clone --filter=blob:none --no-checkout https://github.com/addyosmani/web-quality-skills.git .hotskills/addyosmani-web-quality-skills && git -C .hotskills/addyosmani-web-quality-skills checkout --detach afa8da942115f2961fdbfa80807ea0b232ff6c00
# Copy each selected skill directory from .hotskills/addyosmani-web-quality-skills into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/addyosmani/web-quality-skills.git .hotskills/addyosmani-web-quality-skills && git -C .hotskills/addyosmani-web-quality-skills checkout --detach afa8da942115f2961fdbfa80807ea0b232ff6c00
# Copy each selected skill directory from .hotskills/addyosmani-web-quality-skills into .agents/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/addyosmani/web-quality-skills.git .hotskills/addyosmani-web-quality-skills && git -C .hotskills/addyosmani-web-quality-skills checkout --detach afa8da942115f2961fdbfa80807ea0b232ff6c00
# Copy each selected skill directory from .hotskills/addyosmani-web-quality-skills into .gemini/skills/<skill-name>/Heat
5.5- Star growth, last 7 daysAhead of 85% of tracked repositories
- Star growth, last 24 hoursAhead of 91% of tracked repositories
- Rank movement, last 7 daysAhead of 31% of tracked repositories
- Commits, last 30 daysAhead of 0% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- accessibility
skills/accessibility - best-practices
skills/best-practices - core-web-vitals
skills/core-web-vitals - performance
skills/performance - seo
skills/seo - web-quality-audit
skills/web-quality-audit
How it works
accessibility
When your agent uses it
Audit and improve web accessibility following WCAG 2.2 guidelines. Use when asked to "improve accessibility", "a11y audit", "WCAG compliance", "screen reader support", "keyboard navigation", or "make accessible".
What it loads into context
Frontmatter
76 tokensAlways available to the agent
SKILL.md
3,619 tokensWhen the skill is activated
Reference documents
6,332 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Evidence-led audit workflow
- WCAG Principles: POUR
- Conformance levels
- Perceivable
- Operable
- Understandable
- Robust
- Testing checklist
- Common issues by impact
- References
Files
../../.claude-plugin/marketplace.jsonasset479 bytes../../.claude-plugin/plugin.jsonasset438 bytesSKILL.mdcore14,358 bytesSKILL.mdcore14,358 bytesSKILL.mdcore14,358 bytesSKILL.mdcore14,358 bytesreferences/A11Y-PATTERNS.mddoc6,036 bytesreferences/WCAG.mddoc9,079 bytes../web-quality-audit/SKILL.mddoc10,450 bytes
Read SKILL.md
# Accessibility (a11y)
Comprehensive accessibility guidelines based on WCAG 2.2 and Lighthouse accessibility audits. Goal: make content usable by everyone, including people with disabilities.
## Evidence-led audit workflow
When a rendered page is available:
1. Run a live Lighthouse Accessibility audit when that capability is available; with Chrome DevTools MCP, use `lighthouse_audit`. Use mobile navigation mode for a general public page or snapshot mode when reloading would lose authenticated or user-created state.
2. Use failed audit nodes to localize the relevant component or template instead of searching the whole repository for generic patterns.
3. Inspect a rendered accessibility-tree snapshot for names, roles, states, landmarks, and heading structure; with Chrome DevTools MCP, use `take_snapshot`. Exercise the affected flow with the keyboard.
4. Fix the source, then re-run the same audit and manual interaction.
If the live tools are unavailable, use Lighthouse CLI or axe for automated coverage and complete the same manual checks. Automated tools detect only a subset of accessibility barriers: a score of 100 is not WCAG conformance, and a low score does not replace issue-level evidence.View the complete source on GitHubbest-practices
When your agent uses it
Apply modern web development best practices for security, compatibility, and code quality. Use when asked to "apply best practices", "security audit", "modernize code", "code quality review", or "check for vulnerabilities".
What it loads into context
Frontmatter
75 tokensAlways available to the agent
SKILL.md
2,990 tokensWhen the skill is activated
Reference documents
3,930 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Evidence-led audit workflow
- Security
- Browser compatibility
- Deprecated APIs
- Console & errors
- Source maps
- Performance best practices
- Code quality
- Permissions & privacy
- Audit checklist
- Tools
- References
Files
SKILL.mdcore12,719 bytesSKILL.mdcore12,719 bytesSKILL.mdcore12,719 bytesSKILL.mdcore12,719 bytesSKILL.mdcore12,719 bytesSKILL.mdcore12,719 bytesSKILL.mdcore12,719 bytesreferences/SECURITY.mddoc6,705 bytes../web-quality-audit/SKILL.mddoc10,450 bytes
Read SKILL.md
# Best practices
Modern web development standards based on Lighthouse best practices audits. Covers security, browser compatibility, and code quality patterns.
## Evidence-led audit workflow
When a rendered page is available:
1. Run a live Lighthouse Best Practices audit when that capability is available; with Chrome DevTools MCP, use `lighthouse_audit`. Use navigation mode for a normal page load or snapshot mode when the current state must be preserved.
2. Inspect the listed console and network failures and fetch individual details only when they support a finding.
3. Supplement runtime evidence with dependency, header, configuration, and source inspection; Lighthouse is not a complete security assessment.
4. Fix the implicated code, re-run the same audit, and keep security findings separate from style preferences.
If live tools are unavailable, use the Lighthouse CLI plus focused dependency and header checks. Never report a high Lighthouse score as proof that the application is secure.View the complete source on GitHubcore-web-vitals
When your agent uses it
Optimize Core Web Vitals (LCP, INP, CLS) for better page experience using field and lab evidence. Use when asked to "improve Core Web Vitals", "fix LCP", "reduce CLS", "optimize INP", "page experience optimization", or "fix layout shifts".
What it loads into context
Frontmatter
93 tokensAlways available to the agent
SKILL.md
2,276 tokensWhen the skill is activated
Reference documents
8,609 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Measure before optimizing
- The three metrics
- LCP: Largest Contentful Paint
- INP: Interaction to Next Paint
- CLS: Cumulative Layout Shift
- Measurement sources
- Framework quick fixes
- References
Files
SKILL.mdcore9,776 bytesSKILL.mdcore9,776 bytesSKILL.mdcore9,776 bytesreferences/CLS.mddoc4,011 bytesreferences/INP.mddoc4,445 bytesreferences/LCP.mddoc5,078 bytes../performance/SKILL.mddoc13,811 bytes../performance/references/MEASUREMENT.mddoc7,371 bytes../performance/references/RUM.mddoc3,135 bytes
Read SKILL.md
# Core Web Vitals optimization
Targeted optimization for the three Core Web Vitals using field data to identify user impact and browser traces to diagnose causes.
## Measure before optimizing
When a runnable URL is available, read [the performance measurement workflow](../performance/references/MEASUREMENT.md). Prefer this sequence:
1. Check page-level CrUX p75 data, with a clearly labeled origin fallback when page data is unavailable.
2. Record a browser performance trace under stated conditions. With Chrome DevTools MCP, trace summaries can include CrUX alongside the observed lab metrics.
3. Analyze only the insights associated with the failing metric, then inspect the implicated code and resources.
4. Re-run equivalent lab measurements after the fix. Do not claim an immediate field improvement; CrUX and first-party RUM need new user visits.
If only source code is available, identify likely causes but do not claim that LCP, INP, or CLS is failing without runtime evidence.View the complete source on GitHubperformance
When your agent uses it
Optimize web performance for faster loading and better user experience. Use when asked to "speed up my site", "optimize performance", "reduce load time", "fix slow loading", "improve page speed", or "performance audit".
What it loads into context
Frontmatter
75 tokensAlways available to the agent
SKILL.md
3,291 tokensWhen the skill is activated
Reference documents
4,460 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- How it works
- Starting performance budget
- Critical rendering path
- Image optimization
- Font optimization
- Caching strategy
- Runtime performance
- Third-party scripts
- Measurement
- References
Files
../core-web-vitals/SKILL.mddoc9,776 bytesSKILL.mdcore13,811 bytesSKILL.mdcore13,811 bytesSKILL.mdcore13,811 bytesSKILL.mdcore13,811 bytesreferences/MEASUREMENT.mddoc7,371 bytesreferences/RUM.mddoc3,135 bytes
Read SKILL.md
# Performance optimization
Evidence-led performance optimization using real-user signals for prioritization and browser traces for diagnosis. Focuses on loading speed, runtime responsiveness, and resource delivery.
## How it works
1. If a page can run, read [the measurement workflow](references/MEASUREMENT.md) and establish a field-plus-lab baseline before editing.
2. Prioritize poor real-user Core Web Vitals. Use a DevTools performance trace and its focused insights to find the cause.
3. Inspect and change only the code or assets connected to measured bottlenecks.
4. Re-run equivalent lab measurements and report before/after values, conditions, and uncertainty. Field verification remains pending until enough new user data arrives.
When no runnable page exists, perform static inspection but call findings **hypotheses**, not measured regressions. Include the command or browser workflow that can verify each high-impact hypothesis.
Prefer a browser tool that records a performance trace and exposes focused insights. With Chrome DevTools MCP, use `performance_start_trace` and `performance_analyze_insight`; do not route performance through `lighthouse_audit`, which covers non-performance Lighthouse categories.View the complete source on GitHubseo
When your agent uses it
Optimize for search engine visibility and ranking. Use when asked to "improve SEO", "optimize for search", "fix meta tags", "add structured data", "sitemap optimization", or "search engine optimization".
What it loads into context
Frontmatter
72 tokensAlways available to the agent
SKILL.md
3,234 tokensWhen the skill is activated
Reference documents
5,511 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Evidence-led audit workflow
- Technical SEO
- On-page SEO
- Structured data (JSON-LD)
- Agentic browsing and AI discoverability
- Mobile SEO
- International SEO
- SEO audit checklist
- Tools
- References
Files
../core-web-vitals/SKILL.mddoc9,776 bytesSKILL.mdcore13,977 bytesSKILL.mdcore13,977 bytesSKILL.mdcore13,977 bytesreferences/STRUCTURED-DATA.mddoc3,339 bytes../web-quality-audit/SKILL.mddoc10,450 bytes
Read SKILL.md
# SEO optimization
Search engine optimization based on Lighthouse SEO audits and Google Search guidelines. Focus on technical SEO, on-page optimization, and structured data.
## Evidence-led audit workflow
When a rendered page is available:
1. Run live Lighthouse SEO and Agentic Browsing checks when that capability is available; with Chrome DevTools MCP, use `lighthouse_audit`. Use the results to localize rendered-page failures.
2. Inspect signals Lighthouse cannot establish on its own: response headers, redirects, `robots.txt`, sitemap coverage, canonical consistency across page templates, structured-data eligibility, and Search Console evidence when the user provides access.
3. Separate technical crawl/index findings from content quality and authority. Do not invent ranking-factor weights or promise ranking changes.
4. Fix the source and re-run the same checks. For indexation or ranking outcomes, report that search-engine validation remains pending.
If live tools are unavailable, use category-specific Lighthouse CLI output plus direct source and HTTP inspection. A Lighthouse SEO score covers a useful subset of technical checks; it is not a prediction of rankings.View the complete source on GitHubweb-quality-audit
When your agent uses it
Run an evidence-led web quality audit covering performance, accessibility, SEO, best practices, and agentic browsing. Use when asked to "audit my site", "review web quality", "run lighthouse audit", "check page quality", or "optimize my website".
What it loads into context
Frontmatter
84 tokensAlways available to the agent
SKILL.md
2,328 tokensWhen the skill is activated
Reference documents
16,926 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- How it works
- Tool routing
- Audit categories
- Severity levels
- Audit output format
- Quick checklist
- References
Scripts executed separately
scripts/analyze.sh
Files
../accessibility/SKILL.mddoc14,358 bytes../best-practices/SKILL.mddoc12,719 bytes../core-web-vitals/SKILL.mddoc9,776 bytes../performance/SKILL.mddoc13,811 bytes../performance/references/MEASUREMENT.mddoc7,371 bytes../seo/SKILL.mddoc13,977 bytesSKILL.mdcore10,450 bytesSKILL.mdcore10,450 bytesSKILL.mdcore10,450 bytesSKILL.mdcore10,450 bytesSKILL.mdcore10,450 bytesSKILL.mdcore10,450 bytesscripts/analyze.shruns3,864 bytes
Read SKILL.md
# Web quality audit
Comprehensive quality review that combines live browser evidence with source inspection. Covers Performance, Accessibility, SEO, Best Practices, and Agentic Browsing without treating an aggregate score as proof of quality.
> **Lighthouse 13+.** The Performance category now uses shared **Performance Insights** across Lighthouse and the DevTools Performance panel ([announcement](https://developer.chrome.com/blog/moving-lighthouse-to-insights)). Follow current insight names and evidence. Do not require removed audit IDs or automatically recreate their recommendations; some were retired because they were noisy, inactionable, or easy to over-recommend.
## How it works
1. Establish the audit target: representative URLs, important states and journeys, public versus authenticated access, and mobile/desktop scope.
2. If a page can run, read [the measurement workflow](../performance/references/MEASUREMENT.md) and collect a minimal live baseline before searching the codebase broadly.
3. Use runtime failures to localize source inspection. Keep measured findings separate from hypotheses found only in code.
4. Categorize by user impact and confidence, then make or recommend specific fixes.
5. Re-run equivalent automated checks and the affected manual flows. Report what is verified and what still needs field or human validation.
View the complete source on GitHubSkills included
- accessibility
- best-practices
- core-web-vitals
- performance
- seo
- web-quality-audit
Repository facts
- License
- MIT
- Created
- Jan 18, 2026
- Last pushed
- Aug 24, 2026
- Forks
- 266
- Open issues
- 4
- Project activity
- Slowing
Rank over the last 12 weeks
Now #408 · best #320 · down 51 in 30 days
- #396 from Oct 30 to Nov 1
- #398 from Nov 2 to Nov 3
- #400 on Nov 4
- #402 on Nov 5
- #405 on Nov 6
- #408 since Nov 7
78 earlier periods
- #300 on Aug 2
- #311 on Aug 8
- #310 on Aug 9
- #318 from Aug 10 to Aug 11
- #315 on Aug 12
- #323 on Aug 13
- #321 on Aug 14
- #318 on Aug 15
- #322 on Aug 16
- #321 on Aug 17
- #330 on Aug 18
- #326 on Aug 19
- #325 on Aug 20
- #327 on Aug 21
- #320 on Aug 22
- #325 on Aug 23
- #328 from Aug 24 to Aug 25
- #327 on Aug 26
- #325 on Aug 27
- #326 on Aug 28
- #327 on Aug 29
- #320 on Aug 30
- #328 on Aug 31
- #334 on Sep 1
- #330 on Sep 2
- #336 on Sep 3
- #330 on Sep 4
- #332 on Sep 5
- #331 on Sep 6
- #340 on Sep 7
- #338 on Sep 8
- #340 on Sep 9
- #339 on Sep 10
- #335 on Sep 11
- #339 on Sep 12
- #337 on Sep 13
- #341 on Sep 14
- #346 on Sep 15
- #344 on Sep 16
- #341 on Sep 17
- #342 on Sep 18
- #337 on Sep 19
- #346 on Sep 20
- #348 on Sep 21
- #350 on Sep 22
- #345 from Sep 23 to Sep 24
- #344 on Sep 25
- #342 on Sep 26
- #346 on Sep 27
- #350 on Sep 28
- #358 on Sep 29
- #355 on Sep 30
- #354 on Oct 1
- #356 on Oct 2
- #351 on Oct 3
- #347 on Oct 4
- #352 on Oct 5
- #350 on Oct 6
- #354 on Oct 7
- #357 on Oct 8
- #362 on Oct 9
- #353 on Oct 10
- #354 on Oct 11
- #362 on Oct 12
- #364 on Oct 13
- #366 on Oct 14
- #363 on Oct 15
- #369 on Oct 16
- #362 on Oct 17
- #373 from Oct 18 to Oct 19
- #376 on Oct 20
- #375 on Oct 21
- #377 on Oct 22
- #378 on Oct 23
- #373 on Oct 24
- #386 on Oct 25
- #393 on Oct 28
- #395 on Oct 29
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 2, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 21 notes
skills/accessibility/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/accessibility/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/accessibility/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/best-practices/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/best-practices/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/best-practices/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/best-practices/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/best-practices/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/best-practices/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/core-web-vitals/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/core-web-vitals/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/performance/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/performance/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/performance/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/seo/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/web-quality-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/web-quality-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/web-quality-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/web-quality-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 333 network referencesin 15 files: seo/SKILL.md:53 seo/references/STRUCTURED-DATA.md:8 core-web-vitals/SKILL.md:77 and 12 more
- No hidden or obfuscated text
- No instruction overrides
- 1 executable scriptin 1 file: web-quality-audit/scripts/analyze.sh:1
- No access to secrets
- No requests to vote in Hot
Show all 334 signals by file
.claude-plugin/plugin.json
- Network accessline 5
"author": { "name": "Addy Osmani", "url": "https://github.com/addyosmani" - Network accessline 6
"name": "Addy Osmani", "url": "https://github.com/addyosmani" }, - Network accessline 7
"url": "https://github.com/addyosmani" - Network accessline 8
}, "homepage": "https://github.com/addyosmani/web-quality-skills", "repository": "https://github.com/addyosmani/web-quality-skills", - Network accessline 9
"homepage": "https://github.com/addyosmani/web-quality-skills", - Network accessline 10
"repository": "https://github.com/addyosmani/web-quality-skills",
skills/accessibility/SKILL.md
- Network accessline 412
# Lighthouse accessibility audit npx lighthouse https://example.com --only-categories=accessibility - Network accessline 412
# Lighthouse accessibility audit npx lighthouse https://example.com --only-categories=accessibility - Network accessline 413
npx lighthouse https://example.com --only-categories=accessibility - Network accessline 413
npx lighthouse https://example.com --only-categories=accessibility - Network accessline 415
# axe-core npm install @axe-core/cli -g axe https://example.com - Network accessline 415
# axe-core npm install @axe-core/cli -g axe https://example.com - Network accessline 417
axe https://example.com - Network accessline 417
axe https://example.com - Network accessline 459
- [WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) - Network accessline 459
- [WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) - Network accessline 460
- [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/) - Network accessline 460
- [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/) - Network accessline 461
- [Deque axe Rules](https://dequeuniversity.com/rules/axe/) - Network accessline 461
- [Deque axe Rules](https://dequeuniversity.com/rules/axe/)
skills/accessibility/references/WCAG.md
- Network accessline 109
<a href="/page">Descriptive link text</a> <!-- External links --> <a href="https://external.com" target="_blank" rel="noopener"> - Network accessline 110
<!-- External links --> <a href="https://external.com" target="_blank" rel="noopener"> External site - Network accessline 111
<a href="https://external.com" target="_blank" rel="noopener"> - Network accessline 178
| Tool | Type | URL | |------|------|-----| | axe DevTools | Browser extension | [deque.com/axe](https://www.deque.com/axe/) | - Network accessline 179
|------|------|-----| | axe DevTools | Browser extension | [deque.com/axe](https://www.deque.com/axe/) | | WAVE | Browser extension | [wave.webaim.org](https://wave.webaim.org/) | - Network accessline 180
| axe DevTools | Browser extension | [deque.com/axe](https://www.deque.com/axe/) | - Network accessline 181
| WAVE | Browser extension | [wave.webaim.org](https://wave.webaim.org/) | - Network accessline 182
| Lighthouse | Built into Chrome | DevTools → Lighthouse | | NVDA | Screen reader (Windows) | [nvaccess.org](https://www.nvaccess.org/) | | VoiceOver | Screen reader (Mac) | Built into macOS | - Network accessline 183
| NVDA | Screen reader (Windows) | [nvaccess.org](https://www.nvaccess.org/) | - Network accessline 185
| Colour Contrast Analyser | Desktop app | [tpgi.com](https://www.tpgi.com/color-contrast-checker/) | - Network accessline 189
- [WCAG 2.2 W3C Recommendation](https://www.w3.org/TR/WCAG22/) - Network accessline 190
- [WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) - Network accessline 191
- [What's New in WCAG 2.2](https://www.w3.org/WAI/standards-guidelines/wcag/new-in-22/)
skills/best-practices/SKILL.md
- Network accessline 131
**Never load polyfills from a third-party CDN you don't control.** The `polyfill.io` service was [compromised in mid-2024](https://sansec.io/research/polyfill-supply-chain-attack) in a supply-chain attack and used to serve malware to ~100k - Network accessline 131
**Never load polyfills from a third-party CDN you don't control.** The `polyfill.io` service was [compromised in mid-2024](https://sansec.io/research/polyfill-supply-chain-attack) in a supply-chain attack and used to serve malware to ~100k - Network accessline 152
// ✅ Async fetch const response = await fetch(url); - Network accessline 152
// ✅ Async fetch const response = await fetch(url); - Network accessline 153
const response = await fetch(url); - Network accessline 153
const response = await fetch(url); - Network accessline 427
<!-- Or allow for specific origins --> <meta http-equiv="Permissions-Policy" content="geolocation=(self 'https://maps.example.com')"> - Network accessline 427
<!-- Or allow for specific origins --> <meta http-equiv="Permissions-Policy" content="geolocation=(self 'https://maps.example.com')"> - Network accessline 429
content="geolocation=(self 'https://maps.example.com')"> - Network accessline 429
content="geolocation=(self 'https://maps.example.com')"> - Network accessline 468
|------|---------| | `npm audit` | Dependency vulnerabilities | | [SecurityHeaders.com](https://securityheaders.com) | Header analysis | - Network accessline 468
|------|---------| | `npm audit` | Dependency vulnerabilities | | [SecurityHeaders.com](https://securityheaders.com) | Header analysis | - Network accessline 469
| `npm audit` | Dependency vulnerabilities | | [SecurityHeaders.com](https://securityheaders.com) | Header analysis | | [W3C Validator](https://validator.w3.org) | HTML validation | - Network accessline 469
| `npm audit` | Dependency vulnerabilities | | [SecurityHeaders.com](https://securityheaders.com) | Header analysis | | [W3C Validator](https://validator.w3.org) | HTML validation | - Network accessline 470
| [SecurityHeaders.com](https://securityheaders.com) | Header analysis | - Network accessline 470
| [SecurityHeaders.com](https://securityheaders.com) | Header analysis | - Network accessline 471
| [W3C Validator](https://validator.w3.org) | HTML validation | - Network accessline 471
| [W3C Validator](https://validator.w3.org) | HTML validation | - Network accessline 472
| Live Lighthouse audit (Chrome DevTools MCP: `lighthouse_audit`) | Rendered Best Practices checks for agents | | Lighthouse CLI | Best Practices audit fallback | | [Observatory](https://observatory.mozilla.org) | Security scan | - Network accessline 472
| Live Lighthouse audit (Chrome DevTools MCP: `lighthouse_audit`) | Rendered Best Practices checks for agents | | Lighthouse CLI | Best Practices audit fallback | | [Observatory](https://observatory.mozilla.org) | Security scan | - Network accessline 474
| [Observatory](https://observatory.mozilla.org) | Security scan | - Network accessline 474
| [Observatory](https://observatory.mozilla.org) | Security scan | - Network accessline 478
- [MDN Web Security](https://developer.mozilla.org/en-US/docs/Web/Security) - Network accessline 478
- [MDN Web Security](https://developer.mozilla.org/en-US/docs/Web/Security) - Network accessline 479
- [OWASP Top 10](https://owasp.org/www-project-top-ten/) - Network accessline 479
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
skills/best-practices/references/SECURITY.md
- Network accessline 7
<!-- ❌ Mixed content --> <img src="http://example.com/image.jpg"> - Network accessline 8
<img src="http://example.com/image.jpg"> - Network accessline 9
<script src="http://cdn.example.com/script.js"></script> - Network accessline 11
<!-- ✅ HTTPS only --> <img src="https://example.com/image.jpg"> - Network accessline 12
<img src="https://example.com/image.jpg"> - Network accessline 13
<script src="https://cdn.example.com/script.js"></script> - Network accessline 27
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted-cdn.com; - Network accessline 28
content="default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline'; - Network accessline 29
script-src 'self' https://trusted-cdn.com; - Network accessline 30
style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https://api.example.com;"> - Network accessline 32
connect-src 'self' https://api.example.com;"> - Network accessline 39
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123' https://trusted.com; - Network accessline 40
default-src 'self'; script-src 'self' 'nonce-abc123' https://trusted.com; style-src 'self' 'nonce-abc123'; - Network accessline 41
script-src 'self' 'nonce-abc123' https://trusted.com; - Network accessline 42
style-src 'self' 'nonce-abc123'; img-src 'self' data: https:; connect-src 'self' https://api.example.com; - Network accessline 43
img-src 'self' data: https:; connect-src 'self' https://api.example.com; frame-ancestors 'self'; - Network accessline 44
connect-src 'self' https://api.example.com; - Network accessline 82
* **Angular** documents built-in sanitization plus the `angular` Trusted Types policy required for enforcement; lazy loading, JIT, upgrades, and explicit sanitizer bypasses need additional named policies. Follow [Angular's maintained securi - Network accessline 83
* **React** does not sanitize `dangerouslySetInnerHTML`. Keep untrusted input out of it or pass content sanitized by an application-owned policy, and verify the deployed React version under report-only enforcement. Do not assume the framewo - Network accessline 90
<script src="https://cdn.example.com/lib@1.2.3/dist/lib.js" - Network accessline 193
- [MDN web security](https://developer.mozilla.org/en-US/docs/Web/Security) - Network accessline 194
- [OWASP Content Security Policy Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html) - Network accessline 195
- [DOMPurify](https://github.com/cure53/DOMPurify)
skills/core-web-vitals/SKILL.md
- Network accessline 77
// ❌ Content loads after JavaScript useEffect(() => { fetch('/api/hero-text').then(r => r.json()).then(setHeroText); - Network accessline 77
// ❌ Content loads after JavaScript useEffect(() => { fetch('/api/hero-text').then(r => r.json()).then(setHeroText); - Network accessline 77
// ❌ Content loads after JavaScript useEffect(() => { fetch('/api/hero-text').then(r => r.json()).then(setHeroText); - Network accessline 77
// ❌ Content loads after JavaScript useEffect(() => { fetch('/api/hero-text').then(r => r.json()).then(setHeroText); - Network accessline 78
useEffect(() => { fetch('/api/hero-text').then(r => r.json()).then(setHeroText); }, []); - Network accessline 78
useEffect(() => { fetch('/api/hero-text').then(r => r.json()).then(setHeroText); }, []); - Network accessline 78
useEffect(() => { fetch('/api/hero-text').then(r => r.json()).then(setHeroText); }, []); - Network accessline 78
useEffect(() => { fetch('/api/hero-text').then(r => r.json()).then(setHeroText); }, []); - Network accessline 79
fetch('/api/hero-text').then(r => r.json()).then(setHeroText); - Network accessline 79
fetch('/api/hero-text').then(r => r.json()).then(setHeroText); - Network accessline 79
fetch('/api/hero-text').then(r => r.json()).then(setHeroText); - Network accessline 79
fetch('/api/hero-text').then(r => r.json()).then(setHeroText); - Network accessline 114
Start conservatively and measure prediction hit rate, transferred bytes, server load, and navigation improvement before expanding the rules. Recheck [Chrome's maintained eagerness documentation](https://developer.chrome.com/docs/web-platfor - Network accessline 114
Start conservatively and measure prediction hit rate, transferred bytes, server load, and navigation improvement before expanding the rules. Recheck [Chrome's maintained eagerness documentation](https://developer.chrome.com/docs/web-platfor - Network accessline 114
Start conservatively and measure prediction hit rate, transferred bytes, server load, and navigation improvement before expanding the rules. Recheck [Chrome's maintained eagerness documentation](https://developer.chrome.com/docs/web-platfor - Network accessline 114
Start conservatively and measure prediction hit rate, transferred bytes, server load, and navigation improvement before expanding the rules. Recheck [Chrome's maintained eagerness documentation](https://developer.chrome.com/docs/web-platfor - Network accessline 116
Caveats: - **Bandwidth/CPU cost.** Each prerender is roughly a full page load. Scope `where` carefully (`href_matches` patterns, exclude logout/checkout) and avoid `immediate` outside small sites. - **Side effects fire early.** Analytics, a - Network accessline 116
Caveats: - **Bandwidth/CPU cost.** Each prerender is roughly a full page load. Scope `where` carefully (`href_matches` patterns, exclude logout/checkout) and avoid `immediate` outside small sites. - **Side effects fire early.** Analytics, a - Network accessline 116
Caveats: - **Bandwidth/CPU cost.** Each prerender is roughly a full page load. Scope `where` carefully (`href_matches` patterns, exclude logout/checkout) and avoid `immediate` outside small sites. - **Side effects fire early.** Analytics, a - Network accessline 116
Caveats: - **Bandwidth/CPU cost.** Each prerender is roughly a full page load. Scope `where` carefully (`href_matches` patterns, exclude logout/checkout) and avoid `immediate` outside small sites. - **Side effects fire early.** Analytics, a - Network accessline 117
- **Bandwidth/CPU cost.** Each prerender is roughly a full page load. Scope `where` carefully (`href_matches` patterns, exclude logout/checkout) and avoid `immediate` outside small sites. - **Side effects fire early.** Analytics, ads, and a - Network accessline 117
- **Bandwidth/CPU cost.** Each prerender is roughly a full page load. Scope `where` carefully (`href_matches` patterns, exclude logout/checkout) and avoid `immediate` outside small sites. - **Side effects fire early.** Analytics, ads, and a - Network accessline 117
- **Bandwidth/CPU cost.** Each prerender is roughly a full page load. Scope `where` carefully (`href_matches` patterns, exclude logout/checkout) and avoid `immediate` outside small sites. - **Side effects fire early.** Analytics, ads, and a - Network accessline 117
- **Bandwidth/CPU cost.** Each prerender is roughly a full page load. Scope `where` carefully (`href_matches` patterns, exclude logout/checkout) and avoid `immediate` outside small sites. - **Side effects fire early.** Analytics, ads, and a - Network accessline 118
- **Side effects fire early.** Analytics, ads, and any code that runs on load will fire when the prerender starts, not when the user navigates. Gate side effects on the [`prerenderingchange` event](https://developer.chrome.com/docs/web-plat - Network accessline 118
- **Side effects fire early.** Analytics, ads, and any code that runs on load will fire when the prerender starts, not when the user navigates. Gate side effects on the [`prerenderingchange` event](https://developer.chrome.com/docs/web-plat - Network accessline 118
- **Side effects fire early.** Analytics, ads, and any code that runs on load will fire when the prerender starts, not when the user navigates. Gate side effects on the [`prerenderingchange` event](https://developer.chrome.com/docs/web-plat - Network accessline 118
- **Side effects fire early.** Analytics, ads, and any code that runs on load will fire when the prerender starts, not when the user navigates. Gate side effects on the [`prerenderingchange` event](https://developer.chrome.com/docs/web-plat - Network accessline 223
- [Detailed INP optimization](references/INP.md) — read when a trace or field attribution identifies a slow interaction - [Detailed CLS optimization](references/CLS.md) — read when a trace or field attribution identifies unexpected shifts - - Network accessline 223
- [Detailed INP optimization](references/INP.md) — read when a trace or field attribution identifies a slow interaction - [Detailed CLS optimization](references/CLS.md) — read when a trace or field attribution identifies unexpected shifts - - Network accessline 223
- [Detailed INP optimization](references/INP.md) — read when a trace or field attribution identifies a slow interaction - [Detailed CLS optimization](references/CLS.md) — read when a trace or field attribution identifies unexpected shifts - - Network accessline 223
- [Detailed INP optimization](references/INP.md) — read when a trace or field attribution identifies a slow interaction - [Detailed CLS optimization](references/CLS.md) — read when a trace or field attribution identifies unexpected shifts - - Network accessline 224
- [Detailed CLS optimization](references/CLS.md) — read when a trace or field attribution identifies unexpected shifts - [web.dev LCP](https://web.dev/articles/lcp) - [web.dev INP](https://web.dev/articles/inp) - Network accessline 224
- [Detailed CLS optimization](references/CLS.md) — read when a trace or field attribution identifies unexpected shifts - [web.dev LCP](https://web.dev/articles/lcp) - [web.dev INP](https://web.dev/articles/inp) - Network accessline 224
- [Detailed CLS optimization](references/CLS.md) — read when a trace or field attribution identifies unexpected shifts - [web.dev LCP](https://web.dev/articles/lcp) - [web.dev INP](https://web.dev/articles/inp) - Network accessline 224
- [Detailed CLS optimization](references/CLS.md) — read when a trace or field attribution identifies unexpected shifts - [web.dev LCP](https://web.dev/articles/lcp) - [web.dev INP](https://web.dev/articles/inp) - Network accessline 225
- [web.dev LCP](https://web.dev/articles/lcp) - Network accessline 225
- [web.dev LCP](https://web.dev/articles/lcp) - Network accessline 225
- [web.dev LCP](https://web.dev/articles/lcp) - Network accessline 225
- [web.dev LCP](https://web.dev/articles/lcp) - Network accessline 226
- [web.dev INP](https://web.dev/articles/inp) - Network accessline 226
- [web.dev INP](https://web.dev/articles/inp) - Network accessline 226
- [web.dev INP](https://web.dev/articles/inp) - Network accessline 226
- [web.dev INP](https://web.dev/articles/inp) - Network accessline 227
- [web.dev CLS](https://web.dev/articles/cls) - Network accessline 227
- [web.dev CLS](https://web.dev/articles/cls) - Network accessline 227
- [web.dev CLS](https://web.dev/articles/cls) - Network accessline 227
- [web.dev CLS](https://web.dev/articles/cls)
skills/core-web-vitals/references/CLS.md
- Network accessline 12
<img src="photo.jpg" alt="Photo"> <iframe src="https://video.example/embed/123" title="Demo"></iframe> - Network accessline 13
<iframe src="https://video.example/embed/123" title="Demo"></iframe> - Network accessline 21
<div class="video-frame"> <iframe src="https://video.example/embed/123" title="Demo"></iframe> - Network accessline 22
<iframe src="https://video.example/embed/123" title="Demo"></iframe> - Network accessline 124
* [Optimize CLS](https://web.dev/articles/optimize-cls) - Network accessline 125
* [Debug layout shifts](https://developer.chrome.com/docs/devtools/performance/insights#cls-culprits) - Network accessline 126
* [CSS font metric overrides](https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/size-adjust)
skills/core-web-vitals/references/INP.md
skills/performance/SKILL.md
- Network accessline 43
* **HTTP/2 or HTTP/3.** Multiplexing reduces connection overhead. * **Edge caching.** Cache HTML at CDN edge when possible. * **Consider Early Hints (HTTP 103) for measured document latency.** If a trace shows slow HTML generation and stabl - Network accessline 43
* **HTTP/2 or HTTP/3.** Multiplexing reduces connection overhead. * **Edge caching.** Cache HTML at CDN edge when possible. * **Consider Early Hints (HTTP 103) for measured document latency.** If a trace shows slow HTML generation and stabl - Network accessline 43
* **HTTP/2 or HTTP/3.** Multiplexing reduces connection overhead. * **Edge caching.** Cache HTML at CDN edge when possible. * **Consider Early Hints (HTTP 103) for measured document latency.** If a trace shows slow HTML generation and stabl - Network accessline 45
* **Consider Early Hints (HTTP 103) for measured document latency.** If a trace shows slow HTML generation and stable critical subresources, send an interim `103` with `Link` headers before the normal final response from the same request. U - Network accessline 45
* **Consider Early Hints (HTTP 103) for measured document latency.** If a trace shows slow HTML generation and stable critical subresources, send an interim `103` with `Link` headers before the normal final response from the same request. U - Network accessline 45
* **Consider Early Hints (HTTP 103) for measured document latency.** If a trace shows slow HTML generation and stable critical subresources, send an interim `103` with `Link` headers before the normal final response from the same request. U - Network accessline 51
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 51
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 51
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 52
<link rel="preconnect" href="https://cdn.example.com" crossorigin> - Network accessline 52
<link rel="preconnect" href="https://cdn.example.com" crossorigin> - Network accessline 52
<link rel="preconnect" href="https://cdn.example.com" crossorigin> - Network accessline 67
**Prerender likely-next navigations** with the [Speculation Rules API](https://developer.chrome.com/docs/web-platform/prerender-pages): - Network accessline 67
**Prerender likely-next navigations** with the [Speculation Rules API](https://developer.chrome.com/docs/web-platform/prerender-pages): - Network accessline 67
**Prerender likely-next navigations** with the [Speculation Rules API](https://developer.chrome.com/docs/web-platform/prerender-pages): - Network accessline 255
event.respondWith( caches.match(event.request).then((cached) => { return cached || fetch(event.request).then((response) => { - Network accessline 255
event.respondWith( caches.match(event.request).then((cached) => { return cached || fetch(event.request).then((response) => { - Network accessline 255
event.respondWith( caches.match(event.request).then((cached) => { return cached || fetch(event.request).then((response) => { - Network accessline 256
caches.match(event.request).then((cached) => { return cached || fetch(event.request).then((response) => { const clone = response.clone(); - Network accessline 256
caches.match(event.request).then((cached) => { return cached || fetch(event.request).then((response) => { const clone = response.clone(); - Network accessline 256
caches.match(event.request).then((cached) => { return cached || fetch(event.request).then((response) => { const clone = response.clone(); - Network accessline 257
return cached || fetch(event.request).then((response) => { - Network accessline 257
return cached || fetch(event.request).then((response) => { - Network accessline 257
return cached || fetch(event.request).then((response) => { - Network accessline 324
The [View Transitions API](https://developer.chrome.com/docs/web-platform/view-transitions) lets the browser cross-fade (or custom-animate) between two DOM states using a single GPU-composited snapshot — no double-render, no layout thrash, - Network accessline 324
The [View Transitions API](https://developer.chrome.com/docs/web-platform/view-transitions) lets the browser cross-fade (or custom-animate) between two DOM states using a single GPU-composited snapshot — no double-render, no layout thrash, - Network accessline 324
The [View Transitions API](https://developer.chrome.com/docs/web-platform/view-transitions) lets the browser cross-fade (or custom-animate) between two DOM states using a single GPU-composited snapshot — no double-render, no layout thrash, - Network accessline 351
// ❌ Blocks main thread <script src="https://analytics.example.com/script.js"></script> - Network accessline 351
// ❌ Blocks main thread <script src="https://analytics.example.com/script.js"></script> - Network accessline 351
// ❌ Blocks main thread <script src="https://analytics.example.com/script.js"></script> - Network accessline 352
<script src="https://analytics.example.com/script.js"></script> - Network accessline 352
<script src="https://analytics.example.com/script.js"></script> - Network accessline 352
<script src="https://analytics.example.com/script.js"></script> - Network accessline 354
// ✅ Async loading <script async src="https://analytics.example.com/script.js"></script> - Network accessline 354
// ✅ Async loading <script async src="https://analytics.example.com/script.js"></script> - Network accessline 354
// ✅ Async loading <script async src="https://analytics.example.com/script.js"></script> - Network accessline 355
<script async src="https://analytics.example.com/script.js"></script> - Network accessline 355
<script async src="https://analytics.example.com/script.js"></script> - Network accessline 355
<script async src="https://analytics.example.com/script.js"></script> - Network accessline 361
if (entries[0].isIntersecting) { const script = document.createElement('script'); script.src = 'https://widget.example.com/embed.js'; - Network accessline 361
if (entries[0].isIntersecting) { const script = document.createElement('script'); script.src = 'https://widget.example.com/embed.js'; - Network accessline 361
if (entries[0].isIntersecting) { const script = document.createElement('script'); script.src = 'https://widget.example.com/embed.js'; - Network accessline 362
const script = document.createElement('script'); script.src = 'https://widget.example.com/embed.js'; document.body.appendChild(script); - Network accessline 362
const script = document.createElement('script'); script.src = 'https://widget.example.com/embed.js'; document.body.appendChild(script); - Network accessline 362
const script = document.createElement('script'); script.src = 'https://widget.example.com/embed.js'; document.body.appendChild(script); - Network accessline 363
script.src = 'https://widget.example.com/embed.js'; - Network accessline 363
script.src = 'https://widget.example.com/embed.js'; - Network accessline 363
script.src = 'https://widget.example.com/embed.js';
skills/performance/references/MEASUREMENT.md
- Network accessline 104
* [Chrome DevTools MCP tool reference](https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/docs/tool-reference.md) - Network accessline 104
* [Chrome DevTools MCP tool reference](https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/docs/tool-reference.md) - Network accessline 104
* [Chrome DevTools MCP tool reference](https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/docs/tool-reference.md) - Network accessline 105
* [Chrome UX Report API](https://developer.chrome.com/docs/crux/api) - Network accessline 105
* [Chrome UX Report API](https://developer.chrome.com/docs/crux/api) - Network accessline 105
* [Chrome UX Report API](https://developer.chrome.com/docs/crux/api) - Network accessline 106
* [Getting started with measuring Web Vitals](https://web.dev/articles/vitals-measurement-getting-started) - Network accessline 106
* [Getting started with measuring Web Vitals](https://web.dev/articles/vitals-measurement-getting-started) - Network accessline 106
* [Getting started with measuring Web Vitals](https://web.dev/articles/vitals-measurement-getting-started) - Network accessline 107
* [PageSpeed Insights API](https://developers.google.com/speed/docs/insights/v5/get-started) - Network accessline 107
* [PageSpeed Insights API](https://developers.google.com/speed/docs/insights/v5/get-started) - Network accessline 107
* [PageSpeed Insights API](https://developers.google.com/speed/docs/insights/v5/get-started)
skills/performance/references/RUM.md
- Network accessline 27
if (!navigator.sendBeacon?.('/rum', body)) { fetch('/rum', {method: 'POST', body, keepalive: true}); - Network accessline 27
if (!navigator.sendBeacon?.('/rum', body)) { fetch('/rum', {method: 'POST', body, keepalive: true}); - Network accessline 28
fetch('/rum', {method: 'POST', body, keepalive: true}); - Network accessline 28
fetch('/rum', {method: 'POST', body, keepalive: true}); - Network accessline 63
* [web-vitals library](https://github.com/GoogleChrome/web-vitals) - Network accessline 63
* [web-vitals library](https://github.com/GoogleChrome/web-vitals) - Network accessline 64
* [Best practices for measuring Web Vitals in the field](https://web.dev/articles/vitals-field-measurement-best-practices) - Network accessline 64
* [Best practices for measuring Web Vitals in the field](https://web.dev/articles/vitals-field-measurement-best-practices) - Network accessline 65
* [Find slow interactions in the field](https://web.dev/articles/find-slow-interactions-in-the-field) - Network accessline 65
* [Find slow interactions in the field](https://web.dev/articles/find-slow-interactions-in-the-field)
skills/seo/SKILL.md
- Network accessline 53
Sitemap: https://example.com/sitemap.xml - Network accessline 53
Sitemap: https://example.com/sitemap.xml - Network accessline 73
<!-- Prevent duplicate content issues --> <link rel="canonical" href="https://example.com/page"> - Network accessline 73
<!-- Prevent duplicate content issues --> <link rel="canonical" href="https://example.com/page"> - Network accessline 74
<link rel="canonical" href="https://example.com/page"> - Network accessline 74
<link rel="canonical" href="https://example.com/page"> - Network accessline 76
<!-- Self-referencing canonical (recommended) --> <link rel="canonical" href="https://example.com/current-page"> - Network accessline 76
<!-- Self-referencing canonical (recommended) --> <link rel="canonical" href="https://example.com/current-page"> - Network accessline 77
<link rel="canonical" href="https://example.com/current-page"> - Network accessline 77
<link rel="canonical" href="https://example.com/current-page"> - Network accessline 79
<!-- For paginated content --> <link rel="canonical" href="https://example.com/products"> - Network accessline 79
<!-- For paginated content --> <link rel="canonical" href="https://example.com/products"> - Network accessline 80
<link rel="canonical" href="https://example.com/products"> - Network accessline 80
<link rel="canonical" href="https://example.com/products"> - Network accessline 87
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 87
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 88
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 88
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 89
<url> <loc>https://example.com/</loc> <lastmod>2024-01-15</lastmod> - Network accessline 89
<url> <loc>https://example.com/</loc> <lastmod>2024-01-15</lastmod> - Network accessline 90
<loc>https://example.com/</loc> - Network accessline 90
<loc>https://example.com/</loc> - Network accessline 94
</url> <url> <loc>https://example.com/products</loc> - Network accessline 94
</url> <url> <loc>https://example.com/products</loc> - Network accessline 95
<url> <loc>https://example.com/products</loc> <lastmod>2024-01-14</lastmod> - Network accessline 95
<url> <loc>https://example.com/products</loc> <lastmod>2024-01-14</lastmod> - Network accessline 96
<loc>https://example.com/products</loc> - Network accessline 96
<loc>https://example.com/products</loc> - Network accessline 114
✅ Good URLs: https://example.com/products/blue-widget - Network accessline 114
✅ Good URLs: https://example.com/products/blue-widget - Network accessline 115
https://example.com/products/blue-widget - Network accessline 115
https://example.com/products/blue-widget - Network accessline 116
https://example.com/blog/how-to-use-widgets - Network accessline 116
https://example.com/blog/how-to-use-widgets - Network accessline 118
❌ Poor URLs: https://example.com/p?id=12345 - Network accessline 118
❌ Poor URLs: https://example.com/p?id=12345 - Network accessline 119
https://example.com/p?id=12345 - Network accessline 119
https://example.com/p?id=12345 - Network accessline 120
https://example.com/products/item/category/subcategory/blue-widget-2024-sale-discount - Network accessline 120
https://example.com/products/item/category/subcategory/blue-widget-2024-sale-discount - Network accessline 134
<!-- Ensure all resources use HTTPS --> <img src="https://example.com/image.jpg"> - Network accessline 134
<!-- Ensure all resources use HTTPS --> <img src="https://example.com/image.jpg"> - Network accessline 135
<img src="https://example.com/image.jpg"> - Network accessline 135
<img src="https://example.com/image.jpg"> - Network accessline 137
<!-- Not: --> <img src="http://example.com/image.jpg"> - Network accessline 137
<!-- Not: --> <img src="http://example.com/image.jpg"> - Network accessline 138
<img src="http://example.com/image.jpg"> - Network accessline 138
<img src="http://example.com/image.jpg"> - Network accessline 170
Treat title-link rewriting separately from truncation. Google may build a different title link from the visible page title, headings, anchor text, and other sources even when the `<title>` is short; investigate accuracy and consistency rath - Network accessline 170
Treat title-link rewriting separately from truncation. Google may build a different title link from the visible page title, headings, anchor text, and other sources even when the `<title>` is short; investigate accuracy and consistency rath - Network accessline 283
Training controls such as `GPTBot` and `ClaudeBot` are distinct from search and user-fetch controls. `GoogleOther` is a generic crawler, not an AI-search visibility switch. Verify current names and consequences in the vendors' maintained do - Network accessline 283
Training controls such as `GPTBot` and `ClaudeBot` are distinct from search and user-fetch controls. `GoogleOther` is a generic crawler, not an AI-search visibility switch. Verify current names and consequences in the vendors' maintained do - Network accessline 343
<!-- For multi-language sites --> <link rel="alternate" hreflang="en" href="https://example.com/page"> - Network accessline 343
<!-- For multi-language sites --> <link rel="alternate" hreflang="en" href="https://example.com/page"> - Network accessline 344
<link rel="alternate" hreflang="en" href="https://example.com/page"> - Network accessline 344
<link rel="alternate" hreflang="en" href="https://example.com/page"> - Network accessline 345
<link rel="alternate" hreflang="es" href="https://example.com/es/page"> - Network accessline 345
<link rel="alternate" hreflang="es" href="https://example.com/es/page"> - Network accessline 346
<link rel="alternate" hreflang="fr" href="https://example.com/fr/page"> - Network accessline 346
<link rel="alternate" hreflang="fr" href="https://example.com/fr/page"> - Network accessline 347
<link rel="alternate" hreflang="x-default" href="https://example.com/page"> - Network accessline 347
<link rel="alternate" hreflang="x-default" href="https://example.com/page"> - Network accessline 406
- [Google Search Central](https://developers.google.com/search) - Network accessline 406
- [Google Search Central](https://developers.google.com/search) - Network accessline 407
- [Schema.org](https://schema.org/) - Network accessline 407
- [Schema.org](https://schema.org/)
skills/seo/references/STRUCTURED-DATA.md
- Network accessline 8
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 9
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 10
"@context": "https://schema.org", - Network accessline 11
"@type": "Organization", "name": "Example Company", "url": "https://example.com", - Network accessline 12
"name": "Example Company", "url": "https://example.com", "logo": "https://example.com/logo.png", - Network accessline 13
"url": "https://example.com", - Network accessline 14
"logo": "https://example.com/logo.png", - Network accessline 15
"sameAs": [ "https://twitter.com/example", "https://linkedin.com/company/example" - Network accessline 16
"https://twitter.com/example", - Network accessline 17
"https://linkedin.com/company/example" - Network accessline 31
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 32
{ "@context": "https://schema.org", "@type": "Article", - Network accessline 33
"@context": "https://schema.org", - Network accessline 35
"headline": "How to Choose the Right Widget", "description": "Complete guide to selecting widgets for your needs.", "image": "https://example.com/article-image.jpg", - Network accessline 36
"description": "Complete guide to selecting widgets for your needs.", "image": "https://example.com/article-image.jpg", "author": { - Network accessline 37
"image": "https://example.com/article-image.jpg", - Network accessline 39
"@type": "Person", "name": "Jane Smith", "url": "https://example.com/authors/jane-smith" - Network accessline 40
"name": "Jane Smith", "url": "https://example.com/authors/jane-smith" }, - Network accessline 41
"url": "https://example.com/authors/jane-smith" - Network accessline 46
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" - Network accessline 47
"@type": "ImageObject", "url": "https://example.com/logo.png" } - Network accessline 48
"url": "https://example.com/logo.png" - Network accessline 60
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 61
{ "@context": "https://schema.org", "@type": "Product", - Network accessline 62
"@context": "https://schema.org", - Network accessline 63
"@type": "Product", "name": "Blue Widget Pro", "image": "https://example.com/blue-widget.jpg", - Network accessline 64
"name": "Blue Widget Pro", "image": "https://example.com/blue-widget.jpg", "description": "Premium blue widget with advanced features.", - Network accessline 65
"image": "https://example.com/blue-widget.jpg", - Network accessline 73
"price": "49.99", "priceCurrency": "USD", "availability": "https://schema.org/InStock", - Network accessline 74
"priceCurrency": "USD", "availability": "https://schema.org/InStock", "url": "https://example.com/products/blue-widget" - Network accessline 75
"availability": "https://schema.org/InStock", - Network accessline 76
"url": "https://example.com/products/blue-widget" - Network accessline 90
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 91
{ "@context": "https://schema.org", "@type": "FAQPage", - Network accessline 92
"@context": "https://schema.org", - Network accessline 119
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 120
{ "@context": "https://schema.org", "@type": "BreadcrumbList", - Network accessline 121
"@context": "https://schema.org", - Network accessline 126
"position": 1, "name": "Home", "item": "https://example.com" - Network accessline 127
"name": "Home", "item": "https://example.com" }, - Network accessline 128
"item": "https://example.com" - Network accessline 132
"position": 2, "name": "Products", "item": "https://example.com/products" - Network accessline 133
"name": "Products", "item": "https://example.com/products" }, - Network accessline 134
"item": "https://example.com/products" - Network accessline 138
"position": 3, "name": "Blue Widgets", "item": "https://example.com/products/blue-widgets" - Network accessline 139
"name": "Blue Widgets", "item": "https://example.com/products/blue-widgets" } - Network accessline 140
"item": "https://example.com/products/blue-widgets" - Network accessline 149
Test structured data at: - [Google Rich Results Test](https://search.google.com/test/rich-results) - Network accessline 150
- [Google Rich Results Test](https://search.google.com/test/rich-results) - Network accessline 151
- [Schema.org Validator](https://validator.schema.org/)
skills/web-quality-audit/SKILL.md
- Network accessline 14
> **Lighthouse 13+.** The Performance category now uses shared **Performance Insights** across Lighthouse and the DevTools Performance panel ([announcement](https://developer.chrome.com/blog/moving-lighthouse-to-insights)). Follow current i - Network accessline 14
> **Lighthouse 13+.** The Performance category now uses shared **Performance Insights** across Lighthouse and the DevTools Performance panel ([announcement](https://developer.chrome.com/blog/moving-lighthouse-to-insights)). Follow current i - Network accessline 14
> **Lighthouse 13+.** The Performance category now uses shared **Performance Insights** across Lighthouse and the DevTools Performance panel ([announcement](https://developer.chrome.com/blog/moving-lighthouse-to-insights)). Follow current i - Network accessline 14
> **Lighthouse 13+.** The Performance category now uses shared **Performance Insights** across Lighthouse and the DevTools Performance panel ([announcement](https://developer.chrome.com/blog/moving-lighthouse-to-insights)). Follow current i
skills/web-quality-audit/scripts/analyze.sh
- Executable scriptline 1
#!/bin/bash - Network accessline 63
WARNINGS+=("$file:$ln: Non-HTTPS URL") http_count=$((http_count + 1)) done < <(grep -noE 'http://[^"'\''[:space:]>]*' "$file" || true) - Network accessline 64
http_count=$((http_count + 1)) done < <(grep -noE 'http://[^"'\''[:space:]>]*' "$file" || true) } - Network accessline 65
done < <(grep -noE 'http://[^"'\''[:space:]>]*' "$file" || true)
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 328 facts
- Network access in code of the SKILL.mdaccessibility/SKILL.md:412High confidence
- Network access in code of the SKILL.mdskills/accessibility/SKILL.md:412High confidence
- Network access in code of the SKILL.mdaccessibility/SKILL.md:413High confidence
- Network access in code of the SKILL.mdskills/accessibility/SKILL.md:413High confidence
- Network access in code of the SKILL.mdaccessibility/SKILL.md:415High confidence
- Network access in code of the SKILL.mdskills/accessibility/SKILL.md:415High confidence
- Network access in code of the SKILL.mdaccessibility/SKILL.md:417High confidence
- Network access in code of the SKILL.mdskills/accessibility/SKILL.md:417High confidence
- Network access in prose of the SKILL.mdaccessibility/SKILL.md:459Low confidence
- Network access in prose of the SKILL.mdskills/accessibility/SKILL.md:459Low confidence
- Network access in prose of the SKILL.mdaccessibility/SKILL.md:460Low confidence
- Network access in prose of the SKILL.mdskills/accessibility/SKILL.md:460Low confidence
- Network access in prose of the SKILL.mdaccessibility/SKILL.md:461Low confidence
- Network access in prose of the SKILL.mdskills/accessibility/SKILL.md:461Low confidence
- Network access in code of documentationaccessibility/references/WCAG.md:109Low confidence
- Network access in code of documentationaccessibility/references/WCAG.md:110Low confidence
- Network access in code of documentationaccessibility/references/WCAG.md:111Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:178Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:179Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:180Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:181Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:182Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:183Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:185Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:189Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:190Low confidence
- Network access in prose of documentationaccessibility/references/WCAG.md:191Low confidence
- Network access in prose of the SKILL.mdbest-practices/SKILL.md:131Low confidence
- Network access in prose of the SKILL.mdskills/best-practices/SKILL.md:131Low confidence
- Network access in code of the SKILL.mdbest-practices/SKILL.md:152High confidence
- Network access in code of the SKILL.mdskills/best-practices/SKILL.md:152High confidence
- Network access in code of the SKILL.mdbest-practices/SKILL.md:153High confidence
- Network access in code of the SKILL.mdskills/best-practices/SKILL.md:153High confidence
- Network access in code of the SKILL.mdbest-practices/SKILL.md:427High confidence
- Network access in code of the SKILL.mdskills/best-practices/SKILL.md:427High confidence
- Network access in code of the SKILL.mdbest-practices/SKILL.md:429High confidence
- Network access in code of the SKILL.mdskills/best-practices/SKILL.md:429High confidence
- Network access in prose of the SKILL.mdbest-practices/SKILL.md:468Low confidence
- Network access in prose of the SKILL.mdskills/best-practices/SKILL.md:468Low confidence
- Network access in prose of the SKILL.mdbest-practices/SKILL.md:469Low confidence
- Network access in prose of the SKILL.mdskills/best-practices/SKILL.md:469Low confidence
- Network access in prose of the SKILL.mdbest-practices/SKILL.md:470Low confidence
- Network access in prose of the SKILL.mdskills/best-practices/SKILL.md:470Low confidence
- Network access in prose of the SKILL.mdbest-practices/SKILL.md:471Low confidence
- Network access in prose of the SKILL.mdskills/best-practices/SKILL.md:471Low confidence
- Network access in prose of the SKILL.mdbest-practices/SKILL.md:472Low confidence
- Network access in prose of the SKILL.mdskills/best-practices/SKILL.md:472Low confidence
- Network access in prose of the SKILL.mdbest-practices/SKILL.md:474Low confidence
- Network access in prose of the SKILL.mdskills/best-practices/SKILL.md:474Low confidence
- Network access in prose of the SKILL.mdbest-practices/SKILL.md:478Low confidence
and 278 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md skills/accessibility/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Native | Manifest gemini-extension.json | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md skills/accessibility/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md skills/accessibility/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/addyosmani-web-quality-skills/)