AutoExpress Sprite Sheet
A labelled contact sheet, not a game atlas
- images
- sprite_sheet
What it actually gives you
Every AutoExpress workflow ends the same way: twenty-eight images that are almost the same image, and no practical way to compare them. That's a genuinely annoying review problem. Twenty-eight thumbnails in a folder, half of them a slight variation on a mouth.
This node tiles them into one picture with the expression name printed under each tile. That's it. It is not a spritesheet in the game-engine sense - there's no alpha channel, no atlas metadata, no packed UV coordinates, and the background is a flat dark grey. What it is, is a contact sheet: one image you can glance at and instantly see that disgust came out looking like annoyance and fear is doing something strange with the eyebrows.
The pack's own README uses them for exactly that - every model family in the docs gets a labelled sheet so you can see the eight expressions side by side. Worth generating for that reason alone if you're testing prompt styles.
How it works
The node collects everything wired into images, flattens any batches, and lays the tiles out left-to-right in rows of columns. Every tile is resized to the size of the first image, which is fine when all your expressions came out of the same graph at the same resolution and confusing when they didn't. Rows are computed from the tile count. Labels are drawn centred underneath each tile, title-cased (joy becomes Joy), in a strip about a sixteenth of the tile height, using Pillow's default font scaled to fit - so no font file to install, and no crisp typography either.
The default columns of 7 is chosen for the pack's 28 expressions: four rows of seven, a tidy 4×7 grid. Set it to 5 and you get six rows with a ragged last one, which is fine, and no worse than most people's first attempt at this.
Inputs and outputs
- images - the list from your FaceDetailer or your Qwen decode. This is what gets tiled.
- columns - 1 to 64, default 7. It's clamped to the number of images, so setting 64 with eight images gives you eight columns, not a mostly empty row.
- show_labels - on by default. Turn it off when you want a clean grid.
- names (optional) - the
nameslist from the prompts node. Wire it or the labels silently don't happen: the node needs both a label source andshow_labelstrue, and if you forget the wire you get an unlabelled grid with no error to explain why.
One output: sprite_sheet, an IMAGE, which goes into Preview Image or Save Image like any other. It's a single image, not a list, so nothing downstream runs per-expression off it.
Where it fits in a working graph
Wire it from the same two nodes as Save Expressions - images from FaceDetailer, names from Expression Prompts - and let it run at the end. It costs a couple of seconds and turns a folder of files into something you can actually evaluate.
If you're doing expression sets for SillyTavern or a visual novel, you need both output nodes, and they do different jobs. Save Expressions writes the files the engine wants (joy.png in a character folder); Sprite Sheet writes the one image you want, for reviewing the set or showing it to someone. Don't ship the sheet - it's for you.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/deepratna-awale/AutoExpress
Or ComfyUI Manager → search AutoExpress; comfy node install autoexpress also works. Restart ComfyUI. The node itself needs nothing but Pillow, which ComfyUI already has - no models, no detectors, no Civitai key. The pipeline around it is what needs Impact Pack and Impact Subpack if you're on the FaceDetailer route, or the Qwen-Image-Edit-2509 files (about 24 GB of VRAM) if you're on the instruction-edit route.
And again, since it's in the repo root: install.sh is the standalone web app's installer and runs a system-wide sudo apt upgrade. Not for ComfyUI.
Honest caveats
Two that matter if you were hoping to use this as a sprite pack rather than a review image. First, RGB only - the flat #333 background is burned into the image, so you cannot key it out cleanly and you cannot get transparent tiles. Second, the tiles are packed edge to edge with no padding or grid lines, which is fine for eyeballing and useless for any engine that expects an atlas with known cell coordinates.
For the actual game-ready sprite set, you want the individual PNGs from Save Expressions, composited against transparency by your own pipeline - that's what the visual-novel sprite tooling in the KB ends up doing, and it's not a problem this node is trying to solve. Use it for what it's good at: seeing twenty-eight faces at once.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| columns | INT | 71–64 | — |
| show_labels | BOOLEAN | true | — |
| namesopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| sprite_sheet | IMAGE | — |