pixelkiln 0.60.0 → 0.60.1

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.
@@ -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.60.0",
3
+ "version": "0.60.1",
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 26 tutorials on PixelLab's official YouTube channel (the 12
5
- featured on pixellab.ai plus 14 more from the channel's "PixelLab Tutorial"
6
- playlist, filtered to the last ~12 months) against this adapter's actual
7
- source. Read this when scoping new PixelLab work, so effort goes toward a
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, not yet investigated.
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. For a style aimed at a specific look (a
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`.