ComfyUI Node

Upload to BASE

Upload your ComfyUI renders straight to BASE

By babe-and-spencer-enterprises·Created about a year ago·Updated about a year ago· 6
Upload to BASE
  • image
  • video
    api_key
    filename_prefixComfyUI
    folder_id

    First, the name: "BASE" here is not "base model" BASE, and it's not base checkpoints either. It's BASE (getbase.app), a small cloud gallery for AI-generated images and video - a place to sort, view, and share what you make. And yes, it's from a GitHub org called babe-and-spencer-enterprises, which is not the name you'd expect from an enterprise, which is exactly the point. This is a tiny indie node for a tiny cloud service, and for the handful of people who use both, it removes the most annoying part of the loop: the download-then-manually-reupload shuffle.

    Upload to BASE is an output node. You drop it at the end of a workflow, connect the image or video you just generated, paste in an API key, and when the queue runs it ships the file straight to your BASE account. It does not call a generic cloud API you configure yourself - the endpoint is baked in, a Google Cloud Function (us-central1-base-14bf3.cloudfunctions.net/uploadToBase). There's nothing to set up on the BASE side beyond generating a key.

    How it works

    This is really a Save Image node with a requests.post() bolted on the end. When it runs it:

    1. Embeds your workflow and prompt into the file's metadata - same culture as normal ComfyUI output, so the uploaded PNG still carries its recipe.
    2. Base64-encodes the bytes and POSTs them to BASE's upload function with your api_key, folder_id, and a filename.
    3. Also saves a local copy in ComfyUI's output folder as a side effect. So even if the upload fails, you're not out the render.

    One genuinely thoughtful touch: the code explicitly scrubs api_key out of the embedded workflow metadata before it uploads. Your key won't leak into the PNG you publish, which is more care than a lot of bigger nodes show. No outputs, no graph value - it returns nothing and just does its thing.

    The inputs that matter

    Out of five, a beginner touches four:

    • api_key - your BASE key, from go.getbase.app → Settings → Integrations → Generate API Key. There's no way around this; the upload dies without it.
    • image - an IMAGE tensor, e.g. straight from a VAEDecode. Uploads a static PNG. Ignored if video is present.
    • video - ComfyUI's native VIDEO type (a saved MP4, not raw tensor frames), so wire it from a node that actually outputs a video file. Takes precedence over image.
    • filename_prefix - defaults to ComfyUI, but it supports format variables like %date:yyyy-MM-dd% or even %Empty Latent Image.width% to pull values from other nodes into the filename.
    • folder_id - optional; right-click a folder in BASE to copy its ID and uploads land there instead of the root.

    Installing it

    This is the easy part. It's published to the Comfy Registry, so open ComfyUI Manager → Custom Nodes Manager, search "Upload to BASE" (or base-comfyui-node), and install. Or go manual:

    cd ComfyUI/custom_nodes/
    git clone https://github.com/babe-and-spencer-enterprises/base-comfyui-node.git
    

    Restart ComfyUI and it appears under the BASE category. Dependencies are requests, Pillow, torch, numpy - all of which ComfyUI already ships, so there's no dependency hell to fall into. Restart still required, as with any node.

    Where people get burned

    • No API key → the upload function returns a non-200 and the node raises RuntimeError with the status text. Make the key first; the error message will tell you exactly what happened.
    • Neither image nor video connected → the code raises ValueError("Either 'image' or 'video' must be provided."). Dead simple to hit if you drag the node in before wiring anything.
    • Batched/animated images → if you feed it multiple frames (say, from an AnimateDiff-style pipeline) it refuses with "Animated image export is not supported." Only single frames upload.
    • Big video files → the upload is a synchronous POST with a 60-second timeout. Long or high-bitrate MP4s can blow past that and fail. Keep clips short, or don't use this as your archive pipeline for multi-GB videos.

    Honest verdict: if you don't already live in BASE's cloud gallery, this node is meaningless to you, and it's far too niche to justify signing up for a service you don't use. But if BASE is your stash-and-share home, this is a legitimately convenient seam in the workflow - and its security hygiene (key scrubbing, local fallback copy) is better than the polish would suggest.

    CategoryBASE

    Inputs (5)

    NameTypeDefaultDescription
    api_keySTRING
    filename_prefixSTRINGComfyUIThe prefix for the file to save. This may include formatting information such as %date:yyyy-MM-dd% or %Empty Latent Image.width% to include values from nodes.
    imageoptIMAGE
    videooptVIDEO
    folder_idoptSTRING

    Outputs (0)

    No outputs