JackyJacky

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:

Directory Hierarchy
MyCustomCompanion/
manifest.json
Idle/
idle_000.png
idle_001.png
idle_002.png
idle_003.png
Walking/
walking_000.png
walking_001.png
walking_002.png
walking_003.png

manifest.json Manifest

Open the Manifest Builder

The manifest.json file defines the package metadata, the skin dimensions, playback rate, and shop card details.

Note

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:

manifest.json
{
  "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 .jacky file.
  • description: A short description of the package.

Skin Settings (skin)

  • sprite_size: Width and height of each (square) frame. Defaults to 128.
  • fps: Target playback frames-per-second. Defaults to 8.
  • sprite_facing: Whether the source assets face left or right. Defaults to right. 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.
Info

Who is the Author?

  • Root author: The author who created/compiled the .jacky package file.
  • skin.card.author: The illustrator or artist who created the actual skin design.
Tip

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.

Warning

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

Show List

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:

Pet States & Fallback Chain ExplorerClick a row to trace fallbacks
PetStatePrimary VariantsUsage 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 Typing2 is missing, it falls back to Typing.
  • If Typing is missing, it falls back to Talk.
  • If Talk is missing, it falls back to Idle Blinking.
  • If Idle Blinking is missing, it falls back to Idle.
Warning

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.png to 003.png).

  • Minimum Viable Skin: The simplest possible skin only requires the Idle folder 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 the Idle animation.

  • Recommended Simple Skin: For a fast but natural-feeling skin, creating just 5 folders with 4 frames each is highly recommended:

    1. Idle (Default resting animation)
    2. Walking (Movement across the screen)
    3. Talk (Active during speech bubbles)
    4. Happy (Triggered on petting, greetings, or victories)
    5. Hurt (Reaction to fights or errors)

    These 5 basic folders cover all main interactions, giving your companion a lively, responsive feel with minimal effort.