ꘇ dat.text
The one-line-per-row trick that makes text addressable
- table
- text
What it is
ꘇ dat.text takes a block of text and turns each line into a row of a one-column table. Same text back out on the text output. Three inputs' worth of nothing: one multiline text box, and that's the entire node.
On its face that sounds useless. It isn't, and the reason is worth spelling out: in ComfyUI, a plain STRING is a terminal value - you can print it, or shove it into a prompt, and that's the end of the road. A GENERETI_DAT table is addressable. Once your text is a table you can index it (dat.cell), slice it (dat.select), search it (dat.json's filter), number it (dat.tochop), or rasterise it (dat.totop). dat.text is the converter that gets you across that line for the cheapest possible price.
Think of it as the plumbing equivalent of the primitive value nodes in core Comfy: it costs nothing, and it exists purely so the rest of the graph can fan out from one authoritative source.
The mechanism
Genuinely one line of logic: split on newlines, wrap each piece in a single-element row. No trimming, no delimiter inference, no header. A blank line becomes a blank row, which is fine - empty cells convert to 0.0 later if you push them into dat.tochop.
The useful consequence is what it does with structured line-based text you already have. A pasted list of seeds becomes a column of seeds you can select from and convert to channels. A list of prompt fragments becomes row-addressable so dat.cell can hand one out as a FLOAT-plus-STRING pair. A MIDI-ish note list - one pitch per line - becomes a table you can drive other nodes from.
Outputs are the DAT pair, both of which are real:
table-GENERETI_DAT, one column, one row per line.text-STRING, the original text (this one is a passthrough of your input, unlike the CSV re-serialisationdat.tabledoes).
So the text output is the one to reach for when you just want to move a string around without it being mangled, and table is the one to reach for when you want to do something to it.
Where it fits in the wider workflow
This is a plumbing node. It won't produce an image, and it has no opinion about models. It's the kind of thing the KB's node-plumbing map argues is undervalued: in any real workflow, the value-carrying, graph-shaping nodes are the majority, and the reason they're invisible is that nobody writes about them.
A concrete use: the pack's DAT/CHOP/texture families share one small arithmetic expression language, so you can build a table of numbers, send it through dat.tochop to make named channels, and then have a texture or CHOP expression read those channels. dat.text is the cheap front of that chain when your data starts life as plain lines.
Install
It's part of the Genereti pack - no standalone install exists. Manager → search Genereti (liuboto) → restart → refresh the browser tab. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/languel/genereti.git genereti
cd ../
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt
Windows Portable users should use the bundled python_embeded\python.exe, and Desktop users its own environment - the README is emphatic about not using a global pip. Requirements are one line (comfyui-frontend-package>=1.53.6); no models, no CUDA work, no extra packs. The pack targets ComfyUI 0.38.2+, Python 3.11+, latest-tested on macOS/Apple Silicon.
Gotchas
- No trimming. Leading or trailing spaces in a line survive into the cell, and
dat.tochop's numeric parse will then fail on that cell and quietly write0.0. If a channel is suspiciously zero, look for whitespace. - Blank lines are rows. They aren't skipped.
- It's still an alpha pack. The README's own words: "Super alpha - early classroom testing. Back up your workflows before updating. Expect bugs and changing interfaces." Node IDs are held stable (
GeneretiDatText), so saved workflows keep working, but don't be surprised by UI movement. - Browser refresh, always. Every node in this pack registers a frontend extension; if the node renders as a bare shell after an update, that's a stale tab, not a broken install.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | A creative signal graph | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| table | GENERETI_DAT | — |
| text | STRING | — |