Solel//dev docs

The avatar pack format

This page is for people who build or check avatar packs: face packs, the .solelface file, figure packs, and the events a live face follows.

Face packs (format 1)

A face pack is a folder:

File Size What
pack.json What the pack is, its render data, and every file with its SHA-256
sheet.full.webp 2400 × 2160 The 15 cells, 480 × 720 each, in a 5 × 3 grid. Only in a pack with adult cells
sheet.tame.webp 2400 × 2160 The same sheet with the three adult cells left empty
flow.full.png 600 × 540 Each cell's flow from neutral, at a quarter of the size. Only with adult cells
flow.tame.png 600 × 540 The same, with the adult cells' flows at rest
region.png 120 × 180 The head, in greyscale
still.webp 480 × 720 The neutral cell alone
thumbs/<cell>.webp 192 × 192 Circle crops

The cells, in sheet order:

neutral  listen  smile  laugh  smirk
think    focus   concern  surprise  talk_a
talk_o   blink   flirt  aroused  euphoric

flirt, aroused and euphoric are the adult cells. Every cell shows the same figure, head and torso, in the same pose. Only the face changes.

pack.json has format (1), id (lower-case letters, digits and hyphens), name, about, adult, cells (always the 15 above), face, mismatch, thumb, grade and files. A pack that isn't Solel's own also needs consent, with permission (the person in the face agreed to it) and adult_subject (they're an adult), or it's refused.

The account's Adult expressions setting decides what's served: the full sheet and flow when it's on, the tame ones when it's off, with the adult feelings shown as smirk and laugh.

Check and export a pack

From the genesis-engine folder of the source:

python -m genesis_avatar.studio check path/to/pack
python -m genesis_avatar.studio export path/to/pack my-face.solelface

A .solelface file is a zip of the pack folder. An import refuses a file over 64 MB, any path outside the pack, links, a pack without its consent, one that fails the check, and Solel's own ids.

Figure packs (format 2)

A figure pack is a Sol's 3D body, drawn on the person's own device. It's checked, kept and served like a face pack.

File What
pack.json Format 2, kind figure, its licence (required) and credits, and every file with its SHA-256
figure.glb Binary glTF 2 on a Mixamo skeleton, with the 52 ARKit face shapes and 15 mouth shapes. Up to 256 MB with the rest
figure.json What the renderer needs to know about this body, only where it differs from the defaults
still.webp 480 × 720, the figure at rest
thumbs/<cell>.webp 192 × 192 circle crops, neutral at least

Solel's own figure ids end in -3d, so a face and a body never share an id. Nothing in a figure pack is an adult file. Solel's figures are listed at https://solel.io/avatars/catalogue.json as .solelfigure files, which fetches and checks by size and SHA-256 before the Genesis Engine keeps them.

Events

A live face follows three events, each with a JSON schema:

Event Schema What
avatar.state https://solel.dev/schemas/avatar.state.v1.json What the Sol is doing: idle, listening, thinking, working, speaking, waiting or muted
avatar.feeling https://solel.dev/schemas/avatar.feeling.v1.json A sentence's feeling, sent before its first word
avatar.pack https://solel.dev/schemas/avatar.pack.v1.json The face changed, or Adult expressions was turned on or off, so load the manifest again