pixelkiln 0.86.3 → 0.87.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.
@@ -69,7 +69,7 @@ asset, that PixelLab draws facing 4 or 8 directions. `mode` picks the
69
69
  engine: `standard` (1 generation, the skeleton template, `outline`,
70
70
  `shading`, and `detail` as soft guidance, and `palette` sent as a colour
71
71
  reference), `v3` (2 to 9 by size, the highest quality, up to 256px),
72
- `pro` (20 to 40 by size), or `pro-flash` (6 to 17 by size: PixelLab's
72
+ `pro` (10 to 25 by size), or `pro-flash` (6 to 17 by size: PixelLab's
73
73
  newest image model draws the south sprite and v3 rotates it; sizes are
74
74
  multiples of 4 up to 256, `template` may be `custom`, and a `reference`
75
75
  pays for the rotations only, 1 at 64px). `size` is the character's size;
@@ -380,7 +380,7 @@ attached to that character's own PixelLab record:
380
380
  result sizes (16, 32, 48, 64, 128, or 160 — 128 and 160 render at 2K and cost
381
381
  more), independent of the style's own `size`. A portrait takes no prompt: it
382
382
  is drawn from the parent's pixels, not text, so it is priced and generated
383
- like a state, 20 to 40 generations by the size tier (a 16px portrait billed
383
+ like a state, 10 to 25 generations by the size tier (a 16px portrait billed
384
384
  exactly 20, the floor, in a live test; see [`docs/ENDPOINTS.md`](ENDPOINTS.md)).
385
385
  It lands as `<asset>.png`, one file like a single-direction generator, and
386
386
  `pixelkiln fetch` also attaches it to the parent's character record upstream
package/docs/CLI.md CHANGED
@@ -53,6 +53,7 @@ Which command:
53
53
  | check the project before committing or in CI | `pixelkiln doctor`, `pixelkiln plan --check` |
54
54
  | see the account balance | `pixelkiln balance` |
55
55
  | shrink upscaled outside art to its native grid before using it as a reference | `pixelkiln unzoom --from refs/knight-512.png --out refs/knight.png` |
56
+ | turn a photo, painting, or render into pixel art | `pixelkiln pixelate --from renders/lodge.png --out art/lodge.png` |
56
57
  | generate a pixel font (`.ttf` plus glyph atlas) | `pixelkiln font --description "warm orange arcade font" --out fonts/arcade` |
57
58
  | start an `animate-skeleton` keypoints file from an image | `pixelkiln estimate-skeleton poses/hero.png --out poses/hero-swing.json` |
58
59
  | see a keypoints file's poses over the source before paying | `pixelkiln skeleton-preview hero-swing` |
@@ -992,6 +993,36 @@ common cause of disappointing output from every endpoint that takes one.
992
993
  - `--json` prints the detected zoom factor and both sizes; `--dry-run` sends
993
994
  nothing.
994
995
 
996
+ ### `pixelate`
997
+
998
+ ```bash
999
+ pixelkiln pixelate --from renders/lodge.png --out art/lodge.png --description "light dithering"
1000
+ ```
1001
+
1002
+ Converts a photo, painting, or render into pixel art with PixelLab's Image to
1003
+ Pixel Art Pro Flash (`/image-to-pixelart-pro-flash`). It works on source art
1004
+ that was never pixel art. For pixel art that was only upscaled, use `unzoom`,
1005
+ which recovers the grid instead of redrawing it.
1006
+
1007
+ - PixelLab picks the output size from the source's detected pixel scale; there
1008
+ is no size option. A 256x256 render came back 108x109 and a 384x384 render
1009
+ 84x110. Sources over 2048px on the longer side are scaled down upstream.
1010
+ - The result keeps transparency: both opaque renders measured came back with
1011
+ the subject cut out.
1012
+ - `--description` optionally steers the style, e.g. `"retro vibes with light
1013
+ dithering"`.
1014
+ - A flat **6 generations**, confirmed against a live bill. The command prints
1015
+ that and asks first; `--yes` skips the question, `--budget <n>` refuses when
1016
+ `n` is below it, and `--dry-run` sends nothing.
1017
+ - `--out` defaults to `<input>.pixel.png` beside the input, and the input is
1018
+ never overwritten. An existing `--out` is replaced only with `--force`.
1019
+ - `--json` prints the job id, both sizes, the PixelLab gallery `imageId`, and
1020
+ the billed usage.
1021
+
1022
+ Like `unzoom`, it writes a loose file and leaves the lockfile alone. Declare
1023
+ the result as an asset's `source`, or use it as a `styleImages` or
1024
+ `reference` path, to bring it into a manifest.
1025
+
995
1026
  ### `font`
996
1027
 
997
1028
  ```bash
@@ -1007,8 +1038,8 @@ writes the same two files.
1007
1038
  - `--weight` is `Bold` or `Regular` (default); `--glyph-px` is the native glyph
1008
1039
  size, `8`, `16` (default), `32`, or `64`; `--name` sets the font family name
1009
1040
  (PixelLab otherwise uses the description plus the weight).
1010
- - Costs PixelLab's documented 25 generations, not yet confirmed against a
1011
- live bill. The command prints that and asks first; `--yes` skips the
1041
+ - Costs PixelLab's documented 15 generations (25 before PixelLab's October
1042
+ 2026 Pro price cut), not yet confirmed against a live bill. The command prints that and asks first; `--yes` skips the
1012
1043
  question, `--budget <n>` refuses when `n` is below it, and `--dry-run` sends
1013
1044
  nothing.
1014
1045
  - It waits for the job (PixelLab documents 30-80 s) and then downloads both
@@ -1095,13 +1126,13 @@ Print the package version. `-v` is an alias.
1095
1126
  | `--provider <id>` | balance/adopt/salvage/purge/workspace add | Select the account provider for a mixed manifest, or set the workspace catalog's default provider hint. |
1096
1127
  | `--account <label>` | workspace add | Free-form account label, e.g. distinguishing sandboxes. |
1097
1128
  | `--all` | salvage dry run | List every unclaimed object rather than the first 30. |
1098
- | `--from <path>` | init/refine/quality check/unzoom | Existing source tree for init; source PNG or quality record for one-file refine mode; baseline for quality check; the upscaled image for unzoom. Omit it to use manifest `style.quality`. |
1129
+ | `--from <path>` | init/refine/quality check/unzoom | Existing source tree for init; source PNG or quality record for one-file refine mode; baseline for quality check; the upscaled image for unzoom; the photo or render for pixelate. Omit it to use manifest `style.quality`. |
1099
1130
  | `--exclude <names>` | init | Directory/name fragments to exclude; repeatable. |
1100
1131
  | `--generator <name>` | init | Generator assigned to the scaffolded style. |
1101
1132
  | `--name <name>` | init/font | Project name for the scaffolded manifest, or the generated font's family name. |
1102
1133
  | `--write-prompts` | adopt | Recover provider prompts into the manifest. |
1103
1134
  | `--port <n>` | pick/salvage/gallery | Local review or gallery server port; otherwise chooses a free port. |
1104
- | `--out <path>` | pack/export/refine/recipe install/quality snapshot/unzoom/font | Output base override, final native PNG for path-mode refine, exact recipe destination, quality baseline path, the unzoomed PNG, or the font's `<base>.ttf`/`<base>.png`. Export requires one selected tileset. |
1135
+ | `--out <path>` | pack/export/refine/recipe install/quality snapshot/unzoom/pixelate/font | Output base override, final native PNG for path-mode refine, exact recipe destination, quality baseline path, the unzoomed or pixelated PNG, or the font's `<base>.ttf`/`<base>.png`. Export requires one selected tileset. |
1105
1136
  | `--inputs <path>` | pack/quality snapshot | JSON input array; requires `--out`. Quality cases use `{ id, path, record?, tolerances? }`. |
1106
1137
  | `--columns <n>` | pack/export | Grid columns, 1–1024; default is near-square. |
1107
1138
  | `--format <name>` | export, pack, mount | `export`: `generic` (default), `tiled`, or `godot` (TileSet). `pack` and `mount`: `generic` (default), `aseprite` (sheet JSON), or `godot` (SpriteFrames). |
@@ -1120,7 +1151,7 @@ Print the package version. `-v` is an alias.
1120
1151
  | `--note <text>` | refine approve | Optional review note stored in the quality companion. |
1121
1152
  | `--model-root <path>` | recipe verify | ComfyUI `models` directory. Enables streamed hash checks for every external model declared by the recipe. |
1122
1153
  | `--quantize <n>` | unzoom | `0` auto-detects a palette (default), `-1` keeps every color, `2`-`256` quantizes to exactly that many. |
1123
- | `--description <text>` | font | The font's style, e.g. `"warm orange arcade font"`. |
1154
+ | `--description <text>` | font/pixelate | The font's style, e.g. `"warm orange arcade font"`, or an optional style steer for pixelate. |
1124
1155
  | `--weight <w>` | font | `Bold` or `Regular` (default). |
1125
1156
  | `--glyph-px <n>` | font | Native glyph size: `8`, `16` (default), `32`, or `64`. |
1126
1157
  | `--generation <n\|hash>` | restore | Bring a replaced generation back: `1` is the most recently replaced, or a prefix of one of its output hashes. One asset at a time. |
package/docs/ENDPOINTS.md CHANGED
@@ -38,17 +38,22 @@ matters most for icon and prop work.
38
38
  | `create-image-pixen` | **1** | sync (~40s) | no | no | Best raw detail at 1 generation |
39
39
  | `create-image-bitforge` | **1** | sync (~20s) | yes | yes | Best on paper, poor in practice |
40
40
  | `map-objects` | **1** | job (~30s) | rejected | no | Fine when the prompt carries the style |
41
- | `create-1-direction-object` | **20–40** | job | no | yes | Only when you need rotations |
41
+ | `create-1-direction-object` | **10–25** | job | no | yes | Only when you need rotations |
42
42
  | `generate-with-style-v2` (Pro) | **20** | job (~150s) | no | yes | Real style transfer |
43
- | `generate-image-v2` (Pro) | **40** | job (~150s) | no | yes | Real style transfer |
43
+ | `generate-image-v2` (Pro) | **10–25** | job (~150s) | no | yes | Real style transfer |
44
44
 
45
- `1dir` prices by canvas area: ≤1024 px = 20, ≤2048 px = 25, larger = 40. A
46
- 64×64 icon therefore costs 40. Every other generator above is a flat 1–40
47
- regardless of size.
45
+ `1dir` prices by canvas area: ≤1024 px = 10, ≤2048 px = 15, larger = 25. A
46
+ 64×64 icon therefore costs 25. These are October 2026 prices; see [the Pro
47
+ price cut](#october-2026-pro-price-cut) below for what changed and what was
48
+ re-measured. `generate-with-style-v2`'s 20 predates the cut and has not been
49
+ re-measured.
50
+
51
+ `generate-image-v2` was a flat 40 at any size until the cut. It now tiers by
52
+ canvas like the other Pro tools: a 64×64 call billed exactly 10.
48
53
 
49
54
  `generate-image-v2` is wrapped by pixelkiln's `imagePro` generator
50
55
  (skills/pixelkiln/references/pixellab.md): non-square and larger canvases
51
- than `pixflux` allows, at the flat 40 above. Its `reference_images` and
56
+ than `pixflux` allows, at the 10–25 above. Its `reference_images` and
52
57
  `style_image` are not modeled, and its completed job's response shape is
53
58
  inferred from `edit-images-v2`'s (also unmeasured for this endpoint
54
59
  specifically) rather than confirmed live — see `pollImagePro` in
@@ -188,6 +193,76 @@ description claims 0.1 generations, the same as the rest of the tier.
188
193
 
189
194
  ---
190
195
 
196
+ ## Image to Pixel Art Pro Flash, measured
197
+
198
+ `POST /image-to-pixelart-pro-flash` (added in PixelLab 0.4.128, October
199
+ 2026) converts a photo, painting, or render into pixel art. Unlike
200
+ `image-to-pixelart` above, it takes no size: PixelLab detects the source's
201
+ pixel scale and picks the output size. The only other fields are an optional
202
+ `description` that steers the style and a `seed`. Sources over 2048px on the
203
+ longer side are scaled down upstream.
204
+
205
+ Measured live, October 2026:
206
+
207
+ | Source | Description | Output | Billed |
208
+ |---|---|---|---|
209
+ | 256×256 opaque render (a knight) | none | 108×109, transparent background | **6** |
210
+ | 384×384 opaque render (a mountain keep) | "light dithering" | 84×110, transparent background | **6** |
211
+
212
+ - It is a background job. The submit response carries `estimated_generations:
213
+ 6`, `pricing_provisional: true`, and `image_id`/`source_image_id` (the result
214
+ is also saved to the PixelLab gallery). `usage` on the submit is null.
215
+ - The completed job has `usage: {type: "generations", generations: 6}` and the
216
+ image at `last_response.images[0]` as `{type, base64, width, height}`.
217
+ `last_response.original_images[0]` is the same size, before PixelLab's
218
+ final "touching up pixels" pass. pixelkiln reads `images[0]`.
219
+ - Unlike `image-to-pixelart`, it keeps alpha: both opaque renders came back
220
+ with the subject cut out on transparency.
221
+
222
+ Wired up as `pixelkiln pixelate`, a standalone command on a loose file like
223
+ `unzoom`; see [the CLI reference](./CLI.md#pixelate). Use `unzoom` instead
224
+ for art that is already pixel art and was only upscaled.
225
+
226
+ ---
227
+
228
+ ## October 2026 Pro price cut
229
+
230
+ PixelLab 0.4.128 (October 2026) cut every Pro tool's price ladder from
231
+ 20/25/40 to **10/15/25** generations. The release notes give the new tiers
232
+ by side: 16–256px is 10, 256–384px is 15, 384–512px is 25. PixelLab's
233
+ OpenAPI now quotes "10–25 generations" for 1- and 8-direction objects, Pro
234
+ characters, and Pro object animations, and 15 for `generate-font-pro`
235
+ (previously 25).
236
+
237
+ **Only the prices moved, not the breakpoints.** The release notes put
238
+ 352px and 384px in the middle tier, but both billed the top tier (25) when
239
+ re-measured on `inpaint-v3` after the cut, exactly where the old bisection
240
+ below put the boundary. pixelkiln's estimates use the new prices on those
241
+ measured breakpoints. Every historical measurement on this page that says
242
+ 20, 25, or 40 predates the cut and is kept as a record.
243
+
244
+ Re-measured after the cut:
245
+
246
+ | Endpoint | Canvas | Before | After |
247
+ |---|---|---|---|
248
+ | `generate-image-v2` | 64×64 | 40 (flat at any size) | **10** |
249
+ | `inpaint-v3` | 256×256 | 20 | **10** |
250
+ | `inpaint-v3` | 288×288 | 25 | **15** |
251
+ | `inpaint-v3` | 352×352 | 40 | **25** |
252
+ | `inpaint-v3` | 384×384 | 40 | **25** |
253
+
254
+ `generate-image-v2` is no longer flat; pixelkiln now prices it with
255
+ `proTierCost` (≤65536px² is 10, ≤102400px² is 15, larger is 25), the same
256
+ function `inpaint-v3` and `edit-images-v2` revisions use.
257
+
258
+ **Create VFX** shipped in the same release as an experimental web tool
259
+ (`pixellab.ai/create-vfx`). As of October 2026 it has no REST endpoint in
260
+ `/v2/openapi.json` and no MCP tool; PixelLab says the MCP tool is coming.
261
+ pixelkiln cannot wrap it until one of those exists; see the
262
+ [roadmap](../skills/pixelkiln/references/pixellab-roadmap.md).
263
+
264
+ ---
265
+
191
266
  ## Tilesets: schema only, not yet measured
192
267
 
193
268
  Called out separately because these are the most capable endpoints for level art
@@ -385,7 +460,7 @@ constraint, not a hint: 130 badges across two sets came back containing *only*
385
460
  the requested colours.
386
461
 
387
462
  **Re-roll one bad asset.** 1 generation. `gen --only <id> --force`. Cheaper than
388
- asking for more candidates. A `1dir` call that yields 16 candidates costs 20–40.
463
+ asking for more candidates. A `1dir` call that yields 16 candidates costs 10–25.
389
464
 
390
465
  **Clean up fringing.** `remove-background` at 1 generation, and it will not
391
466
  disturb the palette.
@@ -394,7 +469,8 @@ disturb the palette.
394
469
  size. Do not use `resize`.
395
470
 
396
471
  **Anchor to an existing look rather than a palette.** `generate-with-style-v2`
397
- (20) or `generate-image-v2` (40). `bitforge` claims to do this for 1, but see
472
+ (20 before the October 2026 cut, not re-measured) or `generate-image-v2`
473
+ (10–25). `bitforge` claims to do this for 1, but see
398
474
  above. `map` has no style anchoring at all. A 1-bit set generated through it
399
475
  came back with a yellow star and a brown chocolate bar.
400
476
 
@@ -562,8 +638,8 @@ Listed so the gaps are known rather than assumed away:
562
638
  neither schema carries a usage example.
563
639
  - `/generate-font-pro` (+ `GET /generate-font-pro/{job_id}`) — an 80-glyph
564
640
  atlas PNG plus a `.ttf` from a style description, `weight`
565
- (`Bold`/`Regular`), and `glyph_px` (8/16/32/64). Documented at 25
566
- generations, unmeasured. Wired up as `pixelkiln font`, outside the
641
+ (`Bold`/`Regular`), and `glyph_px` (8/16/32/64). Documented at 15
642
+ generations since the October 2026 cut (25 before), unmeasured. Wired up as `pixelkiln font`, outside the
567
643
  manifest; see [the CLI reference](./CLI.md#font).
568
644
  - Everything else PixelLab's own tutorials demonstrate that this file has no
569
645
  entry for at all — "animation to animation" motion transfer,
@@ -575,7 +651,8 @@ Listed so the gaps are known rather than assumed away:
575
651
  `uiAsset` generator; cost confirmed live at one data point, 20 generations
576
652
  for a 256x192 canvas).
577
653
  - `image-to-pixelart-pro` takes only `image` + `description`, no size fields.
578
- The non-Pro version is characterised above.
654
+ The non-Pro version is characterised above, and the Pro Flash version,
655
+ which pixelkiln wraps, [below](#image-to-pixel-art-pro-flash-measured).
579
656
  - the tileset family, with schema documented above and costs unmeasured
580
657
  (the standalone isometric tile endpoint alongside it now has one real
581
658
  measured data point — see above)
@@ -10,17 +10,17 @@ account; [ENDPOINTS.md](./ENDPOINTS.md) contains the detailed experiments.
10
10
  |---|---|---:|---|
11
11
  | Standalone prop or icon with arbitrary dimensions | `map` (default) | 1 generation | 1 |
12
12
  | Exact fixed palette | `pixflux` | 1 generation | 1 inline image |
13
- | Candidate variety, richer rendering, future rotation/animation | `1dir` | 20–40 generations | 4–64 by size |
14
- | Ground tiles or connectable structural sets | `tiles` | 20–40 generations | variations or complete set |
15
- | Two-terrain Wang tileset for elevation (grass to water, floor to cliff) | `terrain` | 20–40 generations (unmeasured) | 16 or 25 tiles |
13
+ | Candidate variety, richer rendering, future rotation/animation | `1dir` | 10–25 generations | 4–64 by size |
14
+ | Ground tiles or connectable structural sets | `tiles` | 10–25 generations | variations or complete set |
15
+ | Two-terrain Wang tileset for elevation (grass to water, floor to cliff) | `terrain` | 10–25 generations (unmeasured) | 16 or 25 tiles |
16
16
  | A single elevation tile — a raised mesa, a cliff block | `isometricTile` | 1 generation | 1 |
17
- | Larger or non-square scene or background, up to 792 wide and 688 tall | `imagePro` | 40 generations flat | 1–64 by size |
17
+ | Larger or non-square scene or background, up to 792 wide and 688 tall | `imagePro` | 10–25 generations by canvas | 1–64 by size |
18
18
  | Controlled pose/expression sequence in ComfyUI | `frames` | 0 `free` provider units | one atomic ordered set |
19
19
  | Animated GIF or spritesheet from Retro Diffusion | `animation` | $0.07–$0.25 per animation (published price) | 1 GIF or PNG sheet |
20
- | A character facing 4 or 8 directions, its poses, and its animations | `character` | 1 per base (standard), 20–40 per pose or portrait, 1 per template loop (2–4 as `skeleton-v3`), 20 per outfit (measured once) | one set of directions, one ordered loop, or one portrait |
20
+ | A character facing 4 or 8 directions, its poses, and its animations | `character` | 1 per base (standard), 10–25 per pose or portrait, 1 per template loop (2–4 as `skeleton-v3`), 20 per outfit (measured once) | one set of directions, one ordered loop, or one portrait |
21
21
  | A prop, creature, or vehicle with rotations, states, or loops but no character rig | `objectPro` | about 6 per base at 64px (unmeasured) | one set of directions, or one ordered loop |
22
22
  | UI chrome — panels, buttons, health bars, toolbars | `uiAsset` | 20 generations (measured once, at 256x192) | 1 composited image |
23
- | One UI element from a description, 16px and up, optionally guided by a concept image | `uiElement` | 20–40 generations (unmeasured) | 1 image |
23
+ | One UI element from a description, 16px and up, optionally guided by a concept image | `uiElement` | 10–25 generations (unmeasured) | 1 image |
24
24
  | A styled still on the Pro Flash model, or the south sprite a Pro Flash character will rotate | `imageProFlash` | 5–9 generations (PixelLab's provisional quote) | 1 image |
25
25
 
26
26
  Start with `map` unless a required capability points elsewhere. Forty `map`
@@ -275,13 +275,13 @@ and regenerating the parent makes the child stale.
275
275
  |---|---:|---:|
276
276
  | base, `mode: standard` | create-character-with-4/8-directions | 1 |
277
277
  | base, `mode: v3` | create-character-v3 | 1 + ceil(size² × 8 / 65536): 2 at 64px, 3 at 128px; from a `reference`, the rotations alone on its canvas: 1 at 64px |
278
- | base, `mode: pro` | create-character-pro | 20–40 by canvas |
278
+ | base, `mode: pro` | create-character-pro | 10–25 by canvas |
279
279
  | base, `mode: pro-flash` | create-character-pro-flash | image tier (5 to 96px, 6 to 208px, 9 above) + ceil(size² × 8 / 65536): 6 at 64px, 8 at 128px, 17 at 256px; rotations only from a `reference` |
280
- | state | create-character-state | 20–40 by canvas |
280
+ | state | create-character-state | 10–25 by canvas |
281
281
  | animation with a `template` | animate-character | 1 |
282
282
  | animation from text (v3) | animate-character | ceil(size² × frames / 65536): 1 at 64px, 2 at 128px |
283
- | animation, `mode: pro` | animate-character | 20–40 by canvas |
284
- | portrait | portrait-character-pro | 20–40 by `size` (16px billed exactly 20 live) |
283
+ | animation, `mode: pro` | animate-character | 10–25 by canvas |
284
+ | portrait | portrait-character-pro | 10–25 by `size` (16px billed exactly 20 live, before the October 2026 cut) |
285
285
  | outfit | transfer-outfit-v2 | 20 (a 2-frame, 92×92 job billed exactly this live; not yet measured at other frame counts or canvases) |
286
286
 
287
287
  The 20–40 tiers are PixelLab's; the tier is resolved from the canvas when
@@ -450,7 +450,7 @@ Left as an over-read for `--budget` until a second size is measured; see
450
450
  `imageProFlash` wraps PixelLab's `/create-image-pro-flash`: one native
451
451
  pixel-art image on the Pro Flash model, the same model the `character` and
452
452
  `objectPro` `pro-flash` engines draw with, as a plain still. It sits between
453
- `pixflux`/`map` (1 generation, no style reference) and `imagePro` (a flat 40):
453
+ `pixflux`/`map` (1 generation, no style reference) and `imagePro` (10–25 by canvas):
454
454
 
455
455
  ```jsonc
456
456
  {
@@ -530,7 +530,7 @@ to 16×16, which suits icons and small widgets:
530
530
  `imagePro`'s.
531
531
 
532
532
  **Unmeasured.** The schema carries no usage example and no call has been
533
- billed yet. The plan prices it on the same 20/25/40 canvas tiers as
533
+ billed yet. The plan prices it on the same 10/15/25 canvas tiers as
534
534
  `1dir`/`tiles`, the safe over-read for a Pro endpoint, and the completed
535
535
  job's shape is read defensively (`pollUiElement` names the keys it got if
536
536
  the shape is not the documented `images` list).
package/docs/MANIFEST.md CHANGED
@@ -492,7 +492,7 @@ their own page: [Characters](./CHARACTERS.md) and
492
492
  | `keypointsFile` | string, required for `animate-skeleton` | Manifest-relative JSON file (`src/skeleton.ts`'s `SkeletonSetSchema`): the pose the source is already in, plus 3–15 per-frame poses. See [Skeleton-driven animation](./REVISIONS.md#skeleton-driven-animation). |
493
493
  | `skeletonTemplate` | string | `animate-skeleton` only. Body a joint's missing `depth` is taken from: `mannequin` (default), `bear`, `cat`, `dog`, `horse`, or `lion`. |
494
494
  | `description` | string | `animate-skeleton`: what the subject *looks like* (colours, clothing, held items) — the asset's own `prompt` is sent as the motion's short label instead. `remove-background`: a hint naming the foreground. Rejected on other modes. |
495
- | `engine` | enum | `image-to-image`/`inpaint` only. `pro-flash` draws the edit with PixelLab's Pro Flash edit or inpaint endpoint instead of the default Pro one: 5–9 generations instead of 20–40, 32 to 256px per side in multiples of 4, no `strength`. Omit for the default. |
495
+ | `engine` | enum | `image-to-image`/`inpaint` only. `pro-flash` draws the edit with PixelLab's Pro Flash edit or inpaint endpoint instead of the default Pro one: 5–9 generations instead of 10–25, 32 to 256px per side in multiples of 4, no `strength`. Omit for the default. |
496
496
 
497
497
  The parent may use committed `source`, downloaded generated output, or a
498
498
  current approved quality output. Parent and mask hashes participate in the
package/docs/PIXELLAB.md CHANGED
@@ -69,16 +69,16 @@ unapproved files. See [Manifest quality profiles](./MANIFEST.md#quality-profiles
69
69
  |---|---|---:|
70
70
  | `map` | You need one prop, icon, building, or landmark at arbitrary dimensions | 1 generation |
71
71
  | `pixflux` | You need a closed palette or a full-bleed background | 1 generation |
72
- | `1dir` | You need references or several candidates for human review | 20 to 40 generations |
73
- | `tiles` | You need ground variations or a connected structural set | 20 to 40 generations |
74
- | `terrain` | You need a two-terrain Wang tileset (grass to water, floor to cliff) | 20 to 40 generations (unmeasured) |
72
+ | `1dir` | You need references or several candidates for human review | 10 to 25 generations |
73
+ | `tiles` | You need ground variations or a connected structural set | 10 to 25 generations |
74
+ | `terrain` | You need a two-terrain Wang tileset (grass to water, floor to cliff) | 10 to 25 generations (unmeasured) |
75
75
  | `isometricTile` | You need one standalone isometric tile, 16 to 64px | 1 generation (measured once) |
76
- | `imagePro` | You need a larger or non-square scene, up to 792 wide and 688 tall | 40 generations |
76
+ | `imagePro` | You need a larger or non-square scene, up to 792 wide and 688 tall | 10 to 25 generations |
77
77
  | `imageProFlash` | You need a still on the Pro Flash model, optionally styled from one image, 16 to 256px | 5 to 9 generations (provisional quote) |
78
78
  | `character` | You need a character in 4 or 8 directions, with states, loops, portraits, or outfits | See [Characters](./CHARACTERS.md) |
79
79
  | `objectPro` | You need a prop or creature with rotations, states, or loops but no character rig | about 6 at 64px (unmeasured) |
80
80
  | `uiAsset` | You need a UI panel composited from pieces and named elements, 192px and up | 20 generations (measured once) |
81
- | `uiElement` | You need one UI element from a description, 16px and up | 20 to 40 generations (unmeasured) |
81
+ | `uiElement` | You need one UI element from a description, 16px and up | 10 to 25 generations (unmeasured) |
82
82
 
83
83
  `map` accepts these values:
84
84
 
@@ -93,7 +93,7 @@ channel before building a production batch. For a scenic background, use
93
93
  `pixflux` with `noBackground: false`.
94
94
 
95
95
  Read [Generator selection](./GENERATORS.md) for the full constraints and
96
- measured economics. "20 to 40 generations" is a tier, not an exact figure:
96
+ measured economics. "10 to 25 generations" is a tier, not an exact figure:
97
97
  `poll` reads what a completed job actually billed and records it as `billed`
98
98
  beside the submit-time `cost` estimate a wave budget spends against;
99
99
  `pixelkiln history`, `plan --json`, and the gallery show both when they
package/docs/REVISIONS.md CHANGED
@@ -593,7 +593,7 @@ source's own size; the canvas never grows) or `/inpaint-image-pro-flash`
593
593
  (replaces only the mask's white pixels and keeps the rest exactly). It is the
594
594
  same model the `imageProFlash` generator and the `pro-flash` character engine
595
595
  use, priced on the same provisional Pro Flash tier (5 generations up to 96px,
596
- 6 up to 208px, 9 beyond) instead of the 20–40 of the default Pro endpoints.
596
+ 6 up to 208px, 9 beyond) instead of the 10–25 of the default Pro endpoints.
597
597
  Sources must be 32 to 256px per side in multiples of 4; `strength` is refused,
598
598
  since neither endpoint has one. The finished job is read the same way as the
599
599
  default endpoints'. PixelLab also offers reference-image edits, a
@@ -635,7 +635,7 @@ further — there is nothing to ask.
635
635
  - `interpolate` (`/interpolation-v2`) and `edit-animation`
636
636
  (`/edit-animation-v2`) are both documented "Pro" endpoints with no usage
637
637
  example in the schema and no live measurement. `estimate()` borrows the
638
- same 20/25/40 canvas tiers the other unmeasured Pro edits use, sized on the
638
+ same 10/15/25 canvas tiers the other unmeasured Pro edits use, sized on the
639
639
  keyframe for `interpolate` and on the packed frame grid for
640
640
  `edit-animation` (four 32×32 frames price as a 64×64 canvas, the 40 tier).
641
641
  Over-reading is the safe direction for `--budget`; expect a live bill at or
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixelkiln",
3
- "version": "0.86.3",
3
+ "version": "0.87.0",
4
4
  "description": "Manifest-driven pixel-art generation, review, recovery, and packaging with deterministic provenance.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -56,7 +56,10 @@ hashes.
56
56
  - Before an outside or upscaled sprite becomes a `reference` or `styleImages`
57
57
  path, run `pixelkiln unzoom --from <file> --out <file>` to bring it back to
58
58
  its native pixel grid. Upscaled input degrades every PixelLab endpoint that
59
- takes a reference, and the unzoomed result is opaque.
59
+ takes a reference, and the unzoomed result is opaque. For outside art that
60
+ was never pixel art (a photo, painting, or render), `pixelkiln pixelate
61
+ --from <file> --out <file>` converts it with PixelLab's Image to Pixel Art
62
+ Pro Flash for 6 generations and asks first.
60
63
  - Treat every ComfyUI output as source material until it passes the native-grid,
61
64
  final-palette, prompt-coverage, and human 1× checks in the ComfyUI reference.
62
65
  A successful PNG or high-confidence grid result is not quality approval.
@@ -111,7 +114,7 @@ Read only the reference needed for the current decision:
111
114
 
112
115
  - For PixelLab configuration, generators (including `uiElement` for single UI
113
116
  pieces and `imageProFlash` for styled stills), costs, alpha behavior,
114
- account operations, or the `unzoom`, `font`, `estimate-skeleton`, and
117
+ account operations, or the `unzoom`, `pixelate`, `font`, `estimate-skeleton`, and
115
118
  `skeleton-preview` utilities, read [references/pixellab.md](references/pixellab.md). For a
116
119
  PixelLab style aimed at a specific resolution or fidelity tier (retro,
117
120
  high-detail, or matching an existing set's look), read
@@ -55,7 +55,7 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
55
55
  — a real gap, not a docs fix: `tiles`'s own `tileFeature: "tileset"` draws
56
56
  one terrain's edges, not two named, connected terrain levels with their own
57
57
  transition prompt. Closed by the `terrain` generator; see
58
- `pixellab.md`. Cost is unmeasured (borrows the same 20/25/40 canvas tiers
58
+ `pixellab.md`. Cost is unmeasured (borrows the same 10/15/25 canvas tiers
59
59
  already confirmed for `tiles` and `1dir`); `/create-tileset-sidescroller`,
60
60
  reference images, `color_image`, and the `pro` pipeline's own tunables
61
61
  beyond `spreadX`/`slopeSize`/`raggedness` remain unmodeled.
@@ -161,7 +161,7 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
161
161
  now wrapped too, as the `interpolate` revision mode (parent = start
162
162
  keyframe, required `lastFrame` = end keyframe), alongside
163
163
  `/edit-animation-v2` as `edit-animation` (one text edit across a whole
164
- frame set). Both unmeasured, both borrowing the 20/25/40 Pro canvas tiers.
164
+ frame set). Both unmeasured, both borrowing the 10/15/25 Pro canvas tiers.
165
165
  Real demonstrated demand for Interpolate: "Level Up Your Game: Custom
166
166
  Sprite Animation Tutorial" used it
167
167
  repeatedly, in Aseprite via PixelLab's own extension, as the fix for an
@@ -291,16 +291,30 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
291
291
  unconfirmed beyond the endpoint's existence. Closed by `pixelkiln font`, a
292
292
  standalone command rather than a generator: a font has no style suffix,
293
293
  candidates, or image-shaped primary output for the lockfile to track. The
294
- documented 25-generation price is unmeasured.
294
+ documented price (15 since October 2026, 25 before) is unmeasured.
295
295
  - **Unzoom** (`/unzoom`, recover the native grid of upscaled pixel art) —
296
296
  PixelLab's own API overview calls upscaled reference art "the most common
297
297
  cause of disappointing output" from every reference-taking endpoint.
298
298
  Closed by `pixelkiln unzoom`, a standalone command on a loose file, since
299
299
  the art it is for comes from outside the manifest. Its result is opaque
300
300
  (transparency is composited onto white first). Cost unmeasured.
301
+ - **Image to Pixel Art Pro Flash** (`/image-to-pixelart-pro-flash`, added in
302
+ PixelLab 0.4.128, October 2026) — converts a photo, painting, or render
303
+ into pixel art, choosing the output size itself. Closed by `pixelkiln
304
+ pixelate`, a standalone command on a loose file like `unzoom`, since its
305
+ input comes from outside the manifest. Billed a flat 6 generations live,
306
+ and unlike `image-to-pixelart` it keeps transparency
307
+ (docs/ENDPOINTS.md, "Image to Pixel Art Pro Flash, measured").
308
+ - **October 2026 Pro price cut** — PixelLab 0.4.128 moved every Pro tool from
309
+ 20/25/40 to 10/15/25 generations. Cost estimates now use the new prices,
310
+ and `imagePro` (`generate-image-v2`) is tiered instead of a flat 40: a
311
+ 64x64 call billed 10 live. Re-measured `inpaint-v3` calls (256, 288, 352,
312
+ and 384px billed 10, 15, 25, 25) show the breakpoints did not move, despite
313
+ the release notes putting 352-384px in the middle tier (docs/ENDPOINTS.md,
314
+ "October 2026 Pro price cut").
301
315
  - **Pro Flash for plain image create, edit, and inpaint** — a third image
302
316
  tier, distinct from `pixflux`/`map`'s 1-generation endpoints and
303
- `imagePro`'s flat-40 `generate-image-v2`, on the same model
317
+ `imagePro`'s `generate-image-v2` (a flat 40 then, 10–25 since October 2026), on the same model
304
318
  `character`/`objectPro` already use for their `pro-flash` engine
305
319
  (`gpt-image-2.5-flare`), confirmed against PixelLab's MCP tool schemas.
306
320
  Demonstrated in "Pixel Art Animation Tutorial: Images Pro Flash, Skeleton
@@ -349,6 +363,18 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
349
363
  from an existing 8-direction object's sprites), is not worth a second,
350
364
  pricier engine on its own.
351
365
 
366
+ ## Create VFX (experimental, no API yet)
367
+
368
+ PixelLab 0.4.128 (October 2026) added Create VFX, an experimental web tool
369
+ for pixel-art visual effects (`pixellab.ai/create-vfx`). As of that release it
370
+ has no endpoint in `/v2/openapi.json` and no MCP tool; PixelLab's release
371
+ notes say it "will be added for MCP". Effects are a real gap for game work
372
+ (hit sparks, spell bursts, dust puffs), and pixelkiln's closest substitutes
373
+ are an `animate` revision or an `objectPro` animation, neither built for it.
374
+ Revisit once an endpoint appears: check its request shape, whether the
375
+ result is a frame set or a sheet, and its cost, then decide between a
376
+ generator (frames into a `pack`able set) and a loose-file command.
377
+
352
378
  ## Map Workshop (scene composition)
353
379
 
354
380
  PixelLab's actual scene-building surface: lay out a tile floor, place
@@ -22,15 +22,15 @@ providers, or before any PixelLab account operation.
22
22
  |---|---|---:|
23
23
  | `map` | One prop, icon, building, or landmark, up to 400×400 | 1 generation |
24
24
  | `pixflux` | Closed palettes or full-bleed backgrounds up to 400×400 | 1 generation |
25
- | `1dir` | Reference-guided work or several candidates | 20–40 generations |
26
- | `tiles` | Ground variations or connected structures | 20–40 generations |
27
- | `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff) | Unmeasured; borrows the same 20–40 canvas tiers |
28
- | `imagePro` | A larger or non-square background/scene, or real style transfer | **40 generations flat**, any size |
25
+ | `1dir` | Reference-guided work or several candidates | 10–25 generations |
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) |
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
- | `uiElement` | One UI element (button, slot, bar, dialogue box) from the prompt, 16px and up, with an optional concept image | 20–40 generations, **unmeasured** |
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
34
  | `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
35
 
36
36
  `tiles` is not limited to top-down ground: `tileType` selects the projection
@@ -140,9 +140,10 @@ ceiling in a corner also depends on aspect ratio, e.g. 512×512 for square or
140
140
  688×384 for 16:9), where `pixflux` tops out at 400×400 with no style
141
141
  reference at all. Set the asset's `width`/`height` for anything other than
142
142
  the style's default square. Unlike every other multi-candidate generator
143
- here, its cost is a **flat 40 generations regardless of size** (measured;
144
- `docs/ENDPOINTS.md`, "Single-image generators, measured") — `1dir` and
145
- `tiles` scale with canvas area, this does not. One call still returns
143
+ here, it was a flat 40 generations at any size until PixelLab's October 2026
144
+ Pro price cut; it now tiers by canvas at 10/15/25 like the other Pro tools,
145
+ and a 64×64 call billed exactly 10 (`docs/ENDPOINTS.md`, "October 2026 Pro
146
+ price cut"). One call still returns
146
147
  several candidates to pick from by the same size tiering as `1dir` (up to
147
148
  42px: 64, 43–85px: 16, 86–170px: 4, above 170px: 1), reached through the
148
149
  generic background-job endpoint the same way a `revision` is. Reference
@@ -260,7 +261,7 @@ the prompt, no `pieces`/`elements` layout, sizes from 16×16 (up to 792 wide,
260
261
  the `concept_image` (design guidance); `uiColorPalette` is sent as
261
262
  `color_palette`. Reach for it over `uiAsset` for icons, slots, and small
262
263
  widgets under `uiAsset`'s 192px floor. Unmeasured: the plan borrows the
263
- 20/25/40 canvas tiers, and the completed job's shape has not been observed
264
+ 10/15/25 canvas tiers, and the completed job's shape has not been observed
264
265
  live.
265
266
 
266
267
  `imageProFlash` wraps `/create-image-pro-flash`, the Pro Flash model as a plain
@@ -270,7 +271,7 @@ provisional `/pro-flash/cost` quotes). Its lock entry keeps PixelLab's
270
271
  byte-for-byte that still's file is sent the id instead of the upload (same
271
272
  price, no re-encode). The same model edits and inpaints through a revision's
272
273
  `"engine": "pro-flash"` (`image-to-image`/`inpaint` only, 32–256px in multiples
273
- of 4, no `strength`), at the Pro Flash tier instead of the Pro endpoints' 20–40.
274
+ of 4, no `strength`), at the Pro Flash tier instead of the Pro endpoints' 10–25.
274
275
 
275
276
  Do not confuse pixelkiln's `map` generator with PixelLab's own "Map
276
277
  Workshop": `map` returns one static prop, icon, or building in a single
@@ -466,12 +467,16 @@ reference-image method, palette correction, inpaint's output-method choice,
466
467
  and inpainting with surrounding `context_image`. See
467
468
  [pixellab-roadmap.md](./pixellab-roadmap.md) for the confirmed shape.
468
469
 
469
- Three commands call PixelLab on loose files, outside the manifest and
470
+ Four commands call PixelLab on loose files, outside the manifest and
470
471
  lockfile. `pixelkiln unzoom --from <file> --out <file>` returns upscaled
471
472
  pixel art to its native grid; run it before outside art becomes a
472
473
  `reference` or `styleImages` entry (input at least 256×256, result opaque,
473
- cost unmeasured). `pixelkiln font --description <text> --out <base>` writes a
474
- `.ttf` and an 80-glyph atlas for PixelLab's documented 25 generations, and
474
+ cost unmeasured). `pixelkiln pixelate --from <file> --out <file>` converts a
475
+ 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
477
+ `--description` steers the style, and it costs a flat 6 generations
478
+ (measured) after asking first. `pixelkiln font --description <text> --out <base>` writes a
479
+ `.ttf` and an 80-glyph atlas for PixelLab's documented 15 generations, and
475
480
  asks first. `pixelkiln estimate-skeleton <image> --out <file>` starts an
476
481
  `animate-skeleton` keypoints file, and `pixelkiln skeleton-preview <asset>`
477
482
  draws its poses over the source for free. See `docs/CLI.md`, "PixelLab utilities".
@@ -17,7 +17,7 @@ Read this reference when an asset declares `revision`.
17
17
  - On PixelLab, `"engine": "pro-flash"` sends an `image-to-image` or `inpaint`
18
18
  revision to the Pro Flash edit/inpaint endpoints instead of the Pro ones:
19
19
  5 generations up to 96px, 6 up to 208px, 9 beyond (provisional quotes),
20
- against 20–40. The parent must be 32–256px per side in multiples of 4, and
20
+ against 10–25. The parent must be 32–256px per side in multiples of 4, and
21
21
  `strength` is refused. Other modes reject `engine`.
22
22
  - `remove-background` (PixelLab, one image up to 400x400, `removalTask`
23
23
  `simple` or `complex`, optional `description` hint) cuts the background out
@@ -71,7 +71,7 @@ Read this reference when an asset declares `revision`.
71
71
  `edit-animation` applies one prompt across a whole frame set (a cape added
72
72
  to every frame of a walk); its frame ceiling falls with frame size (16 up
73
73
  to 64px, 9 up to 80px, 4 up to 256px). Both land in candidate review and
74
- are unmeasured; their plan cost borrows the 20/25/40 Pro tiers.
74
+ are unmeasured; their plan cost borrows the 10/15/25 Pro tiers.
75
75
  - Both PixelLab and ComfyUI can back a `revision`, not just ComfyUI.
76
76
  PixelLab's `reduce-colors`/`correct-pixelart` calls its own
77
77
  `/reduce-colors`/`/correct-pixelart` endpoints synchronously (no background