Create custom desktop pet (Mate) characters with spritesheet and manifest. Use when the user asks to 'create a pet', 'make a desktop companion', 'design a mate character', 'generate a spritesheet for my pet', or wants to customize their desktop buddy. Generates a WebP spritesheet + manifest.json that can be loaded by MiMo Desktop's Mate system.
74
91%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Create animated desktop pet characters for MiMo Desktop's Mate (桌面伙伴) system.
A valid custom pet lives in a folder with this structure:
<pet-id>/
├── manifest.json # Required — animation metadata
└── spritesheet.webp # Required — all animation frames in a gridThe user places this folder in their MiMo Desktop custom pets directory (userData/pets/<pet-id>/), then clicks "Refresh" in Settings → Mate to load it.
{
"id": "my-pet",
"name": "My Pet",
"description": "A cute custom pet",
"version": 1,
"spritesheet": "spritesheet.webp",
"frameWidth": 240,
"frameHeight": 240,
"columns": 8,
"totalFrames": 16,
"animations": {
"idle": { "row": 0, "frames": 8, "fps": 8, "loop": true }
}
}| Field | Type | Description |
|---|---|---|
id | string | Unique identifier (kebab-case) |
name | string | Display name |
version | number | Always 1 |
spritesheet | string | Filename of the spritesheet image |
frameWidth | number | Width of each frame in pixels |
frameHeight | number | Height of each frame in pixels |
columns | number | Number of columns in the spritesheet grid |
totalFrames | number | Total number of frames across all animations |
animations | object | At minimum must include idle |
| Field | Type | Description |
|---|---|---|
description | string | Shown in settings UI |
anchorX | number | Horizontal anchor (0–1, default 0.5) for centering |
Each animation entry:
| Field | Type | Description |
|---|---|---|
row | number | Row index in the spritesheet (0-based) |
frames | number | Number of frames in this animation |
fps | number | Playback speed (recommended: 6–12) |
loop | boolean | Whether the animation loops |
The idle animation is required — it plays by default when the pet is loaded.
row field in the animation definition).frameWidth × frameHeight).Ask the user:
Use the imagegen skill to generate the spritesheet image. Construct the prompt with these guidelines:
If the generated image is already WebP, use it directly. If it is PNG or another format, convert to WebP:
# Convert to lossless WebP preserving transparency
cwebp -lossless -q 100 spritesheet.png -o spritesheet.webpIf cwebp is not available, check for sips (macOS Ventura+ supports WebP export):
sips -s format webp spritesheet.png --out spritesheet.webpIf neither tool is available, instruct the user to install one:
brew install webp # provides cwebpDo NOT silently rename a PNG to .webp — the file must have valid WebP encoding (RIFF/WEBP header). If conversion genuinely cannot be performed, fail explicitly and tell the user what tool to install.
If imagegen is unavailable (skill not enabled or image generation fails), fall back to generating pixel-art frames directly as SVG, then rasterize. Compute dimensions from the manifest:
# Calculate actual spritesheet dimensions from manifest
WIDTH=$((frameWidth * columns))
HEIGHT=$((frameHeight * rows)) # rows = max animation row index + 1
# Rasterize SVG to PNG, then convert to WebP
rsvg-convert -w $WIDTH -h $HEIGHT spritesheet.svg -o spritesheet.png
cwebp -lossless spritesheet.png -o spritesheet.webpAs a last resort, output the SVG file directly and instruct the user to convert it manually.
Generate manifest.json with correct dimensions matching the actual spritesheet output. Verify:
frameWidth × columns = spritesheet total widthframeHeight × (max animation row index + 1) = spritesheet total heightanimations.idle exists with valid row, frames, fps, loopframes ≤ columns (frames per row cannot exceed grid columns)Write both files to the current working directory under a folder named with the pet ID. Tell the user to:
idle animation MUST exist — the system falls back to it.koala, panda), the preset wins.ec3f989
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.