Free to try · clean downloads $4.99 once · no monthly fee · See plans

Docs

Last updated: 25 August 2026 (v3.2.0)

New to games? Start with First game (new devs) — sprite basics and a complete HTML mini-game. Also: simple path, Ready panel, frame packs, crop, guided jobs, engines, and troubleshoot. Pricing: /pricing. App: /workspace. Looking for one job only? Tools by job.

Start here

What SpriteFix actually does

You upload art (PNG, JPEG, or WebP — PNG is best for transparency). We find poses (or treat each file as one pose), make cells the same size, line feet up, and export a horizontal PNG strip (or a ZIP of several strips).

SpriteFix operates in 3 simple steps: Step 1 Auto-cleans automatically on upload. Step 2 allows optional fine-tuning (Edit image or Guided setup). Step 3 exports your clean PNG, GIF, or ZIP.

Most of the time you never open settings: drop → wait for Ready → play the preview → download. Multi-row packs often become one strip per row — each strip is a card, all checked by default.

  • Step 1 (Auto-Clean): Detects poses, lines up feet, centers frames, and trims blank margins automatically.
  • Step 2 (Adjust - Optional): Use Edit image (crop, erase pixels, rotate) or Guided setup for custom grid sizes.
  • Step 3 (Download): Export unwatermarked PNG strips, animated looping GIFs, or separate frame ZIP packages.
  • Input: PNG (preferred), JPEG, or WebP. Clear background or solid black is fine.
  • Output: always PNG — clean strip, multi-strip ZIP, optional per-frame ZIP (Pro), optional GIF for promo.
  • Payment: Pay once securely with PayPal or Cards (no subscription, no token drain).

Simple path vs Guided setup

Simple path (default): after you drop files we recommend a job, auto-clean, and land on Ready. No interview — except when we are unsure.

If you drop several files and we cannot tell “pose pack” vs “several full sheets,” we ask you to pick before cleaning. That avoids a silent wrong job.

On Ready we show what we decided (glass box). If it is wrong, open Guided setup.

Guided setup: short question flow (job → size → layout → align → extras → run) with clear blue continue buttons at each step.

Tip: If the result looks right, download. Only open Guided when the job was wrong or you need cut-by-grid, export frames, outlines, or a forced frame count.

Words we use on the UI

  • Sheet — one image that already contains multiple poses (often a horizontal strip). PNG preferred; JPEG/WebP also upload.
  • Frame file — one image that is a single pose (often named run_01, Attack_Frame_03).
  • Strip — export: poses side by side, each cell Frame size × Frame size.
  • Ready — post-process screen: source strip, animation, Frame size chips, download.
  • Source strip — horizontal cards for each upload: tap, check, × remove, + Add more.
  • Frame size — export cell size: 32, 64, 128, or 256 px square.

Open Workspace

  1. Go to Workspace from the site header or homepage.
  2. You should see Drop your sprites or frames and a dashed upload area.
  3. PNG, JPEG, or WebP in (PNG preferred for transparency). Clean exports are always PNG. Free / Basic: up to 10 files and 2.5MB total per batch. Pro: up to 100 files and 4.5MB total.

New to making games?

Read First game (new devs) next — sprite basics, how to clean art in SpriteFix, then a tiny browser game you can finish in one sitting.

Tip: Sidebar: First game (new devs). Direct link path: /docs (scroll to that chapter).

First game (new devs)

Who this is for

You want to make a small 2D game (platformer, runner, top-down demo) and your art is messy or split into many PNGs. You do not need Unity or Godot for this tutorial — a text editor and a browser are enough.

When you outgrow the demo, the same cleaned strip works in Godot, Unity, GameMaker, and other engines (see Game engines).

  • Time: about 30–60 minutes if you already have character art.
  • Skill: basic comfort with files and copy-paste. No advanced programming.
  • Outcome: a playable walk-left / walk-right scene using your own sprites.

