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 native ownership / disposal memory leaks AND fix them with a red→green regression test.
$ npx skills add mono/SkiaSharp --skill memory-leak-fixer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mono/SkiaSharp memory-leak-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/memory-leak-fixer .claude/skills/memory-leak-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 "memory-leak-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/memory-leak-fixer into .claude/skills/memory-leak-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "memory-leak-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/memory-leak-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 memory-leak-fixer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mono/SkiaSharp memory-leak-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/memory-leak-fixer .agents/skills/memory-leak-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 "memory-leak-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/memory-leak-fixer into .agents/skills/memory-leak-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "memory-leak-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 memory-leak-fixer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mono/SkiaSharp memory-leak-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/memory-leak-fixer .cursor/skills/memory-leak-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 "memory-leak-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/memory-leak-fixer into .cursor/skills/memory-leak-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "memory-leak-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/memory-leak-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 memory-leak-fixer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mono/SkiaSharp memory-leak-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/memory-leak-fixer .gemini/skills/memory-leak-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 "memory-leak-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/memory-leak-fixer into .gemini/skills/memory-leak-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "memory-leak-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 memory-leak-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 memory-leak-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/memory-leak-fixer .github/skills/memory-leak-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 "memory-leak-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/memory-leak-fixer into .github/skills/memory-leak-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "memory-leak-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 memory-leak-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 memory-leak-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/memory-leak-fixer .opencode/skills/memory-leak-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 "memory-leak-fixer" agent skill from https://github.com/mono/SkiaSharp/tree/main/.agents/skills/memory-leak-fixer into .opencode/skills/memory-leak-fixer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "memory-leak-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.
memory-leak-fixerScan SkiaSharp for native ownership / disposal memory leaks AND fix them with a red→green regression test.
Memory Leak Fixer is an agent skill from mono/SkiaSharp. Scan SkiaSharp for native ownership / disposal memory leaks AND fix them with a red→green regression test. Two combined modes in one skill: (1) SCAN — hunt the SkiaSharp leak signature (undisposed SKObject handle, wrong owns: flag, same-instance double-dispose, unremoved event/handler subscription, fixed-pointer lifetime) and empirically confirm it; (2) FIX — write a failing regression test, implement the minimal idiomatic fix, prove it goes green, and open a PR. Triggers: "memory leak", "leak scan", "leak…
Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 13 other files, including reference files (for example `references/leaks/allocation-failure-path.md`, `references/leaks/clone-copy-double-free.md` and `references/leaks/field-not-nulled-on-dispose.md`).
It sits in Development, covering 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 cb51ed5. 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:
dotnetghFrom 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.
Memory Leak Fixer loads about 4.9k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 226 tokens; SKILL.md has 2,254 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 cb51ed5, republished under its MIT licence (© mono). 2,254 words, ~4,867 tokens.
.claude/skills/memory-leak-fixer/SKILL.md (or your agent's skills folder). This skill also uses 11 other files; get the full folder from GitHub.Proactively find and fix memory leaks in SkiaSharp — a thin managed wrapper over native Skia, so its recurring, high-impact class of leaks is native ownership / disposal correctness — the C# binding failing to dispose, own, pin, or root a native object correctly — not the managed view-retention leaks a pure-managed app framework worries about. This skill hunts that class of leaks and produces a validated fix.
Scope: managed C# only. Work only in the code SkiaSharp owns — the C# bindings
(binding/**) and view layers (source/**). Everything under externals/skia/** is
upstream Skia (including our C shim): out of scope, not buildable on a standard runner, and
handled by a separate process. Every candidate must be provable and fixable from C#.
Read documentation/dev/memory-management.md
first — it is the authoritative model (pointer types, owns: flag, ref-count rules, the
same-instance-return contract). This skill assumes that model.
The leak catalogue is split into 11 focused references, each with a description, why it's bad, a leak→fix code example, and a leak-specific anti-pattern. Phase 1 maps the selected focus area directly to its one reference file; consult that same file when writing a fix (Phase 3).
Code samples are illustrative and trimmed to the essential lines; real wrappers must retain
normal argument validation and use GC.KeepAlive where lifetime requires it.
[Obsolete]-hide, or delete a test to make it pass. If
the only thing that turns green is a mute, the fix is wrong — reject it.*.generated.cs and everything under
externals/skia/** (including our C shim) are off-limits — this skill is managed-C#
only. Every fix lives in binding/** or source/**.noop (see Phase 5).Run the phases in order. The skill has two entry points:
| You were asked to… | Start at | Notes |
|---|---|---|
| Find a leak (scan only) / file an issue | Phase 1 → 2 → (report) | Stop after confirmation; file [memory-leak] issue. |
| Scan and fix (the default, and what the workflow does) | Phase 0 → 1 → 2 → 3 → 4 → 5 | End-to-end: hunt → prove → fix → file the finding as an issue and open a linked draft PR that closes it (Fixes #…). |
CI runner reality: this skill fixes managed C# only (
binding/**,source/**). The native library is consumed as a pre-built package (externals-download) — you never build native code, so every candidate must be provable and fixable from C#. A leak whose only fix is in native / upstream Skia is out of scope: file an issue (Phase 4), never open a PR you cannot validate.
dotnet --version.A full 11-area sweep every run is wasteful and the surface is mostly hardened, so start from ONE focus area and widen only if it's exhausted.
Override first. If the run supplies an explicit focus area (a bare number 0–10 — e.g. a
maintainer testing one area on demand), use that number directly as FOCUS and skip the
rotation below. Otherwise rotate the starting area on a
time-based round-robin so consecutive runs cover different areas. This needs only
date, so it behaves identically locally and in CI — no $GITHUB_RUN_NUMBER / $RANDOM
(which don't exist or aren't deterministic outside GitHub Actions):
# Round-robin: advance one focus area every hour, cycling through all 11.
DOY=$(date -u +%j); HOUR=$(date -u +%H) # day-of-year + hour, both zero-padded
FOCUS=$(( (10#$DOY * 24 + 10#$HOUR) % 11 )) # 10# forces base-10
echo "focus area: $FOCUS"The 10# prefix is required: date zero-pads %j/%H, and $(( 08 )) is an
invalid-octal error without it. For a targeted local run, skip the rotation and just name the
focus area you want.
Every focus area is drawn from a real, historical SkiaSharp leak fix. Open the one file mapped
to FOCUS, then read its Where to look line, description, why-it's-bad, leak→fix example, and
per-area anti-pattern before scanning:
If the selected focus area is exhausted (its leaks are already open issues/PRs — see 1.3), advance to the next index and load only its mapped reference file.
For each candidate write the precise path with file:line citations:
creation site → escape path → missing Dispose/unref.owns: bugs: the P/Invoke name that produced the handle (_new_/_create returns an
owned object; _get_/property-style returns a borrowed pointer) vs the owns: value the
C# wrapper passed.long-lived root → subscription/handler → transient view, and the
unload path that should have detached but doesn't.Skip if already weak/correct: uses WeakEventHandler/WeakReference/
ConditionalWeakTable, or the ownership already matches the memory-management rules.
Before confirming, fetch and skip anything already covered. Search two ways — real
SkiaSharp leak fixes are usually filed as [BUG] … (not [memory-leak] …), so the
title-prefix search alone will miss them. Also search by the specific type/API name:
# 1. Prior runs of THIS workflow (our own prefix):
gh issue list --repo "$GITHUB_REPOSITORY" --search '"[memory-leak]" in:title' \
--state open --limit 100 --json number,title,body
gh pr list --repo "$GITHUB_REPOSITORY" --search '"[memory-leak]" in:title' \
--state open --limit 100 --json number,title,body
# 2. Human-reported coverage of the SAME api/type (the important check):
# e.g. for the Blob.FromStream candidate below, this surfaces open PR #3473.
gh issue list --repo "$GITHUB_REPOSITORY" --search 'Blob.FromStream in:title,body' --state open --json number,title
gh pr list --repo "$GITHUB_REPOSITORY" --search 'Blob.FromStream in:title,body' --state open --json number,titleA candidate is OUT only if an open issue/PR already covers the same
handle / ownership path (by our prefix OR by the api/type name). A candidate whose only
prior item is CLOSED may be re-filed. Worked example: the HarfBuzzSharp.Blob.FromStream
fixed-pointer leak (area 4) is a genuine, still-present bug — but open PR #3473 "Make
Blob.FromStream GC safe" already fixes it, so it is OUT: stand down, do not open a
duplicate PR, emit a noop.
Pick the ONE strongest candidate. If none is convincing, stop — a quiet run is a success
(the surface is hardened; the value is catching new leaks as code lands). Do not keep
digging past a reasonable single pass hoping to manufacture a finding: report the quiet result
and emit a noop (Phase 5).
Only after one managed-C# candidate has a citable ownership path and clears the Phase 1.3 open-item de-dup gate, prepare for empirical proof. Run this exact command once per run:
dotnet tool restore && dotnet cake --target=externals-downloadThis is the mandatory bootstrap before any source build or test, not a scan prerequisite. Do not run either command for a quiet/duplicate candidate, and do not repeat either command in later phases.
Every in-scope leak is observable from managed code, so prove it with a WeakReference +
forced-GC probe that mirrors the existing memory tests. Prove it against the shipped
SkiaSharp NuGet in a throwaway project — no source build, no display:
mkdir -p /tmp/leakprobe && cd /tmp/leakprobeleakprobe.csproj referencing <PackageReference Include="SkiaSharp" Version="*" /> — the
floating * resolves to the latest stable SkiaSharp on nuget.org automatically (use
Version="*-*" to include the latest preview) — plus xunit + Microsoft.NET.Test.Sdk,
then a single [Fact] that:
WeakReference;for (i=0;i<6;i++){ GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); });cd /tmp/leakprobe && dotnet test --logger "console;verbosity=normal"Dispose is never reached; the in-repo equivalent uses SKObject.GetInstance<T>(handle, out _) + CollectGarbage() (see tests/Tests/SkiaSharp/SKObjectTest.cs).Add a focused regression test to the console test project (source lives under tests/Tests/,
run via tests/SkiaSharp.Tests.Console). Model it on existing disposal/leak tests:
AssertEx.EventuallyGC(weakRef, …) — GC-based (tests/Tests/Xunit/AssertEx.cs).SKObject.GetInstance<T>(handle, out inst) + CollectGarbage() — wrapper lifecycle
(tests/Tests/SkiaSharp/SKObjectTest.cs).tests/SkiaSharp.Tests.Devices/Tests/Maui/MemoryLeakTests.cs.Using the one bootstrap from Phase 1.4, build and confirm the test FAILS on the current tree (proves it catches the leak):
dotnet build binding/SkiaSharp/SkiaSharp.csproj
dotnet test tests/SkiaSharp.Tests.Console/SkiaSharp.Tests.Console.csproj --filter "FullyQualifiedName~<YourTestName>"If a test you expected to be red is green, your hypothesis is wrong — go back to Phase 1.
Apply the Fix (✓) in the selected focus-area reference — every reference has a worked
before/after. Then re-read that reference's Watch out (❌ don't): note: it names the specific
wrong fix that turns one leak into another (an unconditional Dispose, flipping
owns: blind, nulling a field before disposing, a pinned GCHandle where a plain field
suffices, …).
Touch only the minimal code, and keep it inside binding/** / source/**. Never change a
public signature to fix ownership — add an overload or fix internals (ABI stability). If the
only correct fix is in native / upstream Skia, stop and file an issue (Phase 4) — this
skill does not open native PRs.
Rebuild and re-run the regression test (now PASSES) plus neighbouring tests:
dotnet test tests/SkiaSharp.Tests.Console/SkiaSharp.Tests.Console.csproj --filter "FullyQualifiedName~<YourTestName>"
# then a wider relevant slice, e.g. the type's test class, to catch regressionsEnforce red→green in both directions: revert the fix ⇒ red; re-apply ⇒ green.
Run this checklist before committing or opening the PR, so a bad attempt is dropped now
instead of pushed and reverted. If any box can't be ticked, fix it or stand down (emit a
noop) — do not open the PR.
[Obsolete]-hidden, skipped, or weakened.binding/** / source/** only — no *.generated.cs, no
externals/skia/**, no native / upstream change.Dispose, no blind owns: flip, no
field nulled before dispose, no pinned GCHandle or hand-rolled keep-alive field/List<T>
where SKObject.Referenced(...) / KeepAliveObjects (or a plain field) suffices, …).All ticked ⇒ proceed to Phase 4 (file the finding, then open the PR). Any unticked ⇒ no PR
(fix it, file the finding as an issue on its own, or noop).
A confirmed, managed-C#-fixable leak produces two linked safe outputs so the finding and the fix are tracked separately and the issue auto-closes when the PR merges.
Labels (both the issue and the PR): a memory leak is a performance concern, so tag both
outputs with tenet/performance (the quality-tenet umbrella) and perf/memory-leak (the
performance sub-type). When this skill runs from the memory-leak-fixer workflow these labels
are applied automatically by its safe-outputs config; when filing by hand, add them yourself.
The perf/* taxonomy is defined in the issue-triage skill
(references/labels.md).
Emit a create_issue that describes the leak, not the fix. Give it a temporary_id
(format aw_ + 3–8 alphanumeric characters — no underscores or other symbols — e.g. aw_leak1)
so the PR can reference it
before its real number exists. Body (markdown):
memory-leak-fixer skill.file:line citations.tenet/performance + perf/memory-leak.Create a feature branch (dev/memory-leak-<short-desc>), commit the test + fix, and open a
draft create_pull_request. Body (markdown):
Fix ✓).dotnet test commands.Fixes #<temporary_id>
— e.g. Fixes #aw_leak1 (the id you gave the issue in 4.1). gh-aw rewrites it to the real issue
number once the issue is created.tenet/performance + perf/memory-leak.If the leak is real but the only correct fix lives under externals/skia/** (incl. the C
shim), do not open a PR. Emit the create_issue from 4.1 alone — finding plus the
proposed native fix — so nothing is lost.
Write a short summary: which focus area, the candidate (file:line), the proof result, and the
resulting issue + PR links. 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. When
run from the agentic workflow, append this to the run's step summary.
End with the right safe output(s):
Fixes #… so merging closes the issue).create-issue alone (finding + proposal).noop carrying
this summary.A noop is the correct "nothing to do / analysis only" signal — never finish with no safe
output, which makes the run look incomplete.
© 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 11 other files (references) in .agents/skills/memory-leak-fixer of mono/SkiaSharp.
Open the folder on GitHubat commit cb51ed5
Memory Leak 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 |
|---|---|---|---|---|---|---|
| Memory Leak Fixer this skillmono/SkiaSharp | 5.6k | — | ~4.9k | Automated safety check: Pass | MIT | |
| Analyzing .NET Performancedotnet/skills | 5.6k | 3 repos | ~3.1k | Automated safety check: Pass | MIT | |
| Gdscript Advancedjame581/GodotPrompter | 799 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Fory Performance Optimizationapache/fory | 4.6k | — | ~2.2k | Automated safety check: Pass | Apache-2.0 | |
| Game DeveloperJeffallan/claude-skills | 12k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Unity Developeraiskillstore/marketplace | 430 | 7 repos | ~2.7k | Automated safety check: Pass | None |
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.
jame581/GodotPrompter
A skill your agent uses when writing production-grade GDScript — performance idioms, metaprogramming, @tool lifecycle, async pitfalls, signal/Callable trade-offs, profiler-driven idioms, and common…
apache/fory
Run profile-driven bottleneck optimization across Apache Fory implementations (Java, C++, Python/Cython, Go, Rust, Swift, C, JavaScript/TypeScript, Dart, Kotlin, Scala).
Jeffallan/claude-skills
Covers game programming in Unity and Unreal Engine: ECS design, physics, multiplayer networking, shaders and profiling toward a 60 FPS target.
aiskillstore/marketplace
Build Unity games with optimized C scripts, efficient rendering, and proper asset management.
akiojin/unity-cli
Inspect and control Unity Editor state with unity-cli. An agent skill from akiojin/unity-cli.
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 native ownership / disposal memory leaks AND fix them with a red→green regression test. Memory Leak Fixer is an agent skill from mono/SkiaSharp. Scan SkiaSharp for native ownership / disposal memory leaks AND fix them with a red→green regression test.
Memory Leak Fixer fits situations like: tasks that involve Performance optimization.
Run `npx skills add mono/SkiaSharp --skill memory-leak-fixer -a claude-code`. Or copy the skill folder (.agents/skills/memory-leak-fixer in mono/SkiaSharp) into .claude/skills/memory-leak-fixer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mono/SkiaSharp --skill memory-leak-fixer -a codex`. Or copy the skill folder (.agents/skills/memory-leak-fixer in mono/SkiaSharp) into .agents/skills/memory-leak-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 memory-leak-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/memory-leak-fixer, .gemini/skills/memory-leak-fixer, .github/skills/memory-leak-fixer and .opencode/skills/memory-leak-fixer in your project.
Going by SKILL.md and its folder, Memory Leak Fixer needs the command-line tools its instructions call (dotnet and gh).
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.
Memory Leak 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.9k tokens (SKILL.md is roughly 19k 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 5.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Memory Leak Fixer: Analyzing .NET Performance (dotnet/skills, 5.6k stars), Gdscript Advanced (jame581/GodotPrompter, 799 stars), Fory Performance Optimization (apache/fory, 4.6k stars) and Game Developer (Jeffallan/claude-skills, 12k 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,587 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on October 9, 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.