Outpaint
Drag the canvas edges outward and let the model finish the picture
- image
- image
Outpaint is the "change the aspect ratio without re-generating from scratch" node - you've got a portrait image and you need a landscape one, or you want environment space around a subject. ComfyTV gives you edge handles on the image, you drag them outward (or type pixel values), and a diffusion model fills the new canvas while preserving the center. It's the complement to Inpaint in the pack's generative image toolkit: Inpaint fixes inside, Outpaint extends outside.
It's a generative stage - requires a ▶ Run and a real backend workflow. Drag the handles, write a prompt describing the entire finished image, run, done.
How it works
The padding is specified as pad_left / pad_top / pad_right / pad_bottom (each up to 4096px) plus feathering (default 40px) for a soft blend at the seam. Those map onto ComfyUI's ImagePadForOutpaint node - and here's the detail worth internalizing: there's no mask painter. You don't paint where to fill; the pad values are the mask. That's simpler to use and means the workflow has one less thing to go wrong.
The other thing to get right is the prompt. main_prompt should describe the whole finished scene - subject + environment + style - not "extend left with more sky." The model needs to know what the entire frame looks like to extend it plausibly, and describing the full image is the reliable way to get coherent outpaints. This is standard outpaint wisdom from the broader ComfyUI ecosystem: the wider the extension, the more the prompt does the work.
The default workflow is Flux Fill Outpaint; there's also Fooocus SDXL Outpaint in the dropdown. Model files you'll need:
- Flux Fill Outpaint → Flux dev in
diffusion_models/(plus the Fill LoRA) perdocs/models.md. - Fooocus SDXL Outpaint → SDXL Fooocus checkpoint, and this path pulls in the
comfyui-inpaint-nodesplugin as a third-party dependency.
The Fooocus route is the one with extra install steps; stick with Flux Fill unless you're already an SDXL household.
The schema in short
Required: the usual ComfyTV plumbing (force_run_token, project_id, parent_output_id) which you ignore, plus the four pad_* values, feathering, main_prompt, and workflow. Optional: image - the thing you're extending; wire it up. Single output: image (COMFYTV_IMAGE), ready for the picker, Upscale, or Relight next.
Install
Pack-wide one-liner:
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
Restart ComfyUI - Desktop/macOS users clone into the running instance by absolute path, verify __init__.py at the top level, and don't settle for a browser refresh. ComfyUI Manager finds it as "ComfyTV". No extra Python deps unless you go the Fooocus route.
Expect a couple of tries on any aggressive outpaint - the first pass often produces a decent fill that drifts in style. That's not a broken node; large extensions are where diffusion models earn their keep, and re-running with the seed locked on a composition you like is part of the workflow, not a workaround.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| workflow | COMBO | Flux Fill Outpaint | Which outpaint workflow to run. |
| pad_left | INT | 00–4096 | — |
| pad_top | INT | 00–4096 | — |
| pad_right | INT | 00–4096 | — |
| pad_bottom | INT | 00–4096 | — |
| feathering | INT | 400–256 | — |
| main_prompt | STRING | — | |
| custom_params | STRING | {} | Internal — JSON of user-defined parameter attachments/values for this node. |
| imageopt | COMFYTV_IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | COMFYTV_IMAGE | — |