Sprite basics (5 minutes)

A sprite is a 2D image drawn on screen — a character, coin, bullet, or UI icon.

Animation is usually several poses shown in order. Engines expect either one image per pose, or one strip (sprite sheet) where each cell is the same size.

  • Frame — one pose (one cell).
  • Strip / sheet — frames side by side (and sometimes in rows).
  • Frame size — width and height of one cell in pixels (SpriteFix: 32, 64, 128, or 256).
  • Bottom-align — content sits on a shared baseline in every cell so motion does not bounce.
  • Transparent PNG — empty pixels stay empty; engines draw only the art.

Tip: Pick one Frame size and stick to it for the whole project (e.g. 128×128). Mixing sizes makes import harder.

Clean your art in SpriteFix first

Raw marketplace packs and AI exports are often uneven, uncropped, or one-file-per-pose. Fix that before coding.

  1. Open /workspace and drop either one messy sheet, or numbered poses (run_01.png, run_02.png…).
  2. Wait for Ready. Confirm status: one strip = “N frames”; several full animations = multi-sheet.
  3. Play the animation. If the job is wrong, Use guided setup → Combine frame files or Clean several sheets.
  4. Set Frame size (start with 128). Reprocess if you change it.
  5. Download free (watermarked) or clean (Basic/Pro). Keep the PNG next to your game files.

Note: For this mini-game use a single horizontal walk strip (left-to-right frames). Export Frame size must match the CELL size in the code below.

Mini-game plan

We build the smallest useful game loop: clear canvas → update player → draw sprite → request next frame. Controls: A/D or arrows to move; animation advances only while moving.

  • Canvas 640×360 (or any size — player is scaled).
  • Player x moves left/right; y stays on a ground line.
  • Strip image: player.png from SpriteFix (e.g. 8 frames × 128px = 1024×128).
  • CELL = 128 must match SpriteFix Frame size.
  • Optional: flip horizontally when facing left (drawImage scale -1).

Project files

Create a folder with two files: index.html and player.png (your SpriteFix export). Double-click index.html or serve the folder with any static server.

  • index.html — game + page shell (below).
  • player.png — cleaned walk strip (same folder).
  • Open via file:// works in most browsers; if the image fails to load, use a local server (e.g. npx serve).

Complete mini-game (copy into index.html)

