sprite-forge

Generate game sprites, SVG characters, ASCII art, animated mascots, and isometric turnarounds from images or descriptions. Five output modes: SVG characters, game sprite sheets with atlas metadata, 8-

SKILL.md

GitHub

Sprite Forge

Game-ready sprites from images or text, September 2026 edition. Five pipelines, two wired providers (Retro Diffusion, fal genmedia), and a profile runner so a project can declare its own pipeline.

Cost rule: every provider script is a free dry run until you pass --yes. Retro Diffusion runs check_cost; genmedia prints the exact command and price. Never add --yes on a user's behalf without stating the estimate.

When to use

  • Pixel-art characters, 8-direction rotations, animated frames from a start image
  • Walk/idle/attack sprite sheets from video (first+last-frame loops)
  • HD painted turnarounds via GPT Image 2.5 edits
  • Upscaling indexed sprites without new colours (faithful-HD rule)
  • Atlas metadata with states, fps, loop, anchor (Phaser/Godot/Flame/Aseprite)
  • SVG mascots with GSAP, ASCII art, lil-agents dock videos (unchanged niche)

Not for: 3D generation (meshy skill), photoreal image editing (nano-banana-pro skill), generated sprites where original assets exist and parity is required (see references/pipelines/open-rebellion.md).

Work sequentially inside a pipeline; parallel agents only for independent characters.

Quick start

S=~/.claude/skills/sprite-forge/scripts
# 8-direction pixel sprite (one Retro Diffusion call, $0.25)
python3 $S/turnaround.py --mode pixel --prompt "astromech droid" --ref droid.png --out ./turn   # add --yes
# Walk cycle: Wan 3 clip on chroma -> key -> feet-align -> atlas v2 (+ Aseprite JSON)
python3 $S/video_to_spritesheet.py --provider genmedia --start-frame hero.png --end-frame hero.png \
  --prompt "side-view walk cycle in place, flat #00FF00 background" --duration 4 --cell-size 128x128 \
  --dedup 6 --state walk:12:loop --aseprite-json -o walk.png                                   # add --yes
# Indexed sprite 4x with the same palette
python3 $S/pixel_scale.py --input sprite.png --output sprite_4x.png --mode scale4x
# Frames -> sheet with manifest v2
python3 $S/stitch_spritesheet.py --input-dir frames/ --atlas v2 --state idle:8:loop --cols 8 -o idle.png
# Profile
python3 $S/run_pipeline.py ~/.claude/skills/sprite-forge/pipelines/example.json --dry-run

Pipeline 1: Turnaround (turnaround.py)

  • --mode pixel: rd_animation__8_dir_rotation (80x80, <= 5 refs) -> split -> stitch --atlas v2 --directions 8. One paid call.
  • --mode hd: anchor -> 4 cardinal edits -> 4 diagonal edits (anchor + two neighbours as refs) -> key if --chroma -> align_frames -> stitch. Default model openai/gpt-image-2.5/sunburst/edit (true alpha); --model fal-ai/nano-banana-2/edit --chroma for typed refs.
  • Order in the sheet: S, SE, E, NE, N, NW, W, SW. See references/turnaround.md.

Pipeline 2: Video -> sprite sheet (video_to_spritesheet.py)

[genmedia clip] -> ffmpeg -> chroma_key (once) -> align_frames (feet line, dedup, loop check) -> stitch v2. Default model alibaba/wan-3.0/image-to-video with --end-frame = start frame for a seamless loop; alternates Seedance 2.5, Kling 3 (@Element identity), Hailuo 03 (timecoded multi-state). Per-frame rembg on video is refused (matte flicker) unless --allow-rembg-video. Recipe and model table: references/video-to-spritesheet.md; jitter rules: references/frame-alignment.md.

Pipeline 3: Pixel scaling and palette (deterministic)

  • pixel_scale.py --mode nearest|scale2x|scale3x|scale4x, mode-P in, mode-P out, palette block and transparency kept, colour count never grows. --family dir/ --output-dir out/ transforms a frame family and writes family.json with a family sha256.
  • Retro Diffusion free tools for the generative side: retro_diffusion.py tool k_centroid_downscale --input-image in.png --field width=64 --field height=64, tool palette_converter --palette pal.png, tool color_reducer --field color_count=16, tool pixel_correction; pixelate (rd_pro__pixelate, $0.18) turns any raster into native pixel art.
  • pixel_art_generator.py survives only for the SVG <rect> mascot path (Pipeline 4).

Pipeline 4: SVG characters and GSAP mascots

