pixelkiln 0.87.0 → 0.89.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,13 +24,14 @@ providers, or before any PixelLab account operation.
24
24
  | `pixflux` | Closed palettes or full-bleed backgrounds up to 400×400 | 1 generation |
25
25
  | `1dir` | Reference-guided work or several candidates | 10–25 generations |
26
26
  | `tiles` | Ground variations or connected structures | 10–25 generations |
27
- | `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff) | Unmeasured; borrows the same 10–25 canvas tiers |
28
- | `imagePro` | A larger or non-square background/scene, or real style transfer | **10–25 generations** by canvas (64px billed 10; a flat 40 before October 2026) |
27
+ | `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff), or a sidescroller platform set | Sidescroller **3**, measured. Top-down plans at PixelLab's quote: Pro 15 (up to 32px) or 25 (64px), standard 4 (quoted 1–4) |
28
+ | `imagePro` | A larger or non-square background/scene, or real style transfer; takes the style `palette` as a hard constraint | **10–25 generations** by canvas (64px billed 10; a flat 40 before October 2026) |
29
29
  | `character` | A character in 4 or 8 directions, its poses (`state`), its loops (`animation`), bust `portrait`s, and `outfit` transfers onto a loop | 1 per standard base, 6 per pro-flash base at 64px (1 from a `reference`), 20–40 per pose or portrait, 1 per template loop per direction (2–4 as `skeleton-v3`), 20 per outfit (measured once) |
30
30
  | `objectPro` | A prop, creature, or vehicle that needs rotations, states, or loops but has no character rig | 6 per base at 64px (1 from a `reference`), **unmeasured**; assumed to match `character` pro-flash |
31
31
  | `isometricTile` | One standalone isometric tile (a raised mesa, a cliff block), 16–64px | **1 generation, measured once** (32px `block`) |
32
32
  | `uiAsset` | A UI panel, button, health bar, or other chrome, from precise `pieces` and/or named `elements` | **20 generations, measured once** (256×192); the borrowed canvas-tier estimate still predicts 40 |
33
33
  | `uiElement` | One UI element (button, slot, bar, dialogue box) from the prompt, 16px and up, with an optional concept image | 10–25 generations, **unmeasured** |
34
+ | `vfx` | An animated effect (explosion, aura, lightning, status icons) from a `vfx` block: a `preset` or `recipe`, `parts`, an optional `sprite` to build around; cut into an ordered frame set. Or a `description` (+ `artist`: `lite`/`pro`, a local PNG `sprite`) for PixelLab's paid VFX artist | workbench **free** (a renderer, not a model); `description`: lite 1–5, pro 6–28 by sprite size, billed up to 2× the quote, which is what plan counts (a lite effect with no sprite billed its quote of 1, measured once) |
34
35
  | `imageProFlash` | A styled still on the Pro Flash model (style image + `styleTraits`), 16–256px in multiples of 4; also the natural source for a Pro Flash character's south sprite | 5–9 generations, PixelLab's provisional quote |
35
36
 
36
37
  `tiles` is not limited to top-down ground: `tileType` selects the projection
@@ -91,26 +92,72 @@ into the three fields before the call, with the style's `promptPrefix`/
91
92
  `promptSuffix` wrapped around each one individually rather than the whole
92
93
  string once.
93
94
 
