Performance optimizer
49 production-grade AI agent skills (SKILL.md) for Claude Code, Codex & Antigravity — system design, DevOps, security, QA, and more. MIT licensed, open source.
npx -y skills add CODE-SAURABH/OpenSkills --skill performance-optimizerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 14 days oldThe repository was created 14 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Expert performance analysis and optimization guidance. Use when the user asks about frontend optimization, API latency, database optimization, memory leaks, CPU bottlenecks, or profiling.
SKILL.md
10.4 KB, ~2.3k tokens by cl100k_base, as published. Nobody here has run it
Performance Optimization
Approach every performance task as an engineer who measures before cutting. Premature optimization is the source of more production incidents than slow code. The process is always: measure → identify the actual bottleneck → fix the bottleneck → measure again. Intuition about where the slowness is has a poor track record. Data does not.
Step 0: Measure First, Optimize Second
Before touching any code:
- Reproduce the problem with numbers — "it feels slow" is not a problem statement; "p99 latency is 4.2s under 100 concurrent users" is
- Identify the bottleneck — use profiling tools to find where time is actually spent; it is almost never where you expect
- Establish a baseline — measure before making any change; you cannot prove improvement without a before number
- Change one thing at a time — multiple simultaneous optimizations make it impossible to know what helped
- Measure the result — verify the optimization worked and did not regress something else
Optimization priority order:
- Algorithmic complexity — O(n²) becoming O(n log n) beats any micro-optimization
- I/O reduction — fewer DB queries, fewer HTTP calls, smaller payloads
- Caching — avoid recomputing or re-fetching what has not changed
- Parallelism — do independent work concurrently instead of sequentially
- Micro-optimization — only after the above have been exhausted
Frontend Performance
Measure with real tools:
- Lighthouse CI in the CI pipeline — fail builds that regress Core Web Vitals
- Chrome DevTools Performance panel — flame charts for CPU, network waterfall for load
- WebPageTest — real device testing, multiple geographic locations
web-vitalslibrary — measure LCP, FID/INP, CLS in production with real user data
Core Web Vitals targets:
- LCP (Largest Contentful Paint) < 2.5s
- INP (Interaction to Next Paint) < 200ms
- CLS (Cumulative Layout Shift) < 0.1
Bundle size:
- Analyze with
webpack-bundle-analyzerorvite-bundle-visualizer— know what is in the bundle - Code split at route boundaries — never ship one monolithic bundle
- Tree-shake unused exports — ensure bundler tree-shaking is working
- Lazy-load heavy components and libraries: charting, rich text editors, PDF renderers
- Audit and remove unused dependencies — they ship to the client even if unused
- Target: initial JS bundle < 200KB gzipped for most applications
Images:
- Use
next/imageor equivalent — automatic WebP, lazy loading, correct sizing - Specify
widthandheighton every image — prevents layout shift - Use CSS sprites or SVG for icons — not dozens of small PNG requests
- Compress images before serving — never serve raw camera images
JavaScript execution:
- Avoid long tasks on the main thread (> 50ms) — they block user interaction
- Move heavy computation to Web Workers
- Debounce / throttle scroll, resize, and input event handlers
- Avoid layout thrashing — batch DOM reads and writes; do not interleave them
React.memo,useMemo,useCallbackonly when profiling shows a measurable benefit — they add complexity and are commonly overused
Network:
- HTTP/2 or HTTP/3 — multiplexing eliminates per-request connection overhead
- Preconnect to critical third-party origins:
<link rel="preconnect"> - Preload critical assets: fonts, hero images, above-the-fold CSS
- Use a CDN for static assets — serve from the edge, not the origin
- Cache static assets aggressively with content-hashed filenames —
main.abc123.jscan be cached forever
API Latency
Find the bottleneck — use distributed tracing:
- OpenTelemetry spans on every significant operation — DB query, external HTTP call, cache lookup, business logic
- Look for: sequential calls that could be parallel, N+1 patterns, slow DB queries, unnecessary external calls
Common API latency culprits and fixes:
| Problem | Diagnosis | Fix |
|---|---|---|
| N+1 queries | ORM generates one query per item in a list | Eager load with joins or IN query |
| Missing index | EXPLAIN ANALYZE shows seq scan | Add targeted index |
| Synchronous external calls | Trace shows sequential HTTP calls | Fan out with Promise.all / asyncio.gather |
| Oversized response | Response payload is large | Paginate; return only requested fields |
| No caching | Same data fetched on every request | Cache at service or HTTP layer |
| Connection overhead | New DB connection per request | Connection pooling |
| Serialization overhead | Large object serialized repeatedly | Cache serialized form |
Response size matters:
- Return only the fields the client needs — avoid
SELECT *and avoid serializing entire domain objects to API responses - Compress responses with gzip or brotli — most frameworks enable this with one config line
- Paginate — a response with 10,000 items is slow to serialize, transmit, and parse
Caching strategy:
- Cache at the layer closest to the consumer
- HTTP cache headers for public, stable content —
Cache-Control: public, max-age=3600 - Application cache (Redis) for: computed results, external API responses, expensive DB queries
- Define invalidation before caching — stale data is a correctness bug, not just a performance issue
- Cache hit rate is a metric — monitor it; a low hit rate means the cache is not helping
Database Performance
Slow query workflow:
- Enable slow query log — capture all queries above a threshold (e.g., > 100ms)
EXPLAIN ANALYZEon the slow query — read the actual plan, not the estimated one- Look for: seq scans on large tables, nested loops on large sets, high row estimates vs. actuals
- Add the appropriate index — verify with
EXPLAIN ANALYZEthat it is used - Run
ANALYZEif estimates are far off — statistics may be stale
N+1 query pattern:
# ❌ N+1 — one query for the list, one per item
orders = db.query("SELECT * FROM orders WHERE user_id = ?", user_id)
for order in orders:
items = db.query("SELECT * FROM order_items WHERE order_id = ?", order.id)
# ✅ Single query with join or IN clause
orders = db.query("""
SELECT o.*, oi.*
FROM orders o
JOIN order_items oi ON oi.order_id = o.id
WHERE o.user_id = ?
""", user_id)
Index effectiveness:
- Use covering indexes for hot read paths — include all columns the query needs to avoid heap fetches
- Use partial indexes for sparse conditions — index only the subset of rows the query filters on
- Monitor index usage — drop indexes that are never used; they slow every write
- Index bloat accumulates over time —
REINDEX CONCURRENTLYperiodically on heavily updated tables
Connection pooling:
- Never open a new DB connection per request — pool connections at the application layer (PgBouncer, SQLAlchemy pool, HikariCP)
- Monitor connection pool utilisation — exhausted pools queue requests and spike latency
- Set pool size based on DB server capacity, not application concurrency
Query patterns:
- Avoid
SELECT *— fetch only needed columns; reduces data transfer and enables covering indexes - Avoid
OFFSETpagination at scale — use cursor-based pagination - Avoid
LIKE '%term%'on large tables — use full-text search indexes - Use
EXISTSinstead ofCOUNTwhen checking existence — stops scanning after the first match
Memory Leak Detection
Node.js:
- Heap snapshots in Chrome DevTools — take two snapshots separated by a period of activity; compare retained objects
--inspectflag to attach Chrome DevTools to a Node process- Common sources: event listeners not removed, global state that accumulates, closures holding large objects, unbounded caches
Python:
tracemalloc— trace memory allocations to their sourcememory_profiler— line-by-line memory usage- Common sources: growing lists/dicts never cleared, circular references (though Python GC handles most), large objects cached without eviction
General signals:
- Steady memory growth that does not plateau — the hallmark of a leak
- Memory growth correlated with request count — something is accumulating per request
- Out-of-memory crashes on long-running processes
Prevention:
- Bounded caches — LRU cache with a max size; unbounded caches are memory leaks
- Remove event listeners on cleanup — every
addEventListenerneeds a correspondingremoveEventListeneron teardown - Weak references for caches where eviction on GC is acceptable
CPU Bottlenecks
Profiling tools:
- Node.js:
--profflag +node --prof-process; Chrome DevTools flame chart - Python:
cProfile+snakevizfor visualisation;py-spyfor sampling a live process without restart - Go:
pprof
Common CPU bottlenecks:
- Synchronous JSON serialization of large objects — consider streaming serialization or pre-serialization
- Regular expression on large inputs — catastrophic backtracking on poorly written regex; test with ReDoS tools
- Cryptographic operations on the request path — move to background workers if not latency-critical
- Sorting large collections — O(n log n) on every request; cache sorted results
- Unnecessary re-renders in React — profile with the React DevTools Profiler
Parallelism:
- CPU-bound work in Node.js blocks the event loop — offload to worker threads or a separate process
- Python GIL limits CPU parallelism in threads — use
multiprocessingfor CPU-bound work; async/threads for I/O-bound work - Horizontal scaling is not a substitute for fixing an O(n²) algorithm — fix the algorithm first
Bundled Reference
Read measurement-plan.md before collecting a baseline or interpreting a before/after performance result.
Definition of Done — Performance Work
- Baseline measured before optimization with specific numbers
- Bottleneck identified with profiling tools — not intuition
- One change made at a time
- Improvement verified against baseline with the same measurement method
- No regressions in correctness, memory usage, or latency on other paths
- Performance budget or SLO defined and monitored going forward
- CI check added to prevent regression (Lighthouse CI, latency threshold test, or equivalent)
What ships with it: 1 file
678 B alongside SKILL.md
references/
- measurement-plan.md678 B
Gives 0 of the 12 instructions most performance cost skills give in ~2.3k tokens
Counted across 803 of the 1,058 authors here whose files we hold, read 2026-08-07
- Keep skill files under 500 lines or tokensin 82 of 803, across 16 files
- Use imperative form in instructionsin 80 of 803, across 9 files
- Draft assertions while test runs are in progressin 75 of 803, across 9 files
- Create two to three realistic test promptsin 74 of 803, across 9 files
- Write skill descriptions to be pushyin 72 of 803, across 7 files
- Save test cases to evals JSONin 72 of 803, across 6 files
- Ask questions about edge cases and input formatsin 72 of 803, across 7 files
- Save timing data immediately when runs completein 70 of 803, across 5 files
- Include all trigger conditions in the skill descriptionin 69 of 803, across 3 files
- Launch all test runs in a single turn or simultaneouslyin 69 of 803, across 3 files
- Capture intent before writing a skillin 67 of 803, across 1 file
- Import directly instead of barrel filesin 52 of 803, across 15 files
Said here and by no other author read
- verify improvement against baseline
- add CI checks to prevent regression
- compress images before serving
- cache static assets aggressively
- pool database connections
- avoid select star in queries
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.