Make a studio's game run faster with a measured loop, and keep only what really helped.

Apache-2.0Auto-check passed

Install Perf

skills CLI
$ npx skills add hashgraph-online/awesome-codex-plugins --skill perf -a claude-code

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

GitHub CLI
$ gh skill install hashgraph-online/awesome-codex-plugins perf --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/hashgraph-online/awesome-codex-plugins.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/homie-rocks/homie/skills/perf .claude/skills/perf && 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
perf
GitHub stars
1.3k
Token cost
~3.2k tokens
SKILL.md length
1,843 words
Files
5 (incl. scripts, references)
Skills in repo
714
Repo updated
First seen
Licence
Apache-2.0

At a glance

Make a studio's game run faster with a measured loop, and keep only what really helped.

  • Works in 4 steps: Before anything → The baseline → One change at a time → …
  • Someone asks to make a game faster
  • SKILL.md covers 0. Before anything, 1. The baseline, 2. One change at a time and 3. The report, plus 2 more sections
  • Runs JavaScript scripts from its folder; calls node, npm and npx

What it does

Perf is an agent skill from hashgraph-online/awesome-codex-plugins. Make a studio's game run faster with a measured loop, and keep only what really helped. Measure a baseline on a computer and an emulated phone in real Chrome on the GPU (frame times p50/p95/long frames, the game's JavaScript and the main thread per frame, time to the first meaningful frame, to the game's first frame and to playable, what it downloads, the heap, netplay messages a second, the host against a replica), profile it to name the hot functions and the biggest files, then try one small change at a time…

Its SKILL.md is about 3.2k 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 `references/METHOD.md`).

It works with JavaScript. The repository describes itself as: A curated list of awesome OpenAI Codex / ChatGPT plugins, skills, and resources. The 1 Codex Marketplace. See live plugins at: https://hol.org/plugins/best-codex-plugins. The licence is Apache-2.0.

When your agent uses it

  • Someone asks to make a game faster
  • Find out why it stutters
  • Bots for frame rate
  • Run a performance

Example prompts

  • “/perf”

Requirements

  • Node.js

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Before anything
  2. The baseline
  3. One change at a time
  4. The report

What it can do on your machine

