OOP Mouth π
Mouth shape, size and openness as enums β expression without the typos
- OOP_MOUTH
A character's expression lives in the mouth, and "slightly open, full lips" is the kind of prompt line that gets flattened by the encoder into "lips open." OOP Mouth π from the ComfyUI-OOP pack splits it into three clean controls - shape, size and openness - and writes the labeled string for you. It's the pack's expression workhorse.
What it builds
Standard pack architecture: a string builder outputting a custom OOP_MOUTH type. No pixels touched.
- shape - required, 20 options:
Round,Wide,Thin,Full,Heart,Smile,Frown,Neutral,Angled,Downturned,Oval,Pointed, and more. DefaultNeutral. - size - optional, 8 options:
Small,Medium,Large,Tiny,Huge,Petite,Gigantic. Default" "(off - no size tag written). - opening - optional, 9 options:
Closed,Slightly,Wide,Open,Partially Open,Fully Open,Gaping,Barely Open. Default" "(off).
The two optional fields use the " " sentinel as their off switch - leave them blank and the node just won't write a size or openness tag. Set Full + Medium + Slightly and you get shape:Full, size:Medium, opened:Slightly, which is the exact mouth line from the README example. The output uses opened: (past tense, with the author's spelling) rather than open: - harmless, since it's just text the encoder reads, but don't be surprised to see it.
randomize is available and re-rolls shape, size and opening on every queue run (IS_CHANGED returns fresh random bits). For batch expression study, it's great; for one specific look, keep it off.
Where it goes
OOP_MOUTH plugs into the mouth input on OOP Person π€, which bundles it with hair, eyes, clothing and poses into a full character block. The OOP Node π« then assembles the scene and encodes it, exposing a STRING output so you can verify the mouth line survived. If Gaping reads wrong on your model, that string is where you fix it by hand.
Install
It ships with the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/0xRavenBlack/ComfyUI-OOP
Restart ComfyUI. Manager works too - search ComfyUI-OOP in the Custom Nodes Manager. No requirements.txt, no model files, nothing to download beyond the clone.
Gotchas
- Expression nuance is the weak spot.
SmileandFrownare booru-style tags that SDXL and anime checkpoints read well; on photorealistic models, the size/openness split will do more work than the shape list. - SDXL-era again. The pack's aggregator hardcodes CLIP skip β2 and 1024Γ1024 conditioning; the demo workflow is SDXL (euler/karras, cfg 8, 20 steps). These labels are tuned for that family.
- The lists are a little unhinged at the edges.
GiganticandGapingexist next toPetiteandBarely Open. They're all valid strings; the model decides how literal to be.
Small dormant pack (early 2025, ~15 stars). For keeping mouths consistent across a batch of character portraits - same shape, every render - this node is the reliable part of the pipeline.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| shape | COMBO | Neutral | 20 options: Round, Wide, Thin, Full, Heart, Smile, +14 |
| sizeopt | COMBO | 8 options: , Small, Medium, Large, Tiny, Huge, +2 | |
| openingopt | COMBO | 9 options: , Closed, Slightly, Wide, Open, Partially Open, +3 | |
| randomizeopt | BOOLEAN | false | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| OOP_MOUTH | OOP_MOUTH | β |