Gemini SVG-as-code for clean vectors (references/gemini-svg-generation.md); pixel_art_generator.py --grid 16-24 --colors 4-6 --merge for rect-based pixel mascots (references/pixel-art-svgs.md); animation_builder.py --preset idle|bounce|lean|wave|walk|walk-and-bounce|walk-and-wave|typing for GSAP timelines (references/gsap-timeline-patterns.md, references/ayotomcs-deconstruction.md); generate_walk_video.py sheet.png --cols 6 --name robot for lil-agents HEVC-alpha dock videos (references/lil-agents-character-spec.md). Trim AI images first: magick in.png -fuzz 15% -trim +repage out.png.

Pipeline 5: ASCII

image_to_ascii.py img.png --mode gray|color|jp2a --width 80 for static art (references/ascii-art-techniques.md); frame-based React components and the asciistudio catalog in references/ascii-animation-components.md and references/animated-ascii-sprites.md; template assets/ascii-animation-template.tsx.

Profiles (pipelines/)

A profile (pipelines/schema.json) is an ordered list of stages over these scripts with ${var} substitution. run_pipeline.py profile.json [--dry-run] [--yes] [--stage name] [--from name] [--force] writes <output_root>/run/<id>/manifest.json with per-stage commands and input/output sha256 and skips unchanged stages. pipelines/example.json is the generic character profile; project profiles live in their repos (Open Rebellion: references/pipelines/open-rebellion.md).

Provider matrix (short)

Need Use Alpha
Pixel still / identity RD rd_pro__default + --ref (<= 9), $0.18 --remove-bg
8 directions, pixel RD rotate8, $0.25 yes
Animate a start frame RD `animate --action walking idle
HD anchor / edits openai/gpt-image-2.5/sunburst[/edit] via gen_image.py yes
Many typed refs fal-ai/nano-banana-2/edit no, chroma
Loops alibaba/wan-3.0/image-to-video first+last no, chroma
Identity-critical clip fal-ai/kling-video/v3/pro/image-to-video @Element1 no, chroma

Full table, prices, setup commands and PixelLab notes: references/provider-matrix.md. Setup: genmedia CLI (curl https://genmedia.sh/install -fsS | bash, then genmedia setup --non-interactive --api-key "$FAL_KEY"), RETRODIFFUSION_API_KEY in ~/.config/env/secrets.env; optional RD MCP claude mcp add --transport http retro-diffusion https://mcp.retrodiffusion.ai/mcp --header "Authorization: Bearer rdpk-...".

Gotchas

  • Feet line, not bbox. Halos and shadows move the bbox; align_frames.py scans for the lowest row with >= 5% solid width. Check feet_line_variance < 1.
  • One matte per clip. Chroma-key video frames with one setting; per-frame rembg flickers (perimeter_cv > 0.15).
  • RD limits. Styles cap at 384 px, animations at 256 and must match the start frame; input_image must be RGB without alpha (scripts composite onto --matte); negative is ignored; never write "pixel art" in RD prompts; balance is charged before generation.
  • genmedia. Use --async for anything over ~5 s (the video script does); verify endpoint ids and field names with genmedia models / genmedia schema; the GPT Image 2.5 endpoint spelling came from a third-party commit.
  • Nano Banana 2 still has no alpha; GPT Image 2.5 and RD do. Never key magenta on warm costumes.
  • Manifest v2 pastes at cell origin; use --fit scale only for legacy sheets that need centring.
  • Pixel art through the aligner: --no-scale, and the scaler uses nearest below 256 px.
  • Turnarounds: cardinals, then diagonals; diagonals come out shorter, so never skip the align step.

Dependencies

Pillow (numpy optional, speeds pixel_scale.py), ffmpeg, ImageMagick 7, genmedia CLI (fal), rembg (stills only), jp2a (optional), GSAP 3 via CDN. Keys: FAL_KEY, RETRODIFFUSION_API_KEY (loaded by scripts/_secrets.py from env or ~/.config/env/secrets.env).

Reference

  • references/provider-matrix.md, references/landscape-2026-09.md — endpoints, prices, what changed
  • references/turnaround.md, references/video-to-spritesheet.md, references/frame-alignment.md, references/chroma-key-transparency.md — pipeline details
  • references/gemini-svg-generation.md, references/pixel-art-svgs.md, references/gsap-timeline-patterns.md, references/ayotomcs-deconstruction.md, references/lil-agents-character-spec.md — SVG and mascot
  • references/ascii-art-techniques.md, references/ascii-animation-components.md, references/animated-ascii-sprites.md — ASCII
  • references/pipelines/open-rebellion.md — project profile pointer
  • tests/test_deterministic.py — run python3 tests/test_deterministic.py