pixelkiln 0.60.0 → 0.61.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.
- package/CONTRIBUTING.md +18 -2
- package/docs/CHARACTERS.md +8 -2
- package/docs/PIXELLAB.md +5 -0
- package/docs/README.md +0 -1
- package/docs/REVISIONS.md +12 -0
- package/package.json +1 -2
- package/skills/pixelkiln/references/pixellab-roadmap.md +113 -6
- package/skills/pixelkiln/references/pixellab.md +38 -1
- package/skills/pixelkiln/references/revisions.md +6 -1
- package/NAMING.md +0 -87
package/CONTRIBUTING.md
CHANGED
|
@@ -73,6 +73,20 @@ wire contracts.
|
|
|
73
73
|
image. Any `website` scope is also refused a release by `releaseRules` in
|
|
74
74
|
`.releaserc.json`, so a slip is caught rather than published, but the right
|
|
75
75
|
subject keeps the changelog honest.
|
|
76
|
+
- **A change under `skills/pixelkiln/` always releases, whatever the commit
|
|
77
|
+
type says.** That directory is what the public `gfargo/skills` tap mirrors
|
|
78
|
+
on every new release tag (see [Releases](#releases)), so a `docs:`-typed
|
|
79
|
+
commit touching it — accurate framing for a human reader, since it reads as
|
|
80
|
+
documentation — would otherwise cut no release at all under the default
|
|
81
|
+
rules, and the tap would never see the change. `analyzeCommits` runs a
|
|
82
|
+
second plugin (`scripts/release-plugins/skill-release-analyzer.mjs`)
|
|
83
|
+
alongside `@semantic-release/commit-analyzer` that inspects each commit's
|
|
84
|
+
actual changed files and forces at least a patch release whenever one
|
|
85
|
+
touches `skills/pixelkiln/`, regardless of type or scope. It only ever
|
|
86
|
+
raises the release semantic-release would otherwise cut, never lowers or
|
|
87
|
+
blocks one, so there is no commit-subject convention to remember here —
|
|
88
|
+
just don't remove the plugin from `.releaserc.json` (`test:release` fails
|
|
89
|
+
if it is missing).
|
|
76
90
|
- Add regression coverage for bug fixes and behavior coverage for new public
|
|
77
91
|
options or exports.
|
|
78
92
|
- Update README/help text and focused docs in the same change as user-facing
|
|
@@ -169,5 +183,7 @@ A failed release opens an issue labelled `semantic-release`, which the next
|
|
|
169
183
|
successful run closes. That label must exist in the repository or the reporting
|
|
170
184
|
step itself fails with a validation error and hides the original failure.
|
|
171
185
|
|
|
172
|
-
See the website scoping rule
|
|
173
|
-
|
|
186
|
+
See the website scoping rule and the `skills/pixelkiln/` release-forcing
|
|
187
|
+
plugin under [change guidelines](#change-guidelines) for the two things that
|
|
188
|
+
change whether a release happens at all, independent of the conventional
|
|
189
|
+
commit type on its own.
|
package/docs/CHARACTERS.md
CHANGED
|
@@ -159,7 +159,10 @@ suffix, since the character already carries the look.
|
|
|
159
159
|
`paletteFromReference` snaps the result to the parent's colours; `canvas`
|
|
160
160
|
asks for a larger frame when the edit adds something big. A state costs 20
|
|
161
161
|
to 40 by canvas and keeps the parent's directions. A state may be a state
|
|
162
|
-
of another state.
|
|
162
|
+
of another state. A pose-only state edit (a mid-walk step, a hurt pose) can
|
|
163
|
+
turn the character sideways or away from camera by default even when the
|
|
164
|
+
prompt never mentions rotating; state the facing explicitly (e.g. add
|
|
165
|
+
"front-facing") rather than assume the parent's camera angle carries over.
|
|
163
166
|
|
|
164
167
|
### Animations
|
|
165
168
|
|
|
@@ -167,7 +170,10 @@ A template loop moves a skeleton, so it wants a body the skeleton fits: a
|
|
|
167
170
|
biped on `mannequin`, or one of the quadruped templates. A character that
|
|
168
171
|
is neither (a round robot, a slime) gets a walk from text on the v3
|
|
169
172
|
engine instead; a template on it either fails upstream (`custom`
|
|
170
|
-
template) or redraws the character as the biped it expected.
|
|
173
|
+
template) or redraws the character as the biped it expected. PixelLab's
|
|
174
|
+
"Skeleton V3" model update markedly improved template-loop reliability;
|
|
175
|
+
where earlier guidance favored a custom v3 loop over trusting a template,
|
|
176
|
+
a named template is now the reasonable default for a body it fits.
|
|
171
177
|
|
|
172
178
|
An animation is one loop of one character (`animation.of`, a base or a
|
|
173
179
|
state) in one `direction`. With a `template` (PixelLab's `walk`,
|
package/docs/PIXELLAB.md
CHANGED
|
@@ -139,6 +139,11 @@ comparing notes with someone using a different one:
|
|
|
139
139
|
MCP doesn't." Good for ad hoc, conversational generation; it has no concept
|
|
140
140
|
of a project's state, a budget, or what has already been paid for.
|
|
141
141
|
Complements PixelKiln rather than competing with it.
|
|
142
|
+
- **PixelLab's editor plugins for Aseprite and Pixelorama**, which bring
|
|
143
|
+
PixelLab's create/edit/inpaint/animate/interpolate/reduce-colors tools into
|
|
144
|
+
an existing pixel-art editor's own canvas and layers. Good for a human
|
|
145
|
+
artist iterating by hand inside a familiar tool; like Game Builder, not
|
|
146
|
+
something PixelKiln talks to — no manifest, no budget, no lockfile.
|
|
142
147
|
- **PixelKiln**, calling PixelLab's REST API directly. This is why: a
|
|
143
148
|
manifest is a durable plan an agent can re-read and diff, `--budget` is an
|
|
144
149
|
enforced ceiling instead of trusting an agent's per-call judgement, and the
|
package/docs/README.md
CHANGED
|
@@ -45,7 +45,6 @@ provider you are using. These Markdown files also render at
|
|
|
45
45
|
|
|
46
46
|
- [Contributing](../CONTRIBUTING.md)
|
|
47
47
|
- [Security](../SECURITY.md)
|
|
48
|
-
- [Naming decision](../NAMING.md)
|
|
49
48
|
|
|
50
49
|
The Markdown in this directory is the canonical documentation and ships in the
|
|
51
50
|
npm package. The Next.js app in `website/` renders this source directly into
|
package/docs/REVISIONS.md
CHANGED
|
@@ -185,6 +185,18 @@ between two known poses, PixelLab's own "Animate Between 2 Frames" tool.
|
|
|
185
185
|
Unlike a mask, no size relationship to the source is required at the manifest
|
|
186
186
|
layer; PixelLab's own API is where a mismatch is caught.
|
|
187
187
|
|
|
188
|
+
`direction` + `enhancePrompt` together have a real gotcha, demonstrated by
|
|
189
|
+
PixelLab's own tutorial rather than inferred from the schema: `enhancePrompt`
|
|
190
|
+
can expand the motion description with camera-relative language ("towards
|
|
191
|
+
the camera") that fights the requested world-facing `direction`. The failure
|
|
192
|
+
is direction-specific — cardinal directions generated fine in the same batch
|
|
193
|
+
an off-cardinal one (north-east) did not — so a multi-directional
|
|
194
|
+
`animate-pixminimax` set that breaks at one or two directions but not others
|
|
195
|
+
is more likely the enhanced prompt's own wording than the model or the
|
|
196
|
+
`direction` value itself. The same tutorial states PixMiniMax "allows up to
|
|
197
|
+
40 frames," a second, independent (though still not live-billed)
|
|
198
|
+
confirmation of the 40-frame ceiling below.
|
|
199
|
+
|
|
188
200
|
The result is an **ordered frame set**, not a single image — the source's own
|
|
189
201
|
`frames` PNGs, `<asset>-frame-00.png` onward, exactly the naming a `character`
|
|
190
202
|
loop already uses. Like any generative animation, it lands in **candidate
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pixelkiln",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.61.0",
|
|
4
4
|
"description": "Manifest-driven pixel-art generation, review, recovery, and packaging with deterministic provenance.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -105,7 +105,6 @@
|
|
|
105
105
|
"CONTRIBUTING.md",
|
|
106
106
|
"SECURITY.md",
|
|
107
107
|
"PROVIDERS.md",
|
|
108
|
-
"NAMING.md",
|
|
109
108
|
"LICENSE"
|
|
110
109
|
]
|
|
111
110
|
}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
# PixelLab surface this adapter does not cover
|
|
2
2
|
|
|
3
3
|
A catalog of PixelLab capabilities confirmed absent from PixelKiln, built by
|
|
4
|
-
reading all
|
|
5
|
-
featured on pixellab.ai plus 14 more from the channel's "PixelLab
|
|
6
|
-
playlist, filtered to
|
|
7
|
-
|
|
4
|
+
reading all 29 tutorials on PixelLab's official YouTube channel (the original
|
|
5
|
+
26 — the 12 featured on pixellab.ai plus 14 more from the channel's "PixelLab
|
|
6
|
+
Tutorial" playlist, filtered to ~12 months back from that pass — plus 3 more
|
|
7
|
+
published since: "Level Up Your Game: Custom Sprite Animation Tutorial,"
|
|
8
|
+
"Pixel Art Animation Tutorial: Images Pro Flash, Skeleton V3 & PixMiniMax,"
|
|
9
|
+
and "How to Reduce Colors Like a Pro!") against this adapter's actual source
|
|
10
|
+
— and, for the newest pass, against PixelLab's own MCP tool schemas
|
|
11
|
+
(`create_image_pro_flash`, `edit_image_pro_flash`, `inpaint_image_pro_flash`,
|
|
12
|
+
`get_pro_flash_capabilities`) where a tutorial's framing needed checking
|
|
13
|
+
against the live surface, the same standard the original pass held itself to.
|
|
14
|
+
Read this when scoping new PixelLab work, so effort goes toward a
|
|
8
15
|
confirmed gap with real demand rather than a guess. Nothing here is a
|
|
9
16
|
commitment to build it — it is what is missing, with the evidence for why it
|
|
10
17
|
might matter, so that decision can be made deliberately.
|
|
@@ -109,7 +116,18 @@ which tutorial(s) demonstrated real (not hypothetical) demand for it.
|
|
|
109
116
|
an animation or a character's eight directions share one consistent
|
|
110
117
|
palette/cleanup pass, which is the actual differentiator the tutorials
|
|
111
118
|
demonstrate — PixelKiln only ever sends one frame per revision today, the
|
|
112
|
-
same limit `image-to-image`/`inpaint` already have.
|
|
119
|
+
same limit `image-to-image`/`inpaint` already have. Freshly confirmed by
|
|
120
|
+
"How to Reduce Colors Like a Pro!": the real-world shape of this gap is
|
|
121
|
+
project-wide, not per-asset — the tutorial applies one palette across a
|
|
122
|
+
character's full 8-direction set, its states, each animation (per-frame,
|
|
123
|
+
"apply to all frames" in one operation), a generated UI pack, a tileset,
|
|
124
|
+
and a placed map object, in that order, specifically to keep an entire
|
|
125
|
+
project visually consistent. `numColors`/`paletteImage` already cover the
|
|
126
|
+
tutorial's other two reduction modes ("auto reduce colors" is pixelkiln's
|
|
127
|
+
own omit-both default; "use palette" is `paletteImage`, including one
|
|
128
|
+
imported from Lospec into the source editor's palette list before use) —
|
|
129
|
+
the batch/multi-frame gap above is the only piece still missing, and this
|
|
130
|
+
tutorial is stronger evidence that it is the one that matters.
|
|
113
131
|
- **Generic (non-character) animation and interpolation** (`/animate-with-text-v3`,
|
|
114
132
|
`/animate-pixminimax`) — PixelLab's **Animate with text** tools work on
|
|
115
133
|
*any* image, not just a `character`/`objectPro` asset. Demonstrated
|
|
@@ -130,7 +148,29 @@ which tutorial(s) demonstrated real (not hypothetical) demand for it.
|
|
|
130
148
|
`pollRevision` already handles `image-to-image`/`inpaint`. The dedicated
|
|
131
149
|
**Interpolate** endpoint (`/interpolation-v2`, a separate "Pro" two-keyframe
|
|
132
150
|
tool distinct from `last_frame` pinning on the animate endpoints above)
|
|
133
|
-
remains unwrapped — a narrower, real gap,
|
|
151
|
+
remains unwrapped — a narrower, real gap, with real demonstrated demand
|
|
152
|
+
now: "Level Up Your Game: Custom Sprite Animation Tutorial" used it
|
|
153
|
+
repeatedly, in Aseprite via PixelLab's own extension, as the fix for an
|
|
154
|
+
animation a single `animate-with-text` attempt couldn't produce directly —
|
|
155
|
+
a character knocked backward by a hit. One `animate-with-text` pass from
|
|
156
|
+
the idle pose gave motion but no clean launched-backward pose; the fix was
|
|
157
|
+
to stop asking for the whole animation at once, build the two key poses
|
|
158
|
+
first with a plain single-image edit (an airborne "just hit" frame, then a
|
|
159
|
+
"landed on the floor" frame, each edited from the previous one), and let
|
|
160
|
+
Interpolate fill the motion between them (8 frames for the fall, 11 for the
|
|
161
|
+
recovery back to idle, both with `enhancePrompt` on) — a "key poses first,
|
|
162
|
+
then interpolate the gap" pattern worth carrying into any future wrapper,
|
|
163
|
+
not just the raw endpoint. Also newly confirmed, from "Pixel Art Animation
|
|
164
|
+
Tutorial: Images Pro Flash, Skeleton V3 & PixMiniMax": PixelLab states
|
|
165
|
+
outright that PixMiniMax allows "up to 40 frames," a second, independent
|
|
166
|
+
(though still not live-billed) confirmation of the schema's 40-frame
|
|
167
|
+
ceiling already assumed here. The same tutorial surfaces a real gotcha for
|
|
168
|
+
`animate-pixminimax` + `direction` + `enhancePrompt`: the expanded prompt
|
|
169
|
+
can add camera-relative language ("towards the camera") that fights the
|
|
170
|
+
requested world-facing `direction`, breaking off-cardinal generations (a
|
|
171
|
+
north-east loop came out wrong, cardinal ones did not) even though neither
|
|
172
|
+
the model nor the `direction` value was at fault — worth a caveat wherever
|
|
173
|
+
`enhancePrompt` is documented alongside `direction`.
|
|
134
174
|
- **Object Creator's "pack" generation** (one call → N *distinct* objects,
|
|
135
175
|
each with its own per-item description, instead of N variations of one
|
|
136
176
|
prompt) — demonstrated in "Object Creator" and used throughout
|
|
@@ -199,6 +239,73 @@ which tutorial(s) demonstrated real (not hypothetical) demand for it.
|
|
|
199
239
|
batch demonstrated it in depth, so demand is unconfirmed beyond the tool's
|
|
200
240
|
existence. Not modeled at all.
|
|
201
241
|
|
|
242
|
+
## Pro Flash for plain image create, edit, and inpaint
|
|
243
|
+
|
|
244
|
+
PixelLab ships a **third image-generation tier**, distinct from both
|
|
245
|
+
pixelkiln's already-modeled ones — `pixflux`/`map`'s cheap 1-generation
|
|
246
|
+
non-Pro endpoints, and `imagePro`'s Pro tier (`generate-image-v2`, flat 40
|
|
247
|
+
generations) — confirmed directly against PixelLab's own MCP tool schemas
|
|
248
|
+
(`create_image_pro_flash`, `edit_image_pro_flash`, `inpaint_image_pro_flash`,
|
|
249
|
+
`get_pro_flash_capabilities`), not just a tutorial's framing, the same
|
|
250
|
+
standard this catalog holds itself to elsewhere. It is the **same underlying
|
|
251
|
+
model** `character`/`objectPro` already use for their `pro-flash` engine
|
|
252
|
+
(`gpt-image-2.5-flare`, "medium" provider quality per
|
|
253
|
+
`get_pro_flash_capabilities`), but exposed here for **plain images** — create,
|
|
254
|
+
edit, and inpaint — with no character or object involved. Demonstrated at
|
|
255
|
+
length in "Pixel Art Animation Tutorial: Images Pro Flash, Skeleton V3 &
|
|
256
|
+
PixMiniMax": creating a styled character from a reference-image "style
|
|
257
|
+
image," then repeatedly re-editing the same asset ("give him a winter
|
|
258
|
+
outfit," then, from *that* result, "a thicker royal winter outfit with a
|
|
259
|
+
bigger sword" — evolving the previous edit rather than restarting from the
|
|
260
|
+
original each time), then inpainting new hair, a shirt, and pants as separate
|
|
261
|
+
masked passes, each isolated onto its own layer.
|
|
262
|
+
|
|
263
|
+
**Confirmed shape, via `get_pro_flash_capabilities` (a free, no-generation
|
|
264
|
+
quote/identity lookup — not billed):**
|
|
265
|
+
|
|
266
|
+
- **`create`**: native sizes 16×16 (experimental, always pixel-grid-corrected
|
|
267
|
+
by `image-to-pixel-art`'s own fixer), 24×24, 32×32, 32×48, 64×64, 96×64,
|
|
268
|
+
96×96; custom sizes (beta) 16–256 in steps of 4 on both sides. Takes a
|
|
269
|
+
`style_image` (URL/base64/owned image id) with `style_options`
|
|
270
|
+
(`color_palette`/`outline`/`detail`/`shading` toggles) — the same
|
|
271
|
+
style-copying mechanic as `character` pro-flash's `styleTraits`, just not
|
|
272
|
+
yet exposed for a plain image. One output, no reference images.
|
|
273
|
+
- **`edit`**: native sizes 32×32 up to **128×128** (a larger ceiling than
|
|
274
|
+
`create`'s 96×96), custom 32–256 step 4. Two distinct `edit_methods`:
|
|
275
|
+
`"text"` (a description) or `"reference"` (a `reference_image`, max 1,
|
|
276
|
+
which must fit the edit canvas natively — no resizing). No style options.
|
|
277
|
+
Canvas never grows. An optional `use_color_palette_correction` flag snaps
|
|
278
|
+
the edited result back to the source's own palette.
|
|
279
|
+
- **`inpaint`**: same size range as `edit`. Mask is a rectangle
|
|
280
|
+
(`mask_x`/`y`/`width`/`height`) or a same-size mask PNG, white = generate /
|
|
281
|
+
black = preserve / alpha ignored — the same convention `inpaint-v3` already
|
|
282
|
+
uses. Always crops to the mask. Three `output_methods`: `"New layer with
|
|
283
|
+
changes"`, `"Modify current layer, only changes"`, `"Modify current
|
|
284
|
+
layer"` — matching exactly what the tutorial's Aseprite/Pixelorama UI
|
|
285
|
+
offers, and a real choice the already-modeled `inpaint-v3` does not expose
|
|
286
|
+
at all today (pixelkiln's `inpaint` revision always gets one behavior). A
|
|
287
|
+
new, genuinely unmodeled mechanic: `context_image` + a required
|
|
288
|
+
`bounding_box` lets the model see up to **3×** the native canvas in either
|
|
289
|
+
dimension of surrounding context beyond the masked region itself — for
|
|
290
|
+
inpainting a sub-region of a larger scene coherently, the same problem
|
|
291
|
+
`docs/REVISIONS.md`'s existing "select a sub-region" workaround for
|
|
292
|
+
`inpaint-v3`'s 512px ceiling solves by hand today.
|
|
293
|
+
- **Cost, from live (but not billed — `get_pro_flash_capabilities`'s quotes
|
|
294
|
+
are provisional) queries**: `create` 32×32 and 64×64 both quote 5
|
|
295
|
+
generations flat; 256×256 quotes 9. `edit`/`inpaint` at 64×64 quote 5;
|
|
296
|
+
`inpaint` at 128×128 quotes 6. `character` and `object` at 64×64 (8
|
|
297
|
+
directions) both quote `image: 5, rotations: 1, total: 6` — matching
|
|
298
|
+
pixelkiln's own already-measured `proFlashCharacterCost` (6 at 64px)
|
|
299
|
+
exactly, reassuring cross-validation of the quote endpoint even though it
|
|
300
|
+
is a quote, not a bill.
|
|
301
|
+
|
|
302
|
+
Not modeled at all today: pixelkiln's `imagePro` generator and the `revision`
|
|
303
|
+
asset shape's `image-to-image`/`inpaint` modes only ever call the non-Flash
|
|
304
|
+
endpoints (`generate-image-v2`, `edit-images-v2`, `inpaint-v3`). Adding Pro
|
|
305
|
+
Flash would mean a new generator (or a model/engine choice on the existing
|
|
306
|
+
ones) plus a new inpaint `outputMethod` field and the `context_image`
|
|
307
|
+
mechanism — real, scoped work, not a docs fix.
|
|
308
|
+
|
|
202
309
|
## Map Workshop (scene composition)
|
|
203
310
|
|
|
204
311
|
PixelLab's actual scene-building surface: lay out a tile floor, place
|
|
@@ -294,6 +294,22 @@ held-item character, skip the template and write a custom v3 loop with an
|
|
|
294
294
|
explicit prompt naming the held item and the motion (e.g. "knight holding a
|
|
295
295
|
sword, walking loop") instead of expecting the template to carry it.
|
|
296
296
|
|
|
297
|
+
PixelLab's own tutorials describe a recent quality jump for named templates
|
|
298
|
+
("Skeleton V3"): the same idle/walking/running/full-sprint-style templates
|
|
299
|
+
existed before, but PixelLab did not recommend relying on them because
|
|
300
|
+
result quality was inconsistent; with the updated model backing them, it now
|
|
301
|
+
does — "the movement is much more usable... much more stable." Prefer a
|
|
302
|
+
named template over a custom v3 loop by default for a body it fits, rather
|
|
303
|
+
than defaulting to a custom loop out of habit; the held-item caveat above is
|
|
304
|
+
the one case that still argues for skipping the template.
|
|
305
|
+
|
|
306
|
+
A pose-only `state` edit (a walk mid-step, a hurt pose) can turn the
|
|
307
|
+
character sideways or away from the camera by default, even on a prompt that
|
|
308
|
+
never mentions rotating — PixelLab's own tutorial hits this on a plain
|
|
309
|
+
"mid-walk state" prompt. State the facing explicitly (e.g. add "front-facing"
|
|
310
|
+
to the prompt) rather than assuming the parent's own camera angle carries
|
|
311
|
+
over automatically.
|
|
312
|
+
|
|
297
313
|
A loop costs per direction, and a sprite facing one way is the sprite facing
|
|
298
314
|
the opposite way flipped — this holds for the east/west pair and for both
|
|
299
315
|
diagonal pairs, south-east/south-west and north-east/north-west. Declare the
|
|
@@ -367,7 +383,28 @@ using any of these. `reduce-colors`/`correct-pixelart` cost is **confirmed
|
|
|
367
383
|
live**: a flat 0.1 generations each (not the schema's dollar-denominated
|
|
368
384
|
example), at least at a 32×32 source — `animate`/`animate-pixminimax` remain
|
|
369
385
|
schema-only and unexercised, taken from PixelLab's live OpenAPI document
|
|
370
|
-
rather than an observed call.
|
|
386
|
+
rather than an observed call.
|
|
387
|
+
|
|
388
|
+
`animate-pixminimax`'s `direction` + `enhancePrompt` combination has a
|
|
389
|
+
measured-in-practice gotcha, not just a schema quirk: PixelLab's own tutorial
|
|
390
|
+
states plainly that `enhancePrompt` can expand the motion description with
|
|
391
|
+
camera-relative language ("towards the camera") that fights the requested
|
|
392
|
+
world-facing `direction`, and the failure is direction-specific — cardinal
|
|
393
|
+
directions came out fine, an off-cardinal one (north-east) did not. When a
|
|
394
|
+
multi-directional PixMiniMax animation goes wrong at one or two directions
|
|
395
|
+
but not others, suspect the enhanced prompt's own wording before the model or
|
|
396
|
+
the `direction` value. The same tutorial states outright that PixMiniMax
|
|
397
|
+
"allows up to 40 frames," a second, independent (though still not
|
|
398
|
+
live-billed) confirmation of the ceiling above.
|
|
399
|
+
|
|
400
|
+
PixelLab ships a further image-generation tier beyond what this adapter
|
|
401
|
+
models: "Pro Flash" for plain image create/edit/inpaint, the same
|
|
402
|
+
`gpt-image-2.5-flare` model `character`/`objectPro` pro-flash already use,
|
|
403
|
+
now exposed for images with no character or object involved — see
|
|
404
|
+
[pixellab-roadmap.md](./pixellab-roadmap.md) for the confirmed shape and
|
|
405
|
+
cost.
|
|
406
|
+
|
|
407
|
+
For a style aimed at a specific look (a
|
|
371
408
|
retro/console feel or a
|
|
372
409
|
high-fidelity showcase asset) rather than a default, read
|
|
373
410
|
[pixellab-fidelity.md](./pixellab-fidelity.md) before choosing `size`,
|
|
@@ -27,7 +27,12 @@ Read this reference when an asset declares `revision`.
|
|
|
27
27
|
animation's final frame into the next). `animate` caps at 16 frames;
|
|
28
28
|
`animate-pixminimax` (beta, tier 1+) allows up to 40 and adds `direction`.
|
|
29
29
|
Neither endpoint's cost or completed-response shape is measured against a
|
|
30
|
-
live account.
|
|
30
|
+
live account. `direction` + `enhancePrompt` together have a real gotcha:
|
|
31
|
+
the enhanced prompt can add camera-relative language that fights the
|
|
32
|
+
requested world-facing `direction`, breaking an off-cardinal direction
|
|
33
|
+
while cardinal ones in the same batch generate fine — suspect the enhanced
|
|
34
|
+
prompt's wording, not the model, when only some directions of a
|
|
35
|
+
multi-directional set come out wrong.
|
|
31
36
|
- Both PixelLab and ComfyUI can back a `revision`, not just ComfyUI.
|
|
32
37
|
PixelLab's `reduce-colors`/`correct-pixelart` calls its own
|
|
33
38
|
`/reduce-colors`/`/correct-pixelart` endpoints synchronously (no background
|
package/NAMING.md
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# Naming resolved: `pixelkiln`
|
|
2
|
-
|
|
3
|
-
**The name is settled.** The project ships as `pixelkiln`. `package.json` is
|
|
4
|
-
no longer `private`.
|
|
5
|
-
|
|
6
|
-
## The original blocker was a factual error
|
|
7
|
-
|
|
8
|
-
The prior version of this file claimed `pixelkiln` "is an established npm
|
|
9
|
-
package (v3.5.1, the CSS spritesheet builder) and `pixelsmith` is its
|
|
10
|
-
engine," and blocked the name on that basis. Re-verified directly against
|
|
11
|
-
the npm registry (2026-08-18):
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
GET https://registry.npmjs.org/pixelkiln → 404 "Not found"
|
|
15
|
-
GET https://registry.npmjs.org/spritesmith → 200, latest 3.5.1, "Utility that
|
|
16
|
-
takes images and creates a
|
|
17
|
-
spritesheet with JSON sprite data"
|
|
18
|
-
GET https://registry.npmjs.org/pixelsmith → 200, latest 2.6.0, "Node based
|
|
19
|
-
engine for spritesmith"
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
`pixelkiln` was never published. The "v3.5.1 CSS spritesheet builder" is
|
|
23
|
-
**`spritesmith`**, a real and long-established package. `pixelsmith` really
|
|
24
|
-
is its engine, exactly as claimed, but neither of them is `pixelkiln`. The
|
|
25
|
-
original research conflated the two real packages into a collision that
|
|
26
|
-
didn't exist. (`pixelsmith` also appears, separately and correctly, in the
|
|
27
|
-
rejected-candidates list below. It is a real name in a different, adjacent
|
|
28
|
-
project, which should have been the tell.)
|
|
29
|
-
|
|
30
|
-
A GitHub search for `pixelkiln` returns nothing but this repository, and a
|
|
31
|
-
general web search turns up no product, tool, or project by that name
|
|
32
|
-
anywhere. Nothing else needs to change: `bin/pixelkiln.js`, `package.json`'s
|
|
33
|
-
`name`/`bin`, the README, `scripts/gen-schema.ts`'s schema title, and
|
|
34
|
-
heybud-admin's `package.json` badge scripts already all say `pixelkiln`.
|
|
35
|
-
There is no rename to do, only the `private: true` flag to drop, which is
|
|
36
|
-
done.
|
|
37
|
-
|
|
38
|
-
## What the space already looks like
|
|
39
|
-
|
|
40
|
-
The "manifest-driven AI asset generation CLI" idea is not novel. Prior art found:
|
|
41
|
-
|
|
42
|
-
| Project | Overlap | Backend |
|
|
43
|
-
|---|---|---|
|
|
44
|
-
| [pickbitsai/sprite-generator](https://github.com/pickbitsai/sprite-generator) | Closest. JSON manifest, `assets[]` with id/category/description, `defaultStyle`, `--dry-run`, `--category`, `--concurrency` | OpenAI `gpt-image-1` |
|
|
45
|
-
| [mcp-tool-shop-org/sprite-foundry](https://github.com/mcp-tool-shop-org/sprite-foundry) | SQLite lifecycle tracking, review/accept/reject, provenance, deterministic export with manifest + checksums | ComfyUI (local GPU) |
|
|
46
|
-
| [lx-0/restyle-sprites](https://github.com/lx-0/restyle-sprites) | Restyle a whole pack from source + style reference | Gemini / OpenAI |
|
|
47
|
-
| [trebeljahr/sprite-tools](https://github.com/trebeljahr/sprite-tools) | Post-processing toolkit for atlas, collision, and palette | n/a |
|
|
48
|
-
| [dt-pirate/openrender](https://github.com/dt-pirate/openrender) | Installs generated assets into engines, manifests, rollback | n/a |
|
|
49
|
-
| [freema/pixelforge-mcp](https://github.com/freema/pixelforge-mcp) | MCP server for pixel art | Gemini |
|
|
50
|
-
| [ralphy](https://ralphy.mintlify.app/advanced/asset-manifest) | `asset-manifest.json` slot pointers + `generations.jsonl` audit log | multi |
|
|
51
|
-
|
|
52
|
-
**Implication for naming:** the `sprite-*` namespace is crowded. `sprite-generator`,
|
|
53
|
-
`sprite-foundry`, `sprite-tools`, and `restyle-sprites` all exist. Avoid it.
|
|
54
|
-
|
|
55
|
-
## What is actually differentiated here
|
|
56
|
-
|
|
57
|
-
Worth knowing, because the name should point at it:
|
|
58
|
-
|
|
59
|
-
1. **PixelLab-native.** Everything above wraps a general image model and
|
|
60
|
-
downscales. PixelLab generates on a real pixel grid. Nothing found targets it.
|
|
61
|
-
2. **Exploits the candidate economics.** Cost is fixed per call while candidates
|
|
62
|
-
returned scale inversely with canvas size. Nothing found treats "generate
|
|
63
|
-
small, pick from 16" as the core loop.
|
|
64
|
-
3. **`adopt`.** Retroactively reconciling an existing account and repo by image
|
|
65
|
-
hash. Not found anywhere.
|
|
66
|
-
4. **A true lockfile.** `sprite-foundry` uses SQLite, `ralphy` uses a pointer
|
|
67
|
-
table plus a log. A committed, sorted, hash-on-both-sides lockfile in the npm
|
|
68
|
-
sense was not found.
|
|
69
|
-
|
|
70
|
-
## Shortlist (historical, kept for context)
|
|
71
|
-
|
|
72
|
-
All verified free on npm, zero GitHub repos by that name, no web presence
|
|
73
|
-
(checked 2026-07-29 for the alternates; `pixelkiln` itself re-verified
|
|
74
|
-
2026-08-18 per the resolution above).
|
|
75
|
-
|
|
76
|
-
| Candidate | Note |
|
|
77
|
-
|---|---|
|
|
78
|
-
| **pixelkiln** ✅ **chosen** | Firing/baking metaphor fits pixel art, avoids the crowded `sprite-*` space. The npm collision this was shelved for turned out not to exist. See Resolution. |
|
|
79
|
-
| pixelquarry | Extraction metaphor, since you quarry many candidates and keep the good ones. Still free, not needed. |
|
|
80
|
-
| pixelcrate | Packaging/inventory feel; leans toward the lockfile idea. Still free, not needed. |
|
|
81
|
-
| dithermill | Most pixel-art-native word available; "mill" carries batch production. Still free, not needed. |
|
|
82
|
-
| spriteledger | Points hardest at provenance, but inherits the crowded `sprite-` prefix. Still free, not needed. |
|
|
83
|
-
|
|
84
|
-
Rejected after checking: `pixelwright` (three live businesses use it: an AI app
|
|
85
|
-
builder, an iOS audit firm, and a UI developer's brand), `spritefoundry` (taken by a
|
|
86
|
-
real project), `pixelsmith` (real package, `spritesmith`'s engine, see
|
|
87
|
-
Resolution), `spritemill`, `pixelloom`, `bitforge`, `spritelab`.
|