Replace the whole file with this. Set CELL to your SpriteFix Frame size. Set FRAME_COUNT to how many poses are in the strip (Ready shows Frame 1 / N).

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>My first sprite game</title>
  <style>
    body { margin: 0; background: #0f172a; color: #e2e8f0;
      font-family: system-ui, sans-serif; display: grid; place-items: center;
      min-height: 100vh; }
    canvas { background: #1e293b; image-rendering: pixelated;
      border: 2px solid #334155; border-radius: 8px; }
    p { max-width: 40rem; text-align: center; font-size: 0.9rem; opacity: 0.85; }
  </style>
</head>
<body>
  <canvas id="c" width="640" height="360"></canvas>
  <p>A / D or arrows to walk · Sprite from SpriteFix (player.png)</p>
  <script>
    // --- Match SpriteFix export ---
    const CELL = 128;        // Frame size chip (32 / 64 / 128 / 256)
    const FRAME_COUNT = 8;   // N from Ready: "Frame 1 / N"
    const FPS = 10;          // animation speed while moving

    const canvas = document.getElementById("c");
    const ctx = canvas.getContext("2d");
    ctx.imageSmoothingEnabled = false;

    const sheet = new Image();
    sheet.src = "player.png";

    const keys = {};
    addEventListener("keydown", (e) => { keys[e.key] = true; });
    addEventListener("keyup", (e) => { keys[e.key] = false; });

    const player = {
      x: 280, y: 220, speed: 2.2,
      facing: 1, // 1 right, -1 left
      frame: 0, frameTimer: 0,
    };

    function update(dt) {
      let moving = false;
      if (keys["ArrowLeft"] || keys["a"] || keys["A"]) {
        player.x -= player.speed; player.facing = -1; moving = true;
      }
      if (keys["ArrowRight"] || keys["d"] || keys["D"]) {
        player.x += player.speed; player.facing = 1; moving = true;
      }
      player.x = Math.max(0, Math.min(canvas.width - CELL * 0.5, player.x));

      if (moving) {
        player.frameTimer += dt;
        if (player.frameTimer > 1 / FPS) {
          player.frameTimer = 0;
          player.frame = (player.frame + 1) % FRAME_COUNT;
        }
      } else {
        player.frame = 0;
        player.frameTimer = 0;
      }
    }

    function draw() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      // ground
      ctx.fillStyle = "#334155";
      ctx.fillRect(0, player.y + CELL * 0.5, canvas.width, 4);

      if (!sheet.complete || !sheet.naturalWidth) return;
      const sx = player.frame * CELL;
      const drawW = CELL * 0.5; // scale down for canvas
      const drawH = CELL * 0.5;
      ctx.save();
      ctx.translate(player.x + drawW / 2, player.y);
      ctx.scale(player.facing, 1);
      ctx.drawImage(
        sheet, sx, 0, CELL, CELL,
        -drawW / 2, -drawH / 2, drawW, drawH
      );
      ctx.restore();
    }

    let last = performance.now();
    function loop(now) {
      const dt = Math.min(0.05, (now - last) / 1000);
      last = now;
      update(dt);
      draw();
      requestAnimationFrame(loop);
    }
    sheet.onload = () => requestAnimationFrame(loop);
    // if cached
    if (sheet.complete) requestAnimationFrame(loop);
  </script>
</body>
</html>

Tip: If the character looks like 2×2 poses in one step, CELL is larger than the real cell — match SpriteFix Frame size. If only part of the pose shows, CELL is too small.

What to learn next

You already have the hard part for art: clean, equal cells. Next upgrades:

  • Add gravity and jump (change player.y with velocity).
  • Second strip for idle vs run (swap image or use a second row if you export a grid).
  • Import the same PNG into Godot (Nearest filter) or Unity (Sprite Multiple + Point) — see Game engines.
  • Use SpriteFix multi-sheet for Jump / Attack / Idle, then switch strips in code when state changes.
  • Promo: Ready → Download GIF for itch.io or Discord.

Tip: Stuck on import? Open /workspace, re-export at 128, and re-check Frame size in the engine slice settings.

How this fits “how do I make a game?”

A complete first game is: idea → art → clean art → game loop → controls → share. SpriteFix is the clean-art step so you are not stuck in Photoshop before you ever write a loop.

This page is the SpriteFix guide for that path. Start in the workspace when you have PNGs ready.

  1. Get or draw a walk cycle (or download a pack).
  2. Clean it at /workspace (this product).
  3. Paste the mini-game HTML and drop in player.png.
  4. Iterate: better art → re-clean → refresh the browser.

Simple path (drop → Ready)

One spritesheet

Best when one image holds a full animation (e.g. Attack.png as a horizontal strip of poses).

  1. Drop one sheet image (PNG, JPEG, or WebP).
  2. Wait while we clean (status shows how many files are selected for this run).
  3. Ready: play the animation, change Frame size if needed, download.

Tip: If characters stick together, try Guided → Cut by grid (Pro) or crop to one cycle.

One file with many rows (top-down / pet grids)

Some packs put several directions or rows in one PNG (for example 4×4 of 32px cells, or 6×2 pet poses). Auto clean often splits that into one strip per row.

  1. Drop the grid PNG.
  2. On Ready you should see one card per cleaned strip (not only one card for the upload).
  3. Every strip starts checked for download. Uncheck any you do not need.
  4. Tap a card to preview that strip’s animation.

Note: If you only see one card but the status says several sheets, refresh and re-drop — the Ready strip should list each cleaned strip.

Several full animation sheets

Best when each file is its own animation (Jump.png, Idle.png, Run.png). You get one cleaned strip per file and a multi-sheet ZIP.

  1. Drop all sheets in one batch.
  2. On Ready, tap cards to preview each strip.
  3. Every card starts checked. Uncheck any you do not want in the ZIP.
  4. Use + Add more or × to change the batch.
  5. Download free (with a mark) or clean (paid).

Note: Different frame counts per sheet are normal (Jump 9, Attack 8). Forcing the same count is optional in Guided extras.

Folder of pose PNGs (combine into one strip)

Best when each file is one pose of the same animation. Names like run_01 / Spell_Frame_06 help us pick combine-frames even if each PNG is large or has floating particles (VFX).

  1. Drop the whole sequence (order follows sorted filenames — zero-pad: 01, 02, …).
  2. We should produce one strip with N frames (one cell per file), not N separate multi-frame sheets.
  3. Play the preview — it should cycle all poses.

Tip: Want one looping animation from many pose files? Ready should say something like “8 frames”, not “8 sheets cleaned”. If you see one card per file, open Guided setup → Combine frame files (or rename to run_01 / Frame_01 style and Start over).

How Simple picks the job

We look at filenames and image shape. It’s a best guess — wrong picks are easy to fix.

  • Names like Frame_01, run_01, walk-02 → we usually combine into one strip.
  • Names like player1.png on a large square → we may treat each file as its own sheet.
  • Wide or tall images (already look like strips) → clean as sheets.
  • Several complete animations (Jump, Idle, Run) → clean each sheet separately.

Note: If the guess is wrong: Ready → Use guided setup → pick the job you meant → run again.

Ready panel (after processing)

What you see

  • Sticky top bar: Ready to download, status line, Crop, Use guided setup, Start over.
  • Source strip: one card per upload — thumb, checkbox, × remove; horizontal scroll if many; + Add more pinned so it never scrolls away.
  • Frame size chips: 32 / 64 / 128 / 256 — changing these re-processes.
  • Large preview + Animation preview (play, FPS, GIF).
  • Something look off? Use guided setup — then free/paid download buttons.

Status line

Multi-sheet: “N sheets cleaned · viewing i of N” and multi-sheet ZIP when applicable.

Single strip: “M frames · S×S px each”.

Start over

Clears the whole queue, crops, and results and returns to the drop zone. Same end state as removing the last file with ×.

Sprite sheets

Auto detect poses (default)

We find separate poses and the gaps between them. Transparent PNGs and near-black matte backgrounds both work (black gutters are common in marketplace packs).

  1. Drop the sheet.
  2. On Ready, confirm frame count and play the animation.
  3. Adjust Frame size if your engine expects a different cell size.

Black or dark backgrounds

Near-black is treated as background so poses don’t glue across matte gaps. If a dark silhouette is real art and gets eaten, crop tighter or use grid slice when cells are regular.

Equal cells and multi-row gridsPro

If the sheet is equal boxes (for example 1024×128 → eight 128px cells), auto usually works. Multi-row packs (4×4 top-down, 6×2 pets) often become one strip per row — each strip is a card on Ready, all checked by default.

When trails and effects glue poses together, force a grid cut in Guided setup.

  1. Ready → Use guided setup → Cut by grid / Slice a uniform grid (Pro).
  2. Set Frame size to the cell size you want in your engine.
  3. Run and check the animation on each strip card.

Trails, particles, disconnected VFX

Nearby sparks usually stay with a pose; far-away effects can be mistaken for extra frames. Prefer grid slice for equal cells, or crop junk out of the sheet.

If each PNG is already one pose (even with floating particles), use Combine frame files — not “clean each file as its own sheet”.

Frame files (pose PNGs)

Naming that helps auto-detect

  • Strong: run_01.png, walk-02.png, Fire_Frame_06.png, attack_Frame_03.png.
  • Weaker: hero1.png (digit stuck to the word) — large canvases may be treated as sheets.
  • Zero-pad sequences (01–08) so alphabetical order matches animation order.

Tip: Big transparent padding around a small character (common for VFX) is fine. Prefer names like Spell_Frame_01 so we know each file is one pose of the same animation.

Combine into one strip

  1. Drop the whole sequence at once.
  2. If Ready shows many separate sheets instead of one strip: Guided setup → Combine frame files.
  3. Uncheck any pose you want to leave out (we re-run so the strip matches).
  4. Play the preview — it should step through every included pose.

Don’t combine whole animations into one strip

If Jump.png and Attack.png are already full animations (many poses each), do not use Combine frame files — that would squash each file into a single cell. Use Clean several sheets so each animation stays its own strip.

Add, remove, and select sources

Tap, check, remove, add

  • Tap card — focus that source; for multi-sheet, the big preview switches strip.
  • Checkbox — multi-sheet: include in download ZIP. Frame pack: include in the combined strip (re-process).
  • All / None — bulk checkboxes.
  • × — remove that file from the upload queue and re-clean the rest.
  • + Add more — always visible beside the scroll area; drop more PNGs without Start over.

Note: Uncheck ≠ remove. Uncheck keeps the file; × deletes it from the batch.

Note: Removing the last file returns to the empty drop zone.

“Cleaning N files…”

N is how many sources are selected for this run, not always the full queue. If you unchecked frames for a combine job, the cleaner only counts the included set.

Plan limits while adding

Free/Basic: max 10 files and 2.5MB total per batch. Pro: 100 files / 4.5MB. The uploader rejects oversize batches; remove files or upgrade if you hit the wall.

Crop

How to crop a file

  1. On Ready, tap the card for the file you want to crop.
  2. Click Edit image (or Edit this file when you have more than one upload).
  3. Flip, rotate, erase, or drag a crop box — crop and eraser work in the same session. The eraser is included with Basic.
  4. The editor fills the whole screen. Use + / − or the slider to zoom (small pixel art needs zoom). Zoom stays put when you switch tools.
  5. Drag a box on the area to keep. The bar shows size in pixels: x · y · w · h.
  6. Undo takes back the last action (crop, erase, flip, rotate, background). Reset restores the image from when you opened the editor.
  7. Cancel discards the edit and does not re-clean. Save and Process keeps the edit and re-runs the job.

Erase stray pixelsBasic

Some sheets carry junk the cleaner cannot know is junk: a signature in the corner, a stray spark bridging two poses, a leftover guide line. The eraser rubs it out before the frames are detected, so the split comes out right.

  1. Open Edit image and click Eraser.
  2. Choose a size from the brush dropdown. It is a hard-edged circular brush that works on the real pixel grid — no soft edges to leave halos.
  3. Zoom in first for small pixel art. Erasing works on the real pixels, so a stroke at 4× removes exactly what it looks like it removes.
  4. Drag over anything you want gone. It becomes transparent.
  5. A round theme-colored marker follows the pointer so you can see the brush size, and a dimmed shroud shows what is outside the crop.
  6. Undo takes back the last action; Reset restores the image from when you opened the editor. Both work until you save.
  7. Save and Process keeps the erases and re-runs the job — there is no separate apply step. After that, undo and reset are gone.

Note: The eraser is included with Basic and Pro. On Free the button shows a Basic tag.

Note: Erasing changes the file you are working on for this session, the same way flip and rotate do — so what you preview is what you export. Reset restores that file from when you opened the editor. After Save and Process, open Edit image again to start a new session.

Note: It erases the file you selected only. Other uploads in the queue are untouched.

Each file can have its own crop

When you upload several files, each one can have its own crop box. We apply the right crop by file name when cleaning.

You cannot draw several boxes on one image yet. For a full grid of poses, use auto clean or Guided setup → cut by grid.

Crop in Guided setup

On the last step of Guided setup you can open crop for the current file before you run the job.

Frame size

What Frame size means

Every pose is packed into a square cell of this size (e.g. 128×128). In-engine slice width and height should match. The strip width is roughly N × Frame size for a single-row export.

  • 32 — tiny / UI-scale
  • 64 — small pixel characters
  • 128 — default for most character work
  • 256 — large or high-res characters

Tip: Fill (~92%) is how much of the square the art fills — not a second size control.

Change after Ready

Use the chips on Ready. We re-process with the new cell size. Preview display size (in the animation panel) is only for on-screen viewing; download always uses Frame size.

Preview & download

Animation preview

Use Play / Pause, Loop, FPS, and optional Download GIF to check motion before you export.

The label “Frame 3 / 8” means the strip has eight poses and you’re on the third. If you only have one pose on this strip, Play stays off (“nothing to animate”) — that’s normal for a single-frame result.

Glance at the status under Ready to download:

  • “8 frames · 128×128px each” — one strip; Play should cycle all eight.
  • “8 sheets cleaned · viewing 1 of 8” — each file is its own strip; tap cards to switch. To turn a folder of poses into one loop, use Guided setup → Combine frame files.

GIF export

Under the animation controls. Uses export Frame size and current FPS — good for store pages, Discord, and social. Not a substitute for the game strip.

Free download

Watermarked art and _spritefix in filenames so you can tell free exports from paid. Multi-sheet free downloads are ZIPs of checked sheets only.

Clean download (Basic / Pro)

No watermark, original base names when possible. Free accounts that click clean download are offered Basic ($4.99 once) after sign-in.

Download only some sheets

  1. Uncheck cards you don’t want.
  2. Download button text shows how many are selected.
  3. ZIP contains only checked sheets.

Guided setup

Where to open it

  • Ready sticky bar: Use guided setup.
  • Ready above downloads: Something look off? → Use guided setup.
  • Not on the empty drop screen (drop files first).

Typical flow

  1. Choose a job (clean one sheet, combine frames, several sheets, Pro tools…).
  2. Frame size.
  3. Align / fill options when relevant.
  4. Extras: outline, metadata, same/fixed frame count when offered.
  5. Optional crop of focused source → Run this job.

Tip: Simple mode / back leaves guided without clearing your files.

Same frame count / force N

Default: keep every detected frame (Jump can be 6, Attack 8).

In extras you can force a fixed count. On one sheet that pads/trims that strip. On several sheets it applies N to every strip — only if you truly want equal lengths. Wrong N drops or duplicates poses.

All jobs (reference)

Clean one sheet

One multi-pose PNG → one cleaned horizontal strip. Poses are detected automatically.

Combine frame files

Many single-pose PNGs → one strip in file order. Each file becomes one cell (particles stay with that pose).

Clean several sheets

Each file is its own animation → one strip per file, multi preview, ZIP download of checked sheets.

Cut by grid (uniform grid)Pro

Sheet is already equal boxes. Cut by rows and columns instead of free detect — best when whip trails stick poses together.

Export each frame as its own PNGPro

Detect frames, download a ZIP of individual frame files instead of one strip.

Pack sheets as one gridPro

Several full sheets → one grid image (each upload is a row; columns from max frames or forced count). For atlas-style importers.

Split grid into row sheetsPro

One grid atlas → one horizontal strip per row (ZIP / multi preview). Reverse of pack.

Sprite data (JSON)Basic

Tick this in Guided setup and your download becomes a ZIP with two extra files beside the sheet.

  • sprites.json — an atlas in Aseprite's JSON format. Every frame has its rectangle in the sheet (x, y, w, h), its name, and a duration. Phaser, PixiJS and Cocos load this file directly. Unity and Godot need an importer plugin (godot-aseprite-wizard and similar) — neither reads a JSON atlas on its own.
  • metadata.json — plain reference data: frameSize, and per frame the original height, output height, scale factor, baseline (anchorY) and the tight box around the visible pixels (hitbox). Useful for your own scripts, not for engine import.

