- frame1
- frame2
- frame3
- frame4
- frame5
- preview
- row_data
Comic Row (class RowNode) does the thing you'd otherwise wrestle out of a generic compositing node: glues up to five panels into a single horizontal strip with even gutters and per-panel vertical alignment. It's the middle layer of Pixstri ComfyUI Comics (lisaks/comfyui-panelforge) - it eats Comic Frame output on one side and hands a finished row to Comic Page on the other. If all you want is a quick row of panels for a reaction-image, this is the node you'd grab before reaching for the image-editor.
How it works
You connect up to five FRAME_DATA dicts on frame1–frame5, and it pastes them side by side on a white canvas. Width is the sum of the frame widths plus spacing between each pair; height is whatever the tallest frame is. Each shorter frame gets placed top, center, or bottom per your alignment choice. It also records each frame's x, y, width, height into the row_data dict it passes upward - that's informational, since PageNode actually uses the row's baked image.
A nice touch for a small pack: feed it no frames at all and it doesn't error out. You get a gray 400×200 placeholder that literally says "No frames provided." It'll still run and let you iterate the rest of your graph.
The inputs that matter
- frame1–frame5 (optional) -
FRAME_DATAfrom Comic Frame nodes. Wire them in order; any you leave empty are just skipped. - spacing (0–100, default 10) - the horizontal gap between panels, in raw pixels.
- alignment -
top,center, orbottom. Only does anything when your frames aren't all the same height, which with generated panels is most of the time.
Outputs
Two outputs: preview (IMAGE) and row_data (ROW_DATA). A pleasant difference from its little sibling FrameNode - RowNode's IMAGE output is properly normalized float, so it's actually safe to feed into Save Image or an upscaler if you want the strip on its own. The row_data output is what PageNode's row1–row5 inputs expect.
Installing it
Same story as the rest of the pack - no models, no keys, pure compositing. ComfyUI Manager, search "Pixstri", install, restart. Or:
cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/lisaks/comfyui-panelforge
# restart ComfyUI
The README's own clone command points at a placeholder (yourusername/pixstri.git), so trust the URL above, not the doc. The code needs Pillow but only ships torch and numpy in requirements.txt - in practice you get Pillow from ComfyUI's own install, so there's nothing extra to run.
Common issues
- The row is as tall as its tallest frame - that's the design, not a bug. Short panels hang top/center/bottom wherever you set
alignment, and the row background behind them stays white. If you want every panel visually centered, pickcenter. - Need six panels in a row? The five frame inputs are hard-coded. Build two rows and stack them on the page.
- Gutters that scale with panel size aren't possible here -
spacingis fixed pixels. For proportional gutters you'd want a montage node instead. - A row that looks empty - check you actually connected
frame_data(not the IMAGE preview) from FrameNode. The FRAME_DATA path is what carries the processed image into the row.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| spacing | INT | 100–100 | — |
| alignment | COMBO | 3 options: top, center, bottom | |
| frame1opt | FRAME_DATA | — | |
| frame2opt | FRAME_DATA | — | |
| frame3opt | FRAME_DATA | — | |
| frame4opt | FRAME_DATA | — | |
| frame5opt | FRAME_DATA | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| preview | IMAGE | — |
| row_data | ROW_DATA | — |