Nodes/comfyui-controlbot/📲 Save to Phone (Telegram)
ComfyUI Node

📲 Save to Phone (Telegram)

Get Renders on Your Phone the Moment They Finish (Telegram)

By AbhishekJha3511·Created 4 months ago·Updated 4 months ago· 0
📲 Save to Phone (Telegram)
  • images
    â—„bot_tokenYOUR_BOT_TOKEN_HEREâ–º
    â—„chat_idYOUR_CHAT_ID_HEREâ–º
    â—„captionGenerated by ComfyUIâ–º

    The name isn't marketing: this node takes whatever image batch you feed it and pushes the results straight to your phone over Telegram. No cloud drive, no port-forwarding, no remote-desktop session just to look at a picture. If your ComfyUI box lives in a closet or on a rented cloud GPU and you want to check an overnight batch from bed, that's the whole job.

    It's the "send it to me" half of the comfyui-controlbot pack - the pack's other half is a background bot that listens for /generate commands from your phone and queues prompts. This node is the manual, always-on part: wire it into any workflow and every generation it touches gets shipped off as a Telegram message.

    How it works

    Mechanically it's almost embarrassingly simple. The node takes the IMAGE tensor, converts it to a PIL image, encodes it as PNG in memory (no disk write), and POSTs it to Telegram's Bot API:

    https://api.telegram.org/bot<bot_token>/sendPhoto
    

    with your chat_id and caption attached. There's no API key beyond the bot token, no account to set up, and it works from any machine that can reach the internet.

    Like Save Image, it's an output node with no return wires - it terminates a branch and always forces the graph to run to it, so the generation in front of it executes even if nothing downstream is being saved. Wire it to the image you actually want: after VAE decode or after your final upscale, not before. Feed it a batch and it loops - every frame in the batch becomes its own sendPhoto message, so a 4-image batch is 4 pings.

    The inputs that matter

    Only four, and only two of them require homework:

    • images - your IMAGE output. The only thing you wire in.
    • bot_token - get it from @BotFather: /newbot, copy the token, paste it here.
    • chat_id - your numeric Telegram user ID, from @userinfobot. This one bites people: before the bot can send you anything, you have to open the bot and press Start. Telegram bots can't initiate a conversation, so "it's not working" is very often "I never messaged my own bot."
    • caption - the text under the photo. Defaults to "Generated by ComfyUI"; set it to the prompt or seed so your phone knows what it's looking at.

    Installing it

    In ComfyUI Manager, search for comfyui-controlbot and hit Install, or clone it manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/Abhishekjha3511/comfyui-controlbot
    

    Then restart ComfyUI. No pip install needed for the node itself - it only uses torch, PIL and requests, which ComfyUI already bundles. (The README's pip install websocket-client step is for the pack's separate bot script, not this node. Ignore it here.)

    Where people get burned

    • The pack starts a Telegram bot daemon on every ComfyUI launch - the __init__.py spins up a background thread that polls Telegram for /generate commands, whether or not you ever touch this node. And here's the thing: the repo ships a config.json in the pack folder that already contains what looks like a real bot token and user IDs. If you're only using this node, blank that token out. With a dead token the daemon tight-loops against Telegram's API with no backoff, which is both a privacy smell and a waste.
    • Your token and chat_id sit in plaintext in the node and get baked into any workflow JSON you export. Never share those files. If a token leaks, /revoke it at BotFather.
    • Errors only go to the console. Success or failure, it's a print statement in your terminal - check ComfyUI's output for Failed to send: followed by Telegram's actual response. A 401 means a bad token; "chat not found" means a wrong chat_id or no Start pressed.
    • Telegram re-encodes photos. sendPhoto sends a compressed photo, so a huge render comes back downscaled. Fine for "did it converge?" checking; don't use it as an archival pipeline. (Silver lining: since the PNG is encoded from the raw tensor in memory, there's no embedded workflow in what you send - one less thing to leak.)
    CategoryImage/Postprocessing

    Inputs (4)

    NameTypeDefaultDescription
    imagesIMAGE—
    bot_tokenSTRINGYOUR_BOT_TOKEN_HERE—
    chat_idSTRINGYOUR_CHAT_ID_HERE—
    captionSTRINGGenerated by ComfyUI—

    Outputs (0)

    No outputs