94
- A set is always 16 tiles, or 25 when `terrainTransitionSize` is exactly 1
95
- (the "cliff" layout, where the visual step between levels is tallest and
96
- corners take a third "transition" value); it always resolves straight to a
97
- finished asset with one output file per tile, never a candidate sheet to
98
- pick from, the same as a connectable `tiles` set. `terrainTileSize` sets the
99
- tile edge (16 or 32 in both modes, 64 needs `terrainMode: "pro"`, default
100
- 16). `terrainMode: "standard"` (the default) is the classic Wang pipeline,
95
+ A set is 16 tiles, or 25 in the tall layout: `terrainTransitionSize` 1 on
96
+ standard, or anything above 0.4 on Pro (so 0.5 is already 25 tiles). There
97
+ the step between levels is a wall and corners take a third "transition"
98
+ value. A set always resolves straight to a finished asset with one output
99
+ file per tile, never a candidate sheet to pick from, the same as a
100
+ connectable `tiles` set. `terrainTileSize` sets the tile edge (16 or 32 in
101
+ both modes, 64 needs `terrainMode: "pro"`, default 16).
102
+ `terrainTransitionSize` is 0, 0.25, 0.5, or 1 without `terrainShapeStyle`
103
+ (any value 0–1 with it, though above 0.5 switches to an extended 32-tile
104
+ layout pixelkiln does not model). Pro reads it as wall height: 0 flat, 0.25
105
+ a low bank, 0.5 or 1 a proper wall. `terrainView` picks `low top-down` or
106
+ `high top-down` (API default). The style's `outline`/`shading`/`detail`
107
+ apply here too.
108
+
109
+ `terrainMode: "standard"` (the default) is the classic Wang pipeline,
101
110
  optionally with `terrainShapeStyle` (`square` or `round`) for a fixed
