{
  "config": {},
  "extra": {
    "ds": {
      "offset": [
        1281.6666666666665,
        -566.0609567901236
      ],
      "scale": 0.41405750798722046
    },
    "frontendVersion": "1.44.19"
  },
  "groups": [
    {
      "bounding": [
        470,
        1470,
        380,
        560
      ],
      "color": "#3f789e",
      "flags": {},
      "id": 1,
      "title": "Get frame counts (need < 240)"
    }
  ],
  "id": "26d0d199-1925-4395-ac1f-57e3cbc6bcd4",
  "last_link_id": 52,
  "last_node_id": 37,
  "links": [
    [
      25,
      17,
      0,
      20,
      1,
      "IMAGE"
    ],
    [
      29,
      20,
      0,
      22,
      0,
      "VIDEO"
    ],
    [
      30,
      20,
      1,
      24,
      0,
      "VIDEO"
    ],
    [
      37,
      21,
      0,
      29,
      0,
      "VIDEO"
    ],
    [
      38,
      29,
      0,
      20,
      0,
      "VIDEO"
    ],
    [
      39,
      29,
      0,
      25,
      0,
      "VIDEO"
    ],
    [
      40,
      25,
      0,
      30,
      0,
      "IMAGE"
    ],
    [
      41,
      30,
      2,
      31,
      0,
      "INT"
    ]
  ],
  "nodes": [
    {
      "flags": {},
      "id": 17,
      "inputs": [
        {
          "link": null,
          "localized_name": "image",
          "name": "image",
          "type": "COMBO",
          "widget": {
            "name": "image"
          }
        },
        {
          "link": null,
          "localized_name": "choose file to upload",
          "name": "upload",
          "type": "IMAGEUPLOAD",
          "widget": {
            "name": "upload"
          }
        }
      ],
      "mode": 0,
      "order": 0,
      "outputs": [
        {
          "links": [
            25
          ],
          "localized_name": "IMAGE",
          "name": "IMAGE",
          "type": "IMAGE"
        },
        {
          "links": null,
          "localized_name": "MASK",
          "name": "MASK",
          "type": "MASK"
        }
      ],
      "pos": [
        -40,
        1800
      ],
      "properties": {
        "Node name for S&R": "LoadImage"
      },
      "size": [
        370,
        430
      ],
      "title": "Load Image (Optional)",
      "type": "LoadImage",
      "widgets_values": [
        "blue_poppies_field.png",
        "image"
      ]
    },
    {
      "bgcolor": "#000",
      "color": "#222",
      "flags": {},
      "id": 19,
      "inputs": [],
      "mode": 0,
      "order": 1,
      "outputs": [],
      "pos": [
        -750,
        1250
      ],
      "properties": {},
      "size": [
        550,
        1070
      ],
      "title": "Beeble SwitchX Image Edit",
      "type": "MarkdownNote",
      "widgets_values": [
        "## Beeble SwitchX — Image Edit\n\n**Switch anything, keep what matters.** Masked regions follow your prompt and reference; unmasked regions keep the source pixels and are relit to match.\n\n---\n\n### What this graph does\n\n1. **Source image** — the still SwitchX edits.\n2. **Reference image** (optional) — visual blueprint for background, lighting, mood, and costumes. Masked areas are filled from it; the subject adopts its look without replacing unmasked pixels.\n3. **Beeble API** — uploads both, runs SwitchX, then downloads the **render** and the **alpha matte** Beeble used.\n4. **Outputs you get:** the composited result, a before/after compare, and (via alpha) a transparent cutout PNG.\n\nAt least one of **prompt** or **reference_image** is required.\n\n---\n\n### Alpha modes\n\n| Comfy | Beeble | Best for |\n|-------|--------|----------|\n| **auto** | Auto | Background swap, relighting, virtual production |\n| **select** | Select | Targeted edits (outfit, inpainting); connect your mask |\n| **fill** | Fill | Full-frame relight/restyle; no separate alpha output |\n| **custom** | Upload | Custom matte from Nuke, After Effects, etc. |\n\n---\n\n### Prompting \n\nBe specific — environment, lighting, mood:\n\n*\"A dramatic cliff in Ireland, soft overcast lighting, highly detailed props.\"*\n\nAvoid vague prompts (e.g. *\"Take me to heaven\"*).\n\n**Reference image:** does not need to match the source perfectly; SwitchX keeps your real pixels outside the mask and only pulls style/lighting from the reference.\n\nVideo: use **Beeble SwitchX Video Edit** (max 240 frames)."
      ]
    },
    {
      "bgcolor": "#653",
      "color": "#432",
      "flags": {},
      "id": 20,
      "inputs": [
        {
          "link": 38,
          "localized_name": "video",
          "name": "video",
          "type": "VIDEO"
        },
        {
          "link": 25,
          "localized_name": "reference_image",
          "name": "reference_image",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "link": null,
          "localized_name": "prompt",
          "name": "prompt",
          "type": "STRING",
          "widget": {
            "name": "prompt"
          }
        },
        {
          "link": null,
          "localized_name": "alpha_mode",
          "name": "alpha_mode",
          "type": "COMFY_DYNAMICCOMBO_V3",
          "widget": {
            "name": "alpha_mode"
          }
        },
        {
          "link": null,
          "localized_name": "max_resolution",
          "name": "max_resolution",
          "type": "COMBO",
          "widget": {
            "name": "max_resolution"
          }
        },
        {
          "link": null,
          "localized_name": "seed",
          "name": "seed",
          "type": "INT",
          "widget": {
            "name": "seed"
          }
        }
      ],
      "mode": 0,
      "order": 4,
      "outputs": [
        {
          "links": [
            29
          ],
          "localized_name": "video",
          "name": "video",
          "type": "VIDEO"
        },
        {
          "links": [
            30
          ],
          "localized_name": "alpha",
          "name": "alpha",
          "type": "VIDEO"
        }
      ],
      "pos": [
        930,
        1250
      ],
      "properties": {
        "Node name for S&R": "BeebleSwitchXVideoEdit"
      },
      "size": [
        400,
        236
      ],
      "type": "BeebleSwitchXVideoEdit",
      "widgets_values": [
        "The character stands in the wilderness and looks back towards the camera.",
        "auto",
        "720p",
        379113823,
        "randomize"
      ]
    },
    {
      "flags": {},
      "id": 21,
      "inputs": [
        {
          "link": null,
          "localized_name": "file",
          "name": "file",
          "type": "COMBO",
          "widget": {
            "name": "file"
          }
        },
        {
          "link": null,
          "localized_name": "choose file to upload",
          "name": "upload",
          "type": "IMAGEUPLOAD",
          "widget": {
            "name": "upload"
          }
        }
      ],
      "mode": 0,
      "order": 2,
      "outputs": [
        {
          "links": [
            37
          ],
          "localized_name": "VIDEO",
          "name": "VIDEO",
          "type": "VIDEO"
        }
      ],
      "pos": [
        -40,
        1250
      ],
      "properties": {
        "Node name for S&R": "LoadVideo"
      },
      "size": [
        370,
        496
      ],
      "type": "LoadVideo",
      "widgets_values": [
        "woman_in_wheat_field.mp4",
        "image"
      ]
    },
    {
      "flags": {},
      "id": 22,
      "inputs": [
        {
          "link": 29,
          "localized_name": "video",
          "name": "video",
          "type": "VIDEO"
        },
        {
          "link": null,
          "localized_name": "filename_prefix",
          "name": "filename_prefix",
          "type": "STRING",
          "widget": {
            "name": "filename_prefix"
          }
        },
        {
          "link": null,
          "localized_name": "format",
          "name": "format",
          "type": "COMBO",
          "widget": {
            "name": "format"
          }
        },
        {
          "link": null,
          "localized_name": "codec",
          "name": "codec",
          "type": "COMBO",
          "widget": {
            "name": "codec"
          }
        }
      ],
      "mode": 0,
      "order": 6,
      "outputs": [],
      "pos": [
        1380,
        1250
      ],
      "properties": {},
      "size": [
        450,
        470
      ],
      "type": "SaveVideo",
      "widgets_values": [
        "video/Beeble_switchX_video",
        "auto",
        "auto"
      ]
    },
    {
      "flags": {},
      "id": 24,
      "inputs": [
        {
          "link": 30,
          "localized_name": "video",
          "name": "video",
          "type": "VIDEO"
        },
        {
          "link": null,
          "localized_name": "filename_prefix",
          "name": "filename_prefix",
          "type": "STRING",
          "widget": {
            "name": "filename_prefix"
          }
        },
        {
          "link": null,
          "localized_name": "format",
          "name": "format",
          "type": "COMBO",
          "widget": {
            "name": "format"
          }
        },
        {
          "link": null,
          "localized_name": "codec",
          "name": "codec",
          "type": "COMBO",
          "widget": {
            "name": "codec"
          }
        }
      ],
      "mode": 0,
      "order": 7,
      "outputs": [],
      "pos": [
        1910,
        1250
      ],
      "properties": {},
      "size": [
        450,
        470
      ],
      "title": "Save Video (Alpha)",
      "type": "SaveVideo",
      "widgets_values": [
        "video/Beeble_switchX_alpha",
        "auto",
        "auto"
      ]
    },
    {
      "flags": {
        "collapsed": true
      },
      "id": 25,
      "inputs": [
        {
          "link": 39,
          "localized_name": "video",
          "name": "video",
          "type": "VIDEO"
        }
      ],
      "mode": 0,
      "order": 5,
      "outputs": [
        {
          "links": [
            40
          ],
          "localized_name": "images",
          "name": "images",
          "type": "IMAGE"
        },
        {
          "links": null,
          "localized_name": "audio",
          "name": "audio",
          "type": "AUDIO"
        },
        {
          "links": null,
          "localized_name": "fps",
          "name": "fps",
          "type": "FLOAT"
        },
        {
          "links": null,
          "localized_name": "bit_depth",
          "name": "bit_depth",
          "type": "INT"
        }
      ],
      "pos": [
        530,
        1560
      ],
      "properties": {
        "Node name for S&R": "GetVideoComponents"
      },
      "size": [
        225,
        8
      ],
      "type": "GetVideoComponents",
      "widgets_values": []
    },
    {
      "flags": {},
      "id": 29,
      "inputs": [
        {
          "link": 37,
          "localized_name": "video",
          "name": "video",
          "type": "VIDEO"
        },
        {
          "link": null,
          "localized_name": "start_time",
          "name": "start_time",
          "type": "FLOAT",
          "widget": {
            "name": "start_time"
          }
        },
        {
          "link": null,
          "localized_name": "duration",
          "name": "duration",
          "type": "FLOAT",
          "widget": {
            "name": "duration"
          }
        },
        {
          "link": null,
          "localized_name": "strict_duration",
          "name": "strict_duration",
          "type": "BOOLEAN",
          "widget": {
            "name": "strict_duration"
          }
        }
      ],
      "mode": 0,
      "order": 3,
      "outputs": [
        {
          "links": [
            38,
            39
          ],
          "localized_name": "VIDEO",
          "name": "VIDEO",
          "type": "VIDEO"
        }
      ],
      "pos": [
        520,
        1250
      ],
      "properties": {
        "Node name for S&R": "Video Slice"
      },
      "size": [
        270,
        170
      ],
      "type": "Video Slice",
      "widgets_values": [
        0,
        5,
        false
      ]
    },
    {
      "flags": {
        "collapsed": true
      },
      "id": 30,
      "inputs": [
        {
          "link": 40,
          "localized_name": "image",
          "name": "image",
          "type": "IMAGE"
        }
      ],
      "mode": 0,
      "order": 8,
      "outputs": [
        {
          "links": null,
          "localized_name": "width",
          "name": "width",
          "type": "INT"
        },
        {
          "links": null,
          "localized_name": "height",
          "name": "height",
          "type": "INT"
        },
        {
          "links": [
            41
          ],
          "localized_name": "batch_size",
          "name": "batch_size",
          "type": "INT"
        }
      ],
      "pos": [
        530,
        1700
      ],
      "properties": {
        "Node name for S&R": "GetImageSize"
      },
      "size": [
        225,
        8
      ],
      "type": "GetImageSize",
      "widgets_values": []
    },
    {
      "flags": {},
      "id": 31,
      "inputs": [
        {
          "link": 41,
          "localized_name": "source",
          "name": "source",
          "type": "*"
        }
      ],
      "mode": 0,
      "order": 9,
      "outputs": [
        {
          "links": null,
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        520,
        1790
      ],
      "properties": {
        "Node name for S&R": "PreviewAny"
      },
      "size": [
        260,
        220
      ],
      "type": "PreviewAny",
      "widgets_values": [
        null,
        null,
        null
      ]
    }
  ],
  "revision": 0,
  "version": 0.4
}