Note: Included with Basic and Pro. On Free the option shows a Basic tag.

Note: SpriteFix cells are a plain even grid, so frame N sits at column N of the sheet. The atlas writes those rectangles out so nothing has to guess.

Note: We do not write Unity .meta files or Godot .tres resources — those are project files each engine generates itself.

Plans & limits

What each plan unlocks (behavior, not pricing)

Pricing amounts live on /pricing. Behavior summary:

  • Free — process and preview; free downloads watermarked + _spritefix name branding; batch 10 files / 2.5MB.
  • Basic — clean downloads (no watermark, original names), sprite data JSON, and the same batch size as free.
  • Pro — larger batches (100 files / 4.5MB), grid slice, explode frames ZIP, pack/split grid, and outlines.

Note: Guided setup itself is available on free for non-Pro jobs; Pro-only jobs are locked in the job list until you upgrade.

File rules

  • PNG, JPEG, or WebP in (transparency works best with PNG; up to 4096×4096). Exports are PNG.
  • Per-image max dimension 4096×4096 in the pipeline.
  • Duplicate filenames in one batch are rejected.

Game engines

Unity

  1. Import the PNG strip (or extract ZIP).
  2. Texture Type: Sprite (2D and UI) → Sprite Mode Multiple.
  3. Sprite Editor → Slice by cell size = Frame size (e.g. 128×128).
  4. Pivot bottom (or custom) to match bottom-aligned cells.
  5. Filter Mode: Point (no filter) for pixel art; compression None / high quality as needed.

Godot

  1. Import strip; set filter to Nearest for pixel art.
  2. SpriteFrames / AnimatedSprite2D: region size = Frame size.
  3. Build animation from frames left to right.

Unreal

Import as texture; paper 2D or flipbook setups should use the same frame width/height as Frame size. Disable sRGB quirks for pure masks if you use separate alpha workflows.

GameMaker

Add as sprite strip; set frames horizontal count from strip width ÷ Frame size, or import Pro frame ZIP as individual frames.

Cocos, custom engines

Any tool that samples fixed cells works: cell width = cell height = Frame size, origin usually bottom or center depending on your character setup.

Tips that work

Prepare source art

  • Prefer one animation cycle per sheet when using auto detect.
  • Equal-width cells (sheet width divisible by pose width) slice cleanest.
  • Don’t mix a numbered pose pack and five full sheets in one drop if you can help it — auto has to guess.
  • Crop UI chrome and empty margins when detection fails.

Name for correct auto-job

  • Poses: action_01.png or action_Frame_01.png.
  • Full sheets: Idle.png, Jump.png, Attack.png (action name, not a pose index).

Keep pixels sharp in-engine

  • Nearest / Point filter.
  • No destructive compression on the strip.
  • Import scale 1:1.
  • Slice using the same Frame size you exported.

Limitations (read this)

Works great when…

  • You have a horizontal or vertical animation strip with gaps between poses.
  • You have a folder of numbered poses (run_01…, Frame_01…) to combine.
  • You want feet lined up and even cells for engine import (32 / 64 / 128 / 256).
  • You need a quick GIF for a store page or Discord.

Harder cases

  • Dense combat sheets with lots of sparks/trails between poses — auto can still under- or over-split. Prefer equal-grid art or Guided → Cut by grid (Pro).
  • Icon tilesets / irregular object sheets — use Cut by grid (Pro), not auto island detect.
  • JPEG/WebP are accepted but have no real transparency — PNG sheets still work best for clean alpha.
  • Batches over Free/Basic 2.5MB or 10 files — compress or use Pro limits.