102
- procedural boundary; `terrainMode: "pro"` swaps that for its own shape
103
- controls — `terrainSpreadX` (0 = steep, 1 = gradual boundary), `terrainSlopeSize`
104
- (slope on three sides as a fraction of wall height), and `terrainRaggedness`
105
- (0 = smooth, 1 = rough boundary noise) — and rejects `terrainShapeStyle`
106
- outright. `terrainTransitionSize` (0, 0.25, 0.5, or 1 without `terrainShapeStyle`;
107
- any value 0–1 with it, though above 0.5 switches to an extended 32-tile
108
- layout pixelkiln does not yet model) controls how pronounced the elevation
109
- step looks. `terrainView` picks `low top-down` or `high top-down` (API
110
- default). The style's existing `outline`/`shading`/`detail` apply here too.
111
- Reference images, a forced palette, and the `pro` pipeline's own tunables
112
- beyond the three above (`tileStrength`, `tilesetAdherence`, and the rest)
113
- are not modeled yet; open an issue if a real project needs one of them.
111
+ procedural boundary. `terrainMode: "pro"` rejects `terrainShapeStyle` and
112
+ shapes the border with its own controls, each refused outside the mode that
113
+ reads it:
114
+
115
+ - `terrainRaggedness` (0–1): boundary noise, half strength on tall sets.
116
+ - `terrainRoundness` (0–2): 0 square corners, 1 round, 2 cut at 45°. Pro or
117
+ a shape style; above 1 needs Pro. Defaults 0.85 (Pro), 0.6 (shape style).
118
+ - `terrainBoundaryAmplitude` (0–0.3) and `terrainBoundarySeed` (integer):
119
+ how far the border meanders, and which meander. Pro, or a shape style.
120
+ - `terrainStepSlope` (0–2): 0 a cliff to 2 a gentle slope. Pro at
121
+ `terrainTransitionSize` 0.25 only.
122
+ - `terrainConnectDiagonals` (boolean): joins the two diagonal tiles'
123
+ upper corners into one area. Pro only. With `terrainRoundness: 2` it is
124
+ the fix for 45° paths and coastlines that break into one island per step.
125
+
126
+ `terrainSpreadX` and `terrainSlopeSize` are deprecated: PixelLab ignores
127
+ both now, so leave them out. Reference images, a forced palette, and the
128
+ remaining tunables (`tileStrength`, `tilesetAdherence`) are not modeled.
129
+
130
+ **Connected sets.** An asset's `connect` makes one of its terrains the very
131
+ terrain of another set in the same style, so ocean, sand, and grass paint on
132
+ one map: `"connect": { "lower": { "of": "coast", "terrain": "upper" } }` is
133
+ "this set's lower terrain is `coast`'s upper". The other set generates
134
+ first (the connected one is blocked until it is downloaded, and follows in
135
+ the next wave), PixelLab draws the shared terrain from its base tile, and
136
+ regenerating the other set makes this one stale. Sharing a terrain makes it
137
+ available, not blendable: two terrains with no set of their own between
138
+ them still meet with a hard (in PixelLab's map tool, black) edge, so plan a
139
+ set for every pair that touches.
140
+
141
+ **Sidescroller sets.** `terrainOrientation: "sidescroller"` switches to
142
+ `/create-tileset-sidescroller`: a platform seen from the side. The prompt is
143
+ `"1). mossy stone bricks texture 2). green grass texture"`, the platform
144
+ body and the layer on top of it; the other side of every edge is empty air.
145
+ 16 or 32px tiles, `terrainTransitionSize` (the top layer's height) 0, 0.25,
146
+ 0.5, or 1, and none of the mode, view, or shape controls. It billed 3
147
+ generations for 16 tiles. A sidescroller set connects only its platform
148
+ (`lower`) terrain. PixelLab's Pro sidescroller (64px, taller top layers) is
149
+ web-app only.
150
+
151
+ Prompt each terrain as a short material ending on the word "texture" ("deep
152
+ ocean water texture", "plain smooth sand texture"). PixelLab's "Pro
153
+ Tilesets: Full Guide" shows that without it, Pro sometimes scatters rocks,
154
+ shells, or plants over the surface. Pro needs no long prompts. Put style
155
+ words in the style's `promptPrefix`/`promptSuffix` so they wrap each
156
+ terrain: color, season, and outline words ("autumn", "frosty", "bold black
157
+ outlines with cel shading", "four-color green palette") change the set the
158
+ most, so try two or three at a time. With `terrainTransitionSize` above 0.4
159
+ on Pro, the third numbered description is the wall itself ("crumbling
160
+ dungeon brick wall").
114
161
 
115
162
  `1dir`'s own candidate mechanic (the size-tiered table above) normally
116
163
  returns N variations of one prompt. `/create-1-direction-object` also takes
@@ -146,7 +193,13 @@ and a 64×64 call billed exactly 10 (`docs/ENDPOINTS.md`, "October 2026 Pro
146
193
  price cut"). One call still returns
147
194
  several candidates to pick from by the same size tiering as `1dir` (up to
148
195
  42px: 64, 43–85px: 16, 86–170px: 4, above 170px: 1), reached through the
149
- generic background-job endpoint the same way a `revision` is. Reference
196
+ generic background-job endpoint the same way a `revision` is. The style's
197
+ `palette` goes out as the beta `target_palette` (PixelLab 0.4.130): every
198
+ pixel of every candidate lands on those 2–256 colours, at no extra cost.
199
+ `paletteName` (needs `palette`) names it, and `maxColors` (2–64) caps each
200
+ candidate's colours, with or without a palette. PixelLab's `smart` palette
201
+ mapping is not wrapped: it is "single images only", and this endpoint
202
+ returns a grid of candidates below 171px. Reference
150
203
  images and a style image (`reference_images`, `style_image` +
151
204
  `style_options`, up to 4 subject references plus one style reference) exist
152
205
  on this endpoint but are not modeled yet, and the completed job's exact
@@ -411,6 +464,9 @@ An asset that declares `revision` against a PixelLab style calls `inpaint`
411
464
  (palette quantize, `/reduce-colors`), `correct-pixelart` (edge/noise
412
465
  cleanup, `/correct-pixelart`), `remove-background` (transparent cutout,
413
466
  `/remove-background`, one image up to 400x400, 1 generation measured),
467
+ `normal-map` (`/normal-map`, lighting normals for a sprite or a loop sent as
468
+ one strip, 0.5 generation per call from the docs, a background job; refused
469
+ on a set of directions and in a style with `enforcePalette` or `quality`),
414
470
  `animate` (`/animate-with-text-v3`),
415
471
  `animate-pixminimax` (`/animate-pixminimax`, beta, tier 1 subscription or
416
472
  higher), `animate-skeleton` (`/animate-with-skeleton-v3`, also beta/tier
@@ -462,20 +518,63 @@ the `direction` value. The same tutorial states outright that PixMiniMax
462
518
  "allows up to 40 frames," a second, independent (though still not
463
519
  live-billed) confirmation of the ceiling above.
464
520
 
521
+ Try `vfx` first for an effect: the workbench is free and re-renders the same
522
+ pixels. When presets and parts do not get there and the person would rather
523
+ describe the effect, a `vfx` `description` asks PixelLab's paid VFX artist
524
+ (`POST /vfx`) instead: it cannot be mixed with `preset`/`recipe`/`parts`/`fps`,
525
+ its `sprite` must be a local PNG up to 512px (no `character:` references), and
526
+ every regeneration is a new, re-billed effect. Tell the person the price
527
+ before running it.
528
+ Generate one instead when the effect is a drawn object or a character's own
529
+ motion, such as a water hammer that bursts into a splash, a sword turning
530
+ into lightning, or a mage casting. PixelLab's "How to Make Animated Pixel
531
+ Art VFX" tutorial gives a pattern for that which maps onto what exists. Draw a sheet of different effects in
532
+ one `imagePro` call by listing one effect per frame in the prompt (64×64
533
+ returns 16 candidates), pick one, and animate it with `animate-pixminimax`.
534
+ Pin the ending with `lastFrame` when the motion should arrive somewhere: a
535
+ crystal cluster grown from a few hand-placed blue pixels, a splash after a
536
+ hammer strike, or the same sprite edited by a `"engine": "pro-flash"`
537
+ revision ("make it a lightning-enhanced version") so the clip transforms one
538
+ into the other. Describe motion, not appearance, and ask a loop to "return to
539
+ its original state at the end." Give a growing effect room: the tutorial
540
+ pads most sources onto a larger canvas first, which here means a hand-padded
541
+ `source` file, since a revision sends its parent at its own size. Then clean
542
+ up: `driftThreshold` or a `reduce-colors` revision over the frame set for
543
+ color flicker, `correct-pixelart` or `pixelkiln edit` for stray pixels, and
544
+ check a loop's last frame against its first for a duplicate.
545
+
546
+ Budget `animate-pixminimax` above what `plan` prints for long clips. The MCP
547
+ tool prices it by generation time (64×64 at 16 frames is 2, at 40 frames is
548
+ 6), while pixelkiln's placeholder estimate gives 1 and 3. Tell the person the
549
+ plan may under-read before a long PixMiniMax run.
550
+
465
551
  Parts of Pro Flash image editing are still outside this adapter: `edit`'s
466
552
  reference-image method, palette correction, inpaint's output-method choice,
467
553
  and inpainting with surrounding `context_image`. See
468
554
  [pixellab-roadmap.md](./pixellab-roadmap.md) for the confirmed shape.
469
555
 
470
- Four commands call PixelLab on loose files, outside the manifest and
556
+ Six commands call PixelLab on loose files, outside the manifest and
471
557
  lockfile. `pixelkiln unzoom --from <file> --out <file>` returns upscaled
472
558
  pixel art to its native grid; run it before outside art becomes a
473
559
  `reference` or `styleImages` entry (input at least 256×256, result opaque,
474
560
  cost unmeasured). `pixelkiln pixelate --from <file> --out <file>` converts a
475
561
  photo, painting, or render into pixel art with Image to Pixel Art Pro Flash:
476
- PixelLab picks the output size, the result keeps transparency, an optional
562
+ PixelLab picks the output size, the result is opaque on near-white, an optional
477
563
  `--description` steers the style, and it costs a flat 6 generations
478
- (measured) after asking first. `pixelkiln font --description <text> --out <base>` writes a
564
+ (measured) after asking first. `pixelkiln normal-map --from <png> [--frames
565
+ N] [--convention opengl|directx]` writes a sprite's normal map, or a strip's
566
+ (N equal frames side by side, up to 32), for 0.5 generation after asking
567
+ first. `pixelkiln vfx --preset <name> --out <base>`
568
+ builds an animated effect (explosion, heal pillar, lightning strike, aura,
569
+ and more; `pixelkiln vfx presets` and `vfx parts` list them) with PixelLab's
570
+ VFX workbench, which is free and reached through PixelLab's MCP server. Add
571
+ `--part <name>` to layer parts, `--sprite <file|character:<id>:<dir>>` to
572
+ build around a character, and `--game-pack` for per-piece clips. It writes a
573
+ spritesheet, GIF, atlas JSON, and a `.vfx.json` record whose recipe
574
+ re-renders the same effect with `--recipe`. `pixelkiln vfx --description
575
+ <text> [--artist pro] --out <base>` asks the paid VFX artist instead, prints
576
+ the quote and its 2× ceiling, and asks first; with `--effect <id>` it changes
577
+ that saved effect in place. `pixelkiln font --description <text> --out <base>` writes a
479
578
  `.ttf` and an 80-glyph atlas for PixelLab's documented 15 generations, and
480
579
  asks first. `pixelkiln estimate-skeleton <image> --out <file>` starts an
481
580
  `animate-skeleton` keypoints file, and `pixelkiln skeleton-preview <asset>`
@@ -23,6 +23,16 @@ Read this reference when an asset declares `revision`.
23
23
  `simple` or `complex`, optional `description` hint) cuts the background out
24
24
  to transparency and leaves a locked palette intact; 1 generation measured.
25
25
  It refuses a set parent.
26
+ - `normal-map` (PixelLab `/normal-map`, 8–512px per side, PNG only,
27
+ optional `convention` `opengl` or `directx`) makes lighting data, not art:
28
+ 0.5 generation per call, unmeasured. A loop's frames go as one strip
29
+ (`frames: N`, up to 32) so the light stays steady, and come back cut into
30
+ the parent's `-frame-NN` files; a character's directions are refused (one
31
+ revision per direction instead). It is refused in a style with
32
+ `enforcePalette` or `quality`, since snapping or grid repair would wreck
33
+ the normals: put it in a plain style and point at the parent with
34
+ `fromStyle`. A mirror of a normal map is refused too. For a loose file,
35
+ `pixelkiln normal-map --from <png> [--frames N]` asks before spending.
26
36
  - `reduce-colors` and `correct-pixelart` send no prompt to the provider — the
27
37
  asset's `prompt` stays a manifest-only label. `numColors`/`paletteImage`
28
38
  are mutually exclusive; a `paletteImage` has no size relationship to the
@@ -93,8 +103,10 @@ Read this reference when an asset declares `revision`.
93
103
  paint-over-the-sprite mask editor that writes the mask PNG into the project),
94
104
  `animate`, `animate-pixminimax`, `interpolate` (another same-size sprite as
95
105
  the ending keyframe), `reduce-colors`, `correct-pixelart`, or
96
- `remove-background`; on a PixelLab frame set (or a character's directions)
97
- `edit-animation`, `reduce-colors`, or `correct-pixelart`; on ComfyUI
106
+ `remove-background`, or `normal-map`; on a PixelLab frame set (or a
107
+ character's directions) `edit-animation`, `reduce-colors`, or
108
+ `correct-pixelart`, plus `normal-map` on a loop (never in a style with
109
+ `enforcePalette` or `quality`); on ComfyUI
98
110
  `image-to-image` or `inpaint`; on other providers `image-to-image`. On a
99
111
  single PixelLab sprite, "+ Skeleton animation" creates an `animate-skeleton`
100
112
  revision: poses from a project file, pasted JSON, or "Estimate poses" (one