Card overlay (Arrssenne)
Stamp a collector-card frame over your characters
- image
- IMAGE
- full_name
- price_str
- stars
This is the node the rest of the pack is building toward. Feed it a generated character image and it stamps a fake trading-card frame over it: gold stars top-right, tag text bottom-right, a name-and-price banner along the bottom - and every once in a while a holographic sheen, because it's a collector's card and rare cards shine. It's an opinionated, slightly silly, single-purpose node, and it does exactly what it says.
A quick honesty note before the details: the author built this for a personal adult-content character-collection workflow, and the wildcard files the pack ships with are explicit by default (and in French). If you're not doing that, you'll point the tag and surname files at your own lists - which, luckily, is the whole design.
How it works
It's a Pillow composition. The overlay is drawn onto a copy of the image - stars top-right, tags bottom-right, a semi-transparent black banner across the bottom with the name in gold on the left and the price in gold on the right. The "collector" logic is a tiny bit of game design:
- full_name = your
first_nameinput plus a random surname drawn fromsurname_wildcard_path(typically you wirefirst_namefrom the Load image FACE + path node'snameoutput - that's the intended pairing). - tags =
tag_countrandom entries fromtag_wildcard_pathplustag_special_countfrom a separatetag_special_wildcard_path(sampled without repeats within a draw). - price = normally a random value in
price_min–price_max, rounded toprice_step. But with probabilityrare_chance(default 3%) it's fixed at 100,000, and with probabilityultra_rare_chance(default 0.5%) it's fixed at 1,000,000. Both rare tiers add the holographic sheen - a rainbow gradient screen-blended over the card. - stars = random integer between
star_minandstar_max(defaults 1–5).
The whole roll is driven by a seed input through a single RNG, so the same seed on the same wildcard files gives you the same card - seed it if you want to keep a particular price.
The inputs you'll actually touch
Most of the fifteen inputs have sane defaults and you'll leave them alone. The ones worth knowing:
- image and first_name - the picture and the character's first name.
- The three wildcard paths - surname, tag, special tag. Relative paths resolve against the pack's own
wildcards/folder (that's what ships); an absolute path overrides it. - tag_count / tag_special_count - how many tags get pulled (0–10 and 0–5).
- rare_chance / ultra_rare_chance - how often the card is worth 100k or a million.
- font_path - defaults to
georgia.ttf. More on that below.
Outputs: IMAGE (the card), full_name, price_str (formatted like $12,400), and stars - handy if you want to echo the card's stats into metadata or a filename.
The traps
Only the first image of a batch gets the overlay. The node reads image[0] - feed it a single image, not a batch, or you'll silently get one card and N plain images.
The font fallback is tiny. If georgia.ttf can't be found, Pillow falls back to its built-in bitmap font and logs a warning - and the result looks comically small. If your text looks like ants, that's why: set font_path to an absolute path to a TTF you actually have.
Wildcard files are just text - one entry per line, blank lines skipped, missing file = no tags (with a console warning, not a crash). Easy to edit, easy to break; keep the encoding UTF-8.
Install
ComfyUI Manager → search "ComfyUI-Arrssenne", or:
cd ComfyUI/custom_nodes
git clone https://github.com/arrssenne/comfyui-arrssenne
Restart, find it under Arrssenne/Image. No models, no keys. The one real dependency is Pillow - in the pack's requirements.txt even though the README claims no dependencies - and ComfyUI ships it as a matter of course.
Is it worth installing the pack for this alone? Only if you're literally building a card-collection output. But if you are, this is the fastest path between a generated character and a presentable "card," and the rest of the pack (the face loader, the loaders, the filename node) is clearly built to feed it. It's a personal-pack quirk - and a charming one.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| first_name | STRING | — | |
| surname_wildcard_path | STRING | wildcards/card_surname.txt | — |
| tag_wildcard_path | STRING | wildcards/card_tag.txt | — |
| tag_special_wildcard_path | STRING | wildcards/card_tag_special.txt | — |
| tag_count | INT | 30–10 | — |
| tag_special_count | INT | 10–5 | — |
| price_min | INT | 10000–10000000 | — |
| price_max | INT | 100000–10000000 | — |
| price_step | INT | 1001–10000 | — |
| rare_chance | FLOAT | 0.0300–1 | — |
| ultra_rare_chance | FLOAT | 0.0050–1 | — |
| star_min | INT | 11–5 | — |
| star_max | INT | 51–5 | — |
| font_path | STRING | georgia.ttf | — |
| seed | INT | 00–18446744073709550000 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| full_name | STRING | — |
| price_str | STRING | — |
| stars | INT | — |