2D Asset Pipeline
A pixel art asset creation pipeline. Trigger it with a text description to generate game-ready sprites and animated GIFs — fully transparent background, exact pixel dimensions, and no manual cleanup.
Two workflows:
- Single asset — describe a sprite and get a sized, transparent PNG ready to drop into a game project
- Animation frames — describe a sprite and an animation, get a looping GIF with frame-accurate timing
Both workflows save directly to ~/game_assets by default.

Setup
1. Download Friday
- Go to hellofriday.ai and download the macOS installer
- Open the DMG and drag Friday to your Applications folder
- Launch Friday and complete the initial setup
2. Import the workspace
- Open Friday and go to Discover Spaces
- Find this workspace and click it
- Click Add Space
3. Install dependencies
The pipeline uses ImageMagick to convert and resize images and Pillow for spritesheet processing. Both must be available in your PATH.
ImageMagick
brew install imagemagick
Pillow (installed automatically by the Friday SDK Python environment — no manual action needed)
4. That's it
No API keys, no external services, no email address to configure. The workspace runs entirely locally.
How it works
Single asset pipeline

| Component | Role |
|---|---|
create-pixel-asset signal |
HTTP trigger at /create-pixel-asset accepting description, size, style |
create-pixel-asset-job |
Five-state FSM: idle → generate → save → remove background → resize → done |
pixel-asset-generator |
Atlas image-generation agent; produces a neon-green-background PNG at requested canvas size |
file-saver |
Python user agent; fetches the artifact from the Friday API and writes it to disk |
background-remover |
LLM agent (Claude Haiku); runs two-pass ImageMagick chroma key to remove neon green and make the sprite transparent |
image-resizer |
LLM agent (Claude Haiku); runs ImageMagick nearest-neighbour resize to exact target dimensions |
Animation pipeline

| Component | Role |
|---|---|
create-animation-frames signal |
HTTP trigger at /create-animation-frames |
create-animation-frames-job |
Eight-state FSM with a retry loop: idle → generate spritesheet → save → normalize → check → route → assemble GIF → resize → done |
animation-frame-generator |
Atlas image-generation agent; produces a horizontal spritesheet with all frames side by side |
file-saver |
Python user agent; saves the raw spritesheet PNG to disk |
spritesheet-normalizer |
Python user agent; detects background color from corners, slices frames to exact dimensions using NEAREST resampling, and returns regenerate: true if the canvas is malformed |
check-normalize-result |
Inline LLM step (Claude Haiku); reads normalizer output and emits REGENERATE or OK |
route-after-normalize |
Inline LLM step (Claude Haiku); routes the FSM to retry generation or proceed to assembly |
gif-assembler |
LLM agent (Claude Opus); runs a Python/Pillow script to slice frames and produce the final looping GIF |
image-resizer |
LLM agent (Claude Haiku); final nearest-neighbour resize |
filesystem MCP server |
Provides the bash tool used by gif-assembler, image-resizer, and background-remover |
The animation job includes a regeneration loop: if the spritesheet normalizer cannot parse frame boundaries (canvas dimensions wrong and no clean column separators detected), it sets regenerate: true and the FSM routes back to generate-frames to try again.