Project Resolution
Drive Multi-Resolution Passes From One JSON List
- width
- height
- seed
ProjectResolution is the node that turns a list of resolution choices in your JSON into concrete width, height, and seed outputs for a generation pass. If you've ever set up a workflow that renders a low-res preview first and a full-res final later, this is the piece that stops you from hardcoding dimensions in five different places.
Why you'd reach for it
In the Comfyui-JSON-Manager world, each sequence in your project file can carry its own resolutions list - an array of [width, height] or [width, height, seed] entries. ProjectResolution picks one entry by index and hands you the parts. Drive that index from a loop or an iterator and one workflow serves a whole shot list: preview pass at 512, final pass at 1280, each with its own seed, all driven by data instead of hardcoded widget values. That's the workflow pattern that made ComfyUI the standard for video work - data driving the graph rather than the graph being re-edited per shot.
How it works
It's a small client to the manager, same as the other project nodes. It fetches the sequence data from GET /api/projects/{project}/files/{file}/data?seq={sequence}, reads the list at key_name (default "resolutions"), clamps your index into the list's bounds, and unpacks the entry: entry[0] becomes width, entry[1] becomes height, and entry[2] (if present) becomes seed. Like ProjectKey, it's marked to re-fetch every run, so updating the JSON in the dashboard flows through immediately.
Two details from the source are worth knowing. The index is clamped, not error-checked - ask for index 5 on a 2-item list and you silently get the last entry, not an error. And if anything goes wrong (key missing, list malformed, manager unreachable) it falls back to 512, 512, 0. Useful for keeping a workflow alive, potentially infuriating when you're trying to figure out why everything is 512.
Inputs and outputs
source_label- ties the node to its ProjectSource (settings sync over automatically when connected).key_name- the JSON key holding the resolution series. Defaults to"resolutions".index- which entry to use; wire this to a loop counter for multi-pass work.
Outputs are three INTs: width, height, and seed - straight into an Empty Latent Image (or your video model's resolution inputs) and the sampler's seed.
How to install
Part of Comfyui-JSON-Manager:
cd ComfyUI/custom_nodes/
git clone https://github.com/ethanfel/Comfyui-JSON-Manager ComfyUI-JSON-Manager
Restart ComfyUI, or find "ComfyUI JSON Manager" in ComfyUI Manager. No model downloads, no node-side dependency install - the ComfyUI nodes only need Python's standard library plus the aiohttp that ships with ComfyUI. The heavy deps (nicegui, graphviz, requests) belong to the separate web manager, which this node requires to be running.
Common issues
The trap is the silent 512×512×0 fallback. It triggers in three scenarios: the manager is unreachable, key_name doesn't exist in the sequence, or the entry at your index isn't a [w, h]-style list. The failure mode is invisible - your workflow runs fine, just at the wrong resolution. If your outputs are suspiciously always 512, check that the key name matches the JSON exactly and that the value is a list of lists, not a single resolution.
Second, remember the index clamps. If your loop goes one past the end of the list, you get the last entry again, not a stop. That's usually fine for a final pass but it means your "preview only" iteration might silently re-render the final. Plan the loop bounds in the data.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| source_label | STRING | — | |
| key_name | STRING | resolutions | — |
| index | INT | 00–9999 | — |
| manager_urlopt | STRING | http://localhost:8080 | — |
| project_nameopt | STRING | — | |
| file_nameopt | STRING | — | |
| sequence_numberopt | INT | 11–9999 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| width | INT | — |
| height | INT | — |
| seed | INT | — |