with-pebbly/aseprite-ai-artist

Your coding agent paints pixel art in the Aseprite window you already have open. MCP server + skills for Claude Code, omp, Codex, Gemini CLI and Cursor — draws, looks at its work, animates and exports. Gallery and benchmark: pixeli.pebbly.space

TypeScript

287

128 commits

updated Oct 11, 2026

See the code

See what people are saying

SourceMessageScoreDate

I significantly improved the pixel art quality of my Aseprite MCP! (r/mcp)

Some of you may remember my previous post: [https://www.reddit.com/r/mcp/s/WqEwY60FKI](https://www.reddit.com/r/mcp/s/WqEwY60FKI) I’ve spent the last week rebuilding a lot of the drawing workflow The biggest changes: 1. **Grid loop** The agent now represents pixel art as a text grid, reads it back…

1

Oct 8, 2026

README

A rainy night in Japan, filmed by a slowly swaying camera through layers of rain: a raccoon pulls a can from a vending machine, lightning flashes over the rooftops, maple leaves blow past an old bookshop where a girl in a big knit sweater reads and sips cocoa in warm lamplight

Aseprite AI Artist

Your coding agent, painting in the Aseprite window you already have open.

Not a generated PNG. Not a file changed behind your back. The document on your screen, one pixel at a time — and every step is one Ctrl+Z.

npm CI licence

☔ 500×400 · 384 frames at 24 fps · 16 s · 24 layers — drawn by Claude Opus 5.5 through this server.

Install · How it draws · Skills · Gallery


✨ What it feels like

"Draw me a 32×32 knight in the PICO-8 palette, then give him a 4-frame idle."

You type that, and watch it happen in Aseprite: a palette, a silhouette, shading, layers, a breathing idle, a tagged cycle. The agent looks at its own work after every step, and at the end tells you what it compromised on.

You stay in charge. Don't like the helmet? Ctrl+Z, or just say so.

Works with Claude Code, omp, Codex CLI, Gemini CLI, Cursor, VS Code and Windsurf. Best results so far: Claude Opus 5.5.

🚀 Install

You need Aseprite 1.3+ and Node 22.6+ (macOS, Linux or Windows).

1. The Aseprite extension — then quit and reopen Aseprite:

npx @pebbly/aseprite-ai-artist install-extension

2. Your agent:

Claude Code
/plugin marketplace add with-pebbly/aseprite-ai-artist
/plugin install aseprite@aseprite-ai-artist
omp
omp plugin marketplace add with-pebbly/aseprite-ai-artist
omp plugin install aseprite@aseprite-ai-artist
Codex, Gemini, Cursor, VS Code, Windsurf
npx @pebbly/aseprite-ai-artist install codex      # or gemini, cursor, --all

Your config is backed up first; --dry-run shows the change.

3. Check it — restart your agent, then:

npx @pebbly/aseprite-ai-artist doctor

All ticks means you're ready. Updating? Run step 1 again. Odd setups (Steam, custom folders, Windows paths) are in docs/INSTALL.md.

No window? Headless mode

For CI or a batch of assets, the server can run Aseprite itself with no window:

npx @pebbly/aseprite-ai-artist serve --headless --aseprite /path/to/aseprite

Nothing is on disk until the agent saves, and it never touches a file your editor has open. It is never a fallback: if your window isn't attached, the agent asks instead of quietly switching.

🎨 How it draws

Ask /aseprite:studio for anything and it runs the whole job:

StageWhat happens
1ConnectChecks Aseprite is attached and reads what's open. If it isn't, it stops — it never edits files behind your back.
2BriefOnly for open-ended requests: size, palette, view, light — one message, one answer.
3ConceptFor anything new: writes the design down and gives you a prompt for an image model. Send back a concept sheet, or say "continue without".
4DrawSilhouette first, written as a text grid (below), then shading.
5AnimateSplits limbs onto layers, plans key poses and timing, draws each frame, tags the cycles.
6ReviewA separate critic who didn't draw it judges the result cold — what does it look like to someone never told? Blockers get fixed one at a time; a fix is kept only if the critic, shown both versions blind, prefers it.
7ExportSpritesheet + atlas, GIF or PNGs for your engine.

After every step that changed pixels, it looks at the result before moving on.

🔤 The grid loop

New in 0.5.0. The agent doesn't draw with circles and rectangles — it types the frame out, one character per pixel, and draws that text in one call. To fix something, it reads the canvas back in the same format and changes only the characters that are wrong.

Four steps: the agent writes a pebble as rows of characters; Aseprite draws it; the agent reads it back as text and changes two characters; Aseprite draws the pebble winking

It sees the whole shape while writing it, so silhouettes stay even, limbs keep their length between frames, and an edit never spills into its neighbours. Animation is the same trick: copy the last frame's rows, move the arm, draw.

Since 0.6.0 every character stands for one palette entry, the same on every read, so a big canvas can be read and edited in pieces without the letters changing meaning between them. A grid can be as large as the canvas.

Early signal, not a measurement: with the same model and prompts, the mage benchmark went 3 → 4/10 and the road 1 → 3/10; the tree stayed at 2 (compare them).

📚 The pixel-art knowledge base

The agent doesn't improvise a hand at 16 px or a horse's walk — it looks them up.

62 rules · ~400 pixel templates · 2006 palettes — browse them at pixeli.pebbly.space/knowledge 👀

🧍 Craft🌍 World
0x Core — loop, palette, shading, outlines5x Creatures — quadrupeds, birds, monsters
1x Technique — lines, anti-aliasing, dithering6x Environments — skies, water, tiles, buildings
2x Colour — hue-shifted ramps, materials, light7x Objects & 3D — perspective, isometric, props
3x Characters — anatomy, faces, hands, clothing8x Effects & UI — fire, magic, particles, fonts
4x Animation — idle, walk, jumps, attacks9x Style — console eras, tells of generated art

Every rule gives size budgets, a procedure, common mistakes and grid templates the agent pastes straight onto the canvas. Any MCP client reads them as rules:// resources from rules/.

🎨 Palettes: the console classics plus Lospec's 2000 most-downloaded, each credited — preset: "endesga-32", or just a word of the name.

👀 Review by fresh eyes

New in 0.8.0. The agent that drew a sprite is the worst judge of it — it knows what it meant, so it sees it. studio hands the result to pixel-critic, which first writes a cold read (what the picture shows to someone who was never told), then a scored critique. A draft ships at 7/10 with nothing blocking; below that the agent fixes the one thing named, snapshotting first. Each fix goes back to the critic as a blind A/B — old and new under neutral names — and stays only if it wins, so a round can't quietly make good art worse.

It costs time (roughly one more critique per round) and its effect on quality is not yet measured — the thirteen experiment runs behind it are in the gallery, next to the benchmark rows.

🧰 Skills

studio picks these for you. Call one directly when you know the step you want — as /aseprite:<name> in Claude Code and omp, or just ask elsewhere.

SkillForTry
🎬 studioanything — it plans and runs the rest/aseprite:studio a fox, 32×32, sleeping loop
📝 briefa vague idea/aseprite:brief a cosy tavern keeper
🖼️ concepta design or storyboard before drawing/aseprite:concept a fire mage, 4-frame walk
📄 newa fresh document set up right/aseprite:new 64×64, PICO-8
🎨 palettecolour: a retro look, ramps, cleanup/aseprite:palette give this a Game Boy look
✏️ drawmaking the thing, text included/aseprite:draw a fox curled up asleep
🌗 shadeflat art that needs light/aseprite:shade light from the upper left
🦴 rigsplitting a character for animation/aseprite:rig split the knight
🏃 animatewalk, idle, attack cycles/aseprite:animate 8-frame walk cycle
🧱 tilesetterrain and autotiles/aseprite:tileset grass-to-dirt, 16px
🔍 reviewan honest critique/aseprite:review why does this look off?
🩹 fixchanging art without wrecking it/aseprite:fix make him more menacing
📦 exportfiles for your engine/aseprite:export spritesheet for Godot
🗂️ submitsharing it in the gallery/aseprite:submit

In Claude Code and omp, four specialists take stages off the main agent: palette-smith, rig-builder, animation-director and the read-only pixel-critic.

🏆 Which model?

Benchmark leaderboard: every model's score out of 100, with compliance, craft, speed and coverage

Live from the benchmark: every model draws the same fixed prompts and is scored against written criteria. Your model is not on it? Send us a sprite!

Everything drawn with the plugin — with its prompts, models and .aseprite source — is at pixeli.pebbly.space. The benchmark puts every model and plugin version through the same three fixed prompts and scores them against written criteria, and the knowledge base shows the rulebook the agents draw by.

Made something? Ask your agent for /aseprite:submit — it packages the files and opens the pull request.

🔧 Under the hood

your agent  ──MCP──▶  server  ──▶  bridge  ──▶  Aseprite extension
  • 18 tools, grouped by noun (draw, look, layer, frame, export…) instead of ninety — every tool costs context on every turn. Reference.
  • A knowledge base in rules/ — 62 files from line craft to walk cycles, with pixel templates — served over MCP, so every client gets the same craft knowledge.
  • Safe by default. Every action is one undo step. With Aseprite detached, tools refuse instead of editing files on disk. Everything binds to 127.0.0.1. Details · security.

🛠️ Development

pnpm install && pnpm run build
pnpm test                 # TypeScript
pnpm run test:extension   # the Lua handlers, inside a real Aseprite
pnpm gallery:check        # gallery and benchmark data
pnpm web:dev              # the site, locally

Read AGENTS.md before changing anything — it lists the rules that aren't negotiable and the Lua gotchas that already cost someone a day.

📜 Licence

MIT — see LICENSE. Aseprite is a trademark of Igara Studio S.A.; this project isn't affiliated with them.

Made with ☕ and a lot of Ctrl+Z.
ai-agents
aseprite
benchmark
claude-code
gamedev
lua
mcp
model-context-protocol
pixel-art
sprite-animation
spritesheet
typescript

with-pebbly/aseprite-ai-artist

Your coding agent paints pixel art in the Aseprite window you already have open. MCP server + skills for Claude Code, omp, Codex, Gemini CLI and Cursor — draws, looks at its work, animates and exports. Gallery and benchmark: pixeli.pebbly.space

TypeScript

287

128 commits

updated Oct 11, 2026

See the code

See what people are saying

SourceMessageScoreDate

I significantly improved the pixel art quality of my Aseprite MCP! (r/mcp)

Some of you may remember my previous post: [https://www.reddit.com/r/mcp/s/WqEwY60FKI](https://www.reddit.com/r/mcp/s/WqEwY60FKI) I’ve spent the last week rebuilding a lot of the drawing workflow The biggest changes: 1. **Grid loop** The agent now represents pixel art as a text grid, reads it back…

1

Oct 8, 2026

README

A rainy night in Japan, filmed by a slowly swaying camera through layers of rain: a raccoon pulls a can from a vending machine, lightning flashes over the rooftops, maple leaves blow past an old bookshop where a girl in a big knit sweater reads and sips cocoa in warm lamplight

Aseprite AI Artist

Your coding agent, painting in the Aseprite window you already have open.

Not a generated PNG. Not a file changed behind your back. The document on your screen, one pixel at a time — and every step is one Ctrl+Z.

npm CI licence

☔ 500×400 · 384 frames at 24 fps · 16 s · 24 layers — drawn by Claude Opus 5.5 through this server.

Install · How it draws · Skills · Gallery


✨ What it feels like

"Draw me a 32×32 knight in the PICO-8 palette, then give him a 4-frame idle."

You type that, and watch it happen in Aseprite: a palette, a silhouette, shading, layers, a breathing idle, a tagged cycle. The agent looks at its own work after every step, and at the end tells you what it compromised on.

You stay in charge. Don't like the helmet? Ctrl+Z, or just say so.

Works with Claude Code, omp, Codex CLI, Gemini CLI, Cursor, VS Code and Windsurf. Best results so far: Claude Opus 5.5.

🚀 Install

You need Aseprite 1.3+ and Node 22.6+ (macOS, Linux or Windows).

1. The Aseprite extension — then quit and reopen Aseprite:

npx @pebbly/aseprite-ai-artist install-extension

2. Your agent:

Claude Code
/plugin marketplace add with-pebbly/aseprite-ai-artist
/plugin install aseprite@aseprite-ai-artist
omp
omp plugin marketplace add with-pebbly/aseprite-ai-artist
omp plugin install aseprite@aseprite-ai-artist
Codex, Gemini, Cursor, VS Code, Windsurf
npx @pebbly/aseprite-ai-artist install codex      # or gemini, cursor, --all

Your config is backed up first; --dry-run shows the change.

3. Check it — restart your agent, then:

npx @pebbly/aseprite-ai-artist doctor

All ticks means you're ready. Updating? Run step 1 again. Odd setups (Steam, custom folders, Windows paths) are in docs/INSTALL.md.

No window? Headless mode

For CI or a batch of assets, the server can run Aseprite itself with no window:

npx @pebbly/aseprite-ai-artist serve --headless --aseprite /path/to/aseprite

Nothing is on disk until the agent saves, and it never touches a file your editor has open. It is never a fallback: if your window isn't attached, the agent asks instead of quietly switching.

🎨 How it draws

Ask /aseprite:studio for anything and it runs the whole job:

StageWhat happens
1ConnectChecks Aseprite is attached and reads what's open. If it isn't, it stops — it never edits files behind your back.
2BriefOnly for open-ended requests: size, palette, view, light — one message, one answer.
3ConceptFor anything new: writes the design down and gives you a prompt for an image model. Send back a concept sheet, or say "continue without".
4DrawSilhouette first, written as a text grid (below), then shading.
5AnimateSplits limbs onto layers, plans key poses and timing, draws each frame, tags the cycles.
6ReviewA separate critic who didn't draw it judges the result cold — what does it look like to someone never told? Blockers get fixed one at a time; a fix is kept only if the critic, shown both versions blind, prefers it.
7ExportSpritesheet + atlas, GIF or PNGs for your engine.

After every step that changed pixels, it looks at the result before moving on.

🔤 The grid loop

New in 0.5.0. The agent doesn't draw with circles and rectangles — it types the frame out, one character per pixel, and draws that text in one call. To fix something, it reads the canvas back in the same format and changes only the characters that are wrong.

Four steps: the agent writes a pebble as rows of characters; Aseprite draws it; the agent reads it back as text and changes two characters; Aseprite draws the pebble winking

It sees the whole shape while writing it, so silhouettes stay even, limbs keep their length between frames, and an edit never spills into its neighbours. Animation is the same trick: copy the last frame's rows, move the arm, draw.

Since 0.6.0 every character stands for one palette entry, the same on every read, so a big canvas can be read and edited in pieces without the letters changing meaning between them. A grid can be as large as the canvas.

Early signal, not a measurement: with the same model and prompts, the mage benchmark went 3 → 4/10 and the road 1 → 3/10; the tree stayed at 2 (compare them).

📚 The pixel-art knowledge base

The agent doesn't improvise a hand at 16 px or a horse's walk — it looks them up.

62 rules · ~400 pixel templates · 2006 palettes — browse them at pixeli.pebbly.space/knowledge 👀

🧍 Craft🌍 World
0x Core — loop, palette, shading, outlines5x Creatures — quadrupeds, birds, monsters
1x Technique — lines, anti-aliasing, dithering6x Environments — skies, water, tiles, buildings
2x Colour — hue-shifted ramps, materials, light7x Objects & 3D — perspective, isometric, props
3x Characters — anatomy, faces, hands, clothing8x Effects & UI — fire, magic, particles, fonts
4x Animation — idle, walk, jumps, attacks9x Style — console eras, tells of generated art

Every rule gives size budgets, a procedure, common mistakes and grid templates the agent pastes straight onto the canvas. Any MCP client reads them as rules:// resources from rules/.

🎨 Palettes: the console classics plus Lospec's 2000 most-downloaded, each credited — preset: "endesga-32", or just a word of the name.

👀 Review by fresh eyes

New in 0.8.0. The agent that drew a sprite is the worst judge of it — it knows what it meant, so it sees it. studio hands the result to pixel-critic, which first writes a cold read (what the picture shows to someone who was never told), then a scored critique. A draft ships at 7/10 with nothing blocking; below that the agent fixes the one thing named, snapshotting first. Each fix goes back to the critic as a blind A/B — old and new under neutral names — and stays only if it wins, so a round can't quietly make good art worse.

It costs time (roughly one more critique per round) and its effect on quality is not yet measured — the thirteen experiment runs behind it are in the gallery, next to the benchmark rows.

🧰 Skills

studio picks these for you. Call one directly when you know the step you want — as /aseprite:<name> in Claude Code and omp, or just ask elsewhere.

SkillForTry
🎬 studioanything — it plans and runs the rest/aseprite:studio a fox, 32×32, sleeping loop
📝 briefa vague idea/aseprite:brief a cosy tavern keeper
🖼️ concepta design or storyboard before drawing/aseprite:concept a fire mage, 4-frame walk
📄 newa fresh document set up right/aseprite:new 64×64, PICO-8
🎨 palettecolour: a retro look, ramps, cleanup/aseprite:palette give this a Game Boy look
✏️ drawmaking the thing, text included/aseprite:draw a fox curled up asleep
🌗 shadeflat art that needs light/aseprite:shade light from the upper left
🦴 rigsplitting a character for animation/aseprite:rig split the knight
🏃 animatewalk, idle, attack cycles/aseprite:animate 8-frame walk cycle
🧱 tilesetterrain and autotiles/aseprite:tileset grass-to-dirt, 16px
🔍 reviewan honest critique/aseprite:review why does this look off?
🩹 fixchanging art without wrecking it/aseprite:fix make him more menacing
📦 exportfiles for your engine/aseprite:export spritesheet for Godot
🗂️ submitsharing it in the gallery/aseprite:submit

In Claude Code and omp, four specialists take stages off the main agent: palette-smith, rig-builder, animation-director and the read-only pixel-critic.

🏆 Which model?

Benchmark leaderboard: every model's score out of 100, with compliance, craft, speed and coverage

Live from the benchmark: every model draws the same fixed prompts and is scored against written criteria. Your model is not on it? Send us a sprite!

Everything drawn with the plugin — with its prompts, models and .aseprite source — is at pixeli.pebbly.space. The benchmark puts every model and plugin version through the same three fixed prompts and scores them against written criteria, and the knowledge base shows the rulebook the agents draw by.

Made something? Ask your agent for /aseprite:submit — it packages the files and opens the pull request.

🔧 Under the hood

your agent  ──MCP──▶  server  ──▶  bridge  ──▶  Aseprite extension
  • 18 tools, grouped by noun (draw, look, layer, frame, export…) instead of ninety — every tool costs context on every turn. Reference.
  • A knowledge base in rules/ — 62 files from line craft to walk cycles, with pixel templates — served over MCP, so every client gets the same craft knowledge.
  • Safe by default. Every action is one undo step. With Aseprite detached, tools refuse instead of editing files on disk. Everything binds to 127.0.0.1. Details · security.

🛠️ Development

pnpm install && pnpm run build
pnpm test                 # TypeScript
pnpm run test:extension   # the Lua handlers, inside a real Aseprite
pnpm gallery:check        # gallery and benchmark data
pnpm web:dev              # the site, locally

Read AGENTS.md before changing anything — it lists the rules that aren't negotiable and the Lua gotchas that already cost someone a day.

📜 Licence

MIT — see LICENSE. Aseprite is a trademark of Igara Studio S.A.; this project isn't affiliated with them.

Made with ☕ and a lot of Ctrl+Z.
ai-agents
aseprite
benchmark
claude-code
gamedev
lua
mcp
model-context-protocol
pixel-art
sprite-animation
spritesheet
typescript