Manage game art assets from creation to in-engine. Use when organizing sprites, choosing art tools, setting up folder structures, managing source files, or planning asset production. For a solo dev learning art — practical pipeline, not art instruction.
The best art pipeline is the one you actually use. Start simple. Automate later.
Invariant Every asset has one source file and one export target. The source file is the editable original (layers, vectors, animation frames). The export is the game-ready file. Never edit exports directly.
Example
player_idle.ase (source, Aseprite) → export → player_idle.png (game-ready). Need to change the player? Edit the .ase, re-export. Never open the PNG in a pixel editor.
//BOUNDARY: Quick one-off assets (placeholder rectangles, debug markers) can skip the source file. But anything that will ship needs a source.
project/
├── assets/ ← game-ready exports (committed to git)
│ ├── sprites/
│ │ ├── player/
│ │ ├── enemies/
│ │ ├── items/
│ │ └── effects/
│ ├── tilesets/
│ ├── ui/
│ ├── backgrounds/
│ └── audio/ ← see sound-designer skill
│
├── art-source/ ← editable source files
│ ├── sprites/ ← mirrors assets/ structure
│ │ ├── player/
│ │ ├── enemies/
│ │ ├── items/
│ │ └── effects/
│ ├── tilesets/
│ ├── ui/
│ └── backgrounds/
│
└── marketing/ ← Steam capsule, screenshots, trailer
├── capsule/
├── screenshots/
└── trailer/
assets/ mirrors art-source/ in structure. Same subfolders, same naming.art-source/. Exports go in assets/.art-source/ can be gitignored if files are too large — but back them up (MinIO, external drive).marketing/ is separate because marketing assets have different requirements (resolutions, formats, Steam specs).[subject]_[variant]_[state]_[frame].png
| Component | Examples | Notes |
|-----------|----------|-------|
| subject | player, slime, sword, tile_grass | What the asset is |
| variant | red, elite, rusty | Optional — for variations |
| state | idle, run, attack, dead | Animation state |
| frame | 01, 02, 03 | For sprite sheets / animation frames |
Examples:
player_idle_01.pngslime_red_attack_03.pngsword_rusty.png (no state — static item)tile_grass_center.pngRules:
01 not 1)Source vs Export naming: Aseprite stores all animation frames in one .ase file. The source file is named without frame numbers: player_idle.ase. On export (File -> Export Sprite Sheet or batch export), frames become player_idle_01.png, player_idle_02.png, etc. One source file, many export files.
Pick ONE tool per category. Learn it. Switch only if it genuinely blocks you.
Aseprite — The standard for pixel art. Costs ~$20 or compile from source for free.
LibreSprite — Free, open-source fork of older Aseprite. Fewer features but functional.
Krita — Free, open-source. Full painting/illustration tool.
LDtk — Modern tile map editor by the creator of Dead Cells.
Tiled — The long-standing standard. More features, steeper learning curve.
Blender — Free, does everything. Steep learning curve but enormous community and tutorials.
| Property | Recommendation | |----------|---------------| | Format | PNG (lossless, transparency) | | Size | Power of 2 not required for modern engines, but keep consistent within a category | | Resolution | Choose one base resolution and stick with it. Common: 16x16, 32x32, 48x48, 64x64 | | Color depth | 32-bit RGBA |
| Property | Recommendation | |----------|---------------| | Tile size | 16x16 or 32x32 for pixel art; match sprite scale | | Format | Single PNG atlas with consistent grid | | Padding | 1px between tiles to prevent bleeding | | Export | Atlas + JSON metadata (LDtk or Tiled export) |
| Property | Recommendation | |----------|---------------| | Format | PNG with transparency | | Style | Match game's art style but prioritize readability | | 9-slice | Use 9-slice/9-patch for resizable panels and buttons |
Combine animation frames into a single image:
player_idle_sheet.png (4 frames, 32x32 each = 128x32 total)
┌────┬────┬────┬────┐
│ 01 │ 02 │ 03 │ 04 │
└────┴────┴────┴────┘
Export from Aseprite: File → Export Sprite Sheet → choose layout.
Art takes longer than you think. Use these estimates for sprint planning:
| Asset | Size | Estimate (Beginner) | |-------|------|---------------------| | Simple sprite (16x16, few colors) | S | 30-60 min | | Detailed sprite (32x32, animated) | M | 2-4 hours | | Character with full animation set | L | 1-2 days | | Tileset (basic, 20-30 tiles) | L | 1-2 days | | Full tileset (60+ tiles, autotile) | XL | 3-5 days | | UI mockup (one screen) | M | 2-4 hours | | Background/parallax (one layer) | M | 2-4 hours |
These are beginner estimates. They get faster with practice, but NOT as fast as you hope.
assets/ (exported PNGs) — always commit. These are small and essential.art-source/ — commit if files are reasonable size (<50MB total). Otherwise gitignore and back up separately.If source files are large (PSD, Blender files):
art-source/ to .gitignoreart-source/README.md listing what's stored and where the backup livesFor projects with many large source files, consider Git LFS. But for a solo dev starting out, the gitignore + backup approach is simpler.
art-source/ and assets/.When helping with art pipeline:
Player Idle (2).png, gently redirect to player_idle_02.png.When the user is choosing art tools:
scope-guardian skill — Art scope is content scopeprototype-coach skill — Art tests validate style feasibilitygdd-writer skill — Art Direction sectionn8n-workflow-builder skill — Automating asset processingsound-designer skill — Audio assets follow similar pipeline patternsOrganized assets compound. Messy assets multiply. Name it right the first time.
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer