Agent skill

Performance

by ericrisco in ericrisco/rsc-harness

A skill your agent uses when a page or interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP, INP, CLS), a heavy JS bundle, wasted re-renders, an…

MITAuto-check passedFrontend & Design

Install Performance

skills CLI
$ npx skills add ericrisco/rsc-harness --skill performance -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ericrisco/rsc-harness performance --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/performance .claude/skills/performance && rm -rf skills-src

Use ~/.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/

Facts

Skill name
performance
GitHub stars
167
Token cost
~4k tokens
SKILL.md length
1,859 words
Files
5 (incl. scripts, references)
Skills in repo
227
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when a page or interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP, INP, CLS), a heavy JS bundle, wasted re-renders, an…

  • Works in 3 steps: Kill or replace the heavy dependency.… → Dynamic import() for non-critical UI.… → Fix tree-shaking — stop importing the…
  • Interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP
  • SKILL.md covers Decision table — symptom to…, Step 0 — measure first: field…, CWV "good" thresholds (field… and LCP — attribute to a subpart…, plus 6 more sections
  • Runs Shell scripts from its folder; calls npm and npx

What it does

Performance is an agent skill from ericrisco/rsc-harness. Use when a page or interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP, INP, CLS), a heavy JS bundle, wasted re-renders, an over-broad client boundary: profile, attribute the cost to one phase, fix it, re-measure. NOT surviving concurrent load (that is scaling), NOT the slow query (that is postgresdb).

Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/profiling-playbook.md`).

It sits in Frontend & Design, covering Web performance and Query optimization. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.

When your agent uses it

  • Interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP
  • A heavy JS bundle
  • Wasted re-renders
  • An over-broad client boundary: profile

Example prompts

  • “/performance”

Requirements

  • Node.js
  • A Bash shell

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Kill or replace the heavy dependency. The treemap usually shows one or two boxes dwarfing everything (a date library, an icon set, a…
  2. Dynamic import() for non-critical UI. Modals, editors, charts, anything below the fold or behind an interaction loads on demand instead of…
  3. Fix tree-shaking — stop importing the whole library for one function. import _ from "lodash" pulls the entire library; import the one…

What it can do on your machine

Read from SKILL.md and the folder at commit e3d5b33. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • npm
    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm 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.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Performance loads about 4k tokens when it runs, and up to ~5k if it reads all its reference files. Until then it costs about 93 tokens; SKILL.md has 1,859 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~93
When it runs · the whole SKILL.md, loaded when a task matches
~4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5k

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.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from ericrisco/rsc-harness at commit e3d5b33, republished under its MIT licence (© ericrisco). 1,859 words, ~4,016 tokens.

Download SKILL.mdSave it as .claude/skills/performance/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
performance
description
Use when a page or interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP, INP, CLS), a heavy JS bundle, wasted re-renders, an over-broad client boundary: profile, attribute the cost to one phase, fix it, re-measure. NOT surviving concurrent load (that is `scaling`), NOT the slow query (that is `postgresdb`).
tags
performance, core-web-vitals, lcp, inp, cls, bundle-size, profiling, react, web-vitals
recommends
scaling, postgresdb, redis, nextjs, react, observability, monitoring
origin
risco

Performance: make one thing fast

Performance makes a single request, page, or interaction faster for one user. Scaling makes many requests survive at the same time. Different problem, different toolbox — if the system is fine for you and only bends under concurrent load, that is ../scaling/SKILL.md, not this.

The whole job in one line: measure with a profiler → attribute the cost to one specific phase → apply the one fix that moves that phase → re-measure against a number. Repeat until you clear the threshold, then stop.

Prime directive: no fix without a profile first. A waterfall, a flame chart, a bundle treemap, or a field CWV number comes before you touch code. The fix you guess is almost never the fix the measurement points at, and a "fast" change that moves a phase nobody was waiting on is wasted work that you then have to maintain.

Cross-reference, don't duplicate: the last column of the table below names where each deep fix lives. The one case it has no row for — you decided what to cache to cut a phase and now need that cache race-free — is ../redis/SKILL.md.

Decision table — symptom to first move

SymptomMetric / phaseFirst probeFirst leverDeep fix lives in
Slow load, hero appears lateLCPLighthouse + DevTools traceattribute to a subpart, then fix that onethis skill / ../postgresdb/SKILL.md if TTFB
Janky scroll, laggy typing/clickINPDevTools Performance trace (long-task bars)break the >50 ms task, yieldthis skill
Layout jumps as it loadsCLSLighthouse layout-shift tracereserve space (dimensions / aspect-ratio)this skill
"First Load JS is huge"bundle bytes@next/bundle-analyzer / source-map-explorerkill/replace the heavy dep, then dynamic importthis skill
Component re-renders constantlyrender timeReact DevTools Profiler ("why did this render")fix the unstable ref / boundary../react/SKILL.md for the pattern
'use client' drags server work downFirst Load JSbundle analyzer server/client tracepush the boundary to a leaf../nextjs/SKILL.md
Slow only under concurrent loadthroughput, not latencyload test— not this skill —../scaling/SKILL.md
TTFB dominated by one queryserver timequery plan / EXPLAIN— not this skill —../postgresdb/SKILL.md

Step 0 — measure first: field vs lab

You have two kinds of measurement and they answer different questions. Use both, in this order.

  • Field data (CrUX, RUM via the web-vitals library) at the 75th percentile tells you what real users actually feel. A metric passes when ≥75% of page views hit "good". This is the only number that matters for "is it actually a problem".
  • Lab data (Lighthouse, the Chrome DevTools Performance trace) tells you why — it reproduces one load under controlled conditions so you can read the waterfall and flame chart.

Rule: never optimize a lab number that no real user ever hits, and never report the mean — report the 75th percentile. A lab Lighthouse run on a throttled cold cache can show an LCP your field p75 never sees; chasing it burns time on a phantom. Conversely a field INP failure with a clean lab run means you have not reproduced the slow interaction yet — go find it.

The output of Step 0 is one sentence naming the bottleneck: "LCP is 3.8 s and 2.1 s of it is resource load delay because the hero image is lazy-loaded." Do not proceed without that sentence. Tool runbooks (Lighthouse CI flags, reading a flame chart, the Profiler workflow, wiring web-vitals for RUM) live in references/profiling-playbook.md.

Measurement honesty: static source can identify a plausible bottleneck, never a measured LCP/INP/CLS, latency win or byte saving. If runtime/field data is unavailable, label the finding POTENTIAL, name the exact trace/benchmark needed, and make no numeric improvement claim. Do not turn code inspection into fictional telemetry.

Keep one experiment card per change:

text
metric + conditions | baseline distribution | one hypothesis/change | after distribution | keep/revert | next

Use the same device, data volume, cache state, build mode and sampling method before and after. Repeat enough runs to see ordinary variance; a one-off result inside that noise is neutral. Keep a change only when it moves the target beyond the noise without violating another budget. Revert a neutral or worse experiment with a targeted edit and preserve the card — failed attempts prevent the next person from paying for the same guess.

CWV "good" thresholds (field p75)

MetricGoodNeeds improvementPoor
LCP≤ 2.5 s2.5–4.0 s> 4.0 s
INP≤ 200 ms200–500 ms> 500 ms
CLS≤ 0.10.1–0.25> 0.25

INP replaced FID as a Core Web Vital in March 2024 and is still a CWV — it measures the full interaction-to-next-paint, so a fast event handler with a slow paint still fails. As of 2025, ~62% of mobile pages hit good LCP (up from 44% in 2022), and LCP remains the hardest CWV to pass and the most common overall bottleneck — so start there when the symptom is "slow load".

LCP — attribute to a subpart before fixing

LCP is not one thing. It decomposes into four sequential phases, and each phase has a different fix. Attribute first, then fix only the dominant phase.

SubpartWhat it isThe fix that moves it
TTFBserver + network to first byteserver work — punt to ../postgresdb/SKILL.md (slow query) or ../scaling/SKILL.md (under load); cache the response
Resource load delaygap between TTFB and the LCP resource starting to loaddiscoverability — <link rel="preload">, fetchpriority="high", never lazy-load the hero
Resource load durationtime to actually download the LCP resourcesmaller/next-gen image, CDN, right dimensions, priority on next/image
Element render delayresource downloaded but not yet paintedunblock the main thread / render-blocking CSS/JS, font readiness

A text-node LCP rendered in a system font has zero load delay and zero load duration — its budget is all TTFB and render delay, so don't go hunting for an image to preload.

The single most common LCP mistake is lazy-loading the largest element. Make it eager and high priority:

html
<!-- Bad: the hero is the LCP element and you just deferred it -->
<img src="/hero.webp" loading="lazy" alt="Product" />

<!-- Good: eager + high priority + reserved dimensions (also kills CLS) -->
<link rel="preload" as="image" href="/hero.webp" fetchpriority="high" />
<img src="/hero.webp" fetchpriority="high" width="1200" height="630" alt="Product" />
tsx
// Next.js: `priority` sets fetchpriority=high and disables lazy-loading for the LCP image
import Image from "next/image";
<Image src="/hero.webp" width={1200} height={630} priority alt="Product" />;

INP — kill the long task

INP is dominated by long tasks: any main-thread task over 50 ms blocks every interaction for its full duration. The fix is to break long work into chunks under 50 ms and yield to the main thread between them so a queued click or keypress can run.

ts
// Bad: one 400ms loop blocks every click/keypress while it runs
function processAll(items: Item[]) {
  for (const item of items) heavyWork(item); // one long task
}

// Good: chunk + yield. scheduler.yield() resumes at the FRONT of the queue,
// so your continuation isn't starved behind newly-queued work.
async function processAll(items: Item[]) {
  for (let i = 0; i < items.length; i++) {
    heavyWork(items[i]);
    if (i % 50 === 0 && "scheduler" in globalThis) {
      await (globalThis as any).scheduler.yield();
    }
  }
}

Other INP levers, in order of payoff:

  • Move third-party JS off the main thread (analytics, chat widgets, tag managers) — defer, load on interaction, or sandbox in a worker. Third-party scripts are the usual hidden long-task source.
  • Defer non-urgent handler work. Do the visible state update now; push the expensive recompute behind requestIdleCallback, a debounce, or startTransition.
  • Measure the actual interaction — the field INP failure names which interaction; reproduce it in a DevTools trace and read the long-task bar, don't guess.
Show full SKILL.md (776 more words)Show less

CLS — reserve the space

CLS comes from space that was not reserved before content arrived: images/video/ads/embeds without dimensions, content injected above existing content, and font swaps (FOUT). Fix by reserving the box up front.

html
<!-- Bad: no dimensions, image reflows everything below it on load -->
<img src="/card.webp" alt="" />

<!-- Good: explicit box, zero shift -->
<img src="/card.webp" width="400" height="300" alt="" />
css
/* Reserve space for ratio-based media and swap fonts without reflow */
.media { aspect-ratio: 16 / 9; }                 /* box exists before load */
@font-face { font-family: Inter; font-display: optional; size-adjust: 100%; }

Rules: give every image/embed explicit width/height or an aspect-ratio; render skeleton boxes the size of the real content; never insert banners/notices above content the user is already reading (push them below or overlay); use font-display: optional (or swap + size-adjust) so a font swap doesn't reflow text.

Bundle size — analyze before you cut

Never guess what's heavy. Generate a treemap, read it, then cut the biggest box.

bash
# Next.js: interactive treemap with server/client import tracing (Turbopack module graph)
ANALYZE=true npm run build      # with @next/bundle-analyzer wired in next.config

# Any webpack/Vite build: attribute bytes back to source via source maps
npx source-map-explorer 'dist/**/*.js'

Levers in order of payoff:

  1. Kill or replace the heavy dependency. The treemap usually shows one or two boxes dwarfing everything (a date library, an icon set, a charting lib). Replace with a lighter one or a few lines of your own.
  2. Dynamic import() for non-critical UI. Modals, editors, charts, anything below the fold or behind an interaction loads on demand instead of in First Load JS.
  3. Fix tree-shaking — stop importing the whole library for one function. import _ from "lodash" pulls the entire library; import the one function (or use the native equivalent).
tsx
// Bad: whole library in the initial bundle for one helper
import _ from "lodash";
const fn = _.debounce(save, 300);

// Good: named import (tree-shakeable) — or just write the 6-line debounce
import debounce from "lodash-es/debounce";
const fn = debounce(save, 300);
tsx
// Bad: heavy editor in First Load JS even though it's behind a button
import { RichEditor } from "@org/rich-editor";

// Good: split it out, load on demand
import dynamic from "next/dynamic";
const RichEditor = dynamic(() => import("@org/rich-editor"), { ssr: false });

Render cost — React 19, the compiler, and the boundary

React 19 with the React Compiler auto-memoizes, so blanket defensive useMemo/useCallback/memo is now an anti-pattern, not a best practice — it adds noise and the compiler already handles the common cases. Manual memo is the exception, and you justify it with a profile.

  • Profile with the React DevTools Profiler: record an interaction, find the component that re-rendered, read "why did this render" and its render time.
  • The 16 ms rule: one frame at 60 fps is ~16 ms. If a manual memo saves less than that, skip it — you can't see it and you're paying for the cache.
  • The compiler cannot fix a new object/array/function reference created in render and passed as a prop — that's a fresh identity every time. Hoist it or derive it stably; that's the real fix, not wrapping the consumer in memo.

RSC boundary discipline. React Server Components ship zero JS for non-interactive trees; teams report 50–70% First-Load-JS cuts from full RSC adoption. The 'use client' directive is a boundary: everything imported below it becomes client code. So push interactivity into the smallest leaf component and keep data fetching and layout on the server.

tsx
// Bad: 'use client' at the top of the route — the whole tree ships to the browser
"use client";
export default function ProductPage({ data }) {
  /* layout, data display, and one tiny button all client-side */
}

// Good: server component holds data/layout; only the interactive leaf is a client component
export default function ProductPage({ data }) {       // server: zero JS
  return (
    <article>
      <ProductDetails data={data} />                  {/* server */}
      <AddToCartButton id={data.id} />                {/* the only 'use client' file */}
    </article>
  );
}

Use streaming SSR with <Suspense> to flush the static shell immediately and stream slow subtrees in parallel — multiple independent boundaries stream concurrently, cutting time-to-first-paint when one section is data-bound. The canonical App-Router data and component patterns are ../nextjs/SKILL.md and ../react/SKILL.md; bring the perf loop here, take the idioms there.

Anti-patterns

Anti-patternWhy it's wrongDo instead
Optimizing on a hunch, no profileyou fix a phase nobody waits onmeasure → attribute → fix the dominant phase
Chasing a lab score no real user hitslab cold-cache LCP ≠ field p75optimize the field 75th-percentile number
Reporting the mean, not p75the average hides the tail users feelalways read/report the 75th percentile
Blanket useMemo/useCallback in React 19the compiler already memoizes; you add noisememo only what the Profiler proves >16 ms
Lazy-loading the LCP / hero imageyou defer the very element LCP measurespriority / fetchpriority=high, eager
import _ from "lodash" for one functionthe whole library lands in First Load JSnamed import or a few lines of your own
'use client' at the top of the treethe entire subtree ships to the browserpush the boundary to the interactive leaf
Images/embeds with no reserved spacecontent reflows on load → CLSexplicit width/height or aspect-ratio
Micro-optimizing a non-bottleneck phaseeffort moves a number off the critical pathfix only the phase the trace points at
"Done" without re-measuringthe fix may not have moved the metricre-measure against the threshold, then stop
Reporting source-only review as a measured winno trace/field/benchmark ran, so the number is inventedlabel POTENTIAL and name the measurement
Changing three levers in one experimentyou cannot attribute the result or reuse the learningone hypothesis/change per card, then re-measure
Keeping a neutral optimizationcomplexity rose but the target did not beat normal variancetargeted revert; retain the failed-experiment record

Stop rule

You are done when the field 75th percentile clears the "good" threshold (LCP ≤ 2.5 s, INP ≤ 200 ms, CLS ≤ 0.1) and your bundle is under its budget — re-measure to confirm, then stop. Going from "good" to "slightly better good" is gold-plating: it costs maintenance and moves a number no user notices. Commit the threshold as a budget so it can't silently regress (scripts/verify.sh lints that budget; see references/profiling-playbook.md for the field-RUM wiring that keeps the p75 honest in production).

© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files (scripts, references) in skills/performance of ericrisco/rsc-harness.

  • SKILL.md
  • evals/README.md
  • evals/cases.yaml
  • references/profiling-playbook.md
  • scripts/verify.sh

Open the folder on GitHubat commit e3d5b33

Compare with similar skills

Performance 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.

Performance compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Performance this skillericrisco/rsc-harness167—~4kAutomated safety check: PassMIT
Performance TuningNoobyGains/godmode107—~2.3kAutomated safety check: PassMIT
React Doctormakeplane/plane61k12 repos~657Automated safety check: PassAGPL-3.0
Fixing Motion Performanceibelick/ui-skills9.5k5 repos~1.4kAutomated safety check: PassMIT
GSAP Performance Tuninggreensock/gsap-skills16k4 repos~1kAutomated safety check: PassMIT
React Frontend Development Guidelinesdiet103/claude-code-infrastructure-showcase10k2 repos~2.9kAutomated safety check: PassMIT

Similar skills

  • Performance Tuning

    NoobyGains/godmode

    A skill your agent uses when performance is a concern - sluggish pages, slow queries, bloated bundles, high-latency APIs, or whenever someone says "optimize" or "make it faster"

    107 GitHub stars~2.3k tokensUpdated 7 mo ago
    DatabasesAuto-check passed
  • React Doctor

    makeplane/plane

    Scans React code for lint, accessibility, bundle size and architecture issues, reports a health score and checks that changes do not lower it.

    61k GitHub starsUsed in 12 repos~657 tokens
    Frontend & DesignAuto-check passed
  • Fixing Motion Performance

    ibelick/ui-skills

    Audits and fixes web animation performance: layout thrashing, work that belongs on the compositor, scroll-linked motion and costly blur effects.

    9.5k GitHub starsUsed in 5 repos~1.4k tokens
    Frontend & DesignAuto-check passed
  • GSAP Performance Tuning

    greensock/gsap-skills

    Guides the agent to keep GSAP animations smooth by animating transforms and opacity, batching DOM reads and writes, and avoiding layout-heavy properties.

    16k GitHub starsUsed in 4 repos~1k tokens
    Frontend & DesignAuto-check passed
  • React Frontend Development Guidelines

    diet103/claude-code-infrastructure-showcase

    Guidelines for React 18 and TypeScript apps covering Suspense data fetching, lazy loading, feature folders, MUI v7 styling, TanStack Router and performance.

    10k GitHub starsUsed in 2 repos~2.9k tokens
    Frontend & DesignAuto-check passed
  • Web Quality Audit

    addyosmani/web-quality-skills

    Run an evidence-led web quality audit covering performance, accessibility, SEO, best practices, and agentic browsing.

    2.9k GitHub stars~2.6k tokensUpdated 1 mo ago
    Frontend & DesignAuto-check passed

More from ericrisco/rsc-harness

All 227 skills in this repo
  • Ab Testing

    ericrisco/rsc-harness

    A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…

    167 GitHub stars~2.4k tokensUpdated today
    Auto-check passed
  • Accessibility

    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…

    167 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Ads

    ericrisco/rsc-harness

    A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…

    167 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Agent Eval

    ericrisco/rsc-harness

    A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…

    167 GitHub stars~3.2k tokensUpdated today
    Auto-check passed
  • AI Media

    ericrisco/rsc-harness

    A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…

    167 GitHub stars~3.3k tokensUpdated today
    Auto-check passed
  • Analytics

    ericrisco/rsc-harness

    A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.

    167 GitHub stars~2.8k tokensUpdated today
    Auto-check passed

Questions about Performance

What does Performance do?

A skill your agent uses when a page or interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP, INP, CLS), a heavy JS bundle, wasted re-renders, an…. Performance is an agent skill from ericrisco/rsc-harness. Use when a page or interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP, INP, CLS), a heavy JS bundle, wasted re-renders, an over-broad client boundary: profile, attribute the cost to one phase, fix it, re-measure.

When should I use Performance?

Performance fits situations like: interaction is slow for one user and the fix starts from a measurement — a failing Core Web Vital (LCP; A heavy JS bundle; wasted re-renders; an over-broad client boundary: profile.

How do I install Performance in Claude Code?

Run `npx skills add ericrisco/rsc-harness --skill performance -a claude-code`. Or copy the skill folder (skills/performance in ericrisco/rsc-harness) into .claude/skills/performance in your project. Claude Code loads it when a task matches its description.

How do I install Performance in Codex?

Run `npx skills add ericrisco/rsc-harness --skill performance -a codex`. Or copy the skill folder (skills/performance in ericrisco/rsc-harness) into .agents/skills/performance in your project. Codex loads it when a task matches its description.

Can I use Performance in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill performance -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/performance, .gemini/skills/performance, .github/skills/performance and .opencode/skills/performance in your project.

What does Performance need to run?

Going by SKILL.md and its folder, Performance needs a shell for the scripts in its folder and the command-line tools its instructions call (npm and npx). Our summary lists: Node.js; A Bash shell.

Does Performance access the network?

SKILL.md contains no URLs. Its commands use npm and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Performance safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Performance use?

Performance is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Performance use?

About 4k tokens (SKILL.md is roughly 16k 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 1k tokens, read only when the agent opens those files.

What are the alternatives to Performance?

Skills that share tags, products or a category with Performance: Performance Tuning (NoobyGains/godmode, 107 stars), React Doctor (makeplane/plane, 61k stars), Fixing Motion Performance (ibelick/ui-skills, 9.5k stars) and GSAP Performance Tuning (greensock/gsap-skills, 16k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Performance?

ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 167 GitHub stars. The repository holds 227 skills in this directory. The repository was last updated on October 7, 2026.

Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.