by aldegad
Generate clean 2D game sprites & animation atlases — component-row pipeline: state rows, alpha cleanup, frame extraction, runtime atlases. Codex/Claude skill.
# Add to your Claude Code skills
git clone https://github.com/aldegad/sprite-genGuides for using data processing skills like sprite-gen.
Last scanned: 6/16/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-06-16T09:27:00.845Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}See how sprite-gen compares with popular alternatives.
sprite-gen is an open-source data processing skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by aldegad. Generate clean 2D game sprites & animation atlases — component-row pipeline: state rows, alpha cleanup, frame extraction, runtime atlases. Codex/Claude skill. It has 3,091 GitHub stars.
Yes. sprite-gen passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/aldegad/sprite-gen" and add it to your Claude Code skills directory (see the Installation section above). sprite-gen ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
sprite-gen is primarily written in Python. It is open-source under aldegad on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other Data Processing skills you can browse and compare side by side. Open the Data Processing category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh sprite-gen against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
Based on votes and bookmarks from developers who liked this skill
From $49 · 30 days · terms & refunds
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
Automated security scan — not a certification.
sprite-gen rife install (sha256-checked, into the user data directory); SPRITE_GEN_RIFE or PATH override it; Linux without a GPU also needs libvulkan1 mesa-vulkan-drivers. Without it, walk and run loops are cut as filmed with a warning. SPRITE_GEN_RIFE_BACKEND=torch runs the same model in PyTorch instead, for a GPU with no Vulkan (pip install \"sprite-gen[torch]\", then sprite-gen rife install --backend torch; SPRITE_GEN_RIFE_DEVICE=cuda or cpu; SPRITE_GEN_RIFE_EXECUTOR=module:attr sends its frames to a GPU elsewhere, rife_torch.serve there)"
required_scripts:
- scripts/prepare_sprite_run.py
- scripts/generate_sprite_image.py
- scripts/gen_set.py
- scripts/generate_sprite_video.py
- scripts/video_canvas.py
- scripts/video_frames.py
- scripts/video_loop.py
- scripts/video_set.py
- scripts/extract_sprite_row_frames.py
- scripts/interpolate_frames.py
- scripts/compose_sprite_atlas.py
- scripts/preview_animation.py
- scripts/compose_selected_cycle.py
- scripts/compose_sprite_gif.py
- scripts/inspect_sprite_run.py
- scripts/score_sprite_run.py
- scripts/run_correction_loop.py
- scripts/curation.py
- scripts/serve_curation.py
- scripts/slice_sheet_cells.py
- scripts/unpack_atlas_run.py
- scripts/export_curated_pngs.py
- scripts/recolor.py
modes:
default: component-rowGeneration entry points: make sprites, make an image, or animate a still into a video. Existing generation, extraction and export tools do the work; the user chooses the result and provider. For repeat a background, project a shadow, inspect motion or compose a scene, use the independent routes below directly with existing assets.
For a standalone video clip, read video and use sprite-gen video.
This route works from any agent engine and delivers a verified MP4 plus report.
For sprites or ordinary images, use the guides below.
Read user-workflow, then run the appropriate read-only guide:
$SPRITE_GEN_ROOT/.venv/bin/sprite-gen workflow --kind sprite
$SPRITE_GEN_ROOT/.venv/bin/sprite-gen workflow --kind image
A call that names no provider (gen, logo, gen-set, video-set's mid-step redraw) runs on codex. When codex cannot run here — not signed in, or the codex usage of the account used up — and the user's choice for that is to ask (the default), the command generates nothing, prints one stderr line starting sprite-gen ask codex-unavailable: followed by JSON, and ends with exit 75. That is a question for the user, not a failure: never answer it yourself, never retry without the answer, never switch provider on your own.
Ask it in these words, with the reason from the line's cause (login: "로그인이 없어요", usage-limit: "사용량을 다 썼어요"):
지피티(codex)를 지금 쓸 수 없어요 — {이유}. 어떻게 할까요?
- OpenAI API 로 만들기 (호출당 과금)
- 그록으로 만들기
- 멈추기
Keep the side still, canvas placement and motion prompt facing the same direction.
video-set observes each side input once before canvas placement and uses the requested
--facing for both the canvas and clip prompt. Observation is record-only by default;
it never changes the requested direction. Image correction requires explicit opt-in.
Direction is requested through the generation and motion prompts, which cannot guarantee model compliance.
The detector can be wrong even at high confidence: review the still before choosing mirror or regen.
Generation reports record direction, model, requested direction, model-reported confidence and correction
under extra.facing; video reports and batch items use facing. final_direction is an observation
or a value derived from it, not independent verification; final_direction_source identifies which.
An uncertain or failed inspection records unknown and its reason and continues without correction;
front-facing observations also remain unchanged. Mirroring does not preserve left/right accessory handedness.
| Task | Entry | Contract |
|---|---|---|
| GPT image sprites | prepare, gen-set --provider codex, extract, compose and QA |
atlas-workflow |
| Standalone video / animate a still, pin a last frame, reference images | video (--image, --last-frame, --reference) |
video |
| Continue or edit an existing clip | video-extend, video-edit |
video |
A clip run left unfinished (its line or report names a request_id): ask for it again, never submit it again |
video-resume --request-id <id> |
video |
| Grok video sprites | video-set |
video-pipeline |
A soft part of a walk loop or cycle frames sways with the body (the Sway layer): an ellipse after video-cycle-align, --read-on <sha256> for a cut, --stretch-floor D for least area, --frames for full frames, --breathe for the breath drive, a flat share to move a region whole, --gain-across for across gain, and --reference for a way in or out of a loop |
video-sway (old name video-follow) |
video-pipeline |
| Where an ellipse is carried in every other cell, and what the move changes there (an arm crossing a chest moves with it; the stretch, the bend and the seam): a record and boards of every cell, nothing moved; a seam under a third moving region is not counted | video-sway-inspect (old name video-follow-inspect) |
video-pipeline |
| A set's directions on one sheet, standing on one ground line (a 3×3 board, an engine import) | video-set-sheet |
video-pipeline |
| A walk or run that stops, from the clip's own start played backwards | video-stop |
video-pipeline |
| Build a talking lower-face pack anchored to every frame of body motions from a reference and keyed clips. | video-face |
face-parts |
| Bake a voice and the pack's face layer onto body frames, optionally after a clip's own mouth and sound. | face-bake |
face-parts |
| Compare the currently displayed loop with a final candidate, including after follow-through | video-loop-compare |
loop-comparison |
| Restore post-processing damage in the current cut from its exact source times, preserving normal cells and playback | video-source-manifest → video-loop-repair → video-loop-compare |
source restoration |
| Video sprites from a clip your agent makes with a connected video MCP (ZCRE, 지크) | video-canvas, video-prompt --no-last-frame, the agent's own MCP tools (quote, user approval, generate, save the mp4), then video-frames and video-loop, and for a walk or run cut in two or more directions video-cycle-align --view … over their loop directories. sprite-gen never calls the MCP. |
video-pipeline |
| Typography logo, wordmark or title lettering (로고, 타이포그래피, 타이틀 글자): the title lettered into a title screen or poster first, then only its lettering redrawn on a key and cut out with its glow; the text is read back and a misspelt logo refused | logo --text … --style … (--mood to start from a picture you have, --lettering to cut again for nothing) |
logo |
| Ordinary image or edit | gen --provider codex or gen --provider grok (the subscription login first; without one grok uses XAI_API_KEY, and a codex signed in with an API key bills it — both per call, said on stderr) |
gen |
Pixel art the model draws directly as a grid, 8–48 px, on your Claude subscription (claude signed in), or without one on ANTHROPIC_API_KEY, billed per call |
pixel-draw |
pixel-draw |
| Image generation with no login available (server, container, SaaS) | gen --provider openai — server/SaaS route on OPENAI_API_KEY, billed per call, never a default; it runs only when named, or when the user chose it for a codex that cannot run |
gen |
| Base and direction anchors | anchor |
directional-anchor-workflow |
| Curation view or existing image candidates | curation, unpack-atlas --pngs-dir |
curation |
| Uniform background removal or imported sheets | cutout, slice-sheet |
sheet-slicing |
| Palette swap | sprite-gen recolor-palette, sprite-gen recolor |
recolor |
Idle breathing as a post-processing layer (the Breathe layer): pixel (default, pixel art) or smooth (large illustrations, video frames: head fixed, chest breathes, shoulders follow; facing values for a turned body); smooth can choose a beat that misses the hands with --avoid-region, and a way in or out of a loop carries on its breath with --loop-cells, --start-cell and --reference; pixel can breathe round from the chest with the arms moving sideways (--chest-round, --arms-x), cells held still (--hold-mask), what the arms hold moving whole with them (--props-mask), what the arms hold behind the body (a shield hung at the back) moves the same way with the body staying in front (--props-behind-mask), and pieces painted one colour move together (--props-groups colour, so a sword's reflection follows the sword) |
curation sidecar, baked by compose; or sprite-gen breathe <frames> <out> on a folder of loop frames |
breathing |
| Engine exports | export-aseprite, export-pngs |
engine-export |
| Background recipe or repeating tile | existing gen / cutout, then optional background-tile |
asset-tools |
| Ground tile that repeats both ways | gen (opaque), then background-tile --axis xy |
asset-tools |
| Game UI kit: panel, buttons, card, HP/XP bar frames and fills, timer badge, item slot, counter plate, on/off dots, joystick base and knob as sliced elements | gen --transparent --aspect-ratio 2:3 --layout-guide ui-kit (1:1: the seven frames alone), then ui-kit; the seven frames are required, and a band element whose box is empty is left out and named under missing |
ui-kit |
| Props or icons on a transparent sheet | slice-sheet --chroma-key none --alpha-floor 64, props with --scale sheet --fit contain, icons with --fit contain |
sheet-slicing |
| Painted props, a ground tile and a UI kit in a game pack | game-pack request version 2 (images, tiles, ui) |
game-pack |
| Standalone projected shadow | shadow |
asset-tools |
| Duplicate poses, foot contact and stride measurement | inspect-motion |
asset-tools |
| Optional scene placement, lighting, camera and render | scene-render, scene-inspect |
scene |
| Defaults | defaults show, defaults save (--codex-unavailable ask|grok|openai: what to do when codex cannot run), defaults clear |
user-workflow |
Say a thing once: what an option says, leave out of the prompt. --direction, --facing, --handed, the key background and video --direction side each add their own sentence after your text, in one place. Your prompt carries the subject, its design and its pose. Text that says the opposite of an option ("facing left" with --facing right, the item on the other wrist) is sent as written with a warning (extra.prompt_notes, video-prompt's warnings): fix the prompt, do not send it — prompt-assembly.
Use existing automatic pipeline stages for background removal, extraction, alignment and export. Do not ask users to select each script. For a direct utility request, run that utility; no unrelated generation questions are needed. Preserve the row pipeline and component extraction for image sprites. One-shot grid generation and fixed cell cutting are not an alternative sprite-generation route.
For attack repeat coverage, observed one-shot returns and structured loop failure reports, follow video-pipeline.
A pinned idle or attack whose last frame the video model drew again has its wrap blended by default (video-loop --wrap-blend auto, a redraw only; off cuts as filmed), with details in loop repair.
Scene creation consumes finished assets and remains optional. Asset metadata owns frames, native durations and anchors; scene specs own placement, scale, playback rate, planes, camera and light. Measure stride only with declared same-foot contact and an isolated foot ROI; unknown contact stays unverified. Apply only a verified report for the exact selected asset with an explicit scene direction. Never infer walking direction from the bottommost silhouette, reverse frames or change source assets to make a scene work.
SPRITE_GEN_ROOT is the absolute installed repository path. Use $SPRITE_GEN_ROOT/.venv/bin/sprite-gen or $SPRITE_GEN_ROOT/.venv/bin/python; do not assume an activated shell. 폴백 금지: create a missing venv or report the failure, never use an arbitrary global Python. NumPy 가 없는 인터프리터 fails at package import. Setup and diagnosis: interpreter.
Without RIFE, tell the user which loops went unrepaired and offer the install; after it, cut those loops again and run video-cycle-align. loop-repair.
run-contract owns numeric requests, run layout, atomic publication and curated exports. architecture explains domain ownership. docs index lists every specialized feature and QA procedure. sprite-gen --help derives the command map from the package catalog. Never replace an engine stage — extraction, the loop cut, set alignment, loop repair — with a script of your own while presenting the result as a pipeline output. Where a stage's result is wrong, use the engine's own options first, keep the engine's result as the comparison, report the defect against the engine, and name in the delivery each stage done by hand and why. A new clip is for what no stage can reach: the drawing, the motion itself, a clip that holds no whole cycle (loop-review) — and a clip the engine names for one: when the alignment report's retake lists a loop (reason held-drawings: the cycle cut from its clip shows each drawing for two or three frames, the set's length leaves it at under 13 drawings a second, and frames between its drawings could not be made, so the loop halts there; or filmed-ghost: a filmed ghost frame has filmed ghosts on both sides, so no clean frame stands there and the loop shows it — reasons lists both where both apply), run the engine verbs first as above, then film that direction again and align the set anew rather than hand-painting the gap; tell the user what the reason was and that a new take usually fixes it (loop-repair section 4).
English · 한국어 · 日本語 · 简体中文 · Español · Français
Ask an image model for a "sprite sheet" and you know what you get: a character whose face changes every frame, a background that won't key out, poses that overlap and drift off-grid, and a PNG your game engine can't actually consume. Cute demo, useless asset.
sprite-gen is a Codex/Claude skill and a Python CLI that closes that gap. Give it one base image — it drives generation row by row, locks the character's identity, strips the chroma background to real alpha, extracts each pose as a clean transparent frame, and bakes a runtime atlas with a machine-readable manifest.json.frame_layout. Or hand the same still to a video model and get back a seamless, transparent loop per motion state. For the last 10% that generation never gets right, a curation webview lets you compare, reject, nudge and watch the loop live before you bake.
For side sprites, video-set uses --facing right|left consistently across canvas placement and clip prompts. Its direction detector is record-only by default (--facing-fix none) and can be wrong even at high confidence. Use gen --ref image.png --facing right to request orientation in the generation prompt; gen otherwise preserves orientation. Prompts request direction but cannot guarantee the result. Correction is opt-in: --facing-fix mirror, or gen --facing-fix regen; review the still before using either. See facing options.
Ask for sprites or an image. The agent checks access, asks only for missing provider/motion choices, runs the existing pipeline, and delivers the files. The curation view is optional. Save your choices once to reuse separate sprite and image defaults; a one-off request does not overwrite them. User workflow and defaults.
The two sprite pipelines are ordered generation flows. Tool groups contain independent commands; scene creation is an optional workflow that consumes finished assets. sprite-gen --help prints this map and groups commands by the code domain that owns them.
flowchart LR
subgraph A["A · atlas rows"]
direction LR
a1[prepare] --> a2["gen · gen-set"] --> a3[extract] --> a5[compose-atlas]
a5 -.-> a4["curation (optional)"]
a4 --> a5
end
subgraph B["B · video → loop"]
direction LR
b1[video-canvas] --> b2[video] --> b3[video-frames] --> b4[video-loop]
end
subgraph C["C · utilities"]
direction LR
c1[cutout] ~~~ c2[slice-sheet] ~~~ c4[ui-kit] ~~~ c3[unpack-atlas]
end
subgraph D["D · post-processing"]
direction LR
d1[recolor] ~~~ d2[export-*]
end
subgraph E["E · asset tools (independent)"]
e1[background-tile] ~~~ e2[shadow] ~~~ e3[inspect-motion]
end
subgraph S["S · scene (optional)"]
s1["existing assets + scene.json"] --> s2[scene-render]
s1 --> s3[scene-inspect]
end
| Pipeline / tool group / workflow | What goes in → what comes out | Docs |
|---|---|---|
| A · atlas rows | one still + a list of states → sprite-sheet-alpha.png + manifest.json.frame_layout, with Breathe baked on idle poses |
run-contract · breathing |
| B · video → loop | one still → per state, a seamless transparent GIF / WebP / strip, animated by Grok Imagine and cut at its true period | video-pipeline · video |
| C · utilities | an imported image or grid sheet → clean transparent cuts; a finished atlas → a curator-ready run | sheet-slicing · curation |
| D · post-processing | a finished sheet → deterministic colourways, Aseprite / Phaser / Flame exports | recolor · engine-export |
| E · asset tools | independent PNGs or animations → repeating tiles, projected shadows, motion/contact measurements | asset-tools |
| S · scene | existing assets + placement, camera and lighting → PNG frames, MP4/GIF, inspection and placement metadata | scene |
Full index: docs/README.md. Architecture with domain and pipeline diagrams: docs/architecture.md.
sprite-sheet-alpha.png) — real alpha, no leftover chroma fringe, verified against white backgrounds (why the extractor unmixes instead of peeling).manifest.json.frame_layout) — absolute frame rectangles, per-state fps and loop flags. Your engine samples rectangles; it never guesses a grid.recolor bakes N variant sheets from a palette map; same input, same output bytes (details).# install (Pillow, NumPy) into a fresh virtualenv — the venv is the only supported interpreter
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
sprite-gen --help
A · atlas rows — one still to a runtime atlas.
sprite-gen prepare --out-dir <run> --character-id <id> --base-image base.png # request, guides, prompts
sprite-gen gen-set --run-dir <run> --provider codex # every state row, 4 at a time
sprite-gen extract --run-dir <run> # chroma → transparent frames
sprite-gen compose-atlas --run-dir <run> # sprite-sheet-alpha.png + manifest.json
sprite-gen curation --run-dir <run> # (optional) pick, nudge, breathe
B · video → loop — one still to transparent loops (needs ffmpeg, img2webp, and your own grok login or XAI_API_KEY). Walk and run loops have their jump frames repaired and a direction set shares one cycle length through RIFE: install it once with sprite-gen rife install. Without it those loops are cut as filmed, with a warning (loop-repair).
sprite-gen video-set --base side=still.png --states idle,walk,run,jump,attack --out-dir set/
# per item: video-canvas → video → video-frames → video-loop; set/table.md names every result
Making clips through a video MCP connected to your agent? With ZCRE's (지크), the agent makes the clip on yo