Skins define the visual appearance of your desktop companion. A skin consists of numbered PNG frames organized in specific subfolders representing animation variants.
Sprite Pack Structure
A valid skin is packaged as a .jacky (or .zip) archive containing a manifest.json configuration manifest at the root, along with animation folders containing sequential PNG frames. Note that each animation must contain at least 4 frames to playback correctly:
manifest.json Manifest
Open the Manifest Builder
The manifest.json file defines the package metadata, the skin dimensions, playback rate, and shop card details.
Upon installation, Jacky automatically compiles the manifest.json into an internal, flat character.json file used by the runtime. You should only pack and distribute your skin with manifest.json.
Here is an example manifest.json configuration:
{
"type": "skin",
"name": "MyJacky",
"version": "1.0.0",
"author": "Jacky Team",
"description": "MyJacky skin in .jacky file",
"skin": {
"sprite_size": 128,
"fps": 16,
"sprite_facing": "left",
"card": {
"title": "MyJacky",
"description": "EmoteLab MyJacky skin para Lu",
"author": "Cate",
"link": "https://yourwebsite.com"
}
}
}Package Metadata (Root)
type: Must be set to"skin"for skin packages.name: The display name of the skin package.version: Semantic versioning string (e.g.,"1.0.0").author: The user or organization who compiled and packaged the.jackyfile.description: A short description of the package.
Skin Settings (skin)
sprite_size: Width and height of each (square) frame. Defaults to128.fps: Target playback frames-per-second. Defaults to8.sprite_facing: Whether the source assets faceleftorright. Defaults toright. Optional.
Character Card (skin.card)
You can optionally include a card object under the skin block to display information in the character selector or shop:
title: The display name of the skin card.description: A brief description of the skin.author: The artist/designer who created the visual assets.link: A URL pointing to the artist's website or portfolio.
Who is the Author?
- Root
author: The author who created/compiled the.jackypackage file. skin.card.author: The illustrator or artist who created the actual skin design.
Adding Hat Support? Include a hat object in your manifest with frame-by-frame head coordinates so hats track properly on your custom character. See the Hats guide for the full format reference and coordinate system details.
Animation States & Mappings
Jacky supports 26 distinct state enums (PetState) that are resolved dynamically into internal Animation Variants.
Folders must match Variants, not States!
Do not name your sprite folders after the PetState enum (e.g., do not name a folder JUMPING). Instead, your folders must be named after the standard Folder Names associated with their primary variants (e.g., the folder for the JUMPING state must be named Jump Loop to map to the jump_loop variant).
If you name folders incorrectly, the auto-discovery scanner will not recognize them and will trigger the Fallback System.
To help you verify your packages, here is the reference list of all recognized folder names on disk. Only the Idle folder is strictly required:
Standard Animation Folders Reference
42 recognized folders • 1 required, 41 optional
Row entries below explain the relationship between the internal PetState enums and their primary animation variants. Expand a row to view its fallback chain path:
| PetState | Primary Variants | Usage Context | |
|---|---|---|---|
| IDLE | idleidle2 | Default resting state | |
| TALKING | talk | Active when displaying speech bubbles | |
| WALKING | walk | Standard movement across coordinates | |
| RUNNING | run | Fast movement for screen targeting/chasing | |
| HURT | hurt | Reaction to peer fight strikes or screen interact alerts | |
| HAPPY | happyhappy2 | Greets on load, winning a peer fight, or petted | |
| FALLING | falling | Gravity drop when airborne/drag-release | |
| JUMPING | jump_loop | Unused, reserved for jump animations | |
| ATTACKING | shootingslashingkick | Fights, screen clicks, window resizing | |
| EATING | eatingeating2eating3 | Fed with virtual boba items | |
| DRAGGED | drag | User mouse drag movement state | |
| DYING | dying | Defeat reaction in multiplayer battle module | |
| DANCE | dancedance2dance3dance4 | Music playback triggers or synchronization | |
| GETTING_PET | getting_petgetting_pet2getting_pet3 | Clicking/Petting the avatar | |
| PEEKING | peeking | Hiding behind active desktop application boundaries | |
| SLEEPING | sleeping | Asleep or low battery state | |
| TAKING_NOTES | taking_notes | Writing actions or summarization tasks | |
| ERROR | error | Fallback state when API requests or actions fail | |
| TAKING_PICTURE | taking_picture | Triggered during screen capture / vision analysis | |
| ROCKING | rocking | Listening to music or minor idle variation | |
| CONFUSED | confused | Ambiguous query resolution or parsing errors | |
| DIZZY | dizzy | Post-spin/shake reaction | |
| THINKING | thinking | Active while the LLM generates a text prompt response | |
| LOADING | loading | Indicates background data requests | |
| TYPING | typingtyping2 | Simulating keystrokes into input fields | |
| ALERTING | alerting | Visual notification alerts | |
| SAD | sadsad2sad3 | Low affinity or disappointed responses |
The Fallback System
You do not need to create every sprite folder to make a valid skin. If a folder is missing, Jacky walks the Fallback Chain (shown in the table explorer above) to locate a suitable match.
For example:
- If
Typing2is missing, it falls back toTyping. - If
Typingis missing, it falls back toTalk. - If
Talkis missing, it falls back toIdle Blinking. - If
Idle Blinkingis missing, it falls back toIdle.
The Idle folder is the absolute root of all fallback chains. A package must contain a valid Idle directory with at least 4 frames, otherwise the companion has nothing to fall back to and will fail to render.
Skin Development Guidelines
When creating custom skins, keep these key rules and recommendations in mind to ensure compatibility and smooth rendering:
-
Minimum 4 Frames per Animation: Every single animation you include (e.g.,
Idle,Walking, etc.) must have at least 4 frames (e.g.,000.pngto003.png). -
Minimum Viable Skin: The simplest possible skin only requires the
Idlefolder with at least 4 frames. With this single folder, Jacky can appear on the screen, move around, and run, since every state will gracefully fallback to theIdleanimation. -
Recommended Simple Skin: For a fast but natural-feeling skin, creating just 5 folders with 4 frames each is highly recommended:
Idle(Default resting animation)Walking(Movement across the screen)Talk(Active during speech bubbles)Happy(Triggered on petting, greetings, or victories)Hurt(Reaction to fights or errors)
These 5 basic folders cover all main interactions, giving your companion a lively, responsive feel with minimal effort.