Studio logo

Studio

Organization
with-pebbly
studio

The front door for any Aseprite or pixel-art request. Works out what the user actually wants, picks which workflows to run and in what order — and whether to work in the user's open Aseprite window or a headless batch Aseprite (`--headless` / `--live` force it) — hands parts to the specialist agents where the harness has them, and does not stop until the result has been looked at and reviewed. Use when a request spans several steps ("make me an animated knight for Godot") or when you are unsure which workflow applies.

Overview

Publisherwith-pebbly
Repositoryaseprite-ai-artist
Skill namestudio
Stars
456
Forks
28
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by with-pebbly on GitHub. Read the source before you install it.

Installation

Install the Studio AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/with-pebbly/aseprite-ai-artist/tree/main/skills/studio
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/with-pebbly/aseprite-ai-artist.git /tmp/aseprite-ai-artist
mkdir -p .claude/skills
cp -r /tmp/aseprite-ai-artist/skills/studio .claude/skills/studio
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Studio in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Studio on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Studio is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Take any Aseprite request end to end

The other workflows each do one thing well. This one decides which of them the request needs, runs them in the order that keeps mistakes cheap, and owns the result until it is finished. It does not replace them: at every step, read the workflow it names and follow that — do not do the step from memory.

Procedure

  1. Pick the Aseprite, then preflight. Two places the work can happen: live, the user's open window, which they watch and can undo; or headless, a batch Aseprite this server runs with no window, where the only results are your look previews and the files you save. Decide before the first call, from the request — see Live or headless below — and pass it: preflight mode="headless" or preflight mode="live". When the request says nothing either way, call preflight without mode and keep the mode the server started in.

    If not ready, stop and tell the user what to fix. Nothing below works without Aseprite, and editing files on disk instead is never an acceptable recovery. In headless there is no window: show previews as you go and save (sprite_manage op save_as) before reporting.

  2. Read the room. sprite_info on whatever is open. An open sprite changes the plan: "make it bigger" means a sprite that exists, and its canvas and palette answer questions you would otherwise have to ask.

  3. Classify the request against the table below. Most requests are one row; a big one ("animated knight, export for Godot") chains several. Write the chain down before starting — it is the plan you report progress against.

  4. Decide once whether to ask. Open-ended requests start with aseprite:brief, which puts every decision to the user in one message. Specific requests ("add a 1px outline", "export this as a GIF") do not — just do them. Never ask more than once per stage: a user who asked for a whole animation does not want to approve every frame.

  5. Design before drawing. Anything new — a character, a prop, a scene, an animation — goes through aseprite:concept before a pixel is placed: it writes the art spec (scenario, palette, poses), turns it into a prompt for an image model, and offers the user two ways on: generate a concept sheet or storyboard with that prompt and send it back, or continue without one. That offer rides in the brief's message when there is a brief, so the user still answers once. If they will send references, stop and wait; when the images arrive, aseprite:concept reads them into a PixelSpec and imports them. If the user already supplied reference art, skip the prompt and go straight to reading it.

  6. Run the chain. For each stage, read its skill (skill://<name>) and follow it. Hand a stage to a specialist agent when your harness has one (see below) — the agent reads the same rules, so the result is the same whether it runs or you do.

  7. Look after every stage that changed pixels. look op preview for the read, op ascii when position matters, op compare when there is a reference. A stage is done when you have seen its result, not when its tool reported success.

  8. Get judged by someone who did not draw it. For anything you drew or changed, hand the result to the pixel-critic agent where the harness has one — never grade your own work in place of it; you know what you meant, so you see it. Give it the document name and the brief, nothing about how it was made. Elsewhere, run aseprite:review and do its cold read first.

    The critique decides whether you iterate at all. A draft ships as it is when its critique has no BLOCKING finding and scores 7/10 or more — note its other findings in your report and stop. Below that, or while any BLOCKING finding remains, fix it — at most three fix rounds. Stopping a weak draft only because nothing was marked BLOCKING leaves it weak.

    Each round fixes the BLOCKING findings, or when there are none the one change the critic names as its first fix — never a general polish. A fresh critic always finds something, and each finds something different; polishing on that alone rebuilds parts that already worked. The guards below are what keep a round from doing that:

    • Snapshot before you touch it. export op="png" the current frame (or op="gif" for an animation) to a scratch path, and keep an exact copy of every layer you will change — export op="aseprite" to a scratch path, or the layer's rows from look op="ascii". Restoring means writing those rows back as a grid at the same x/y, or opening the copy and layer op="duplicate" toSprite=<document>.
    • Fix, don't redraw. A fix changes the pixels the finding points at — read that region with look op="ascii", change those rows, write them back as a grid — or recolours a mass that is too dark (recolor). If the round changed more than about a quarter of a layer's opaque pixels, it was a redraw: restore the snapshot and make the smaller fix. Never touch pixels the brief says must stay as they are.
    • Decide by comparison, not by score. Scores from separate critic calls are not on one scale — the same tree drew 5/10 from one critic and 4/10 from the next. After the fix, export the new version next to the snapshot, and give one critic call both images, in an order it cannot read anything into (a.png, b.png, coin-flipped), asking which is the better sprite for the brief and whether the BLOCKING finding is gone. Keep the fix only if it picks the new one; otherwise restore. Two rounds in a row that the comparison rejects end the loop.

    Do not change pixels after the last critique; anything you edit afterwards goes back to the critic. A critique whose cold read did not name your subject is the most important finding you will get: the picture does not say what you think it says. Report each round: the BLOCKING finding, what you changed, and which version the comparison chose.

  9. Report in a few lines: what exists now (document, layers, tags, files written), what you decided on the user's behalf, what you compromised on and why — including where the sprite departs from the reference on purpose. Show it — a look preview or the exported file's path, not an adjective.

Live or headless

Read the flags first, then the request. The first row that matches decides.

The requestMode
contains --headless (or says "headless", "без окна", "in the background", "don't open Aseprite")headless, forced — do not second-guess it
contains --live (or "in my Aseprite", "in the window", "so I can watch")live, forced
edits something open in the user's window — "this sprite", "the selected layer", "fix my knight"live — the art is there, not on disk
produces files and nothing else: a batch of assets, sprites generated into a folder, a CI or build step, a spritesheet from .aseprite files on disk, a run on a machine with no displayheadless
anything else — draw me a knight, animate this, a paletteno mode: keep what the server started in (live, unless the operator ran it with --headless)

Strip the flag from the request before reading the rest of it: --headless a knight is a request for a knight.

Then the one rule that matters: the mode is chosen from the request, never from a failure. If live preflight says Aseprite is not attached, do not switch to headless to get the work done anyway — tell the user, and if the work would suit headless, offer it as one question ("Aseprite isn't open — open it, or should I work headless and save the files to …?"). Switch only on their answer. A user who wanted to watch in their window and got files instead has been ignored, and the .aseprite they had open is a file you were never meant to write.

Switching mid-task is allowed when the user asks for it; each side keeps its own documents. Headless refuses to open or save a file the user's window has open (file_open_in_editor) — that refusal is the answer, not an obstacle to route around. Say which mode you used in the report.

Routing

The user wantsChain
Something new, loosely described ("a knight")aseprite:brief + aseprite:concept (one message) → aseprite:new → aseprite:palette if the palette is not settled → aseprite:draw → aseprite:shade → aseprite:review
Something new, fully specifiedaseprite:concept → aseprite:new → aseprite:draw → aseprite:shade → aseprite:review
Pixel art of a picture the user supplied ("make this character a sprite")aseprite:brief if size or palette is open → aseprite:concept from its reference step → aseprite:new → aseprite:draw → aseprite:review
An animation of a characterthe drawing chain above if nothing exists yet, with a storyboard in the concept prompt → aseprite:rig → aseprite:animate → aseprite:review
An animation of a sprite that is already riggedaseprite:concept for the storyboard (offer) → aseprite:animate → aseprite:review
Tiles, terrain, level artaseprite:brief if open-ended → aseprite:concept (an environment sheet) → aseprite:tileset → aseprite:review
Colours changed, a retro look, a cleanupaseprite:palette → aseprite:review
Volume, light, "it looks flat"aseprite:shade → aseprite:review
A change to existing art ("make it more menacing", "fix the hands")aseprite:fix → aseprite:review
An opinion ("is this good?", "why does it look off?")aseprite:review only — report, do not edit unless asked
Files for an engine or for sharingaseprite:review if not already done → aseprite:export
Words on the art — a label, score, title cardaseprite:draw (its Text section) → aseprite:review
Nine-slice UI panels, pivots or hotspots for an engineaseprite:export (slices)
Share the finished work in the community galleryaseprite:review if not already done → aseprite:submit

If a request fits no row, it is usually a direct tool call ("rename the layer", "add a frame"): make it, look if pixels changed, and say what you did.

Subject rules

Before a stage draws or animates something, read the rule files for its subject — every stage, and every agent you hand a stage to. Two or three files is normal; reading all of them is not. Each one has size budgets, mistakes, a review list and ```grid templates to transcribe with draw op grid.

DrawingRead
Any characterrules://30-proportions-by-size, rules://31-anatomy-and-pose, rules://36-character-design
Its face, eyes, expressionrules://32-heads-and-faces, rules://33-eyes-and-expressions
Hands, feet, a held weaponrules://34-hands-and-feet
Hair, clothing, armour, capesrules://35-hair-and-clothing, rules://23-materials-soft
A turnaround, top-down or 8-direction setrules://37-views-and-directions, rules://47-top-down-animation
A dialogue portraitrules://38-portraits
Any animationrules://40-timing-and-spacing, plus the cycle below
Idle, walk/run, jump, attackrules://41-idle-and-breathing, rules://42-walk-and-run, rules://43-jump-fall-land, rules://44-attacks-and-impacts
Hair, capes, tails in motion; tiny movementrules://45-secondary-motion, rules://46-subpixel-animation
Animalsrules://50-quadrupeds, rules://51-animal-gaits, rules://52-birds-and-flight, rules://53-small-creatures
Monstersrules://54-monster-design, rules://36-character-design
Sky, landscape, a backgroundrules://60-skies-and-atmosphere, rules://61-landscapes-and-terrain, rules://62-parallax-backgrounds
Trees, water, groundrules://63-trees-and-foliage, rules://64-water, rules://65-ground-rocks-grass
Tilesets, buildings, roomsrules://66-tiles-and-autotiling, rules://67-architecture-and-interiors
Anything with depth: perspective, isometric, solid formsrules://70-perspective, rules://71-isometric, rules://72-3d-forms
Items, weapons, vehicles, rotating objectsrules://73-props-and-items, rules://74-vehicles-and-machines, rules://75-rotation-and-turnarounds
Fire, smoke, magic, hits, particles, weatherrules://80-vfx-fire-smoke-magic, rules://81-impacts-and-game-feel, rules://82-particles-and-weather
UI, icons, textrules://83-ui-and-icons, rules://84-bitmap-fonts
Colour, materials, lightrules://20-color-for-pixel-art, rules://22-materials-hard, rules://23-materials-soft, rules://24-lighting-scenarios
A retro platform look or a fixed paletterules://21-limited-and-platform-palettes, rules://90-platform-styles
Line quality, AA, dithering, small sizesrules://10-lines-and-curves, rules://11-clusters-and-noise, rules://12-anti-aliasing, rules://13-dithering-and-texture, rules://14-readability-and-scale
A whole scenerules://91-composition-and-scenes
Review, or "it looks AI-made"rules://92-generated-art-tells, rules://07-review-checklist

Specialists

Claude Code and omp ship four agents. Use them when the harness offers them; elsewhere, run the matching skill yourself.

AgentTakes overInstead of
palette-smithproposing and justifying a paletteaseprite:palette
rig-builderplanning and building the layer rigaseprite:rig
animation-directorkey poses, timing and tags before frames are drawn — and the storyboard panels for the concept promptthe planning half of aseprite:animate
pixel-critica scored, located critique; read-onlyaseprite:review

Give an agent the brief, the PixelSpec if there is one, the document name and the stage it owns — it starts with no memory of this conversation. Run agents one at a time: they all edit the same open document, and two at once will fight over the active layer and frame.

What this workflow must not do

  • Skip the brief on an open-ended request to seem fast. Guessed size and palette cost a full redraw when they are wrong.
  • Skip the concept offer on something new because drawing straight away looks faster. The user decides whether to generate references; you decide only how to phrase the prompt.
  • Pixelize a reference — downscale it onto the canvas and call it art. It is a guide for shapes and poses; the pixels are still drawn.
  • Ask about things a default covers. Light from the upper-left is not worth a round trip.
  • Declare done without look and a review. A tool result saying pixels changed is not evidence the sprite is right.
  • Leave the user's document in a state they did not ask for — stray scratch layers, a changed active frame, colours added to the palette without saying so.

Related

rules://index for the craft every stage relies on, rules://07-review-checklist for what "finished" means.

Frequently asked questions

What does the Studio AI skill do?

The front door for any Aseprite or pixel-art request. Works out what the user actually wants, picks which workflows to run and in what order — and whether to work in the user's open Aseprite window or a headless batch Aseprite (`--headless` / `--live` force it) — hands parts to the specialist agents where the harness has them, and does not stop until the result has been looked at and reviewed. Use when a request spans several steps ("make me an animated knight for Godot") or when you are unsure which workflow applies.

Why use Studio on TypingMind?

Because you install it once and use it with any model. Studio is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Studio in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/with-pebbly/aseprite-ai-artist/tree/main/skills/studio. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Studio?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Studio?

As many as you like. As long as a model supports skills, you can use Studio with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Studio AI skill free?

Yes. It is published on GitHub by with-pebbly under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