Nodes/ComfyUI-MiroBoard/Add Image Miro Board v0.1.3
ComfyUI Node

Add Image Miro Board v0.1.3

Your ComfyUI outputs, teleported onto a Miro board

By TRI3D-LC·Created 2 years ago·Updated 2 years ago· 4
Add Image Miro Board v0.1.3
  • input_image_1
  • input_image_2
  • input_image_3
  • input_image_4
  • input_image_5
  • input_image_6
    y_start-1
    x_offset125000
    width400
    board_idBOARD_ID
    notesNotes

    This is the node that turns a Miro whiteboard into your ComfyUI output folder. Wire an image (or up to six of them) in, hit Run, and they show up as actual items on your Miro board - alongside a sticky note with whatever text you pass in. No saving files, no dragging, no "where did that render go" hunt. It's a niche thing, and honestly that's its charm: if you run batches of variations for a team or keep a living moodboard of your generations, dumping them straight onto a board everyone can look at beats curating a folder of PNGs.

    It's from TRI3D-LC/ComfyUI-MiroBoard, a tiny single-node pack. Before you get excited, the node has zero outputs and it's an output/sink node by design - you wire into it, it swallows the image, and nothing comes out the other side. That's the whole point.

    How it works

    Under the hood it's just the Miro REST API v2, called with requests. Each image is converted from a torch tensor to a JPEG via cv2, then POSTed to https://api.miro.com/v2/boards/{board_id}/images with a Bearer token. Your notes string goes to /sticky_notes as a sticky note sitting left of the row. That's it - no models, no GPU work, no heavy deps beyond requests and python-dotenv.

    The token isn't a UI field. It's read from a .env file via python-dotenv, as MIRO_OAUTH_TOKEN. The pack ships an env_sample; copy it to .env in ComfyUI/custom_nodes/ComfyUI-MiroBoard/ and paste in a Miro OAuth access token with boards:read and boards:write scopes (create an app under your Miro account settings to mint one).

    The inputs that matter

    The full list is in the schema, but you'll actually touch four things:

    • board_id - the base64-looking string from your board's URL (miro.com/app/board/<this-bit>/). The default is literally "BOARD_ID", a placeholder.
    • input_image_1 - your image (required). input_image_2 through input_image_6 are optional extras, laid out in a horizontal row.
    • notes - text dropped as a sticky note at the left of the row.
    • x_offset, y_start, width - board coordinates and item width. The defaults are sane: x_offset 125000 (Miro's canvas is huge, coordinates run to six digits), width 400.

    Here's the sneaky bit: y_start defaults to -1, which is not "negative position" - it means "read the last y from a local db.local file and stack this run below the previous one." Set a real number to pin a row in place, or leave it and let runs tile down the board. Height is auto-scaled to keep aspect ratio, and items get a 20%-of-width gap between them.

    Install

    Easiest via ComfyUI Manager - search ComfyUI-MiroBoard and install, then restart. Or by hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/TRI3D-LC/ComfyUI-MiroBoard
    cd ComfyUI-MiroBoard
    pip install -r requirements.txt
    

    Then restart ComfyUI. Requirements are just python-dotenv and requests, both almost certainly already in your environment, and cv2/torch come from ComfyUI itself. No model downloads, no heavy dependencies - this is one of the lightest installs in the ecosystem.

    Where people get burned

    • The silent no-op. If board_id is still "BOARD_ID", the node returns without doing anything - no error, no upload. The very first thing to check when "nothing happened" is that you replaced the placeholder with your actual board ID.
    • 401 auth errors. That means MIRO_OAUTH_TOKEN is missing, wrong, or scoped too narrowly. Make sure .env is in the pack folder and the token has write access to the board.
    • Batches only upload the first image. The input is a batch IMAGE tensor, but the code grabs input_image[0] - feed it a batch of four and only frame one lands. If you want every variation up there, loop it in your workflow and pass one at a time.
    • Transparency is flattened. Everything becomes a JPEG, so a transparent PNG arrives as a black-background box. Fine for photos, annoying for cutouts.
    • The y-stacking surprise. Because y_start=-1 reads db.local, a rerun lands below your last row, not on top of it. Confusing the first time, useful once you expect it.

    For a pack with zero community chatter so far, it's refreshingly small and honest - read the whole thing in one sitting. If you live in Miro and ComfyUI both, this is the two-minute bridge between them.

    CategoryMiroBoard

    Inputs (11)

    NameTypeDefaultDescription
    y_startINT-1
    x_offsetINT125000
    widthINT400
    board_idSTRINGBOARD_ID
    input_image_1IMAGE
    notesSTRINGNotes
    input_image_2optIMAGE
    input_image_3optIMAGE
    input_image_4optIMAGE
    input_image_5optIMAGE
    input_image_6optIMAGE

    Outputs (0)

    No outputs