Characters
A base in 4 or 8 directions from a prompt or your own sprite, states, loops, mirrors, and what each PixelLab engine costs.
A character style holds one PixelLab character as three kinds of asset: a
base drawn facing 4 or 8 directions, states that apply a pose or an outfit
to every direction at once, and loops, one direction each. Each is an asset
with its own lockfile record and files, so plan prices the cast, one gen
runs it in waves, and pack writes every direction and loop for the engine.
This page is the reference for the manifest shapes; the manifest
reference covers the fields every asset shares.
The three shapes
A cast in full, with a base, a state, and two loops:
{
"styles": {
"cast": {
"generator": "character",
"outDir": "art/characters",
"view": "side",
"size": 64,
"mode": "standard",
"palette": ["#0f380f", "#306230", "#8bac0f", "#9bbc0f"],
"enforcePalette": true
}
},
"assets": {
"mira": {
"prompt": "small young woman, dark curly hair in a bun, oversized hoodie"
},
"mira.chair_spin": {
"prompt": "one hand high on the pole, sitting in the air with knees up, spinning",
"state": { "of": "mira", "paletteFromReference": true }
},
"mira.fireman_spin": {
"prompt": "spinning around the pole, knees crossed",
"animation": { "of": "mira.chair_spin", "direction": "east", "frames": 8, "fps": 10 }
},
"mira.walk": {
"prompt": "",
"animation": { "of": "mira", "template": "walk", "direction": "south" }
}
}
}
The base
A base is a prompt, wrapped in the style's prefix and suffix like any other
asset, that PixelLab draws facing 4 or 8 directions. mode picks the
engine: standard (1 generation, the skeleton template, outline,
shading, and detail as soft guidance, and palette sent as a colour
reference), v3 (2 to 9 by size, the highest quality, up to 256px),
pro (20 to 40 by size), or pro-flash (6 to 17 by size: PixelLab's
newest image model draws the south sprite and v3 rotates it; sizes are
multiples of 4 up to 256, template may be custom, and a reference
pays for the rotations only, 1 at 64px). size is the character's size;
view is low top-down (the default), high top-down, or side;
template picks the body. Each direction lands as
<asset>-<direction>.png, south first.
Standard mode draws on a canvas 28px larger than size, 14px of room on
each side for animation (a 64px character comes back as 92px files, a
104px one as 132px); the lock records the size asked for, and the files
are what PixelLab drew.
Proportions, guidance, and isometric view
Three more knobs shape a standard base. proportions is a preset
(chibi, heroic, and so on) or multipliers on the mannequin's head,
arms, legs, shoulders, and hips; it lives on the style and any base may
override it, and only the mannequin template has proportions to set.
textGuidanceScale (1 to 20, PixelLab's default 8) is how closely the text
is followed, and applies to template loops as well. isometric draws the
base and every loop in isometric view. The v3 and pro engines take none of
the three for a base; a v3 style may still set the last two for its loops.
A v3 base takes enhancePrompt instead, which has PixelLab expand the
prompt into a fuller one before drawing.
Starting from your own sprite
A base can also start from your own sprite. reference names a
manifest-relative PNG or JPEG of the character facing south, and PixelLab
draws the other directions from it, with the prompt as guidance:
"mira": { "prompt": "small young woman, oversized hoodie", "reference": "refs/mira-south.png" }
standard uses each image as it is, centred on its larger canvas, and
generates the rest, so the image must be the style's size exactly; it
accepts one image per direction
({ "south": ..., "east": ... }), and a quadruped template needs south and
east. v3 rotates one south image of up to 256px (its template must
match the body in the image). pro rotates one south image of up to 168px
through its rotate_character method. The reference's bytes are part of
the base's identity, so a redrawn file makes the base stale, and the file
is read again at submit time and refused if it changed since plan.
States, animations, and mirrors take their look from their parent and
cannot carry a reference.
Concept images and style anchors (pro)
The pro engine has two more ways in. concept on a base names a concept
image (a painting, a photo, a sketch, up to 1024px) that seeds the design
in place of the prompt alone (PixelLab's create_from_concept); the
prompt still guides it. styleCharacter, on the style or a base, names a
generated 8-direction character in the same style whose look the base
follows (style_character_id); its south sprite becomes the style image
unless a style image is also given. The anchor is a dependency like a
loop's character: the base is blocked until the anchor is downloaded and
current, gen runs it in the wave after the anchor lands, and a
regenerated anchor makes every base drawn in its style stale. The anchor
itself ignores the setting, so a style can name its own first character.
PixelLab wants the base at least as large as the anchor's visible sprite
and fails the job fast otherwise. A base rotating its own reference
takes neither: the rotate method has one image slot and it is the
character.
Style images (pro and pro-flash)
Style images on a character style are a pro input: one image of up to
168px that anchors the look of a pro base drawn from text or a concept
(create_with_style and create_from_concept both take it), or one of
up to 256px that a pro-flash base copies its look from, no larger than
the character's size on either side (crop it to its subject), with
styleTraits (palette, outline, detail, shading, each on by
default) choosing which traits it lends. standard and v3 have no such
slot and refuse them; a base with a reference refuses them too, in
either engine.
States
A state is a text edit of an existing character, state.of, applied to
every direction at once: a pose, an outfit, a held object. The prompt is
the edit and goes to PixelLab as written, without the style's prefix and
suffix, since the character already carries the look.
paletteFromReference snaps the result to the parent's colours; canvas
asks for a larger frame when the edit adds something big. A state costs 20
to 40 by canvas and keeps the parent's directions. A state may be a state
of another state.
Animations
An animation is one loop of one character (animation.of, a base or a
state) in one direction. With a template (PixelLab's walk,
breathing-idle, running-8-frames, and so on) it costs 1 and the
template decides the frame count; without one the prompt is the motion and
PixelLab's v3 engine draws frames frames (4 to 16, even, default 8) for
ceil(size² × frames / 65536) generations, one at 64px. keepFirstFrame
(on by default) stores the resting pose as frame 0, so 8 frames land as 9
files, <asset>-frame-00.png onwards. fps is recorded with the frames
for the gallery, pack, and the Godot and Aseprite formats; PixelLab does
not keep one. An animation lands in review as an ordered set: pick shows
the loop and accepts or rejects it whole. One asset per direction; declare
another asset for another direction, or a mirror of this one
for the direction that faces the other way.
Pose frames and other loop controls
A v3 loop can start and end where you say. startFrame is a
manifest-relative image of the pose to begin from instead of the
character's rotation; endFrame is a pose to reach, and with it the loop
interpolates from the start frame to that image (both up to 256px, and the
end frame the same size as the start frame or, without one, as the
character's rotation, which plan checks once the parent is on disk; the
frames can still come back on a taller canvas when the motion needs it, as
a 92px crouch did at 92×104). subject replaces the character's own description for this loop when it
would mislead the model (a state that took the armour off), and
enhancePrompt lets PixelLab expand the action into a fuller motion
description first. A template loop takes none of those; it takes
outline, shading, and detail overrides instead, over the character's
own. The style's palette goes to every loop as a colour reference, as it
does to a standard base, and enforcePalette still snaps the frames
afterwards. Pose images hash into the loop's identity and are read again
at submit time, like a base's reference.
"mira.bow": {
"prompt": "bowing deeply from the waist",
"animation": { "of": "mira", "direction": "south", "frames": 6, "endFrame": "poses/mira-bowed.png" }
}
How the family depends on the base
States and animations depend on their parent the way a revision does. The
parent must be downloaded and current before the child is actionable;
plan reports the child as blocked and names the parent until then, and
one gen runs the waves in order: bases, then states, then animations,
under one budget. The
child's identity includes the parent's generated south-facing file, so
regenerating the parent makes every state and animation of it stale. A
hand edit of the parent does not, because PixelLab draws the child from the
character it holds, not from local bytes.
Regenerating an animation clears PixelKiln's own earlier take of that direction on the character first, since PixelLab skips a direction that already exists. The lock records the animation and group ids PixelLab assigned, and the delete goes by those (PixelLab keeps the name PixelKiln gives a loop only for text animations, not template ones). Nothing else on the character is touched, and a base or state is never deleted by PixelKiln.
Palette and packing
enforcePalette snaps every direction and every frame. pack --style cast --format godot writes a SpriteFrames with each direction of a base or
state as a still and each animation as a looping set at its fps;
--format aseprite does the same with frameTags.
Adopting a character from the account
Characters that already exist on the account come under the manifest with
adopt. Declare the asset with remoteId (the character id, or
<character id>#<animation group id> for a loop; get_character in
PixelLab's own tools shows both) and run pixelkiln adopt: it records the
character, writes every direction and frame that is not on disk, and costs
nothing. A base can also be matched by the bytes of its south-facing file.
See adopt.
Mirrors
Each direction of a loop is its own generation, and a sprite walking east
is the sprite walking west flipped. A mirror asset is that flip, made
locally from the source asset's downloaded files:
"hero.walk.west": { "prompt": "", "animation": { "of": "hero", "template": "walk", "direction": "west" } },
"hero.walk.east": { "mirror": "hero.walk.west" }
A full 8-direction set of one loop is then 5 generations (south, north,
west, south-west, north-west) and 3 mirrors; a 4-direction set is 3 and 1.
The mirror takes its shape from the source (a loop of the same character,
facing the other way, at the same fps), needs no prompt, and costs
nothing: plan lists it under the provider with a cost of 0 and gen
flips it in the wave after the source lands. It has its own lock entry and
files (hero.walk.east-frame-00.png onwards), so pack, the gallery, and
an engine see an ordinary loop. Nothing is sent to the provider, and the
account holds no east animation.
The lock records a hash over the source's output hashes when the flip was
made. A source that is regenerated, restored, or re-snapped makes its
mirrors stale, and the next gen flips them again for free. A mirror
whose files went missing is stale too; one that was hand-edited is
orphaned, like generated art. A source that is not downloaded, current,
and untouched blocks its mirrors.
A loop facing south or north cannot be mirrored: the flip would be the same
direction with its asymmetries swapped, not a new one. A single image or a
frame set from any generator can be mirrored, and so can a base or state
(every direction flipped and relabelled, so west becomes east). A tile set
cannot; its edges carry meaning. Mirroring swaps handedness, so a character
who holds a sword in the right hand holds it in the left when facing the
mirrored way. Most games accept that; if yours does not, generate both
sides. adopt skips mirrors, since there is nothing upstream to adopt.
Engines that flip sprites at draw time (Godot's flip_h, Unity's
flipX) do not need mirrored files at all. Declare only the directions
you generate and flip in the engine; mirrors are for pipelines that want
every direction on disk.
Working with a cast
pixelkiln planshows a state or loop asblockeduntil its parent is downloaded and current, and onepixelkiln genruns the waves in order (bases, then states, then loops and mirrors) under one budget; seegen.- Loops land in review as ordered sets;
pixelkiln pickaccepts or rejects a set whole. - Characters that already exist on the account come under the manifest with
adopt, byremoteIdor by the bytes of a south file. - A character edited in PixelLab's own editor comes back with
fetch --refresh, which re-resolves the character's current URLs first. pixelkiln galleryshows the family: states under their base, loops with their direction, mirrors with their source; seegallery.pack --format godotand--format asepritewrite each direction as a still and each loop as a looping set at its fps; see engine formats.- Costs per engine are in the generator table, and what the live runs measured is in Measured endpoints.