Analyzing .NET Performance
dotnet/skills
Scans C# and .NET code for about 50 performance anti-patterns and reports prioritized findings with concrete fixes, at a scan depth you choose.
Scan SkiaSharp for managed-C performance opportunities AND fix them, proving each with a BenchmarkDotNet measurement plus a behaviour-parity test.
$ npx skills add mono/SkiaSharp --skill performance-fixer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mono/SkiaSharp performance-fixer --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/mono/SkiaSharp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/performance-fixer .claude/skills/performance-fixer && 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 "performance-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/performance-fixer into .claude/skills/performance-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-fixer", 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/mono/SkiaSharp/tree/main/.agents/skills/performance-fixerType 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 mono/SkiaSharp --skill performance-fixer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mono/SkiaSharp performance-fixer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mono/SkiaSharp.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/performance-fixer .agents/skills/performance-fixer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "performance-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/performance-fixer into .agents/skills/performance-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-fixer", 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 mono/SkiaSharp --skill performance-fixer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mono/SkiaSharp performance-fixer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mono/SkiaSharp.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/performance-fixer .cursor/skills/performance-fixer && 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 "performance-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/performance-fixer into .cursor/skills/performance-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-fixer", 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/mono/SkiaSharp.git --path .agents/skills/performance-fixer--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 mono/SkiaSharp --skill performance-fixer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mono/SkiaSharp performance-fixer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mono/SkiaSharp.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/performance-fixer .gemini/skills/performance-fixer && 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 "performance-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/performance-fixer into .gemini/skills/performance-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-fixer", 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 mono/SkiaSharp performance-fixerInstalls 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 mono/SkiaSharp --skill performance-fixer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mono/SkiaSharp.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/performance-fixer .github/skills/performance-fixer && 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 "performance-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/performance-fixer into .github/skills/performance-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-fixer", 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 mono/SkiaSharp --skill performance-fixer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install mono/SkiaSharp performance-fixer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mono/SkiaSharp.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/performance-fixer .opencode/skills/performance-fixer && 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 "performance-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/performance-fixer into .opencode/skills/performance-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-fixer", 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.
performance-fixerScan SkiaSharp for managed-C performance opportunities AND fix them, proving each with a BenchmarkDotNet measurement plus a behaviour-parity test.
Performance Fixer is an agent skill from mono/SkiaSharp. Scan SkiaSharp for managed-C performance opportunities AND fix them, proving each with a BenchmarkDotNet measurement plus a behaviour-parity test. Two modes: (1) SCAN — hunt the SkiaSharp perf signature (pure math round-tripping through native P/Invoke, an allocating parse/convert helper or missing Span overload, a hot getter redoing native lookups every call, per-element interop in a loop, avoidable marshalling/struct copies, or an unsized/ contended collection) and prove the win with a benchmark; (2) FIX —…
Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 17 other files, including reference files (for example `references/bcl-patterns/collections.md`, `references/bcl-patterns/interop-and-marshalling.md` and `references/bcl-patterns/memory-and-buffers.md`).
It sits in Development, covering Pull requests and Performance optimization. It works with C#. The repository describes itself as: SkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Google's Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile… The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a74f7f9. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
ghdotnetFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh, 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.
Performance Fixer loads about 4.1k tokens when it runs, and up to ~21k if it reads all its reference files. Until then it costs about 257 tokens; SKILL.md has 1,851 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 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); files beside SKILL.md are not scanned.
The full file from mono/SkiaSharp at commit a74f7f9, republished under its MIT licence (© mono). 1,851 words, ~4,143 tokens.
.claude/skills/performance-fixer/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.Proactively find and fix performance problems in SkiaSharp — a thin managed wrapper over native Skia, so its recurring, high-impact family is the managed layer's own overhead between the caller and Skia: a P/Invoke transition paid for math that is a few float ops, an allocation on a hot parse/convert path, a native lookup redone on every getter, per-element marshalling in a loop. This is not about making Skia's C++ rasterizer faster (that is upstream); it is about removing the tax the C# layer imposes. Every fix is measured (a benchmark) and behaviour-preserving (an equivalence test).
Scope: managed C# only — binding/** and source/**. Everything under externals/skia/**
(including our C shim) is upstream Skia: out of scope to edit or build, though you may read the
pinned source to verify an invariant. Every candidate must be provable and fixable from C#.
Read references/decision-framework.md (is it worth it? the
impact×complexity rubric + the two-proof gate) and references/measuring.md
(how to prove faster and identical) first — they are the model this skill runs on. Background on
the interop boundary is in documentation/dev/memory-management.md
and documentation/dev/architecture.md.
New vs Old shows a meaningful, repeatable speedup with no allocation
regression; an equivalence test proves the result is identical to the original/native path
(bit-exact for numeric ports) across normal and edge inputs. No speedup ⇒ nothing to fix. Any
behaviour change ⇒ reject — a faster answer that differs from Skia is a rendering regression.[Obsolete]-hide, or delete a test. If a correctness test goes red,
fix the change, not the test.*.generated.cs and externals/skia/** are
off-limits to edit/build. You may READ the pinned Skia C++ (fetch at the submodule's pinned
commit and cite it) to verify an algorithm or pointer-stability invariant.ReadOnlySpan<char> overloads.)RuntimeInformation-gated static readonly bool, as #4241 did). Never ship a
float port without it.noop.Utils.RentArray, RentHandlesArray, SKString) or the native oracle may already fit.Low complexity, high impact. Prefer them whenever you write or touch hot-path code.
Try* overload over the allocating one; add a ReadOnlySpan<char> overload where
only the string/T[] one exists (additive, ABI-safe).capacity, rent from Utils.RentArray/ArrayPool.stackalloc a small, bounded buffer instead of allocating (cap the size; never in a loop).SearchValues<T> for repeated set search, FrozenDictionary for
build-once maps.sealed internal types, [MethodImpl(AggressiveInlining)] on trivial wrappers,
in/ref readonly on large structs (internal / new overloads only), avoid LINQ/boxing in loops.High complexity — apply only on a proven hot path, behind a clean API, with the two proofs. Even when you recommend the simpler option, report the faster high-complexity one and its tradeoff.
Vector128/Vector256 (ARM64 NEON Vector256 was 5.7–6.5× slower in #4241).unsafe, raw pointers, MemoryMarshal.Cast/Unsafe.As reinterpretation.HandleDictionary locking discipline.Route here from signals.md. Start with the selected FOCUS row, open only
its linked reference, then use that file's full Where to look commands. Each reference also has
the slow→fast, watch-out, and real PR.
FOCUS | SkiaSharp area | Where to look | Reference |
|---|---|---|---|
| 0 | Geometry & math | Pure managed math on blittable value types in binding/SkiaSharp/, such as SKMatrix.cs, MathTypes.cs, SKColorF.cs, and SKPMColor.cs. | hot-paths/geometry-math.md |
| 1 | Color parse / convert | Parse, format, and conversion helpers in binding/SkiaSharp/ and binding/HarfBuzzSharp/. | hot-paths/color.md |
| 2 | Handles & collections | Native-wrapper getters and object tracking in binding/SkiaSharp/, including GetObject, OwnedBy, and HandleDictionary paths. | hot-paths/handles-and-collections.md |
| 3 | Text & fonts | Per-glyph/per-draw loops, string or array marshalling, and repeated invariant shaping work in binding/SkiaSharp/ and binding/HarfBuzzSharp/. | hot-paths/text-and-fonts.md |
| 4 | Pixels & images | Bulk pixel/scanline paths and array materialization in SKBitmap.cs, SKPixmap.cs, and SKImage.cs. | hot-paths/pixels-and-images.md |
The general .NET fast-API guidance behind the patterns above, with TFM guards.
| Area | Reference |
|---|---|
| Strings & spans | bcl-patterns/strings-and-spans.md |
| Numerics, SIMD & codegen | bcl-patterns/numerics-and-simd.md |
| Memory & buffers | bcl-patterns/memory-and-buffers.md |
| Collections & searching | bcl-patterns/collections.md |
| Interop & marshalling | bcl-patterns/interop-and-marshalling.md |
| You were asked to… | Do this |
|---|---|
| Scan and fix (the default; what the agentic workflow runs) | Phases 0 → 5 below: hunt → prove faster → implement + prove identical → file the finding + a linked draft PR (Fixes #…). |
| Find an opportunity (scan only) / file an issue | Phases 0 → 2, then file a [performance] issue with the numbers, framed as an unvalidated hypothesis — a benchmarked proposed fast path is not yet proof of behaviour parity. Don't use "proven/fixable" language without the Phase 3 parity proof. |
| Author or review perf code interactively (a human is driving) | Route via signals.md, apply low-complexity hot-path wins inline, and report medium/high ones with their tradeoff. Still hold the two-proof bar before claiming a win. |
Read the benchmark harness documentation at
benchmarks/README.md, the template benchmark, and the relevant
proof references; the test project is tests/SkiaSharp.Tests.Console. Do not restore local tools
or download pre-built natives during setup, source scanning, or de-duplication. A quiet or
duplicate run ends before either operation.
1.1 Pick a focus area (round-robin). If the run supplies an explicit focus area (a bare number 0–4), use it and skip rotation. Otherwise rotate over the 5 hot-path areas so consecutive runs differ:
DOY=$(date -u +%j); HOUR=$(date -u +%H) # zero-padded day-of-year + hour
FOCUS=$(( (10#$DOY * 24 + 10#$HOUR) % 5 )) # 10# forces base-10; 0..4
echo "focus area: $FOCUS" # 0 geometry-math · 1 color · 2 handles-and-collections · 3 text-and-fonts · 4 pixels-and-imagesUse the focus table above to locate the exact reference first, then open that hot-paths/ file and
its Where to look commands. Read only the relevant section, bounded by its next heading; do not
guess a line range or load unrelated references. Widen to a neighbour only if it's exhausted.
1.2 Establish the hot path and cost — with file:line citations: the realistic caller and how
often it runs; the concrete overhead (which the reference names); and the invariant that makes the
fast path still correct. If you can't name that invariant, drop it. Skip anything already optimized
(the references list the hardened spots).
1.3 De-dup against open issues/PRs (search the [performance] prefix and the specific
type/API name — real perf work is often perf(...)/Optimize …):
gh issue list --repo "$GITHUB_REPOSITORY" --search '"[performance]" in:title' --state open --json number,title
gh pr list --repo "$GITHUB_REPOSITORY" --search 'SKMatrix in:title' --state open --json number,titleRespect in-flight work (#4241 SKMatrix, #4276/#3699 bench CI, #3489 CopyTo, #4182 dict sizing,
#3033 DrawShapedText). Pick the ONE strongest candidate; if none convinces, stop (noop).
1.4 Bootstrap one qualified candidate. Only after one managed-C# candidate has a citable hot path/invariant and clears the Phase 1.3 open-item de-dup gate, run this exact command once per run:
dotnet tool restore && dotnet cake --target=externals-downloadThis is the mandatory bootstrap before any source build, test, or benchmark, not a scan prerequisite. Do not run either command for a quiet/duplicate candidate, and do not repeat either command in later phases.
Follow measuring.md §"Proof 1": a New vs Old benchmark in one process,
[MemoryDiagnoser], realistic workload, statistical rigor (Mean/Error/StdDev, ≥2 runs, no alloc
regression, no regression on any real shape). No measurable/repeatable win ⇒ not a finding.
Write the equivalence test first (measuring.md §"Proof 2") — full
behaviour parity (return value bit-exact for numeric ports; edge inputs; exceptions/validation;
ownership/GC.KeepAlive; rendered pixels), confirmed to catch a deliberately-wrong result. Then
implement the minimal fix using the matching hot-path + bcl-pattern references, honouring that
family's Watch out and all TFMs (guard newer APIs; a float port keeps the x87 fallback).
Confirm: identical (equivalence passes), faster (benchmark holds), no regressions (type's test class
Self-review gate — before the PR (all must tick, else fix or noop):
binding/**/source/** only — no *.generated.cs, no externals/skia/**.Two linked safe outputs so the finding auto-closes on merge:
create_issue, temporary_id like aw_perf1) — the hot path + measured cost
(family, file:line, the realistic caller, the Phase 2 benchmark table, the scope note).create_pull_request, draft, branch dev/perf-<desc>) — the fix (what changed + the
invariant that keeps it correct), proof faster (benchmark table + command), proof identical
(the equivalence test + what edges it covers + that it catches a wrong result), and Fixes #aw_perf1
on its own line.tenet/performance; add the matching perf/*
sub-type chosen by the dominant, measured driver of the win (a removed P/Invoke → perf/interop,
removed managed allocations → perf/allocations, else perf/rendering/perf/throughput/
perf/startup/perf/memory-leak/perf/size). Canonical taxonomy:
.agents/skills/issue-triage/references/labels.md. Usually one sub-type. When run from the agentic
workflow, its guardrail 8 restates this.Short summary: area, candidate (file:line), benchmark result (New vs Old, ratio, allocations),
equivalence coverage, and the issue + PR links — or "no convincing candidate this run". Name the
actual checked universe and evidence: for an exhaustive claim, name the bounded query/path and
confirm that every returned result was inspected without truncation; for a sample, say it was
representative and name the files or candidates actually opened. Never infer an exhaustive scan or
aggregate count from a few representative reads. End with the right safe output: the issue + PR
pair, the issue alone (native/upstream), or a single noop (quiet/dry run). Never finish
with no safe output.
© mono, MIT. 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 14 other files (references) in .agents/skills/performance-fixer of mono/SkiaSharp.
Open the folder on GitHubat commit a74f7f9
Performance Fixer 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 |
|---|---|---|---|---|---|---|
| Performance Fixer this skillmono/SkiaSharp | 5.6k | — | ~4.1k | Automated safety check: Pass | MIT | |
| Analyzing .NET Performancedotnet/skills | 5.6k | 3 repos | ~3.1k | Automated safety check: Pass | MIT | |
| MAUI PR Performance Analysisdotnet/maui | 23k | — | ~2.4k | Automated safety check: Pass | MIT | |
| Code Reviewjonathanpeppers/dotnes | 780 | — | ~2.1k | Automated safety check: Pass | MIT | |
| Gh Stackdotnet/macios | 2.9k | 2 repos | ~10k | Automated safety check: Pass | Custom licence | |
| Maintain DisCatSharpAiko-IT-Systems/DisCatSharp | 140 | — | ~1.2k | Automated safety check: Pass | MIT |
dotnet/skills
Scans C# and .NET code for about 50 performance anti-patterns and reports prioritized findings with concrete fixes, at a scan depth you choose.
dotnet/maui
Interprets pinned managed benchmark evidence for a dotnet/maui pull request and writes a narrative for the performance review workflow, without running or publishing anything.
jonathanpeppers/dotnes
Review dotnes pull requests against established repository rules.
dotnet/macios
Manage stacked branches and pull requests with the gh-stack GitHub CLI extension.
Aiko-IT-Systems/DisCatSharp
Guides changes to the DisCatSharp C# Discord library: tracing a payload field through parsing, serialization and caches, then validating across target frameworks.
BBuf/AI-Infra-Auto-Driven-SKILLS
Reviews SGLang changes the way its maintainers do, drawing on a bundled corpus of public PR review threads and a flowchart of how the diff runs.
mono/SkiaSharp
Fix bugs in SkiaSharp C bindings. An agent skill from mono/SkiaSharp.
mono/SkiaSharp
Reproduce a SkiaSharp issue systematically and capture structured reproduction results.
mono/SkiaSharp
Triage a SkiaSharp GitHub issue or PR into structured JSON with classification (type, area, platform, severity), suggested response, automatable actions, and companion Markdown/HTML reports.
mono/SkiaSharp
Update native dependencies (libpng, libexpat, zlib, libwebp, harfbuzz, freetype, libjpeg-turbo, etc.) in SkiaSharp's Skia fork.
mono/SkiaSharp
Review a Skia upstream merge PR in mono/skia. An agent skill from mono/SkiaSharp.
mono/SkiaSharp
Scout Skia GM (golden master) samples in the externals/skia submodule to find demos worth porting to the SkiaSharp Gallery.
Works with
Categories
Scan SkiaSharp for managed-C performance opportunities AND fix them, proving each with a BenchmarkDotNet measurement plus a behaviour-parity test. Performance Fixer is an agent skill from mono/SkiaSharp. Scan SkiaSharp for managed-C performance opportunities AND fix them, proving each with a BenchmarkDotNet measurement plus a behaviour-parity test.
Performance Fixer fits situations like: tasks that involve Pull requests; tasks that involve Performance optimization.
Run `npx skills add mono/SkiaSharp --skill performance-fixer -a claude-code`. Or copy the skill folder (.agents/skills/performance-fixer in mono/SkiaSharp) into .claude/skills/performance-fixer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mono/SkiaSharp --skill performance-fixer -a codex`. Or copy the skill folder (.agents/skills/performance-fixer in mono/SkiaSharp) into .agents/skills/performance-fixer 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 mono/SkiaSharp --skill performance-fixer -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-fixer, .gemini/skills/performance-fixer, .github/skills/performance-fixer and .opencode/skills/performance-fixer in your project.
Going by SKILL.md and its folder, Performance Fixer needs the command-line tools its instructions call (gh and dotnet).
SKILL.md contains no URLs. Its commands use gh, 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 no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Performance Fixer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 17k 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 17k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Performance Fixer: Analyzing .NET Performance (dotnet/skills, 5.6k stars), MAUI PR Performance Analysis (dotnet/maui, 23k stars), Code Review (jonathanpeppers/dotnes, 780 stars) and Gh Stack (dotnet/macios, 2.9k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
mono (a GitHub organization) maintains it in mono/SkiaSharp, which has 5,585 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 7, 2026.
Source: mono/SkiaSharp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.