Web Quality Audit
addyosmani/web-quality-skills
Run an evidence-led web quality audit covering performance, accessibility, SEO, best practices, and agentic browsing.
Get a page into Lighthouse's green zone on desktop and mobile, for people AND for the robot form crawlers get — build it, audit all four categories (Performance, Accessibility, Best Practices, SEO)…
$ npx skills add textura-agency/next16-claude-starter --skill optimize-load -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install textura-agency/next16-claude-starter optimize-load --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/textura-agency/next16-claude-starter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/optimize-load .claude/skills/optimize-load && 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 "optimize-load" agent skill from https://github.com/textura-agency/next16-claude-starter/tree/main/.claude/skills/optimize-load into .claude/skills/optimize-load/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "optimize-load", 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/textura-agency/next16-claude-starter/tree/main/.claude/skills/optimize-loadType 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 textura-agency/next16-claude-starter --skill optimize-load -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install textura-agency/next16-claude-starter optimize-load --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/textura-agency/next16-claude-starter.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/optimize-load .agents/skills/optimize-load && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "optimize-load" agent skill from https://github.com/textura-agency/next16-claude-starter/tree/main/.claude/skills/optimize-load into .agents/skills/optimize-load/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "optimize-load", 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 textura-agency/next16-claude-starter --skill optimize-load -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install textura-agency/next16-claude-starter optimize-load --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/textura-agency/next16-claude-starter.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/optimize-load .cursor/skills/optimize-load && 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 "optimize-load" agent skill from https://github.com/textura-agency/next16-claude-starter/tree/main/.claude/skills/optimize-load into .cursor/skills/optimize-load/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "optimize-load", 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/textura-agency/next16-claude-starter.git --path .claude/skills/optimize-load--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 textura-agency/next16-claude-starter --skill optimize-load -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install textura-agency/next16-claude-starter optimize-load --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/textura-agency/next16-claude-starter.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/optimize-load .gemini/skills/optimize-load && 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 "optimize-load" agent skill from https://github.com/textura-agency/next16-claude-starter/tree/main/.claude/skills/optimize-load into .gemini/skills/optimize-load/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "optimize-load", 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 textura-agency/next16-claude-starter optimize-loadInstalls 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 textura-agency/next16-claude-starter --skill optimize-load -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/textura-agency/next16-claude-starter.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/optimize-load .github/skills/optimize-load && 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 "optimize-load" agent skill from https://github.com/textura-agency/next16-claude-starter/tree/main/.claude/skills/optimize-load into .github/skills/optimize-load/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "optimize-load", 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 textura-agency/next16-claude-starter --skill optimize-load -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install textura-agency/next16-claude-starter optimize-load --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/textura-agency/next16-claude-starter.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/optimize-load .opencode/skills/optimize-load && 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 "optimize-load" agent skill from https://github.com/textura-agency/next16-claude-starter/tree/main/.claude/skills/optimize-load into .opencode/skills/optimize-load/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "optimize-load", 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.
optimize-loadGet a page into Lighthouse's green zone on desktop and mobile, for people AND for the robot form crawlers get — build it, audit all four categories (Performance, Accessibility, Best Practices, SEO)…
Optimize Load is an agent skill from textura-agency/next16-claude-starter. Get a page into Lighthouse's green zone on desktop and mobile, for people AND for the robot form crawlers get — build it, audit all four categories (Performance, Accessibility, Best Practices, SEO), fix what the audit blames, re-measure to prove it. Covers LCP (loaders, curtains, the consent banner, fonts, media), CLS, TBT/hydration, bundle cost, contrast and mid-fade accessibility, 404s from linked-but-missing routes, metadata, the brand kit and crawlability. Use when the user says "check Lighthouse", "get it in…
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including reference files (for example `references/fixes.md`, `references/robot-path.md` and `references/runner.md`).
It sits in Frontend & Design, covering Web performance, Accessibility and Performance optimization. The repository describes itself as: AI-first Next.js 16 starter for animation-heavy sites, wired with an Obsidian vault & Claude Code hooks. The licence is Unlicense.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 6c6edf9. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadGrepGlobEditWriteFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
yarnnodegitnpxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use yarn, git and npx, which can reach the network depending on how they are called.
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.
Optimize Load loads about 4.6k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 200 tokens; SKILL.md has 2,525 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 noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Grep, Glob, Edit, WriteAutomated 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 textura-agency/next16-claude-starter at commit 6c6edf9, republished under its Unlicense licence (© textura-agency). 2,525 words, ~4,582 tokens.
.claude/skills/optimize-load/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.Lighthouse, two form factors (plus tablet when it matters), four categories,
two audiences (people and the robot form), then fix and prove it. Rewritten from
optimisation passes on ~50 production sites built from this starter; each lever
says whether it is a rule (held on ≥ 3 sites) or observed (1–2).
Before fixing, read obsidian/knowledge/fix-catalog.md and
obsidian/knowledge/pitfalls.md.
The bar (reached on every one of those sites): Performance ≥ 90 on mobile and desktop; Accessibility, Best Practices and SEO = 100 on both, for people and for the robot form. 100 on the last three is reachable without changing the design — the classic "axe caught a fade mid-way" flake is fixable (§3). Don't chase Performance from 96 to 100; do chase an A11y 96.
Scope. This skill owns the load: navigation to settled. Scroll jank after load is
optimize-performance— Lighthouse never scrolls. A WebGL scene: runoptimize-3d-scenefirst. Real-phone behaviour Lighthouse can't see (iOS toolbar, 120 Hz, menus):mobile-device-qa.
Build → audit (people + robot, mobile + desktop) → attribute → fix one thing → re-audit. Never report a score you did not re-measure.
Ignoring these produces confident wrong answers. Each one cost real time.
next dev. yarn build && yarn start. Kill the
old server by port first (next start runs as next-server), and start the
new one only if the build succeeded — a failed build serves the previous
.next, and the A/B compares the old build with itself.metrics → observedLargestContentfulPaint too.references/robot-path.md). A people run needs a plain Chrome UA. Audit
both; the robot form is what Google and PSI score.--url https://…).sysctl -n vm.loadavg. Build the
baseline from a git worktree of the base branch, never by copying .next/.yarn qa:setup # once — deps go to a cache outside the project
node tools/qa/lighthouse.mjs --url http://localhost:3000/ --runs 3 # people, mobile + desktop
node tools/qa/lighthouse.mjs --url http://localhost:3000/ --as-bot # the robot form (Google, PageSpeed)
node tools/qa/lighthouse.mjs --url <candidate> --ab <reference> # interleaved A/B on a busy machine
node tools/qa/axe-sweep.mjs --url http://localhost:3000/ # contrast/target-size through the whole entrance(tools/qa/README.md lists every flag — --devices, --runs, --as-bot,
--ab, --min-perf/--min-other gates.)
references/runner.md has the raw Lighthouse Node API recipe and the CLS
PerformanceObserver probe for digging; the tool is the record.
Report the grid — four categories × mobile/desktop × people/robot:
| mobile people | mobile robot | desktop people | desktop robot | |
|---|---|---|---|---|
| Performance | ||||
| Accessibility | ||||
| Best Practices | ||||
| SEO |
Performance weights: TBT 30, LCP 25, CLS 25, FCP 10, SI 10. The "Opportunities" list is weight 0.
Read the LCP phase breakdown — it names the fix:
| dominant phase | what it means |
|---|---|
| TTFB | server or hosting |
| Load Delay | the image is discovered late — preload it, or it is behind JS |
| Load Time | the file is too big, or competing for bandwidth |
| Render Delay | downloaded but not painted — the main thread is busy, or something covers it (a loader, a curtain, a hidden start state). Not a network problem. |
Which element is it, and when did it paint? Check the LCP element's timing, not just its identity — a blurred word mid-entrance can out-measure the whole resting headline (§4, blur halo).
CLS: Lighthouse does not tell you what moved. Use the PerformanceObserver
probe in references/runner.md. When the deployed CLS is higher than local,
re-run locally against the production build with a longer trace — a plain run
can end before a late shift (observed).
TBT — name the code before touching it: node tools/qa/profile.mjs --url …
profiles a cold load at 4× CPU with source maps and prints the busiest runs by
original file. Lighthouse's long-tasks times are simulated — a 711 ms
task "at 3.4 s" was ~180 ms of hydration at 0.5 s observed — so lining a task up
with the page's own timeline (a preloader finishing, a reveal) picks the wrong
suspect. Two fixes aimed by timing moved nothing or doubled TBT
(<Suspense> splits 393 → 834 ms) until the profile named react-spring set-up
in hydration.
A resource asked for by raw path bypasses next/image. If
network-requests shows .png/.jpg at /assets/… rather than
/_next/image?…, find who requested it — a preloader's new Image(), a CSS
url(), a <link rel=preload> — and warm the getImageProps candidate
instead (references/fixes.md). That one was the 31 s hosted LCP above.
axe samples once, and on an animated page it samples mid-animation. Text
caught at opacity: 0.4 reads as 1.1:1, so A11y flips 96 ↔ 100 run to run.
Darker text can't fix it. But it is fixable without changing the design
(rule, 4+ sites — one hero went from 96 in 5/8 runs → 100 in 8/8):
tools/qa/axe-sweep.mjs first: it samples every ~120 ms through the whole
entrance and names every element that ever fails, and when. It also finds
real at-rest failures Lighthouse never sees — text over a canvas (it can't
resolve a canvas background), an eyebrow at 4.42:1. Its last-sample failures
are real defects even when Lighthouse says 100.mask-image sweep while opacity stays 1 — it paints like a fade. Remove the
mask at rest. First screen only: below the fold Lighthouse never scrolls,
and masks over glass (backdrop-filter) repaint every frame (250–490 ms
frames, observed twice).visibility/inert) until
revealed, so axe doesn't read through a parent fade.The robot form at rest shows below-fold colours people do see after their reveals — when a robot audit finds contrast failures people-runs never reached, they are real. Fix the colours (§5).
Custom reveal clocks bypass the robot switch. A reveal driven by a
project's own rAF/timeline (not the engine) kept animating on the robot form;
production caught a CTA mid-fade (1.2:1) while localhost finished the fade
before the snapshot. Gate such clocks on useMotionOff() / useRobot().
A CLS of 0 can mean "the trace ended before the shift" — verify with the probe before believing a regression or a win.
Full code in references/fixes.md; the robot form in references/robot-path.md.
PerformanceObserver, or rAF → setTimeout — two
bare rAFs lost the race 1 run in 3), then play the same entrance with the same
config. Nothing visible changes; the LCP is at first paint. Rule (3+:
mobile 64 → 91, 52 → 73, 59 → 85). Then check:blur(20px) measured a
blurred word (62k px²) larger than the whole resting headline (50k px²), so
the LCP moved back to the entrance. Keep the start blur small enough
(≤ 14–16 px observed) or blur per line (observed, 2 sites).observedLargestContentfulPaint (2.85 s observed vs 9.3 s simulated —
Lantern replays the scene build at 4×). Shrinking bytes moved nothing; the
lever is when the heavy work runs.<html data-consent>; CSS hides the banner under that mark and on the robot
form). Keep it that way: a dynamic({ ssr: false }) banner paints after
hydration and Lantern bills it with every request that finished before it.
Rule (10+ sites: mobile 53 → 74 alone, 73 → 99, 87 → 92, 91 → 100). If a
design holds the banner behind an intro, server-rendering changes consent UX —
ask. The banner's privacy link must not import site.ts (it drags zod in —
below).priority on the hero image and nothing else. A raw <img> LCP gets
fetchpriority="high" and its siblings loading="lazy"..ttf/.otf → Latin
WOFF2 subsets (observed: 352 → 74 KB, mobile 83 → 89; WOFF2 alone moved
nothing — the subset did); instance away variable-font axes the design pins
(267 → 51 KB). A font CDN stylesheet (Fontshare, Google @import) is
render-blocking from another origin: self-host with next/font/local
(observed: FCP ~2 → 0.8 s). Prefer next/font/local over next/font/google
anyway — the latter makes every build depend on Google's network (a deploy
failed on it). Don't list a face as WOFF2 and WOFF.experimental.inlineCss: true in next.config.ts, and model / Draco /
scene-data fetches started at first paint, not as <head> preloads —
Lantern bills every download that finished before a late LCP to it. Rule
(3 sites: 87 → 90; LCP 3–5 → 2.5–3.0 s).<source media>, silent audio dropped (masters shipped
at 2892×2160, 21–25 Mbps). Below-fold <video> is preload="none" until its
section hydrates (observed: a run-to-run LCP flip 2.3 ↔ 3.4 s gone).RobotText lazy
(src/components/common/robot-text.tsx): plain text until within 1.5
viewports, then the engine. Never the first screen. Rule (mobile TBT
2,488 → 390 ms alone; 81 → 93, 88 → 98).HydrateNear, observed
68 → 83) or one per idle moment after load when blocks are heavy (rule:
79 → 86, 84 → 87; on approach janked one site's scroll with 75–100 ms
hydration frames). Only once each block is under the long-task limit —
splitting 275–395 ms blocks made TBT worse. Put deferred blocks in memoised
components, or a re-rendering parent replaces their server HTML with the empty
fallback (a FAQ and footer vanished once).(hover: hover) and (pointer: fine) after load, then swap in the real Hover
(robot-hover.tsx does the robot half). Rule (~60 springs: TBT ~570 →
~400 ms).import() from an effect after first
paint, not next/dynamic alone (observed: LCP 2.8 → 1.8 s). Heavy geometry in
a Worker; the whole scene in an OffscreenCanvas worker when set-up is one long
task — optimize-3d-scene §3, §15.zod out of the client. Client code imports brand constants from a plain
module, never site.ts → env.ts. Check:
grep -l ZodError .next/static/chunks/*.js must print nothing (observed:
72 → 78).prefetch={false} on links that never navigate in-app.skipAnimation (robot form, reduced motion) restart
in the same tick forever — the page hangs (PAGE_HUNG) or burns ~300 ms per
load. loop: motionOff ? false : … with useMotionOff() known on the first
render. tools/qa/check-motion.mjs --url … catches it.Reserve space for anything that grows — images, webfonts, counting numbers
(fixed width / tabular-nums). CLS sums distance, not frames: a stiffer spring
doesn't help. A preloader is the usual culprit: a bar growing by height →
scaleY() from its edge; a counter riding on bottom → fixed bottom +
translateY() (observed: CLS 0.489 → 0).
href must resolve. A cookie-banner
link to /privacy-policy that doesn't exist cost BP 3–4 points on six sites;
build the page, don't drop the link. Nav items for pages never built point to
# (or the section anchor), never a 404.object-cover on percentage-cropped images (BP "image aspect ratio").@newproject, generic icons, a 900×600 share card) shipped to most sites it
seeded. seo-audit §2 has the checklist; tools/qa/brand-kit.mjs renders the
favicon set and a 1200×630 share image from the running hero.siteConfig.url from
NEXT_PUBLIC_SITE_URL → the host's production domain → localhost, plus
origin-sync.ts after hydration. Fetch the deployed og:image and curl it:
a localhost or 404 image is a broken share preview.app/loading.tsx stays deleted. It wrapped the streamed page in
<div hidden> for non-JS readers — crawlers saw no <h1>. It is a crawler
fix, not a score lever: keep it deleted even when Lighthouse doesn't move.Arithmetic, not taste. On this starter's surfaces the floor for 4.5:1 is
black at 0.55 alpha on light surfaces and white at 0.46 on black — for
pure black; a softer ink raises it (#111 on white needs 0.6). Large text
(≥ 24 px, or 19 px bold) needs 3:1. Add a new Tier-1 alpha and repoint the
semantic token — don't raise the shared raw value (borders share it at 3:1).
Decorative text that must stay dim → CSS generated content (content:), not
text — but switch to it after the cover lifts, not at first render (doubled
hydration once). target-size: 24 px centres, measured on rendered boxes
(trimmed leading lies; a negative-margin pad doesn't pass); look for an
overflowing row first. Let a control's visible text name it rather than
replacing it with aria-label.
The full grid before and after, which cells meet the bar and which don't. Then:
yarn lint · npx tsc --noEmit -p . · yarn build · .claude/scripts/verify.sh
(zero FAILs) · qa-verify if any UI changed (a contrast fix changes the look) ·
mobile-device-qa if anything a phone shows changed. Then the vault: the grid in
obsidian/meta/changelog.md; an ADR for anything that sets a rule or accepts a
cost; a measured fix → obsidian/knowledge/fix-catalog.md; what misled you →
obsidian/knowledge/pitfalls.md.
[[optimize-load]] · [[optimize-performance]] · [[seo-aeo]] · [[ship]] · [[qa-verification]] · [[mobile-device-qa]] · [[testing-pipeline]]
© textura-agency, Unlicense. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files (references) in .claude/skills/optimize-load of textura-agency/next16-claude-starter.
Open the folder on GitHubat commit 6c6edf9
Optimize Load 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 |
|---|---|---|---|---|---|---|
| Optimize Load this skilltextura-agency/next16-claude-starter | 133 | — | ~4.6k | Automated safety check: Notes | Unlicense | |
| Web Quality Auditaddyosmani/web-quality-skills | 2.9k | — | ~2.6k | Automated safety check: Pass | MIT | |
| Web Quality Auditmidudev/100cosas.dev | 114 | 3 repos | ~1.7k | Automated safety check: Pass | MIT | |
| Building Tablesancoleman/ai-design-components | 526 | — | ~1.8k | Automated safety check: Pass | MIT | |
| React Native Best Practicescallstackincubator/agent-skills | 1.7k | 4 repos | ~3.1k | Automated safety check: Pass | MIT | |
| Accessibilityericrisco/rsc-harness | 174 | — | ~3.4k | Automated safety check: Pass | MIT |
addyosmani/web-quality-skills
Run an evidence-led web quality audit covering performance, accessibility, SEO, best practices, and agentic browsing.
midudev/100cosas.dev
Comprehensive web quality audit covering performance, accessibility, SEO, and best practices.
ancoleman/ai-design-components
Builds tables and data grids for displaying tabular information, from simple HTML tables to complex enterprise data grids.
callstackincubator/agent-skills
Provides React Native performance optimization guidelines for FPS, TTI, bundle size, memory leaks, re-renders, and animations.
ericrisco/rsc-harness
A skill your agent uses 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…
elithrar/dotfiles
Diagnose page-load and interaction performance using browser traces, network evidence, and source code.
textura-agency/next16-claude-starter
Make a site behave on real phones — the defects no Lighthouse run or headless scroll test sees, learned from site owners reviewing production sites on an iPhone.
textura-agency/next16-claude-starter
Make a page in this starter actually smooth — build it, scroll it in real Chrome on PC and on an emulated phone, fix what the measurement blames, re-measure to prove it.
textura-agency/next16-claude-starter
Make a Payload admin feel like part of the site and explain itself — the skin re-tinted from the site's own tokens (calm, light, no added motion), the site's wordmark and favicon, a dashboard…
textura-agency/next16-claude-starter
Put a Payload CMS admin on a site built from this starter — every visible string and content photo editable, derived from the site's own content objects with the code's copy as the fallback, a…
textura-agency/next16-claude-starter
Answer Engine Optimisation — make the site citable by ChatGPT, Claude, Perplexity, Gemini and AI Overviews.
textura-agency/next16-claude-starter
Turn a Figma frame or node into components in this starter — the MCP call order, recording node IDs so later passes can re-fetch, downloading and verifying assets, mapping design values onto the…
Categories
Get a page into Lighthouse's green zone on desktop and mobile, for people AND for the robot form crawlers get — build it, audit all four categories (Performance, Accessibility, Best Practices, SEO)…. Optimize Load is an agent skill from textura-agency/next16-claude-starter. Get a page into Lighthouse's green zone on desktop and mobile, for people AND for the robot form crawlers get — build it, audit all four categories (Performance, Accessibility, Best Practices, SEO), fix what the audit blames, re-measure to prove it.
Optimize Load fits situations like: the user says check Lighthouse; get it in the green; improve the score; core Web Vitals.
Run `npx skills add textura-agency/next16-claude-starter --skill optimize-load -a claude-code`. Or copy the skill folder (.claude/skills/optimize-load in textura-agency/next16-claude-starter) into .claude/skills/optimize-load in your project. Claude Code loads it when a task matches its description.
Run `npx skills add textura-agency/next16-claude-starter --skill optimize-load -a codex`. Or copy the skill folder (.claude/skills/optimize-load in textura-agency/next16-claude-starter) into .agents/skills/optimize-load 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 textura-agency/next16-claude-starter --skill optimize-load -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/optimize-load, .gemini/skills/optimize-load, .github/skills/optimize-load and .opencode/skills/optimize-load in your project.
Going by SKILL.md and its folder, Optimize Load needs the command-line tools its instructions call (yarn, node, git and npx). Its frontmatter pre-approves these tools: Bash, Read, Grep, Glob, Edit, Write.
SKILL.md contains no URLs. Its commands use git and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Optimize Load is published under the Unlicense licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k 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. Its references folder adds about 6.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Optimize Load: Web Quality Audit (addyosmani/web-quality-skills, 2.9k stars), Web Quality Audit (midudev/100cosas.dev, 114 stars), Building Tables (ancoleman/ai-design-components, 526 stars) and React Native Best Practices (callstackincubator/agent-skills, 1.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
textura-agency (a GitHub organization) maintains it in textura-agency/next16-claude-starter, which has 133 GitHub stars. The repository holds 16 skills in this directory. The repository was last updated on October 7, 2026.
Source: textura-agency/next16-claude-starter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.