Not SpriteFix’s job

  • Drawing or AI-generating sprites.
  • Texture atlas packing with Phaser/Unity JSON like TexturePacker.
  • Full timeline editing, onion skinning, or replacing Aseprite.

Troubleshoot

It asked how to treat my files

That is intentional. When several uploads look ambiguous, we pause so we do not silently pick the wrong job.

  1. Choose Combine into one strip if each file is one pose of the same animation.
  2. Choose Clean each sheet if each file is a full Idle / Run / Jump sheet.
  3. If you still get the wrong result, open Guided setup after Ready.

Two or more characters stuck in one frame

The preview cell shows more than one character (or one character fused with the next pose).

  1. If your art is a clean equal grid: Guided setup → Slice a uniform grid (Pro).
  2. Crop to a single animation cycle, then run again from Simple or Guided.
  3. Check the source for soft glow or trails that bridge one pose into the next.

I dropped many pose files, but I didn’t get one full animation

Typical folder: run_01…run_08 or Spell_Frame_01… — each PNG is one pose of the same attack or walk.

What you want: Ready says “8 frames”, one strip, Play steps through all poses.

What went wrong instead:

  1. Look under Ready to download: you need “N frames · …”, not “N sheets cleaned”.
  2. Open Use guided setup → Combine frame files → run the job.
  3. Or Start over, rename to clear numbers (Frame_01, run_01…), re-drop the folder, and try Simple again.
  4. When it’s right: label shows Frame 1 / N, Play works, and the counter moves through every pose.
  • Ready says “8 sheets cleaned” and you have one card per file — we cleaned each file as its own sheet, not as one sequence.
  • Play only flips between a character and a spark/slash (or looks like two things sharing one frame) — parts of one pose were treated as separate frames on that sheet.
  • The big strip looks fine side-by-side, but Play won’t run the whole sequence — you still have separate sheets; open one card at a time instead of one combined strip.

Tip: Floating particles next to a character are normal on one pose. They should stay with that pose in one cell — not become their own “frame” of the animation.

I only got one frame (I expected a full strip)

  • You may have combined whole animation sheets (Jump + Attack) — use Clean several sheets instead.
  • Icon tilesets with no clear gaps often need Guided → Slice a uniform grid (Pro).
  • If you forced a frame count in Guided extras, turn that off and run again.
  • If Ready shows many sheets, each card is its own strip — combine pose files only when each file is a single pose.

Play is greyed out (“nothing to animate”)

Play needs more than one pose on the strip you’re viewing. One cleaned cell = nothing to loop — that can be correct (single pose) or a sign the job was wrong for a pose folder.

  1. Read the status line: “N frames” (one strip) vs “N sheets” (many strips).
  2. Pose folder + multi-sheet status → Guided setup → Combine frame files, then run.
  3. Status already says many frames but Play still off → Start over, re-drop, hard-refresh if needed.
  4. Raise FPS above 0; when it works, the button shows Pause while it loops.
  5. If the static strip already looks wrong, fix the job (combine / several sheets / grid) before worrying about Play.

Looks sharp here, blurry in my game

  • Set the texture filter to Point / Nearest (not bilinear).
  • Avoid heavy compression on the strip.
  • Import at 1× scale — don’t upscale in the importer.

Content still jumps between frames

Bottom-align keeps a shared baseline in each cell (feet for walkers, bases for props/FX). Crop extra ground, shadows, or UI chrome, then re-run. Guided padding/align options can help. If it still drifts, send the original PNG (not only the export) when you contact support.

Upload rejected or “too many files”

You’ve hit your plan’s file count or total size. Remove files with ×, compress sources, or upgrade. If you re-run many times quickly, wait a minute and try again (rate limits).

Still stuck

Email us with: the source PNG(s), what you expected (for example “8 poses in one strip”), and a screenshot of the Ready screen including the status line.

Need to process a sheet? Workspace is the app. Stuck? Email the source PNG.