Windows cursor maker
Skill 222wcnm/windows-cursor-maker/skills/windows-cursor-maker
Agent Skill for creating, validating, and packaging Windows CUR/ANI cursor themes from PNG or SVG.
npx -y skills add 222wcnm/windows-cursor-maker --skill windows-cursor-makerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 22 days oldThe repository was created 22 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.
- 0 stars0 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
Create, draw, convert, preview, inspect, validate, and package Windows mouse cursors and complete cursor themes. Use when an agent needs to turn PNG, generated artwork, or AI-authored SVG into multi-resolution .cur files; draw frame-by-frame SVG cursor animations and assemble .ani files; choose or verify hotspots; review artwork on light and dark backgrounds; validate a full theme manifest; generate a Windows Install.inf scheme; or design a custom Windows pointer set without relying on image-generation tools.
The file declares its own license as GPL-3.0-only. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
9.2 KB, as published. Nobody here has run it
Windows Cursor Maker
Create Windows cursor assets with visual generation separated from deterministic packaging.
Runtime and skill location
- Resolve the absolute directory containing this
SKILL.mdbefore running commands, and assign it to$SkillDir. Never assume the skill is under.codexor.claude. - In Claude Code,
${CLAUDE_SKILL_DIR}can resolve the current skill directory where host substitution is supported. In other hosts, use the skill location supplied by the runtime or the actual installation path. - Use Python 3.10 or newer. Prefer an isolated
uv runinvocation so the host environment is unchanged:
$SkillDir = "<absolute directory containing SKILL.md>"
uv run --with-requirements "$SkillDir\scripts\requirements.txt" python "$SkillDir\scripts\self_test.py"
- If
uvis unavailable, installscripts/requirements.txtinto an already activated virtual environment withpython -m pip install -r .... Do not silently modify an unrelated global Python environment. - Run
python "$SkillDir\scripts\self_test.py"in the prepared environment after installation or when moving the skill to another agent. A skipped SVG test meansresvg_pyis unavailable and SVG input is not ready. agents/openai.yamlis optional Codex UI metadata. The coreSKILL.md, scripts, and references do not depend on it.
Workflow
-
Inspect references and requirements.
- Preserve the user's visual identity, palette, outlines, and animation intent.
- Inspect existing
.cur,.ani, or scheme folders withcursor_tool.py inspectbefore modifying them. - Read references/cursor-design.md when choosing roles, hotspots, sizes, or animation timing.
- Read references/svg-cursor-authoring.md when drawing vector sources, working without image generation, or constructing animations from SVG frames.
-
Prepare transparent source artwork.
- Reuse supplied PNG/SVG artwork when available.
- Choose the authoring path that fits the available environment:
- Raster path: when image generation is available and appropriate, use the host's installed image-generation tool or skill. Generate large transparent PNG sources; do not ask image generation to emit CUR or ANI binaries.
- Vector path: author SVG directly when image generation is unavailable, when exact geometric states matter, or when a code-native and editable result is preferable. Use a square
viewBox="0 0 256 256", declare the hotspot in viewBox coordinates, and installresvg_pyfor deterministic rasterization.
- Keep each static state on a square transparent canvas. Keep animated frames at identical canvas dimensions and alignment.
- Keep raw generation outputs separate from processed transparent sources. If the OpenAI
imagegenskill is installed and generated artwork has a flat background, its helper can remove the background. Resolve that skill's own directory first and use named arguments; do not pass paths positionally:
python "<imagegen-skill>\scripts\remove_chroma_key.py" --input raw.png --out source.png --auto-key border --soft-matte --transparent-threshold 12 --opaque-threshold 220 --despill- Verify that border pixels are transparent and that the nontransparent coverage is plausible before bulk generation.
-
Preview source artwork before packaging.
python "$SkillDir\scripts\cursor_tool.py" contact-sheet source\roles\*.svg --output contact-sheet.png- Pass only finished role artwork, not raw anchors or chroma-key inputs. Review every role on both backgrounds. Reject clipped silhouettes, unintended shadows, opaque fringes, weak contrast, inconsistent scale, and animation jitter.
- For animated roles, include representative frames in the sheet and also review a looping GIF or equivalent playback.
- Functional roles must remain immediately recognizable: the
Crosshaircenter must expose the exact target,IBeammust stay narrow and centered, resize directions must be unambiguous, andHand,Pin, andPersonmust preserve their interaction semantics.
-
Build static cursors.
python "$SkillDir\scripts\cursor_tool.py" cur source.png pointer.cur --sizes 32,48,64,96 --hotspot 3,2 python "$SkillDir\scripts\cursor_tool.py" cur source.svg pointer.cur --sizes 32,48,64,96 --hotspot 16,12Treat
--hotspot X,Yas coordinates on the original raster image or SVG viewBox. The script scales and offsets the hotspot for every output size. Use--hotspot-relative RX,RYonly when a normalized location is more reliable. Add--resample nearestfor pixel-art rasters; SVG is rendered independently at each target size. -
Build animated cursors.
- Build each PNG or SVG frame as a multi-resolution CUR first, using the same sizes and semantically identical hotspot.
- For SVG animation, author numbered static frame files such as
frame-00.svgthroughframe-11.svg. Change pose or transforms between frames; keep the viewBox, alignment, palette, and hotspot fixed. Do not rely on browser-only SMIL or CSS animation because ANI packages sampled cursor frames. - Assemble frames in display order:
python "$SkillDir\scripts\cursor_tool.py" ani frames\*.cur working.ani --frame-ms 100- Use comma-separated durations for per-frame timing, such as
--frame-ms 80,80,120,160.
-
Validate every binary and the full theme.
python "$SkillDir\scripts\cursor_tool.py" inspect pointer.cur working.ani --windows-load python "$SkillDir\scripts\cursor_tool.py" validate-theme theme.json --require-complete --windows-load --json-out validation.jsonRequire valid structure, in-bounds hotspots, consistent ANI frame geometry, the intended size set, and
windows_load: trueon Windows. Treat binary validation and visual validation as separate mandatory gates: a loadable cursor can still be invisible on a light background or communicate the wrong interaction. -
Package a complete scheme only after both gates pass.
- Create a JSON manifest using the role names in references/cursor-design.md.
- Build a distributable folder:
python "$SkillDir\scripts\cursor_tool.py" scheme theme.json output\MyTheme- Inspect the copied files and
Install.inf. Packaging renames cursor files to deterministic, INF-safe ASCII names based on their Windows roles. The generated installer opens Mouse Properties at the Pointers tab after installation so the user can select the new scheme. - Do not install or activate the scheme without explicit user permission; installation changes Windows cursor configuration.
Repair and restart discipline
- Build into a staging directory. Do not treat a nonempty user output folder as disposable scratch space.
- Preserve raw generation outputs and known-good roles so an interrupted run can resume without repeating expensive visual generation.
- When QA fails, regenerate only the failing roles or frames. Then rerun the complete contact sheet, animation review, and
validate-theme; a narrow repair does not justify a narrow final validation. - Never overwrite an unrelated existing file unless the user explicitly authorizes it. Prefer deterministic
--forceonly for artifacts owned by the current build.
Acceptance Criteria
- Static cursors contain the intended 32, 48, 64, and 96 px images unless the user requests another size set.
- SVG sources use a square zero-origin viewBox, local vector resources, deterministic frame files for animation, and no external fonts or images.
- Every hotspot lands on the actual interaction point and stays in bounds at each size.
- ANI frames use consistent sizes and hotspots, preserve intended order, and use deliberate timing.
validate-theme --require-complete --windows-loadreportsstatus: passfor a full theme on Windows, with no unexplained warnings. On non-Windows hosts, omit--windows-load, report Win32 loading as unverified, and do not claim Windows installation validation.- A dual-background contact sheet has been reviewed, plus playback for every animated role; functional shapes remain readable at cursor scale.
- A complete theme maps roles in Windows scheme order and packages all referenced files beside
Install.inf. - Right-click installation opens
main.cplat the Pointers tab; it does not silently activate the new scheme. - Final reporting includes output paths, sizes, hotspots, frame timing, binary results, visual-QA artifacts, and any roles intentionally omitted.