TrainyThing Send
Fire the batch at your phone, then let ComfyUI get on with it
- images
- images_b
- queue
- link
- slug
What it is
TrainyThing Send is the first half of TrainyThing Review, alone: the batch becomes a review queue on your phone, the node shows the link and a QR, and then the run finishes. No waiting, no held queue, no opinion about what ComfyUI does next.
That sounds like a downgrade until you've had a Review node sit on the canvas for forty minutes with ComfyUI frozen behind it. Send is the way out: queue the graph as many times as you like with the same slug and the phone queue grows while you keep generating. Review it whenever, then come back with TrainyThing Load or wire Wait if the split belongs in this run.
Both halves are the same machinery: Send owns the upload and the QR, Wait owns the polling and the slicing. When reviewing can happen on its own schedule, Send alone is the right tool.
How it works
Send builds the queue's configuration from its widgets, creates a queue (or appends to one that's still open), turns each image into a card, and uploads the PNGs to a local TrainyThing daemon. The uploads keep their prompt and workflow chunks - the same ones Save Image writes - so a keeper dragged back out of output/trainything/<slug>/blobs/ reloads the entire workflow that made it.
Before uploading it also walks your graph backwards from images: VAE Decode, sampler, text encoders, LoRA loaders, checkpoint. That fills in each card's seed, prompt and sampler settings so the verdicts come back actionable. It's best effort - custom samplers and loop packs stop it - and meta overrides it.
Then it hands back a handle and gets out of the way. The QR is drawn as an image preview with the link printed underneath, because ui.PreviewText doesn't render on custom nodes in 0.39.0.
Connection details are never widgets: TRAINYTHING_URL/TRAINYTHING_TOKEN from the environment, then ~/.trainything/config.json, then http://127.0.0.1:4747. A token widget would end up baked into every PNG and every shared workflow file, which is exactly how you'd leak it.
The inputs and outputs that matter
Send takes Review's inputs minus latent, timeout_minutes and on_timeout - there's no wait, so nothing to time out. The ones a beginner sets:
images- the batch, one card each.slug- the queue's name in the link. Empty derives one fromtitle;randomgives an unguessable one. Use an open queue's name and your new cards are appended - that's the whole "queue the same graph ten times" trick.mode-single,pair(wireimages_b, same batch size),chooseorselect(both needoptions, writtenid:Label, id:Label).public- opens the tunnel before any upload so the link works off your Wi-Fi. A failed tunnel gives you a console line and the local link, not an error.min_reviews,feedback,identity,order- opinions per card, when a reason is demanded, whether reviewers leave a name, and whether cards run in batch order or fewest-reviews-first.
Three outputs: queue (a TRAINYTHING_QUEUE handle - URL, slug, queue id, link, this run's card refs; only Wait takes it), link and slug (STRING, for a preview or for pasting into Load later).
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/ryanrinkel/comfyui-trainything
cd comfyui-trainything
python -m pip install -r requirements.txt # ComfyUI's own python, or python_embeded\python.exe
# restart ComfyUI, then once:
npx -y trainything dashboard
Manager: search the pack title "TrainyThing", or comfy node install trainything. Deps are segno (QR codes), pillow, numpy; no model files. The daemon is separate and needs Node ≥ 22.5 - that npx line starts it in the background. The pack is built on ComfyUI's V3 node API and pins requires-comfyui = ">=0.39.0".
Where people get burned
The cache eats your second send. ComfyUI caches an unchanged Send, on the logic that those images are already on the phone. Queue the identical graph twice and nothing new arrives - change a seed or any widget to force a real send.
The queue output isn't a value you can feed anywhere else. It fits Wait's socket and nothing else. If you're not waiting in this graph, ignore it and use the slug.
Appending has rules. A queue made by the CLI, the dashboard or the MCP server keeps its settings: a different mode is an error naming both, different options give way to the queue's, a queue with no min_reviews adopts the node's.
No daemon, one line. no TrainyThing at http://127.0.0.1:4747; run npx -y trainything dashboard once. The node tries to start a local daemon once, with a 15-second budget; if that fails, start it yourself.
options is fussy in choose/select, on purpose. Lowercase letters, digits, - and _, 2 to 12 of them, skip reserved. A malformed list errors with the offending entry named.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The pictures to review. Each one becomes a card on the phone. | |
| title | STRING | ComfyUI batch | A name for this batch. Shown at the top of the phone page and on the dashboard. |
| prompt | STRING | Keep this one? | The question written on every card, e.g. Keep this one? |
| mode | COMBO | single | How the reviewer answers. single: keep or reject each picture. pair: pick A or B (wire the B pictures into images_b). choose: pick one of your options per picture. select: tick any of your options per picture. |
| public | BOOLEAN | false | On: make a link that works away from this computer (your phone off the home Wi-Fi), through a tunnel. Off: the link only works on this machine. |
| slug | STRING | The short name in the link, like a folder name. Leave empty to make one from the title. Use the name of a batch that is still open to add these pictures to it. Type random for a name nobody can guess. | |
| intro | STRING | A short message the reviewer reads before the first card. Leave empty for an automatic one that quotes your positive prompt and says what to do. | |
| options | STRING | Only for choose and select: the buttons the reviewer sees, as id:Label pairs separated by commas, e.g. hair:Hair colour, hands:Hands, ok:Fine. An id is lowercase letters, digits, - or _. Ignored in single and pair. | |
| feedback | COMBO | on_reject | When the reviewer is asked to type a reason. on_reject: only when they reject (single mode; a note box on every card in the other modes). optional: a note box on every card. required: they must write something. off: never. |
| identity | COMBO | name_email | name_email: the phone asks for a name and email before the first card, so you know who said what. anonymous: it asks nothing. |
| order | COMBO | coverage | The order the cards are shown in. coverage: the pictures with the fewest reviews first, so several reviewers spread out. fixed: the batch order. |
| min_reviews | INT | 11–50 | How many people must judge each picture before the batch counts as done. 1 when it is just you. |
| project | STRING | comfyui | A tag that groups batches on the dashboard. |
| images_bopt | IMAGE | pair mode only: the B pictures, one for each A picture, same count. | |
| labelsopt | STRING | Optional: a caption above each card. One line per picture, in batch order. | |
| metaopt | STRING | Optional: extra details to attach to every card as JSON, e.g. {"lora": "witch-v2"}. One object for all pictures, or one per line. It comes back with the verdicts and overrides what the node reads from the graph. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| queue | TRAINYTHING_QUEUE | — |
| link | STRING | — |
| slug | STRING | — |