From gamedev
Parses Aseprite (.ase/.aseprite) files to infer metadata (frames, layers, cels, tags, slices, palettes, tilesets), computes durations/bounds, and generates JSON for game engines/tools.
npx claudepluginhub kyh/vibedgamesThis skill uses the workspace's default tool permissions.
Understand `.ase`/`.aseprite` files as *structured timelines of layered pixel (or tilemap) cels*. This skill helps you **infer useful metadata** (animation timing, per-frame bounds, layer hierarchy, tags, slices, tilesets, palettes) and produce **engine-ready JSON** without guessing.
Exports pixel art sprites from Aseprite to PNG, GIF, spritesheets, and JSON metadata for game engines like Unity, Godot, Phaser. Supports layouts, scaling, and frame exports.
Validates asset manifests against PNGs on disk, probes sprite sheets/tilesets for non-empty grid frames, reports PNG dimensions for 2D game projects like Love2D.
Defines import, slicing, atlas packing, and naming rules for 2D sprite assets. Useful for standardizing sprite sheets, replacing placeholders, and validating new assets in 2D projects.
Share bugs, ideas, or general feedback.
Understand .ase/.aseprite files as structured timelines of layered pixel (or tilemap) cels. This skill helps you infer useful metadata (animation timing, per-frame bounds, layer hierarchy, tags, slices, tilesets, palettes) and produce engine-ready JSON without guessing.
An Aseprite file is "truth"; your code is the hypothesis. Prefer reading and verifying over hard-coding expectations.
Before inferring, ask:
Core principles
chunk_size, don't crash.header.speed is deprecated; each frame has its own duration (with compatibility fallback).Use the bundled inspector to turn a file into JSON you can reason about:
python3 .claude/skills/aseprite-inference/scripts/aseprite_inspect.py path/to/sprite.aseprite --json
If you need pixel-derived inference (e.g., tight bounds), opt in:
python3 .claude/skills/aseprite-inference/scripts/aseprite_inspect.py path/to/sprite.aseprite --json --decode-cels
When you decode cel pixels, you can additionally infer:
frames[], layers[], tags[], slices[], and a normalized frameMs[].gamedev-assets) before locking runtime offsets.❌ Anti-pattern: Assuming "speed" is authoritative Why bad: it's deprecated; frame duration is the real timeline. Better: apply compatibility fallback only when a frame duration is zero.
❌ Anti-pattern: Assuming palette always exists / always 256 entries Better: parse palette chunks when present; indexed sprites may still need transparency index handling.
❌ Anti-pattern: Hard-failing on unknown chunks Better: skip by chunk size and keep going; store unknown chunk summaries for debugging.
❌ Anti-pattern: Decompressing everything by default Better: decode only what you need; add safety limits for large sprites.
❌ Anti-pattern: Treating indexed pixels as RGBA Why bad: indexed cel pixels are palette indices; transparency is usually by transparent index (header). Better: keep "indexed" as its own path; only map to RGBA if you've actually parsed a palette (and record missing palette cases).
❌ Anti-pattern: Ignoring linked cels Why bad: you'll "lose" frames or infer empty bounds incorrectly. Better: do a post-pass that resolves links when you need pixel/bounds inference.
❌ Anti-pattern: Assuming a layer's UI grouping equals render grouping Why bad: group compositing behavior depends on header flags and blend/opacity validity rules. Better: treat groups as structural by default; only implement group compositing if you're building a renderer/exporter.
❌ Anti-pattern: Conflating authoring intent with render intent Why bad: tags/slices/user data describe intent; pixels describe appearance. These can disagree. Better: output both kinds of facts, and don't "correct" one with the other unless explicitly requested.
scripts/aseprite_inspect.py (binary parser + JSON; optional cel/tile decode)references/aseprite-format-cheatsheet.md (chunk map + gotchas)references/inference-recipes.md (how to compute bounds/timing/order safely)This domain rewards precision.