lower
Lower — normalize your text before it goes anywhere that cares
- STRING
Case is a silent workflow breaker. A filename built as Photo.PNG won't match a check for photo.png, a tag that comes back as "HDR" won't equal your "hdr" lookup, and two strings that are identical except for capitalization will fail an equality test you assumed would pass. lower is the node that makes case stop matter: it converts every uppercase character in a string to lowercase, and you do it before the comparison, not after the failure.
Reach for it whenever you're comparing, looking up, or matching strings that could arrive in unpredictable case - filenames from a folder, tags from a file, values from an API. Normalize everything to lowercase at the front of the chain and every downstream comparison gets one less way to fail.
How it works
Python's str.lower(), which is Unicode-aware: it converts not just ASCII but accented and non-Latin uppercase to their lowercase forms - "CAFÉ" → "café", "Ä" → "ä". It does a genuine case mapping, not a crude "shrink the letters" pass. Note it's not the same as casefold, which this pack also ships - lower is for display and general normalization, casefold is the more aggressive version used for case-insensitive matching of things like German ß. For 95% of workflow work, lower is what you want.
Inputs and outputs
One required input, string (default ""), one STRING output - the lowercased copy. The original is untouched; strings in Python are immutable and this returns a new one. Wire the output into whatever compares or stores text.
Installing it
Ships in the Basic data handling pack by StableLlama. ComfyUI Manager, search "Basic data handling", install, restart. Manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/StableLlama/ComfyUI-basic_data_handling
Pure Python, zero dependencies, no downloads - the pack installs clean and won't fight your other nodes. Under Basic/STRING in the menu.
Common issues
Don't use lower to "fix" your prompts for the model - that's not what it's for. CLIP and the text encoders handle case themselves, and lowercasing a prompt before it hits the encoder changes the text you're actually conditioning on. lower is for your own string logic: comparisons, lookups, filenames. The other gotcha is the matching subtlety: lower alone isn't a complete case-insensitive comparison for every language - "Straße".lower() is "straße", but "STRASSE".lower() is "strasse", and those won't match even though a human calls them the same word. If you're doing serious case-insensitive matching on user text, that's the pack's casefold node.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| string | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |