px chased: 000000
the recipe

one prompt. one pet file.

describe a character, paste one prompt into an image + files assistant, then drop the single file it returns. the assistant handles all 32 frames.

one clear sentence is enough · 500 characters max

paste into ChatGPT, Codex, or another image + files assistant

what it does
  1. 01

    locks one character identity

  2. 02

    draws and checks 32 frames

  3. 03

    returns one portable pet file

three steps, start to chase
  1. 01

    describe it

    one clear sentence is enough.

  2. 02

    paste once

    the assistant generates, checks, and packs every pose.

  3. 03

    drop one file

    drop the returned .onandemo.json in the playground.

made with this prompt
advanced: prompt a spritesheet directly

layout tiers

pick a layout. they're all complete companions — bigger ones are richer but harder for a model to land; smaller ones are nearly foolproof. the engine fills any missing directions by mirroring and falling back, so even the floor tier chases all eight ways.

the sweet spot. front, side, and back walks plus two idle antics — a full eight-way companion once the engine mirrors the rest. small enough that a model can keep one character on-model across every cell.

1 — the prompt
                    
                      a pixel-art sprite sheet of one character, retro desktop-pet style: 
                      [describe your companion here]
                      

layout: one transparent png. a grid of 4 columns × 3 rows of equal square cells. draw the same character in each cell, in this reading order (left to right, top to bottom):
1. idle — standing, facing the viewer, calm.
2. alert — the same character, startled: eyes wide, leaning back.
3–4. walk toward the viewer — a 2-frame step cycle, facing front.
5–6. walk to the right — a 2-frame step cycle, facing right.
7–8. walk away from the viewer — a 2-frame step cycle, facing back.
9–10. rest — a 2-frame idle loop (sit, curl, sway).
11–12. fidget — a 2-frame idle trick that suits the character (stretch, blink, wiggle).

consistency: it is the SAME character in every cell — same colors, same proportions, same size, standing on the same ground line. only the pose changes.

pixels: crisp pixel art, hard edges. no anti-aliasing, no soft shadows, no glow, no outline. transparent background — no backdrop, no floor, no grid lines, no labels, no border. leave a small margin of empty pixels around the character in every cell; nothing touches or crosses a cell edge.
                    
                  
2 — the frame map

save this as companion.json next to your sheet, or paste it into the playground. this is the map for this exact layout — you don't have to trust the model to write one.

                    {
  "sheet": "./companion.png",
  "frameMap": {
    "cellSize": 32,
    "scale": 1,
    "states": {
      "idle": [[0, 0]],
      "alert": [[1, 0]],
      "S": [[2, 0], [3, 0]],
      "E": [[0, 1], [1, 1]],
      "N": [[2, 1], [3, 1]],
      "rest": [[0, 2], [1, 2]],
      "fidget": [[2, 2], [3, 2]]
    }
  }
}
                  

lock the character — optional

the one thing that wrecks a sheet is the character drifting between cells. if your model can take an image as input (gemini, gpt-image, and friends can), lock it in two passes:

  1. 01 draw just the idle pose first — one clean cell. iterate until the character is exactly right.
  2. 02 feed that image back: “keep this exact character — same colors, proportions, size — and lay it out as the grid below,” then paste the prompt. repeat the pixels lines every turn — edit passes love to sneak anti-aliasing and a background back in.

no image input? skip this — the single prompt still works, you'll just re-roll a few more times for a consistent character.

what goes wrong

the honest part

  • the character drifts between cells. the big one, and it's the model, not you. use the consistency pass above, or drop to a smaller tier — fewer poses, less room to wander. a clean 6-cell pet beats a broken 32-cell one.
  • it shipped an opaque background. the playground keys out a solid background automatically — it reads the corners. only a busy, non-solid backdrop needs a re-roll (ask for solid magenta and try again).
  • a row came back broken. regenerate just that row as its own image — fighting all the cells at once is how an evening disappears. each row is one coherent group, so this is easy.
  • it sliced a little off. the playground detects the grid from content, so margins and gutters are fine — but if a frame still looks wrong, open different layout? in the playground and nudge the grid.