dustin-comfyui-nodes
I wrote some of these nodes myself, not sure if they'll be useful to everyone.
Nodes (11)
Dustin ComfyUI Nodes
A starter ComfyUI custom node pack for collecting your own reusable nodes and publishing them through GitHub, Comfy Registry, and ComfyUI-Manager.
I wrote some of these nodes for my own workflows first, then organized them into this reusable package.
What this repository is
In ComfyUI, a custom node pack is a Python package placed inside
ComfyUI/custom_nodes. When ComfyUI starts, it loads packages that export
NODE_CLASS_MAPPINGS.
This repository is set up to teach and support the full lifecycle:
flowchart LR
local[Local node development] --> git[Git history]
git --> github[GitHub repository]
github --> registry[Comfy Registry publish]
registry --> manager[ComfyUI-Manager install/update]
Current nodes
Dustin Text Prefix
Category: Dustin Nodes/Text
Inputs:
text: source text.prefix: text added before the source.separator: text inserted betweenprefixandtext.
Output:
text: combined string.
This first node is intentionally small so you can verify repository structure, loading behavior, and publishing flow before adding more advanced nodes.
Dustin Image Atlas
Category: Dustin Nodes/Image
Inputs:
images: a batch of square images.max_width: maximum atlas width in pixels.max_height: maximum atlas height in pixels.padding: empty pixels inserted between tiles.
Outputs:
atlas_image: one stitched atlas image.atlas_metadata: JSON text containing each tile's index and position.
Behavior:
- Places images from left to right.
- Wraps to a new row when the next image would exceed
max_width. - Raises an error instead of resizing or dropping images when the atlas would exceed
max_height.
Dustin Marble Generate World
Category: Dustin Nodes/Marble
Calls the World Labs Marble API to generate a 3D world, then polls until the long-running operation completes (typically about 5 minutes).
Authentication:
- Set
api_keyon the node, or - Set the
WLT_API_KEYenvironment variable before starting ComfyUI.
Inputs:
prompt_type:text: text-to-world (text_promptrequired).image_url: image-to-world from a public URL (image_urlrequired).image_tensor: image-to-world from a ComfyUIIMAGEinput (imagerequired).multi_image_json: multi-image from a JSON array (multi_image_jsonor builder node output).video_url: video-to-world from a public URL (video_urlrequired).video_file: local video file (video_pathormedia_asset_idrequired).
text_prompt: text guidance (required fortext; optional for other modes).model:marble-1.1,marble-1.1-plus,marble-1.0, ormarble-1.0-draft.display_name: optional world name (max 64 characters).seed: random seed (-1omits seed from the request).is_pano: mark the input image as a panorama (image modes only).reconstruct_images: multi-image reconstruction mode (up to 8 images).disable_recaption: sendtext_promptas-is without automatic recaptioning.poll_interval_seconds/max_wait_seconds: operation polling controls.
Outputs:
world_json: full world payload from the completed operation.world_id: generated world ID.marble_url: link to open the world in Marble.asset_urls_json: thumbnail, panorama, mesh, and Gaussian splat download URLs.
Recommended image formats for URL / tensor modes: jpg, jpeg, png, webp.
Recommended video formats: mp4, mov, mkv.
Dustin Marble Build Multi-Image Prompt
Category: Dustin Nodes/Marble
Uploads an IMAGE batch and builds multi_image_json for the generate node.
Inputs:
images: square scene photos as an image batch.azimuths: comma-separated degrees, one per image (example:0,90,180,270).upload_mode:media_asset(recommended) ordata_base64.
Output:
multi_image_json: JSON array forDustin Marble Generate World(prompt_type = multi_image_json).
Dustin Marble Generate Multi-Image World
Category: Dustin Nodes/Marble
All-in-one multi-image generation: uploads batch images, starts generation, polls until done.
Dustin Marble Upload Video
Category: Dustin Nodes/Marble
Uploads a local video via Marble media-assets:prepare_upload and returns media_asset_id.
Inputs:
video_path: absolute or relative path tomp4,mov,mkv, etc.
Dustin Marble Generate Video World
Category: Dustin Nodes/Marble
Video-to-world generation from either a public video_url or a local file / uploaded media_asset_id.
Dustin Marble Preview Thumbnail
Category: Dustin Nodes/Marble
Downloads the world thumbnail and shows it in the ComfyUI preview panel.
Inputs (either one):
asset_urls_jsonfrom a generate node, orimage_urlwith a direct thumbnail URL.
Outputs:
image: ComfyUIIMAGEtensor for downstream nodes.
Dustin Marble Preview Panorama
Category: Dustin Nodes/Marble
Downloads the world panorama (pano_url) and shows it in the ComfyUI preview panel as a flat image.
Inputs (either one):
asset_urls_jsonfrom a generate node (recommended), or fullworld_json(also supported),image_urlwith a direct panorama URL.
Outputs:
image: ComfyUIIMAGEtensor (panoramas can be very wide).
Dustin Marble Pano 360 Viewer
Category: Dustin Nodes/Marble
Interactive equirectangular panorama viewer embedded in the node. After you queue the workflow, drag inside the node to look around and use the mouse wheel to zoom (similar to a 360° web viewer).
Uses a DOM widget with an embedded viewer page (js/pano_embed.html) so pointer events are not
stolen by the workflow canvas (works in both Node 1.0 and Node 2.0 UIs). Does not show the default
flat ComfyUI image preview at the bottom of the node. Pannellum is bundled under js/vendor/pannellum/
(no CDN).
Recommended workflow:
Dustin Marble Generate World → asset_urls_json → Dustin Marble Pano 360 Viewer
Inputs (at least one):
asset_urls_jsonfrom a generate node (usespano_url),image_urlwith a direct panorama URL, orimagefrom an upstreamIMAGEoutput.
Options:
max_preview_width: downscales very large panoramas before preview (default4096) to avoid WebGL limits.
Outputs:
image: ComfyUIIMAGEtensor for downstream nodes (Save Image, etc.).
Notes:
- Panoramas are downloaded on the server first (avoids CORS issues with Marble CDN URLs).
- Use Preview Panorama for a quick flat preview; use Pano 360 Viewer for interactive look-around.
Dustin Image Atlas Extract
Category: Dustin Nodes/Image
Inputs:
atlas_image: the stitched atlas image fromDustin Image Atlas.atlas_metadata: JSON metadata fromDustin Image Atlas.index: the tile number to extract, starting from0.
Output:
image: the cropped tile for the selected index.
Local installation
Copy or clone this repository into your ComfyUI/custom_nodes folder:
cd path\to\ComfyUI\custom_nodes
git clone https://github.com/YOUR_GITHUB_USERNAME/dustin-comfyui-nodes.git
Then restart ComfyUI and search for Dustin to find all nodes in this pack.
Repository layout
__init__.py: ComfyUI package entry point.nodes/: node implementations and exports.pyproject.toml: Comfy Registry metadata.requirements.txt: runtime Python dependencies.docs/full-flow.zh-CN.md: step-by-step Chinese guide for Git, GitHub, publishing, and updates.
Publishing outline
ComfyUI-Manager now uses Comfy Registry as the main distribution path.
- Create a GitHub repository.
- Push this code to GitHub.
- Create a publisher on registry.comfy.org.
- Generate a Registry API key.
- Fill in the real repository URL and
PublisherIdinpyproject.toml. - Run
comfy node publish.
Once a version is published, it cannot be edited. You must bump the version and publish again for every fix or new node.
Versioning
This project uses semantic versioning:
PATCH, for example0.1.1: bug fix or documentation fix.MINOR, for example0.2.0: new node or backward-compatible feature.MAJOR, for example1.0.0: breaking change.
Adding a new node later
- Create a new node class inside
nodes/. - Export it from
nodes/__init__.py. - Add it to
NODE_CLASS_MAPPINGSandNODE_DISPLAY_NAME_MAPPINGS. - Document it here.
- Test it locally in ComfyUI.
- Bump
versioninpyproject.toml. - Push and publish the new version.
Notes
Most nodes use only the Python standard library. The Marble node also requires
requests (see requirements.txt).