Read from SKILL.md and the folder at commit 9e7b281. 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 3 files in scripts/ (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • node
    • 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

Perf loads about 3.2k tokens when it runs, and up to ~5.4k if it reads all its reference files. Until then it costs about 256 tokens; SKILL.md has 1,843 words of instructions outside code blocks.

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

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 hashgraph-online/awesome-codex-plugins at commit 9e7b281, republished under its Apache-2.0 licence (© hashgraph-online). 1,843 words, ~3,190 tokens.

Download SKILL.mdSave it as .claude/skills/perf/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
perf
description
Make a studio's game run faster with a measured loop, and keep only what really helped. Measure a baseline on a computer and an emulated phone in real Chrome on the GPU (frame times p50/p95/long frames, the game's JavaScript and the main thread per frame, time to the first meaningful frame, to the game's first frame and to playable, what it downloads, the heap, netplay messages a second, the host against a replica), profile it to name the hot functions and the biggest files, then try one small change at a time, each measured against the build to beat in alternating runs and kept only when it is better beyond the noise, nothing guarded got worse and the two-browser check still passes; anything else is reverted. Ends with a report in the studio's perf/ folder. Use when someone asks to make a game faster, smoother or lighter, to find out why it stutters, lags, loads slowly or drains a phone, to tune particles, shadows, lighting or bots for frame rate, or to run a performance or optimisation pass overnight.

Make a game faster, honestly

The question is never "does it feel faster". It is: is this build measurably better than the one before it, beyond the noise, without looking or playing any differently, and does it still work? Every number here comes from a real Chrome on this computer's GPU, two browsers in a room (the host runs the rules and the bots, the replica draws from snapshots), playing the same seeded presses every run.

One script: scripts/perf.mjs in this skill's folder (Claude Code: node "${CLAUDE_PLUGIN_ROOT}/skills/perf/scripts/perf.mjs" <command>), run from inside the studio. It drives the studio's own @homie-rocks/studio (0.19.0 or later: homie-studio perf, perf compare, check, build --maps; 0.19.1 also reads whether each big script is minified), opens at most two browsers at a time, all muted, and writes everything it measures under .perf/<game>/ (git-ignored). It prints paths and a few numbers, never the data: read the files it names.

0. Before anything

  • df -h .: keep 10 GB free (it keeps every build it measures). The computer may be shared: every run records the load, waits for a calm minute, and a run that started busy is taken again and left out. Never start other heavy work (a render, a build of something else, more browsers) while a loop runs.
  • Start the site as a background task that outlives the command (Claude Code: the Bash tool's run_in_background): npm run dev (another port: npx --no-install homie-studio dev --port <n>). Never npm run build by hand while a loop runs: the script builds and swaps builds itself and checks the site serves exactly the build it means to measure (every file by SHA-256, and the game page as built). Scripts the site's Worker adds to the game page are the site's, not the build's: HOMIE_NET, and any a studio's own Worker injects (a small shim) are set aside, listed in BASELINE.md, and must stay the same through the loop. Don't change the Worker in the middle of a loop; start a new one.
  • Commit or stash what the person is working on first: try only ever touches games/<game>/, and a revert puts that folder back to the kept build.

1. The baseline

sh
node <perf.mjs> baseline <game> --url http://127.0.0.1:8787 [--goal phone.host.frame.p95] [--runs 6] [--seconds 15]

It builds the game keeping its source map (never shipped), runs the two-browser check (it must pass: a game that does not work is not made faster), measures --runs runs per device, profiles one run per device, and writes BASELINE.md in the loop's folder: every number with its run-to-run spread, the load during each run, the hottest functions (read through the source map: draw (src/main.ts:620), not Xe), what a player downloads, and what to try first, each hint naming the number it read. Ten to fifteen minutes; poll its output, never end your turn while it runs.

The goal is one metric, lower is better (perf.mjs goals lists them):

the person saidgoal
"it stutters on my phone", "make it smoother"phone.host.frame.p95 (and frame.over50: hitches)
"it runs fine but my phone gets hot", frames already at 16.7 msphone.host.busy (main thread per frame)
"it takes ages to load"phone.host.load.playable (4G, slow CPU), phone.host.load.prePlayKb (what was really fetched before play) or bytes.jsGzip
"is the scene too heavy for a phone"phone.host.render.calls / render.triangles (the renderer's own counters while playing, when the game exposes them)
"I can move before my character has loaded", "it shows too early"phone.host.load.ready (the game's own net.playable()) against load.playable (control-ready); the headline says the arrival mode, and "ready … after the cover had lifted" means the game should declare arrival: 'game'
"it opens on a blank screen"phone.host.load.look (the first meaningful frame: the play page's arrival card, 0.26.0)
"it lags when lots of people play"phone.host.busy (the host runs the rules) or phone.host.net.kbOut (its upload)

Read BASELINE.md before choosing. If frames already keep pace with the display (p95 about 16.7 ms), a faster frame cannot show on this profile: aim at busy (CPU per frame is battery and headroom on a slower phone), or measure a slower phone with --cpu 6 or 8. A goal can be changed per change with try --goal (a change aimed at load time is judged on load time); everything else stays guarded.

2. One change at a time

Pick the change from the profile and the hints, smallest first. Make one change in games/<game>/, then:

sh
node <perf.mjs> try <game> --name "<the one change, in a line>" --looks same --plays same

It builds, runs the two-browser check (two fresh browsers must finish a round together), then measures the kept build and the changed one in turns (before, after, after, before, …), --runs each per device. Each before-run and the after-run beside it are a pair, so a computer that got busier halfway hits both sides of every pair and cancels. Then homie-studio perf compare:

  • KEEP only when the goal is better beyond the noise: a one-sided signed-rank test on the pairs (Wilcoxon, exact) p < 0.05 (with 6 pairs: the change wins at least 5 and loses only the closest), the 95% bootstrap interval of the change below zero, and at least 3% better (--min at baseline). And no guard got worse (frame time, main thread per frame, time to playable, heap, the host's upload: worse in every pair, or p < 0.01, and at least 5%).
  • REVERT otherwise: games/<game>/ goes back to the kept source (that folder only; files the change added are removed) and the kept build is served again. A change that measures the same is reverted: it costs reading, not frames. Never re-run a REVERT hoping for a luckier draw; change something else.
  • BLOCKED: too many runs started on a busy computer. Nothing is decided and the change stays in place: run the same try again later, or revert.

--looks and --plays are required, every time. same is a promise the screenshots are checked against (brightness, contrast, detail, colour of each run's host screen, against their own run-to-run spread); anything else is said in words (--looks "shadows are softer at the edge") and goes into the report. A change made for how a move feels (the lab skill: a hit-stop, sparks, a squash) is measured here when it costs frames: its --looks and --plays name it. Never trade how the game looks or plays for frames without the person agreeing first; then say it. Fewer bots, a lower resolution, fewer particles, shorter view distance and fewer physics steps are all trades, not optimisations.

--measure (a change kept for another reason: how a move feels, from the lab skill): the same build, check, paired runs and comparison, reported as MEASURED with the verdict and every number, and nothing is reverted: the change stays in games/<game>/ and is served, and the build to beat stays what it was. Say what it costs in those numbers.

Each try takes ten to twenty minutes. Its folder (experiments/<n>-<name>/) has RESULT.md, change.patch, the runs and compare.json. status <game> lists the loop so far; revert <game> drops a change you made but never measured.

What usually helps, roughly in order (references/METHOD.md has the detail and the traps):

  1. Work you do every frame that you could do once: gradients, paths, strings, new arrays and objects, measureText, querying the DOM, reading location or localStorage.
  2. Work per thing that can be work per group: one path for many shapes, instancing in three.js, fewer state changes (composite modes, materials), fewer draw calls.
  3. Garbage: a high gcPct or hitches every few seconds mean allocation in the loop.
  4. Downloads: nothing that is never imported, big things after the first frame, and a minified copy (the same library version) of a script BASELINE.md says is not minified. That is read from the code (whitespace, comments, names), never from how well it gzips: minified JavaScript gzips about as well as source text, and a bundle with three.js in it carries the shaders as GLSL source in strings, which no minifier touches. Minifying it again gains nothing.
  5. Netplay: snapshots that send what did not change; the host's upload grows with every seat (net.kbOut).
Show full SKILL.md (528 more words)Show less

3. The report

sh
node <perf.mjs> report <game>

It writes perf/<game>/ in the studio, to commit with the kept changes:

  • README.md: the goal, the result (first build against the kept one, with the change, the interval and p for the goal and every guard), every change tried and why it was kept or reverted, what changed in how it looks or plays, where the time went, what a player downloads, and how it was measured;
  • numbers.json: the same numbers;
  • before-after/: the host's screen before and after per device, and each kept change as a patch.

With more than one change kept, it measures the first build against the kept one again (in turns) so the result is the whole effect, not a sum of steps. Then tell the person the result in one or two sentences, numbers first, and say plainly when nothing was kept: "nothing I tried was faster beyond the noise" is a result.

Never

  • Never say a change made it faster from the code, one run, a profile, or a number inside the noise. Only try's KEEP says that, and the report's interval says how much.
  • Never keep a change the two-browser check failed on, or one that changes how the game looks or plays without saying so (and without the person's yes).
  • Never judge frames on a software renderer (SwiftShader: a Linux VM, a cloud session): those runs are BLOCKED. The phone here is an emulation (a slower CPU and 4G on this computer's GPU): it ranks changes; before promising a real phone's frame rate, try one (or the iOS Simulator).
  • Never run more browsers beside a loop, and never trust numbers taken while the computer was busy: rerun them.
  • Never leave a room open on a live site: measure against npm run dev; each run opens a fresh room of its own.

Measured, not estimated

Two numbers here are easy to confuse with ones that come from the game's files, and they are not the same thing:

  • First-play traffic (load.prePlayKb, and "Fetched before playable" in the reports): every request the browser made up to the moment the game was playable, on the wire, one run on one device. The shipped payload (bytes.*, perf sizes, the asset check's download figure) totals the built folder, which also holds files the game never asks for and music it streams later. A run that never became playable has no pre-play number at all.
  • Runtime scene cost (render.calls, render.triangles): the renderer's counters while the game is played, read from the port probe when the game exposes them: exposePort(net, { extra: { drawCalls: () => renderer.info.render.calls, triangles: () => renderer.info.render.triangles } }). They include procedural geometry, repeated characters, effects and shadow passes, which an inventory estimate from the asset manifest does not. A game that exposes neither has no such metric: "not measured", never zero.

An address this computer's Node.js cannot look up (a browser on the same computer may still open it) stops the loop as BLOCKED, "network preflight failed, before any page or game was opened": measure against the local site instead. It is never reported as the game or the site failing. check, perf, shoot, port check, the playtest and a deploy's read-back all say it in these words.

© hashgraph-online, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files (scripts, references) in plugins/homie-rocks/homie/skills/perf of hashgraph-online/awesome-codex-plugins.

  • SKILL.md
  • references/METHOD.md
  • scripts/lib/page.mjs
  • scripts/lib/sizes.mjs
  • scripts/perf.mjs

Open the folder on GitHubat commit 9e7b281

Compare with similar skills

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

Perf compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Perf this skillhashgraph-online/awesome-codex-plugins1.3k—~3.2kAutomated safety check: PassApache-2.0
Code Review ChecklistshareAI-lab/learn-claude-code78k5 repos~1.1kAutomated safety check: PassMIT
Tailwindcss Developmentanonaddy/anonaddy4.9k10 repos~865Automated safety check: PassMIT
Figma use_figma Plugin API Ruleswarpdotdev/warp65k4 repos~4.4kAutomated safety check: PassAGPL-3.0
GSAP Core Animationgreensock/gsap-skills16k4 repos~3.7kAutomated safety check: PassMIT
JavaScript Concept Fact Checkerleonardomso/33-js-concepts67k1 repos~5kAutomated safety check: PassMIT

Similar skills

  • Code Review Checklist

    shareAI-lab/learn-claude-code

    Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.

    78k GitHub starsUsed in 5 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Tailwindcss Development

    anonaddy/anonaddy

    Always invoke when the user's message includes 'tailwind' in any form.

    4.9k GitHub starsUsed in 10 repos~865 tokens
    Frontend & DesignAuto-check passed
  • Required groundwork before any use_figma call: the rules and reference files for running JavaScript in a Figma file through the Plugin API without common failures.

    65k GitHub starsUsed in 4 repos~4.4k tokens
    Frontend & DesignAuto-check passed
  • GSAP Core Animation

    greensock/gsap-skills

    Covers the GSAP core API for tweens, easing, staggers, defaults and matchMedia, and when to choose GSAP over CSS animations or other JavaScript animation libraries.

    16k GitHub starsUsed in 4 repos~3.7k tokens
    Frontend & DesignAuto-check passed
  • JavaScript Concept Fact Checker

    leonardomso/33-js-concepts

    Verifies the technical accuracy of JavaScript concept pages by checking code examples, MDN and ECMAScript claims and external links through a five-phase method.

    67k GitHub starsUsed in 1 repo~5k tokens
    Writing & ContentAuto-check passed
  • Scroll World Landing Page

    oso95/scroll-world

    Builds a scroll-driven landing page where a pre-rendered camera flies through connected AI-generated scenes, using Higgsfield for stills and video clips.

    9.8k GitHub starsUsed in 1 repo~12k tokens
    Frontend & DesignAuto-check: notes

More from hashgraph-online/awesome-codex-plugins

All 714 skills in this repo
  • Anime Reaction Gif

    hashgraph-online/awesome-codex-plugins

    Create original anime-style reaction stickers as looping GIFs and MP4 previews, using generated character pose sheets and timed key poses.

    1.3k GitHub stars~922 tokensUpdated today
    Auto-check passed
  • Calibredb

    hashgraph-online/awesome-codex-plugins

    Manage and query Calibre libraries with the calibredb CLI (local paths or Calibre Content server URLs).

    1.3k GitHub stars~1k tokensUpdated today
    Auto-check passed
  • Rust API Test Harness

    hashgraph-online/awesome-codex-plugins

    A skill your agent uses when adding, changing, testing, or debugging Rust HTTP APIs and services, especially when Codex needs black-box integration tests, random-port app startup, real database test…

    1.3k GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Art

    hashgraph-online/awesome-codex-plugins

    Make a studio's game look like something at build time — a cover from a real frame of the game (free), painted covers, backdrops, textures and character plates from image models through the…

    1.3k GitHub stars~2.4k tokensUpdated today
    Auto-check passed
  • Calle

    hashgraph-online/awesome-codex-plugins

    Use CALL-E from Codex through the calle CLI. An agent skill from hashgraph-online/awesome-codex-plugins.

    1.3k GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Game Balance Economy

    hashgraph-online/awesome-codex-plugins

    Balance game difficulty, resources, rewards, probability, progression, economies, and dominant strategies.

    1.3k GitHub stars~618 tokensUpdated today
    Auto-check passed

Works with

Questions about Perf

What does Perf do?

Make a studio's game run faster with a measured loop, and keep only what really helped. Perf is an agent skill from hashgraph-online/awesome-codex-plugins. Make a studio's game run faster with a measured loop, and keep only what really helped.

When should I use Perf?

Perf fits situations like: someone asks to make a game faster; find out why it stutters; bots for frame rate; run a performance.

How do I install Perf in Claude Code?

Run `npx skills add hashgraph-online/awesome-codex-plugins --skill perf -a claude-code`. Or copy the skill folder (plugins/homie-rocks/homie/skills/perf in hashgraph-online/awesome-codex-plugins) into .claude/skills/perf in your project. Claude Code loads it when a task matches its description.

How do I install Perf in Codex?

Run `npx skills add hashgraph-online/awesome-codex-plugins --skill perf -a codex`. Or copy the skill folder (plugins/homie-rocks/homie/skills/perf in hashgraph-online/awesome-codex-plugins) into .agents/skills/perf in your project. Codex loads it when a task matches its description.

Can I use Perf 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 hashgraph-online/awesome-codex-plugins --skill perf -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/perf, .gemini/skills/perf, .github/skills/perf and .opencode/skills/perf in your project.

What does Perf need to run?

Going by SKILL.md and its folder, Perf needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node, npm and npx). Our summary lists: Node.js.

Does Perf 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 Perf 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 Perf use?

Perf is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Perf use?

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

What are the alternatives to Perf?

Skills that share tags, products or a category with Perf: Code Review Checklist (shareAI-lab/learn-claude-code, 78k stars), Tailwindcss Development (anonaddy/anonaddy, 4.9k stars), Figma use_figma Plugin API Rules (warpdotdev/warp, 65k stars) and GSAP Core Animation (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 Perf?

hashgraph-online (a GitHub organization) maintains it in hashgraph-online/awesome-codex-plugins, which has 1,255 GitHub stars. The repository holds 714 skills in this directory. The repository was last updated on October 9, 2026.

Source: hashgraph-online/awesome-codex-plugins on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.