Arch Forge
Arch Forge Turns Clay Renders Into Cyberpunk Streets
- input_image
- upscaled_image
You've got a grey clay render, a massing model, or a scribbled elevation, and you want it to look like a rain-slicked cyberpunk arcade at night. In a normal ComfyUI graph that's a checkpoint loader, three LoRA slots, two ControlNets and their preprocessors, a sampler, an SSAO pass, an upscale model and three sharpen nodes. Forty wires before you touch a slider.
Arch Forge squeezes that chain into one node. Which is the difference between exploring ten architectural ideas tonight and spending the evening working out why your depth map came out inverted.
What it actually is
A single SDXL img2img pipeline aimed at architectural environments - sci-fi, cyberpunk, game art, straightforward realism. Feed it an image, pick a checkpoint, get one finished picture back. ArchForgeNode has exactly one output, upscaled_image (IMAGE), which goes to Save Image and nowhere else.
That's the trade-off. ComfyUI's value is that you can see and rewire the pipeline; Arch Forge hides it. No preview of the Canny map to see why your edges are wrong, no routing the depth pass anywhere else. For one fixed job done many times, that's a feature. For learning what ControlNet is doing, it's a wall.
How it works
The source doesn't implement diffusion at all. It builds the graph for you at call time, reaching into nodes.NODE_CLASS_MAPPINGS and invoking ControlNetApplyAdvanced, KSamplerAdvanced, VAEDecode, ImageUpscaleWithModel and friends in a fixed order. Anything it can't find raises a RuntimeError naming the exact missing node, and the output is only as good as those underlying nodes.
The order, which explains most weird results: corner-pin warp → Canny → MiDaS depth → checkpoint and LoRAs → both ControlNets → VAE encode → sampler → decode → SSAO → upscale → Lucy sharpen → perspective correction.
The img2img strength is disguised as two integers. start_at_step / end_at_step against steps is exactly the denoise on a plain Image-to-Image node - defaults are 15 / 32 of 32, so roughly 53% re-noising. Raise start_at_step and you keep the source harder; lower it and the model invents more. That knob decides whether you're enhancing a render or replacing it.
The settings that actually matter
input_image- the sketch, clay render or base image. Everything is conditioned on it.checkpoint_name,canny_controlnet,depth_controlnet- all required, and neither ControlNet dropdown has aNoneoption. You need a real SDXL Canny ControlNet and an SDXL Depth ControlNet inmodels/controlnet, separate from your checkpoint.enable_perspective_correctionwithperspective_strength- off by default. Leave it off until you've saved a fixed-seed "before"; the author's advice is 0.70–0.85 withperspective_auto_cropleft on.
The rest sits in collapsible groups. Canny carries structure, depth carries volume, and releasing each before the sampler finishes is how the model adds detail instead of tracing your edges forever - the author's defaults of Canny 0.8 over 0.0–0.9 and depth 0.5 over 0.2–0.7 are a good place to start.
Two worth understanding. corner_pin_scope sends the manual four-corner warp to just the Canny branch (canny_only) or the whole source including VAE and depth (all_inputs) - the default is the sensible one, since you bend the structure guide without bending the pixels you encode. And the straightener is real geometry: LSD line detection, a RANSAC-fitted vanishing point, a rotation-only homography from estimated intrinsics behind a confidence gate. Thin evidence gets your image back unchanged, which is not a bug.
Installing it, and the three packs it quietly needs
ComfyUI Manager → search Arch Forge. If it isn't listed yet, clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/jilt/ArchForge arch_forge
Then read requirements.txt first: it lists torch and torchvision, already correct on a portable install, and pip "installing" them again is how you end up with a CPU build of torch. You only need the other two:
python -m pip install "opencv-python>=4.8.0" "numpy>=1.26.0"
Restart, then hard-refresh the browser - the UI ships through WEB_DIRECTORY, and stale JS looks a lot like a broken node.
Now the part the README under-sells. It calls ControlNet Auxiliary Preprocessors, WAS Node Suite and nuke-nodes-comfyui "required only when X is enabled" - except the shipped defaults have enable_nuke, enable_ssao and enable_lucy all true, and the MiDaS depth pass runs unconditionally. With stock settings, all three packs are required. Queue it and the error names the missing one. SSAO and Lucy come from WAS Node Suite, unmaintained since 2023 but still the only home for that breadth.
Where it breaks
- "ArchForge requires registered node 'X'" - that's the missing pack. MiDaS is ControlNet Aux; SSAO and Lucy Sharpen are WAS;
NukeCornerPinis nuke-nodes-comfyui. - Validation is strict.
start_at_stepbelowend_at_step, Canny start not past its end, low threshold not above high,lucy_kernel_sizeodd. Guardrails, not bugs. - Perspective correction is single-image only. Enable it and a batch of more than one image throws - in the code, documented nowhere.
- Corner pin producing nonsense? Turn
enable_nukeoff. It defaults on and it's a dumb four-point transform - no idea what a building is. The straightener is the architectural tool. - No track record. No threads, no tutorials, no forks - one sample workflow (
examples/scifi-tunnel-archforge.json), a promised outdoor-building example that hasn't landed. You're judging the source, not the reputation.
Would I reach for it
If your job is twenty variations of one block tonight with ambient occlusion and a straighten pass, yes - it saves an hour of rewiring, and the defaults were picked by someone who renders buildings. If you're newer, build the six-node version first and learn why depth outranks Canny on a curved facade. Arch Forge will still be here.
Inputs (66)
| Name | Type | Default | Description |
|---|---|---|---|
| input_image | IMAGE | — | |
| checkpoint_name | COMBO | 0 options: | |
| lora_name_1 | COMBO | 1 options: None | |
| lora_strength_1_model | FLOAT | 1.000–10 | — |
| lora_strength_1_clip | FLOAT | 1.000–10 | — |
| lora_name_2 | COMBO | 1 options: None | |
| lora_strength_2_model | FLOAT | 1.000–10 | — |
| lora_strength_2_clip | FLOAT | 1.000–10 | — |
| lora_name_3 | COMBO | 1 options: None | |
| lora_strength_3_model | FLOAT | 1.000–10 | — |
| lora_strength_3_clip | FLOAT | 1.000–10 | — |
| positive_prompt | STRING | photorealistic aerial architectural photograph of a futuristic cyberpunk city at night, high-angle drone view over a dense metropolitan district, preserve the original composition and camera perspective, preserve the large circular glass-roofed transit hub in the foreground, realistic modern skyscrapers with believable structural engineering, detailed windows and facade materials, wet streets reflecting magenta, cyan, and warm amber lights, atmospheric depth, realistic moonlight, subtle volumetric haze, natural bloom, physically plausible nighttime exposure, high dynamic range, cinematic but realistic color grading, sharp architectural details, realistic urban scale, realistic cars driving on the streets, compact electric cars, sedans, taxis, delivery vans, buses, correctly proportioned vehicles, visible headlights and red taillights, vehicles aligned with lanes and road direction, natural spacing between cars, realistic reflections on wet asphalt, a few parked cars near curbs, small realistic pedestrians walking on sidewalks and crossing at intersections, varied clothing silhouettes, coats and jackets appropriate for nighttime, people correctly scaled to the buildings and vehicles, natural walking poses, small groups near storefronts and transit entrances, a few people waiting near crosswalks, subtle motion blur on distant pedestrians, believable street infrastructure, lane markings, traffic signals, crosswalks, sidewalks, road barriers, street lamps, rooftop equipment, signs with minimal mostly unreadable text, realistic windows, realistic shadows, coherent perspective, detailed but uncluttered scene, professional architectural photography, 35mm lens, f/4, natural depth of field, ultra-detailed photorealism | — |
| negative_prompt | STRING | anime, illustration, painting, concept art, 3d render, CGI, game asset, miniature city, toy cars, flying cars, malformed cars, merged cars, duplicated cars, cars on rooftops, cars facing random directions, vehicles floating, oversized vehicles, tiny vehicles, impossible roads, broken perspective, warped buildings, melting architecture, duplicated buildings, repeated windows, deformed pedestrians, giant people, tiny people, floating people, fused people, extra limbs, missing limbs, mannequin figures, faceless close-up people, crowd blobs, cloned pedestrians, distorted silhouettes, text, logos, readable gibberish, watermark, signature, excessive bloom, neon fog, overexposure, crushed blacks, oversaturated magenta, excessive contrast, blurry, low resolution, noisy, smeared details, painterly texture | — |
| canny_controlnet | COMBO | 0 options: | |
| canny_strength | FLOAT | 0.800–10 | — |
| canny_start | FLOAT | 0.000–1 | — |
| canny_end | FLOAT | 0.900–1 | — |
| depth_controlnet | COMBO | 0 options: | |
| depth_strength | FLOAT | 0.500–10 | — |
| depth_start | FLOAT | 0.200–1 | — |
| depth_end | FLOAT | 0.700–1 | — |
| depth_resolution | INT | 1024256–2048 | — |
| upscale_model | COMBO | 0 options: | |
| sharpen_radius | INT | 10–100 | — |
| sharpen_sigma | FLOAT | 1.00.01–10 | — |
| sharpen_alpha | FLOAT | 0.50–10 | — |
| enable_nuke | BOOLEAN | true | — |
| nuke_to1_x | FLOAT | 0.00-10–10 | — |
| nuke_to1_y | FLOAT | 0.00-10–10 | — |
| nuke_to2_x | FLOAT | 1.00-10–10 | — |
| nuke_to2_y | FLOAT | 0.00-10–10 | — |
| nuke_to3_x | FLOAT | 1.02-10–10 | — |
| nuke_to3_y | FLOAT | 1.00-10–10 | — |
| nuke_to4_x | FLOAT | -0.02-10–10 | — |
| nuke_to4_y | FLOAT | 1.00-10–10 | — |
| nuke_filter | COMBO | cubic | 4 options: bilinear, bicubic, cubic, lanczos |
| canny_enable_threshold | BOOLEAN | true | — |
| canny_threshold_low | FLOAT | 0.200–1 | — |
| canny_threshold_high | FLOAT | 0.800–1 | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 321–10000 | — |
| cfg | FLOAT | 5.00–100 | — |
| sampler_name | COMBO | dpmpp_sde | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | karras | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| start_at_step | INT | 150–10000 | — |
| end_at_step | INT | 320–10000 | — |
| enable_perspective_correction | BOOLEAN | false | — |
| perspective_strength | FLOAT | 1.000–1 | — |
| perspective_auto_crop | BOOLEAN | true | — |
| corner_pin_scope | COMBO | canny_only | 2 options: canny_only, all_inputs |
| depth_midas_a | FLOAT | 6.280–12.566 | — |
| depth_midas_bg_threshold | FLOAT | 0.100–1 | — |
| enable_ssao | BOOLEAN | true | — |
| ssao_resolution | INT | 512256–2048 | — |
| ssao_strength | FLOAT | 0.300–10 | — |
| ssao_radius | FLOAT | 2.00.1–100 | — |
| ssao_blur | FLOAT | 2.00–100 | — |
| ssao_specular_threshold | INT | 2000–255 | — |
| ssao_enable_specular | BOOLEAN | true | — |
| ssao_tile_size | INT | 11–4096 | — |
| ssao_blend_factor | FLOAT | 0.200–1 | — |
| ssao_blend_mode | COMBO | multiply | 2 options: multiply, normal |
| enable_lucy | BOOLEAN | true | — |
| lucy_iterations | INT | 31–100 | — |
| lucy_kernel_size | INT | 53–31 | — |
| enable_final_sharpen | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| upscaled_image | IMAGE | — |