{
  "config": {},
  "extra": {
    "VHS_KeepIntermediate": true,
    "VHS_MetadataImage": true,
    "VHS_latentpreview": false,
    "VHS_latentpreviewrate": 0,
    "ds": {
      "offset": [
        -560.0999332347321,
        269.1580626425251
      ],
      "scale": 1.8585770199258285
    },
    "frontendVersion": "1.44.18"
  },
  "groups": [
    {
      "bounding": [
        -450,
        -400,
        750,
        700
      ],
      "color": "#3f789e",
      "flags": {},
      "id": 1,
      "title": "Input And Histogram"
    },
    {
      "bounding": [
        400,
        -400,
        800,
        1200
      ],
      "color": "#444",
      "flags": {},
      "id": 2,
      "title": "Native Curve Editors"
    },
    {
      "bounding": [
        1300,
        -400,
        1600,
        900
      ],
      "color": "#3f789e",
      "flags": {},
      "id": 3,
      "title": "GLSL Curve/LUT Grade"
    },
    {
      "bounding": [
        1300,
        600,
        1600,
        780
      ],
      "color": "#3f789e",
      "flags": {},
      "id": 4,
      "title": "Motion Prompt And Seedance"
    }
  ],
  "id": "3103fa29-c246-47a2-8381-04d38cae84af",
  "last_link_id": 29,
  "last_node_id": 25,
  "links": [
    [
      1,
      1,
      0,
      2,
      0,
      "IMAGE"
    ],
    [
      2,
      2,
      0,
      3,
      0,
      "HISTOGRAM"
    ],
    [
      3,
      2,
      1,
      4,
      0,
      "HISTOGRAM"
    ],
    [
      4,
      2,
      2,
      5,
      0,
      "HISTOGRAM"
    ],
    [
      5,
      2,
      3,
      6,
      0,
      "HISTOGRAM"
    ],
    [
      7,
      3,
      0,
      11,
      9,
      "CURVE"
    ],
    [
      8,
      4,
      0,
      11,
      10,
      "CURVE"
    ],
    [
      9,
      5,
      0,
      11,
      11,
      "CURVE"
    ],
    [
      10,
      6,
      0,
      11,
      12,
      "CURVE"
    ],
    [
      11,
      7,
      0,
      11,
      2,
      "FLOAT"
    ],
    [
      12,
      8,
      0,
      11,
      3,
      "FLOAT"
    ],
    [
      13,
      9,
      0,
      11,
      4,
      "FLOAT"
    ],
    [
      14,
      10,
      0,
      11,
      5,
      "FLOAT"
    ],
    [
      15,
      11,
      0,
      13,
      0,
      "IMAGE"
    ],
    [
      17,
      1,
      0,
      12,
      0,
      "IMAGE"
    ],
    [
      18,
      11,
      0,
      12,
      1,
      "IMAGE"
    ],
    [
      19,
      11,
      0,
      15,
      0,
      "IMAGE"
    ],
    [
      20,
      15,
      0,
      16,
      0,
      "STRING"
    ],
    [
      21,
      16,
      0,
      19,
      1,
      "STRING"
    ],
    [
      22,
      11,
      0,
      19,
      6,
      "IMAGE"
    ],
    [
      26,
      19,
      0,
      20,
      0,
      "VIDEO"
    ],
    [
      28,
      1,
      0,
      11,
      0,
      "IMAGE"
    ]
  ],
  "nodes": [
    {
      "flags": {},
      "id": 1,
      "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": [
            1,
            17,
            28
          ],
          "localized_name": "IMAGE",
          "name": "IMAGE",
          "type": "IMAGE"
        },
        {
          "links": null,
          "localized_name": "MASK",
          "name": "MASK",
          "type": "MASK"
        }
      ],
      "pos": [
        -410,
        -300
      ],
      "properties": {
        "Node name for S&R": "LoadImage"
      },
      "size": [
        300,
        396.171875
      ],
      "title": "Input reference image",
      "type": "LoadImage",
      "widgets_values": [
        "5631adc2747004ecd237e992e813d999c78075f61495d9c6f0b6bed7549da5ed.png",
        "image"
      ]
    },
    {
      "flags": {},
      "id": 2,
      "inputs": [
        {
          "link": 1,
          "localized_name": "image",
          "name": "image",
          "type": "IMAGE"
        }
      ],
      "mode": 0,
      "order": 6,
      "outputs": [
        {
          "links": [
            2
          ],
          "localized_name": "rgb",
          "name": "rgb",
          "type": "HISTOGRAM"
        },
        {
          "links": [
            3
          ],
          "localized_name": "luminance",
          "name": "luminance",
          "type": "HISTOGRAM"
        },
        {
          "links": [
            4
          ],
          "localized_name": "red",
          "name": "red",
          "type": "HISTOGRAM"
        },
        {
          "links": [
            5
          ],
          "localized_name": "green",
          "name": "green",
          "type": "HISTOGRAM"
        },
        {
          "links": null,
          "localized_name": "blue",
          "name": "blue",
          "type": "HISTOGRAM"
        }
      ],
      "pos": [
        -50,
        -300
      ],
      "properties": {
        "Node name for S&R": "ImageHistogram"
      },
      "size": [
        300,
        232.34375
      ],
      "title": "Image histogram",
      "type": "ImageHistogram",
      "widgets_values": []
    },
    {
      "flags": {},
      "id": 3,
      "inputs": [
        {
          "link": 2,
          "localized_name": "histogram",
          "name": "histogram",
          "shape": 7,
          "type": "HISTOGRAM"
        },
        {
          "link": null,
          "localized_name": "curve",
          "name": "curve",
          "type": "CURVE",
          "widget": {
            "name": "curve"
          }
        }
      ],
      "mode": 0,
      "order": 7,
      "outputs": [
        {
          "links": [
            7
          ],
          "localized_name": "curve",
          "name": "curve",
          "type": "CURVE"
        }
      ],
      "pos": [
        440,
        -300
      ],
      "properties": {
        "Node name for S&R": "CurveEditor"
      },
      "size": [
        340,
        489.84375
      ],
      "title": "Master RGB curve",
      "type": "CurveEditor",
      "widgets_values": [
        {
          "interpolation": "monotone_cubic",
          "points": [
            [
              0,
              0.02
            ],
            [
              0.14,
              0.08
            ],
            [
              0.36,
              0.3
            ],
            [
              0.58,
              0.62
            ],
            [
              0.82,
              0.92
            ],
            [
              1,
              1
            ]
          ]
        }
      ]
    },
    {
      "bgcolor": "#653232",
      "color": "#4a2424",
      "flags": {},
      "id": 4,
      "inputs": [
        {
          "link": 3,
          "localized_name": "histogram",
          "name": "histogram",
          "shape": 7,
          "type": "HISTOGRAM"
        },
        {
          "link": null,
          "localized_name": "curve",
          "name": "curve",
          "type": "CURVE",
          "widget": {
            "name": "curve"
          }
        }
      ],
      "mode": 0,
      "order": 8,
      "outputs": [
        {
          "links": [
            8
          ],
          "localized_name": "curve",
          "name": "curve",
          "type": "CURVE"
        }
      ],
      "pos": [
        820,
        -300
      ],
      "properties": {
        "Node name for S&R": "CurveEditor"
      },
      "size": [
        350,
        490
      ],
      "title": "Red curve - warm highs",
      "type": "CurveEditor",
      "widgets_values": [
        {
          "interpolation": "monotone_cubic",
          "points": [
            [
              0,
              0
            ],
            [
              0.22,
              0.17
            ],
            [
              0.48,
              0.5
            ],
            [
              0.74,
              0.82
            ],
            [
              1,
              1
            ]
          ]
        }
      ]
    },
    {
      "bgcolor": "#31583f",
      "color": "#243d2d",
      "flags": {},
      "id": 5,
      "inputs": [
        {
          "link": 4,
          "localized_name": "histogram",
          "name": "histogram",
          "shape": 7,
          "type": "HISTOGRAM"
        },
        {
          "link": null,
          "localized_name": "curve",
          "name": "curve",
          "type": "CURVE",
          "widget": {
            "name": "curve"
          }
        }
      ],
      "mode": 0,
      "order": 9,
      "outputs": [
        {
          "links": [
            9
          ],
          "localized_name": "curve",
          "name": "curve",
          "type": "CURVE"
        }
      ],
      "pos": [
        440,
        260
      ],
      "properties": {
        "Node name for S&R": "CurveEditor"
      },
      "size": [
        340,
        425.890625
      ],
      "title": "Green curve - mid balance",
      "type": "CurveEditor",
      "widgets_values": [
        {
          "interpolation": "monotone_cubic",
          "points": [
            [
              0,
              0.01
            ],
            [
              0.25,
              0.22
            ],
            [
              0.55,
              0.57
            ],
            [
              0.82,
              0.84
            ],
            [
              1,
              0.98
            ]
          ]
        }
      ]
    },
    {
      "bgcolor": "#33385f",
      "color": "#24284a",
      "flags": {},
      "id": 6,
      "inputs": [
        {
          "link": 5,
          "localized_name": "histogram",
          "name": "histogram",
          "shape": 7,
          "type": "HISTOGRAM"
        },
        {
          "link": null,
          "localized_name": "curve",
          "name": "curve",
          "type": "CURVE",
          "widget": {
            "name": "curve"
          }
        }
      ],
      "mode": 0,
      "order": 10,
      "outputs": [
        {
          "links": [
            10
          ],
          "localized_name": "curve",
          "name": "curve",
          "type": "CURVE"
        }
      ],
      "pos": [
        820,
        260
      ],
      "properties": {
        "Node name for S&R": "CurveEditor"
      },
      "size": [
        340,
        425.890625
      ],
      "title": "Blue curve - cool shadows",
      "type": "CurveEditor",
      "widgets_values": [
        {
          "interpolation": "monotone_cubic",
          "points": [
            [
              0,
              0.06
            ],
            [
              0.2,
              0.27
            ],
            [
              0.5,
              0.5
            ],
            [
              0.78,
              0.72
            ],
            [
              1,
              0.9
            ]
          ]
        }
      ]
    },
    {
      "flags": {},
      "id": 7,
      "inputs": [
        {
          "link": null,
          "localized_name": "value",
          "name": "value",
          "type": "FLOAT",
          "widget": {
            "name": "value"
          }
        }
      ],
      "mode": 0,
      "order": 1,
      "outputs": [
        {
          "links": [
            11
          ],
          "localized_name": "FLOAT",
          "name": "FLOAT",
          "type": "FLOAT"
        }
      ],
      "pos": [
        1340,
        -300
      ],
      "properties": {
        "Node name for S&R": "PrimitiveFloat"
      },
      "size": [
        225,
        104.390625
      ],
      "title": "Curve mix",
      "type": "PrimitiveFloat",
      "widgets_values": [
        0.88
      ]
    },
    {
      "flags": {},
      "id": 8,
      "inputs": [
        {
          "link": null,
          "localized_name": "value",
          "name": "value",
          "type": "FLOAT",
          "widget": {
            "name": "value"
          }
        }
      ],
      "mode": 0,
      "order": 2,
      "outputs": [
        {
          "links": [
            12
          ],
          "localized_name": "FLOAT",
          "name": "FLOAT",
          "type": "FLOAT"
        }
      ],
      "pos": [
        1340,
        -150
      ],
      "properties": {
        "Node name for S&R": "PrimitiveFloat"
      },
      "size": [
        225,
        104.390625
      ],
      "title": "Saturation",
      "type": "PrimitiveFloat",
      "widgets_values": [
        1.16
      ]
    },
    {
      "flags": {},
      "id": 9,
      "inputs": [
        {
          "link": null,
          "localized_name": "value",
          "name": "value",
          "type": "FLOAT",
          "widget": {
            "name": "value"
          }
        }
      ],
      "mode": 0,
      "order": 3,
      "outputs": [
        {
          "links": [
            13
          ],
          "localized_name": "FLOAT",
          "name": "FLOAT",
          "type": "FLOAT"
        }
      ],
      "pos": [
        1340,
        10
      ],
      "properties": {
        "Node name for S&R": "PrimitiveFloat"
      },
      "size": [
        225,
        104.390625
      ],
      "title": "Contrast",
      "type": "PrimitiveFloat",
      "widgets_values": [
        1.08
      ]
    },
    {
      "flags": {},
      "id": 10,
      "inputs": [
        {
          "link": null,
          "localized_name": "value",
          "name": "value",
          "type": "FLOAT",
          "widget": {
            "name": "value"
          }
        }
      ],
      "mode": 0,
      "order": 4,
      "outputs": [
        {
          "links": [
            14
          ],
          "localized_name": "FLOAT",
          "name": "FLOAT",
          "type": "FLOAT"
        }
      ],
      "pos": [
        1340,
        180
      ],
      "properties": {
        "Node name for S&R": "PrimitiveFloat"
      },
      "size": [
        225,
        104.390625
      ],
      "title": "Exposure stops",
      "type": "PrimitiveFloat",
      "widgets_values": [
        0
      ]
    },
    {
      "flags": {},
      "id": 11,
      "inputs": [
        {
          "label": "image0",
          "link": 28,
          "localized_name": "images.image0",
          "name": "images.image0",
          "type": "IMAGE"
        },
        {
          "label": "image1",
          "link": null,
          "localized_name": "images.image1",
          "name": "images.image1",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "label": "u_float0",
          "link": 11,
          "localized_name": "floats.u_float0",
          "name": "floats.u_float0",
          "shape": 7,
          "type": "FLOAT"
        },
        {
          "label": "u_float1",
          "link": 12,
          "localized_name": "floats.u_float1",
          "name": "floats.u_float1",
          "shape": 7,
          "type": "FLOAT"
        },
        {
          "label": "u_float2",
          "link": 13,
          "localized_name": "floats.u_float2",
          "name": "floats.u_float2",
          "shape": 7,
          "type": "FLOAT"
        },
        {
          "label": "u_float3",
          "link": 14,
          "localized_name": "floats.u_float3",
          "name": "floats.u_float3",
          "shape": 7,
          "type": "FLOAT"
        },
        {
          "label": "u_float4",
          "link": null,
          "localized_name": "floats.u_float4",
          "name": "floats.u_float4",
          "shape": 7,
          "type": "FLOAT"
        },
        {
          "label": "u_int0",
          "link": null,
          "localized_name": "ints.u_int0",
          "name": "ints.u_int0",
          "shape": 7,
          "type": "INT"
        },
        {
          "label": "u_bool0",
          "link": null,
          "localized_name": "bools.u_bool0",
          "name": "bools.u_bool0",
          "shape": 7,
          "type": "BOOLEAN"
        },
        {
          "label": "u_curve0",
          "link": 7,
          "localized_name": "curves.u_curve0",
          "name": "curves.u_curve0",
          "shape": 7,
          "type": "CURVE"
        },
        {
          "label": "u_curve1",
          "link": 8,
          "localized_name": "curves.u_curve1",
          "name": "curves.u_curve1",
          "shape": 7,
          "type": "CURVE"
        },
        {
          "label": "u_curve2",
          "link": 9,
          "localized_name": "curves.u_curve2",
          "name": "curves.u_curve2",
          "shape": 7,
          "type": "CURVE"
        },
        {
          "label": "u_curve3",
          "link": 10,
          "localized_name": "curves.u_curve3",
          "name": "curves.u_curve3",
          "shape": 7,
          "type": "CURVE"
        },
        {
          "link": null,
          "localized_name": "fragment_shader",
          "name": "fragment_shader",
          "type": "STRING",
          "widget": {
            "name": "fragment_shader"
          }
        },
        {
          "link": null,
          "localized_name": "size_mode",
          "name": "size_mode",
          "type": "COMFY_DYNAMICCOMBO_V3",
          "widget": {
            "name": "size_mode"
          }
        }
      ],
      "mode": 0,
      "order": 11,
      "outputs": [
        {
          "links": [
            15,
            18,
            19,
            22
          ],
          "localized_name": "IMAGE0",
          "name": "IMAGE0",
          "type": "IMAGE"
        },
        {
          "links": null,
          "localized_name": "IMAGE1",
          "name": "IMAGE1",
          "type": "IMAGE"
        },
        {
          "links": null,
          "localized_name": "IMAGE2",
          "name": "IMAGE2",
          "type": "IMAGE"
        },
        {
          "links": null,
          "localized_name": "IMAGE3",
          "name": "IMAGE3",
          "type": "IMAGE"
        }
      ],
      "pos": [
        1640,
        -300
      ],
      "properties": {
        "Node name for S&R": "GLSLShader"
      },
      "size": [
        560,
        462.84375
      ],
      "title": "GLSL curve grade / LUT builder",
      "type": "GLSLShader",
      "widgets_values": [
        "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform sampler2D u_curve0;\nuniform sampler2D u_curve1;\nuniform sampler2D u_curve2;\nuniform sampler2D u_curve3;\nuniform float u_float0; // curve mix\nuniform float u_float1; // saturation\nuniform float u_float2; // contrast\nuniform float u_float3; // exposure in stops\n\nin vec2 v_texCoord;\nlayout(location = 0) out vec4 fragColor0;\n\nfloat curveSample(sampler2D curveTex, float x) {\n    return texture(curveTex, vec2(clamp(x, 0.0, 1.0), 0.5)).r;\n}\n\nvec3 applySaturation(vec3 color, float saturation) {\n    float luma = dot(color, vec3(0.2126, 0.7152, 0.0722));\n    return mix(vec3(luma), color, saturation);\n}\n\nvoid main() {\n    vec4 src = texture(u_image0, v_texCoord);\n    vec3 c = src.rgb * pow(2.0, u_float3);\n\n    vec3 master = vec3(\n        curveSample(u_curve0, c.r),\n        curveSample(u_curve0, c.g),\n        curveSample(u_curve0, c.b)\n    );\n    c = mix(c, master, clamp(u_float0, 0.0, 1.0));\n\n    c.r = curveSample(u_curve1, c.r);\n    c.g = curveSample(u_curve2, c.g);\n    c.b = curveSample(u_curve3, c.b);\n\n    c = (c - 0.5) * u_float2 + 0.5;\n    c = applySaturation(c, u_float1);\n\n    float luma = dot(c, vec3(0.2126, 0.7152, 0.0722));\n    vec3 coolShadow = vec3(0.88, 0.96, 1.10);\n    vec3 warmHighlight = vec3(1.08, 1.00, 0.90);\n    c *= mix(coolShadow, warmHighlight, smoothstep(0.18, 0.88, luma));\n\n    c = clamp(c, 0.0, 1.0);\n    vec3 filmic = c * c * (3.0 - 2.0 * c);\n    c = mix(c, filmic, 0.16);\n\n    fragColor0 = vec4(c, src.a);\n}\n",
        "from_input"
      ]
    },
    {
      "flags": {},
      "id": 12,
      "inputs": [
        {
          "link": 17,
          "localized_name": "image_a",
          "name": "image_a",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "link": 18,
          "localized_name": "image_b",
          "name": "image_b",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "link": null,
          "localized_name": "compare_view",
          "name": "compare_view",
          "type": "IMAGECOMPARE",
          "widget": {
            "name": "compare_view"
          }
        }
      ],
      "mode": 0,
      "order": 13,
      "outputs": [],
      "pos": [
        2270,
        -300
      ],
      "properties": {
        "Node name for S&R": "ImageCompare"
      },
      "size": [
        520,
        390
      ],
      "title": "Before / curve grade compare",
      "type": "ImageCompare",
      "widgets_values": []
    },
    {
      "flags": {},
      "id": 13,
      "inputs": [
        {
          "link": 15,
          "localized_name": "images",
          "name": "images",
          "type": "IMAGE"
        },
        {
          "link": null,
          "localized_name": "filename_prefix",
          "name": "filename_prefix",
          "type": "STRING",
          "widget": {
            "name": "filename_prefix"
          }
        }
      ],
      "mode": 0,
      "order": 12,
      "outputs": [],
      "pos": [
        2270,
        160
      ],
      "properties": {
        "Node name for S&R": "SaveImage"
      },
      "size": [
        340,
        340.328125
      ],
      "title": "Save curve grade reference",
      "type": "SaveImage",
      "widgets_values": [
        "color_curves_seedance2/final_curve_grade_reference"
      ]
    },
    {
      "bgcolor": "#653",
      "color": "#432",
      "flags": {},
      "id": 15,
      "inputs": [
        {
          "link": 19,
          "localized_name": "images",
          "name": "images",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "link": null,
          "localized_name": "audio",
          "name": "audio",
          "shape": 7,
          "type": "AUDIO"
        },
        {
          "link": null,
          "localized_name": "video",
          "name": "video",
          "shape": 7,
          "type": "VIDEO"
        },
        {
          "link": null,
          "localized_name": "files",
          "name": "files",
          "shape": 7,
          "type": "GEMINI_INPUT_FILES"
        },
        {
          "link": null,
          "localized_name": "prompt",
          "name": "prompt",
          "type": "STRING",
          "widget": {
            "name": "prompt"
          }
        },
        {
          "link": null,
          "localized_name": "model",
          "name": "model",
          "type": "COMBO",
          "widget": {
            "name": "model"
          }
        },
        {
          "link": null,
          "localized_name": "seed",
          "name": "seed",
          "type": "INT",
          "widget": {
            "name": "seed"
          }
        },
        {
          "link": null,
          "localized_name": "system_prompt",
          "name": "system_prompt",
          "shape": 7,
          "type": "STRING",
          "widget": {
            "name": "system_prompt"
          }
        }
      ],
      "mode": 0,
      "order": 14,
      "outputs": [
        {
          "links": [
            20
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        1340,
        700
      ],
      "properties": {
        "Node name for S&R": "GeminiNode"
      },
      "size": [
        500,
        370.9375
      ],
      "title": "Motion prompt generator",
      "type": "GeminiNode",
      "widgets_values": [
        "Analyze the curve-graded reference image and write one vivid Seedance 2.0 reference-to-video motion prompt. Preserve the exact subject, composition, geometry, and the baked color-curve grade: deep shaped blacks, protected highlight rolloff, cool shadows, warm practical highlights, saturated but controlled neon, and filmic contrast. Make the video feel cinematic and dimensional with a motivated camera move, foreground/background parallax, rain or atmospheric movement when present, reflective light motion, subtle rack focus, and dynamic contrast; do not let the result become flat, washed out, overexposed, or recolored. Include strict constraints against text, logo changes, object morphing, extra subjects, warped geometry, and scene redesign. Return only one 80-120 word prompt.",
        "gemini-3-1-flash-lite",
        234671487777441,
        "randomize",
        "You are a senior cinematic motion prompt writer for Seedance 2.0 and color-managed VFX workflows. Convert a still curve-graded reference into film-trailer-quality video direction while preserving the grade exactly. Emphasize contrast, depth, parallax, motivated light, and atmospheric motion. Return exactly one prompt with no markdown."
      ]
    },
    {
      "flags": {},
      "id": 16,
      "inputs": [
        {
          "link": 20,
          "localized_name": "source",
          "name": "source",
          "type": "*"
        }
      ],
      "mode": 0,
      "order": 15,
      "outputs": [
        {
          "links": [
            21
          ],
          "localized_name": "STRING",
          "name": "STRING",
          "type": "STRING"
        }
      ],
      "pos": [
        1890,
        700
      ],
      "properties": {
        "Node name for S&R": "PreviewAny"
      },
      "size": [
        350,
        480
      ],
      "title": "Review generated prompt",
      "type": "PreviewAny",
      "widgets_values": [
        null,
        null,
        null
      ]
    },
    {
      "bgcolor": "#653",
      "color": "#432",
      "flags": {},
      "id": 19,
      "inputs": [
        {
          "link": null,
          "localized_name": "model",
          "name": "model",
          "type": "COMFY_DYNAMICCOMBO_V3",
          "widget": {
            "name": "model"
          }
        },
        {
          "link": 21,
          "localized_name": "prompt",
          "name": "model.prompt",
          "type": "STRING",
          "widget": {
            "name": "model.prompt"
          }
        },
        {
          "link": null,
          "localized_name": "resolution",
          "name": "model.resolution",
          "type": "COMBO",
          "widget": {
            "name": "model.resolution"
          }
        },
        {
          "link": null,
          "localized_name": "ratio",
          "name": "model.ratio",
          "type": "COMBO",
          "widget": {
            "name": "model.ratio"
          }
        },
        {
          "link": null,
          "localized_name": "duration",
          "name": "model.duration",
          "type": "INT",
          "widget": {
            "name": "model.duration"
          }
        },
        {
          "link": null,
          "localized_name": "generate_audio",
          "name": "model.generate_audio",
          "type": "BOOLEAN",
          "widget": {
            "name": "model.generate_audio"
          }
        },
        {
          "label": "image_1",
          "link": 22,
          "localized_name": "model.reference_images.image_1",
          "name": "model.reference_images.image_1",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "label": "image_2",
          "link": null,
          "localized_name": "model.reference_images.image_2",
          "name": "model.reference_images.image_2",
          "shape": 7,
          "type": "IMAGE"
        },
        {
          "label": "video_1",
          "link": null,
          "localized_name": "model.reference_videos.video_1",
          "name": "model.reference_videos.video_1",
          "shape": 7,
          "type": "VIDEO"
        },
        {
          "label": "audio_1",
          "link": null,
          "localized_name": "model.reference_audios.audio_1",
          "name": "model.reference_audios.audio_1",
          "shape": 7,
          "type": "AUDIO"
        },
        {
          "label": "asset_1",
          "link": null,
          "localized_name": "model.reference_assets.asset_1",
          "name": "model.reference_assets.asset_1",
          "shape": 7,
          "type": "STRING"
        },
        {
          "link": null,
          "localized_name": "auto_downscale",
          "name": "model.auto_downscale",
          "shape": 7,
          "type": "BOOLEAN",
          "widget": {
            "name": "model.auto_downscale"
          }
        },
        {
          "link": null,
          "localized_name": "model.auto_upscale",
          "name": "model.auto_upscale",
          "shape": 7,
          "type": "BOOLEAN",
          "widget": {
            "name": "model.auto_upscale"
          }
        },
        {
          "link": null,
          "localized_name": "seed",
          "name": "seed",
          "type": "INT",
          "widget": {
            "name": "seed"
          }
        },
        {
          "link": null,
          "localized_name": "watermark",
          "name": "watermark",
          "type": "BOOLEAN",
          "widget": {
            "name": "watermark"
          }
        }
      ],
      "mode": 0,
      "order": 16,
      "outputs": [
        {
          "links": [
            26
          ],
          "localized_name": "VIDEO",
          "name": "VIDEO",
          "type": "VIDEO"
        }
      ],
      "pos": [
        2300.131813478881,
        699.8767032317452
      ],
      "properties": {
        "Node name for S&R": "ByteDance2ReferenceNode"
      },
      "showAdvanced": true,
      "size": [
        560,
        609.5625
      ],
      "title": "Seedance 2.0 reference to video",
      "type": "ByteDance2ReferenceNode",
      "widgets_values": [
        "Seedance 2.0",
        "",
        "720p",
        "adaptive",
        6,
        false,
        false,
        false,
        20481346,
        false,
        false
      ]
    },
    {
      "flags": {},
      "id": 20,
      "inputs": [
        {
          "link": 26,
          "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": 17,
      "outputs": [],
      "pos": [
        3000,
        630
      ],
      "properties": {
        "Node name for S&R": "SaveVideo"
      },
      "size": [
        900,
        750
      ],
      "title": "Save Seedance MP4",
      "type": "SaveVideo",
      "widgets_values": [
        "video/color_curves_seedance2",
        "mp4",
        "h264"
      ]
    },
    {
      "bgcolor": "#000",
      "color": "#222",
      "flags": {},
      "id": 22,
      "inputs": [],
      "mode": 0,
      "order": 5,
      "outputs": [],
      "pos": [
        -1100,
        -370
      ],
      "properties": {
        "Node name for S&R": "MarkdownNote"
      },
      "size": [
        560,
        887.5
      ],
      "title": "Color Curves to Video - VFX",
      "type": "MarkdownNote",
      "widgets_values": [
        "Build cinematic color-curve grades and Seedance 2.0 videos from a single reference image with native Curve Editors, histogram-guided RGB curves, and a GLSL shader in **Color Curves to Seedance 2.0**.\n\n## How It Works\n1. Upload a reference image\n2. Adjust the master, red, green, and blue curve editors\n3. The GLSL shader applies the curve grade in image space\n4. Compare the original and graded reference\n5. Gemini writes a motion prompt from the graded image\n6. Seedance 2.0 generates and saves the final video\n\n## Tips\n- Use images with clear lighting separation and strong depth\n- Shape contrast with the master curve before tuning RGB channels\n- Use red/blue curves for warm highlights and cooler shadows\n- Keep highlights protected to avoid a washed-out video\n- Test the curve grade on a still before generating the video\n\n## Constraints\n- Extreme curves can clip shadows, blow out highlights, or cause color shifts\n- Seedance may still reinterpret motion, so preserve the original image as a second reference\n\n## That's it.\n\nReference image to curve-graded cinematic video in ComfyUI with **Color Curves to Seedance 2.0**.\n"
      ]
    }
  ],
  "revision": 0,
  "version": 0.4
}