More and more people are using AI to bring their own animals onto their desktops: the family dog trotting along the Dock, a much-missed cat napping on top of a browser window. The AI part is easy. The hard part is getting AI images into the exact shape a desktop pet needs. This guide covers both.
βοΈ Our pets are hand-drawn. Yours can be anything.
Every pet that ships with Pets Therapy is hand-drawn by our designers, pixel by pixel. None of them are made by AI. But AI can create art too, so we're opening the door for you to make your own: your dog, your cat, your office mascot. Your custom pets stay on your computer and never become part of our library.
π¦ Download an example pet
A complete, working pet (mypet): the JSON plus every frame,
named and sized correctly. Unzip it to see exactly what yours should look
like, or use it as a template.
Can I just give my AI this page?
Yes, and it's the fastest way. Paste this page's link into an AI that can open websites, together with a photo or description of your pet, and it can follow the guide and hand you the finished ZIP.
Read this guide and follow it to make me a Pets Therapy custom desktop pet: https://pets-therapy.com/ai-custom-pets.html My pet: [attach a photo of your pet, or describe it, e.g. "a small round orange fox with a white-tipped tail"] Pet id: biscuit Follow the guide's file format exactly (50Γ50 frames facing right, the file names, the JSON and the ZIP), draw or generate the front, walk and drag animations, and give me the finished biscuit.zip to import into Pets Therapy. If you can't open the link, tell me, and I'll paste the guide's prompts instead.
This works with chat AIs that can browse the web and run code, and with coding agents on your computer (Claude Code, Codex, Cursorβ¦). If your AI can't open links, or the result isn't right, follow the steps below. Each one has its own prompt, so you can check and fix as you go.
What files does a custom desktop pet need?
A pet is a folder of small PNG frames plus one JSON file, zipped together.
Every frame is named {id}_{animation}-{number}.png. Here is the
smallest pet the app will accept, for a pet with the id biscuit:
front
2β6 frames facing you. Shown in the pet grid and when your pet stops to look at you.
biscuit_front-0.png β¦
walk
4β8 frames, side view, facing right. The app mirrors it when walking left.
biscuit_walk-0.png β¦
drag
1β4 frames of the pet dangling. Shown while you carry it around with the mouse.
biscuit_drag-0.png β¦
biscuit.json
Name, speed, frame rate and behaviours. Your AI writes it for you.
biscuit.json
Frames are small: most built-in pets use a 50 Γ 50 px canvas played at 10 frames per second. You don't need to draw at that size. Generate big, and the packaging prompt has the AI shrink it without blurring.
Step 1: How do I turn a photo of my pet into pixel art?
Upload the photo to a chat-based AI image tool and ask for a chunky pixel-art sprite of that exact animal, in full-body side view facing right, on a solid magenta background.
Start a new chat in your image tool and stay in it for everything that follows. Consistency is the hardest thing for AI here, and keeping one conversation (with the first image as the reference) helps more than anything else.
Option A: from a photo of your real pet
Attach a clear, well-lit photo where the whole body is visible, then paste:
Turn the animal in the attached photo into a cute pixel-art video game character. Style: chunky retro pixel art like a 1990s handheld game, roughly 48Γ48 pixels for the whole body, 1-pixel dark outline, flat colours with a single shade, no anti-aliasing, no gradients, no blur. Keep its real fur colours, markings, ear shape, eye colour and tail exactly as in the photo, so its owner instantly recognises it. Pose: full body, side view, facing RIGHT, standing on all four feet. Background: plain solid magenta (#FF00FF) filling the whole image. No shadow, no ground, no text, no border.
Option B: from an idea
Design a cute pixel-art video game character: a small round orange fox with a fluffy white-tipped tail and big dark eyes. Style: chunky retro pixel art, roughly 48Γ48 pixels for the whole body, 1-pixel dark outline, flat colours with a single shade, no anti-aliasing, no gradients. Pose: full body, side view, facing RIGHT, standing. Background: plain solid magenta (#FF00FF) filling the whole image. No shadow, no ground, no text.
Iterate until you love it ("make the ears bigger", "fewer colours", "more like the photo"). This image is your reference, and every later prompt says "the same character".
π‘ Why magenta and not "transparent"?
- Ask most AI tools for a transparent background and they paint a grey checkerboard into the picture. It looks transparent but isn't.
- A solid colour that appears nowhere on your pet is trivial to remove. Magenta
#FF00FFis the classic choice; use bright green#00FF00for a pink or purple pet. - If your tool really does export transparent PNGs, that's even better: tell the AI there's no background to remove.
Step 2: How do I get AI to make a walk-cycle sprite sheet?
In the same chat, ask for one horizontal row of 4β6 frames of "the same character", facing right, with empty space between frames and the same ground line in every frame.
Ask for each animation as a sprite sheet: one horizontal row of frames with empty space between them. That gap is what lets the AI cut the frames apart cleanly in Step 3.
Walk (required)
Using exactly the same character, create a walk-cycle sprite sheet. 6 frames in a single horizontal row, evenly spaced, with clear empty background between frames. Side view facing RIGHT in every frame. Same size, same proportions and same ground line in every frame; only the legs, tail and a 1-pixel body bob change, so the frames loop smoothly from the last back to the first. Same pixel-art style: 1-pixel dark outline, flat colours, no anti-aliasing. Plain solid magenta (#FF00FF) background. No shadows, no text, no frame numbers, no grid lines.
Front (required)
Same character, now facing the viewer (front view), sitting. Make a 4-frame idle animation in a single horizontal row with empty space between frames: frame 1 neutral, frame 2 eyes closed (blink), frame 3 neutral, frame 4 tiny head tilt. Identical size and position in every frame. Same pixel-art style and outline. Plain solid magenta (#FF00FF) background. No shadows, no text.
Drag (required)
Same character being lifted up by the scruff of its neck: front view, body hanging straight down, legs dangling, a slightly surprised face. 2 frames in a single horizontal row with empty space between them; in frame 2 the legs swing slightly to one side. Same size and pixel-art style. Plain solid magenta (#FF00FF) background. No hand, no shadows, no text.
Extras (optional, but your pet gets more to do)
These unlock right-click actions in the app: Sleep,
Eat, Relax (idle) and
Cuddle (love). A food item lets you feed your pet
from the Pets Interactions window. Your pet also plays these now and then on its own.
Same character curled up asleep on the ground, side view facing right. 4 frames in a single horizontal row with empty space between them: the body gently rises and falls by 1 pixel (breathing), and a small "z" floats above its head in frames 3 and 4. Same size and pixel-art style. Plain solid magenta (#FF00FF) background. No shadows, no text other than the "z".
Same character eating, side view facing RIGHT, head lowered to the ground. 4 frames in a single horizontal row with empty space between them: head down, chewing, head slightly up, chewing again. Same size, same ground line and pixel-art style. Plain solid magenta (#FF00FF) background. No bowl, no shadows, no text.
A single small pixel-art food item this character would love (for example a fish, a bone, a carrot or a seed), drawn in the same pixel-art style with the same outline. It should be tiny, about a third of the character's height, and wider than it is tall. Centred on a plain solid magenta (#FF00FF) background. No plate, no shadow, no text.
Tips per tool
π¬ Chat-based (ChatGPT, Gemini, Copilotβ¦)
The easiest route. Keep everything in one chat, refer back to "the character from the first image", and ask for single fixes: "same image, but frame 4's back leg is wrong".
π¨ Midjourney
Use its character/image reference feature with your Step 1 image, and a wide aspect ratio for rows (e.g. --ar 3:1). It tends to add soft shading, so add "flat colours, no gradients".
π₯οΈ Stable Diffusion (local)
A pixel-art LoRA plus a pose ControlNet gives the most consistent walk cycles. Generate frames one at a time from fixed poses and hand them to the AI as separate files in Step 3.
π‘ When the AI won't stay consistent
- Fewer frames is fine. A 4-frame walk looks great at desktop size. Even 2 frames work.
- Generate extra and pick. Ask for 8 frames, then delete the odd ones before importing.
- Fix one frame at a time. Ask for "only frame 3 again, matching frames 2 and 4". Single-frame images work fine in Step 3.
- Re-anchor. If the character drifts, re-attach the Step 1 image and say "match this exactly".
- No AI is perfect. A minute of touch-up in Piskel (free, in the browser) or Aseprite makes a big difference.
Step 3: How do I turn the AI images into a finished pet?
Ask the same AI to package it. Paste the prompt below and it cuts the frames, removes the background, sizes and names every file, writes the JSON and zips it, either in a chat with code execution or as a coding agent on your computer.
Package the sprite sheets from this chat into a Pets Therapy custom pet. Use code, and give me a downloadable ZIP.
Pet id: biscuit (lowercase letters and numbers only, no spaces, no underscores).
Animations: front, walk and drag are required; also include sleep and eat if I made them.
For each sprite sheet: split it into its individual frames in left-to-right order, and remove the solid background colour.
Frame rules, for every animation:
- Fully transparent background; every pixel either fully opaque or fully transparent (no soft edges).
- All frames of one animation share the same crop box, so the pet doesn't jitter, and the feet touch the bottom edge.
- Scale with nearest-neighbour only (never smooth) onto a 50Γ50 px transparent canvas, bottom-centred.
- Walk, eat and sleep frames face RIGHT (the app mirrors them when the pet walks left).
- Save as PNG named {id}_{animation}-{n}.png, numbered from 0 with no gaps, e.g. biscuit_walk-0.png.
Then write biscuit.json exactly like this:
{
"id": "biscuit",
"movementPath": "walk",
"dragPath": "drag",
"fps": 10,
"speed": 0.8,
"scale": 1,
"zIndex": 0,
"tags": [],
"capabilities": [
"AnimatedSprite", "AnimationsProvider", "AnimationsScheduler", "AutoRespawn",
"BounceOnLateralCollisions", "Draggable", "FlipHorizontallyWhenGoingLeft",
"Gravity", "LinearMovement", "PetsSpritesProvider", "Rotating", "ShowsMenuOnRightClick"
],
"animations": [
{ "id": "front", "position": "fromEntityBottomLeft", "requiredLoops": 5 }
]
}
If sleep or eat frames exist, add them to "animations" too:
{ "id": "sleep", "position": "fromEntityBottomLeft", "requiredLoops": 10 },
{ "id": "eat", "position": "fromEntityBottomLeft", "requiredLoops": 3 }
Put biscuit.json and every PNG in one folder named biscuit, zip it as biscuit.zip, and list the files inside so I can check them.
Or skip the image tool: let a coding agent draw the whole pet
Coding agents that run on your computer (Claude Code, Codex, Cursor and others), and chat AIs with code execution, can draw the pixel art in code straight from a description and write the finished ZIP. Change the description and paste:
Create a Pets Therapy custom desktop pet from this description:
"A small round orange fox with a fluffy white-tipped tail and big dark eyes."
Draw the pixel-art frames yourself in code (for example Python with Pillow): cute chunky retro pixel art, a 1-pixel dark outline, flat colours with a single shade, a limited palette, and the same character in every frame.
Animations to draw:
- front: 4 frames facing the viewer, sitting (neutral, blink, neutral, small head tilt)
- walk: 6 frames, side view facing RIGHT, a smooth looping walk cycle (only the legs and tail move, plus a 1-pixel body bob)
- drag: 2 frames of the pet held up by the scruff, legs dangling and swinging slightly
- sleep: 4 frames curled up, breathing by 1 pixel
- eat: 4 frames, head down to the ground, chewing
Pet id: biscuit (lowercase letters and numbers only, no spaces, no underscores).
Frame rules, for every animation:
- Fully transparent background; every pixel either fully opaque or fully transparent (no soft edges).
- All frames of one animation share the same crop box, so the pet doesn't jitter, and the feet touch the bottom edge.
- Scale with nearest-neighbour only (never smooth) onto a 50Γ50 px transparent canvas, bottom-centred.
- Walk, eat and sleep frames face RIGHT (the app mirrors them when the pet walks left).
- Save as PNG named {id}_{animation}-{n}.png, numbered from 0 with no gaps, e.g. biscuit_walk-0.png.
Then write biscuit.json exactly like this:
{
"id": "biscuit",
"movementPath": "walk",
"dragPath": "drag",
"fps": 10,
"speed": 0.8,
"scale": 1,
"zIndex": 0,
"tags": [],
"capabilities": [
"AnimatedSprite", "AnimationsProvider", "AnimationsScheduler", "AutoRespawn",
"BounceOnLateralCollisions", "Draggable", "FlipHorizontallyWhenGoingLeft",
"Gravity", "LinearMovement", "PetsSpritesProvider", "Rotating", "ShowsMenuOnRightClick"
],
"animations": [
{ "id": "front", "position": "fromEntityBottomLeft", "requiredLoops": 5 }
]
}
If sleep or eat frames exist, add them to "animations" too:
{ "id": "sleep", "position": "fromEntityBottomLeft", "requiredLoops": 10 },
{ "id": "eat", "position": "fromEntityBottomLeft", "requiredLoops": 3 }
Write everything into a folder named biscuit, zip it as biscuit.zip, then show me a preview sheet of all frames enlarged 4Γ so I can check them.
π‘ Getting a clean result
- Chat tools need code execution or file output switched on, or they can't hand you a ZIP.
- A local coding agent writes the files straight into a folder you choose, ready to import.
- Fix one thing at a time: "the walk frames face left, mirror them", "frame 3 floats, align the feet to the bottom edge". The troubleshooting table lists what to look for.
- Prefer doing it by hand? Aseprite (File β Export Sprite Sheet, output
biscuit_walk-{frame}.png) or Piskel work too.
Step 4: What goes in the pet's JSON file?
The pet's id, which animations to use for walking and dragging, its speed and frame rate, and a standard list of behaviours. The packaging prompt has the AI write it for you.
The AI's ZIP already contains this file. If you made the frames by hand,
save this as biscuit.json (with your own id in both places). It
imports as-is:
{
"id": "biscuit",
"movementPath": "walk",
"dragPath": "drag",
"fps": 10,
"speed": 0.8,
"scale": 1,
"zIndex": 0,
"tags": [],
"capabilities": [
"AnimatedSprite",
"AnimationsProvider",
"AnimationsScheduler",
"AutoRespawn",
"BounceOnLateralCollisions",
"Draggable",
"FlipHorizontallyWhenGoingLeft",
"Gravity",
"LinearMovement",
"PetsSpritesProvider",
"Rotating",
"ShowsMenuOnRightClick"
],
"animations": [
{ "id": "front", "position": "fromEntityBottomLeft", "requiredLoops": 5 }
]
}
| Field | What it does | Good values |
|---|---|---|
id | Unique name, and the prefix of every PNG. Lowercase letters and numbers only; no underscores (they separate the id from the animation name). | biscuit, mrwhiskers |
movementPath | Animation used while walking. Frames must exist. | walk |
dragPath | Animation used while you carry the pet. Frames must exist. | drag |
fps | Frames per second for all animations. | 8β12 (max 20) |
speed | Walking speed. | 0.5 (slow) β 1.2 (zoomy) |
scale | Size multiplier on screen (optional). | 1 β 1.5 |
tags, zIndex | Required by the app; leave them as shown. | [], 0 |
capabilities | Behaviours: gravity, dragging, flipping, the right-click menu⦠Add RandomPlatformJumper to let it hop onto windows. | The list above |
animations | Extra animations the pet plays on its own every now and then, with how many times each one loops. | See below |
If you generated sleep, eat, idle or
love frames, add them to animations so your pet also
plays them on its own:
"animations": [
{ "id": "front", "position": "fromEntityBottomLeft", "requiredLoops": 5 },
{ "id": "sleep", "position": "fromEntityBottomLeft", "requiredLoops": 10 },
{ "id": "eat", "position": "fromEntityBottomLeft", "requiredLoops": 3 }
]
Or let an AI write it
Write a Pets Therapy species JSON file for my custom desktop pet. Rules:
- Output only valid JSON, no comments.
- Required keys: id, movementPath, dragPath, fps, speed, zIndex, tags, capabilities, animations. Optional: scale.
- id: "biscuit" (lowercase, no underscores). movementPath: "walk". dragPath: "drag". zIndex: 0. tags: [].
- fps: 10. speed: 0.8 (it's a calm pet). scale: 1.
- capabilities exactly: AnimatedSprite, AnimationsProvider, AnimationsScheduler, AutoRespawn, BounceOnLateralCollisions, Draggable, FlipHorizontallyWhenGoingLeft, Gravity, LinearMovement, PetsSpritesProvider, Rotating, ShowsMenuOnRightClick.
- animations: an array of { "id", "position": "fromEntityBottomLeft", "requiredLoops" } for: front (5 loops) and these extras I have frames for: sleep (10 loops), eat (3 loops).
Then list the PNG file names I need, using the pattern {id}_{animation}-{number}.png.
Step 5: How do I import a custom pet into Pets Therapy?
Zip the JSON and PNG files together, open Pets Therapy's About page and drop the ZIP on the "Create your own!" area. It's the same on Mac, Windows and Linux.
Your folder should look like this, with every file at the top level or inside one folder:
biscuit/
βββ biscuit.json
βββ biscuit_front-0.png β¦ biscuit_front-3.png
βββ biscuit_walk-0.png β¦ biscuit_walk-5.png
βββ biscuit_drag-0.png biscuit_drag-1.png
βββ biscuit_sleep-0.png β¦ (optional)
βββ biscuit_food-0.png (optional)
Zip it: on macOS, right-click the folder β Compress. On Windows, right-click β Send to β Compressed (zipped) folder (or Compress to ZIP file on Windows 11). The AI's download is already a ZIP, so skip this if you used it.
π macOS
Supported- Open Pets Therapy.
- Go to the About page.
- Drag your ZIP onto the dashed "Drag and drop your zip file here" area under Create your own!
- Find your pet in the list and add it to your screen.
πͺ Windows & π§ Linux
Supported- Open Pets Therapy (Manage Pets).
- Go to the About page.
- Drag your ZIP onto the Create your own! drop area, or click it to pick the file.
- Find your pet in the list and add it to your screen.
What else can a custom pet do?
- Give it a nickname: on macOS, open the pet's details and rename it.
- Feed it: with an
eatanimation and a{id}_food-0.png, your pet appears in the Pets Interactions window like the built-in ones. - Too small or too big? Change
scalein the JSON (or ask the AI to change it), or use the pet size slider in the app. - Changed something? Delete the pet from its details page in the app, then import the new ZIP.
Why won't my custom pet import?
Almost always a file name that doesn't match the id in the JSON, or a missing walk or drag frame. Each error message the app shows is listed below.
| You see | Why | Fix |
|---|---|---|
"Missing required file: biscuit_walk" (or _drag) | The PNG names don't match the id + movementPath/dragPath in the JSON. | Rename the files to {id}_walk-0.png⦠exactly. Names are case-sensitive. |
| "Missing required file: <species>.json" | No JSON in the ZIP, or it's nested two folders deep. | Put the JSON next to the PNGs, either at the top level or in one folder. |
| "Invalid species.json file" | A typo (trailing comma, missing quote) or a missing required key. | Start from the template above and paste it into any JSON validator. |
| "β¦already exists" | A pet with that id is already installed. | Delete the old one in the app, or pick a new id (and rename the PNGs). |
| Pet walks backwards (moonwalks) | Walk frames face left. | Ask the AI to mirror the walk frames. Pets must face right. |
| Pet jitters or bounces up and down | Frames weren't aligned on one ground line. | Ask the AI to crop all frames of the animation to one shared box with the feet on the bottom edge. |
| Pink or green halo around the pet | Soft edge pixels left after removing the background. | Ask the AI to make every pixel fully opaque or fully transparent. |
| Pet looks blurry | Frames were resized with smoothing. | Ask the AI to rescale with nearest-neighbour only. Never use a photo editor's default resize. |
| Pet floats above windows | Empty space below the feet in the frames. | Ask the AI to crop the frames so the feet touch the bottom edge. |
| Pet is blank in the grid | No front frames. | Add {id}_front-0.png (even a single frame). |
Where can I find more prompts?
The AI pixel-art pet prompt library has 24 ready-made character prompts (dogs, cats, rabbits, horses, reptiles from a photo; corgis, red pandas, dragons, slimes, mascots and more from a description) plus every animation prompt, including Relax and Cuddle.
Is this easier than making a custom Shimeji?
Yes. A Shimeji-ee character needs a complete set of 46 numbered images; a Pets Therapy pet needs as few as three short animations, imported from one ZIP.
| Custom Shimeji (Shimeji-ee) | Custom Pets Therapy pet | |
|---|---|---|
| Images needed | A full set: shime1.png β¦ shime46.png, every pose | 3 animations minimum (front, walk, drag) |
| File naming | Numbered slots you have to map to poses | Named by animation: biscuit_walk-0.png |
| Install | Copy an image folder into the program, Java required | Drop one ZIP on the About page |
| Platforms | Windows; Mac needs workarounds | Native on Mac, Windows and Linux |
| AI-friendly tooling | None built in | Copy-paste prompts that make the AI build the whole pet |
Coming from Shimeji? See Shimeji alternatives and Shimeji on Mac.