mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-22 13:32:11 +00:00
*PR Created by the Glary-Bot Agent*
---
## Summary
Adds a comfy.org page that lists every custom-node pack supported on
Comfy Cloud, with per-pack detail subpages. Data is fetched at build
time from `cloud.comfy.org/api/object_info` (gated by
`WEBSITE_CLOUD_API_KEY`), sanitized of user content, joined with public
registry metadata from `api.comfy.org/nodes`, and falls back to a
committed snapshot — mirroring the existing Ashby careers integration
pattern.
- Index: `/cloud/supported-nodes` (en) and
`/zh-CN/cloud/supported-nodes` (zh-CN)
- Detail: `/cloud/supported-nodes/[pack]` and
`/zh-CN/cloud/supported-nodes/[pack]`, generated via `getStaticPaths()`
from the same fetcher as the index so the two routes can never diverge.
## What's new
**Shared package (extracted)**
- `@comfyorg/object-info-parser` — Zod schemas (`zComfyNodeDef`,
`validateComfyNodeDef`), node-source classifier (`getNodeSource`,
`isCustomNode`, `CORE_NODE_MODULES`), and helpers (`groupNodesByPack`,
`sanitizeUserContent`). `src/schemas/nodeDefSchema.ts` and
`src/types/nodeSource.ts` become 1-line re-export shims; existing
imports keep compiling.
**Build-time pipeline**
- `apps/website/src/utils/cloudNodes.ts` — Ashby-style fetcher:
retry/backoff `[1s, 2s, 4s]`, 10 s timeout via AbortController, Zod
envelope + per-node validation, snapshot fallback, memoized via
module-level `inflight` promise.
- `apps/website/src/utils/cloudNodes.registry.ts` — Public registry
enrichment (no auth, batches of 50, single retry, soft-fail).
- `apps/website/src/utils/cloudNodes.ci.ts` — GitHub Actions annotations
+ step summary mirroring the Ashby reporter.
- `apps/website/src/utils/cloudNodes.build.ts` — Single
`loadPacksForBuild()` consumed by both index and detail pages so they
share one source of truth.
- `apps/website/scripts/refresh-cloud-nodes-snapshot.ts` — atomic-rename
refresh CLI that walks pack/node string fields with a user-content
extension regex *before* renaming the snapshot into place.
- Mandatory user-content sanitization strips uploaded filenames from
combo lists (`LoadImage`, `LoadImageMask`, `LoadImageOutput`,
`LoadVideo`, `LoadAudio` zeroed; any combo value matching
`/\.(png|jpe?g|webp|gif|mp4|mov|webm|wav|mp3|flac|ogg|safetensors|ckpt|pt)$/i`
filtered).
**Page + components**
- `apps/website/src/pages/cloud/supported-nodes.astro` (en) + zh-CN
twin.
- `apps/website/src/pages/cloud/supported-nodes/[pack].astro` detail
(en) + zh-CN twin, async `getStaticPaths` driven by
`loadPacksForBuild()`.
-
`apps/website/src/components/cloud-nodes/{HeroSection,PackGridSection,PackCard,PackBanner,NodeList,PackDetail}.vue`
— Vue 3.5 destructured props, `cn()` from `@comfyorg/tailwind-utils`,
design-system tokens only, no PrimeVue.
- Pack card name links to its detail page; banner uses the shared
`fallback-gradient-avatar.svg` asset (copied into
`apps/website/public/assets/images/`) when `banner_url` and `icon` are
missing.
- 25 new `cloudNodes.*` i18n keys in `en` + `zh-CN`.
**Tests**
- 33 unit tests in `@comfyorg/object-info-parser` (schemas, classifier,
sanitizer, grouping).
- 19 new website unit tests covering fetcher (10), CI reporter (6),
registry enrichment (3) — Ashby patterns mirrored.
- E2E: index smoke + search + banner + detail click-through + direct
visit + zh-CN parity.
## Required maintainer follow-up
GitHub Apps cannot push `.github/workflows/*` changes (push was rejected
with `refusing to allow a GitHub App to create or update workflow …
without workflows permission`), so the workflow edits prepared in this
branch were reverted in commit `9be2abce8`. The intended diffs are
documented as copy-paste-ready snippets in `apps/website/README.md`
under the new "Cloud nodes integration → CI wiring" section.
A maintainer must:
1. Provision `WEBSITE_CLOUD_API_KEY` in the repo secrets and the Vercel
project env.
2. Apply the `ci-website-build.yaml` and
`ci-vercel-website-preview.yaml` diffs documented in the README directly
to `main` (or as a follow-up commit on this branch with a maintainer
account).
The committed snapshot lets builds succeed without the secret while the
maintainer step is pending — pages render from
`apps/website/src/data/cloud-nodes.snapshot.json`.
## Self-review (Oracle)
Two warnings caught and fixed in commits `deba5ab02` and `99dfc3381`:
- Index/detail pages now share a single source of truth
(`loadPacksForBuild`), so a fresh fetch can't expose packs whose detail
routes weren't generated.
- Refresh script validates parsed snapshot fields *before* the atomic
rename, instead of regex-scanning the serialized JSON after the file is
already in place.
## Quality gates (local)
```
pnpm --filter @comfyorg/object-info-parser test → 33 passed
pnpm --filter @comfyorg/website test:unit → 42 passed
pnpm --filter @comfyorg/website typecheck → 0 errors
pnpm --filter @comfyorg/website build → 47 pages built (incl. 6 cloud-nodes routes)
pnpm lint → 0 errors (1 pre-existing warning in unrelated test file)
pnpm knip → 0 errors (1 pre-existing tag hint in unrelated file)
```
E2E (`pnpm --filter @comfyorg/website test:e2e`) is intended to be run
by the Vercel/CI pipelines.
## Manual verification
Built `dist/`, served locally on port 4321, drove with Playwright:
- `/cloud/supported-nodes` renders both pack cards, search input, sort
dropdown
- `/cloud/supported-nodes/comfyui-impact-pack` renders the metadata grid
(publisher, downloads, stars, version, license, last updated) and 3
categorized node sections with 5 nodes total
- `/zh-CN/cloud/supported-nodes` localizes hero (`Comfy Cloud 上的自定义节点`),
label (`云端节点目录`), search placeholder (`搜索节点包或节点名称`), sort
- `/zh-CN/cloud/supported-nodes/comfyui-controlnet-aux` localizes every
metadata label (`查看仓库`, `发布者`, `下载量`, `GitHub 星标`, `最新版本`, `许可证`,
`最后更新`) and renders dates with `Intl.DateTimeFormat('zh-CN')`
(`2026年4月27日`)
- Search input narrows pack count from 2 to 1 when typing `impact`
(verified via DOM count)
Banners render the shared `fallback-gradient-avatar.svg` when the
snapshot's image URL doesn't resolve — expected in the local sandbox.
## Preview URL (after CI completes)
`https://comfy-website-preview-pr-{N}.vercel.app/cloud/supported-nodes`
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-11903-feat-cloud-nodes-catalog-at-cloud-supported-nodes-3566d73d36508194afdec5f389897585)
by [Unito](https://www.unito.io)
---------
Co-authored-by: Glary-Bot <glary-bot@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
395 lines
15 KiB
JSON
395 lines
15 KiB
JSON
{
|
|
"fetchedAt": "2026-05-04T16:29:55.587Z",
|
|
"packs": [
|
|
{
|
|
"id": "comfyui-impact-pack",
|
|
"registryId": "comfyui-impact-pack",
|
|
"displayName": "ComfyUI Impact Pack",
|
|
"description": "Production-grade detailer, detector, and SEG (segmentation) tooling. The most-used pack for face restoration, region-based refinement, and iterative upscaling on Comfy Cloud.",
|
|
"repoUrl": "https://github.com/ltdrdata/ComfyUI-Impact-Pack",
|
|
"publisher": {
|
|
"id": "drltdata",
|
|
"name": "Dr.Lt.Data"
|
|
},
|
|
"downloads": 2618646,
|
|
"githubStars": 3092,
|
|
"latestVersion": "8.28.3",
|
|
"license": "See repository LICENSE",
|
|
"lastUpdated": "2026-04-19T17:08:04.993918Z",
|
|
"nodes": [
|
|
{
|
|
"name": "FaceDetailer",
|
|
"displayName": "FaceDetailer",
|
|
"category": "ImpactPack/Detailer",
|
|
"description": "Detect and refine faces with iterative passes."
|
|
},
|
|
{
|
|
"name": "DetailerForEach",
|
|
"displayName": "DetailerForEach",
|
|
"category": "ImpactPack/Detailer",
|
|
"description": "Run iterative detail refinement over detected SEG regions."
|
|
},
|
|
{
|
|
"name": "UltralyticsDetectorProvider",
|
|
"displayName": "UltralyticsDetectorProvider",
|
|
"category": "ImpactPack/Detector",
|
|
"description": "Provide detector models powered by Ultralytics YOLO."
|
|
},
|
|
{
|
|
"name": "SAMLoader",
|
|
"displayName": "SAMLoader",
|
|
"category": "ImpactPack/Detector",
|
|
"description": "Load Segment Anything models for high-fidelity masking."
|
|
},
|
|
{
|
|
"name": "MaskToSEGS",
|
|
"displayName": "MaskToSEGS",
|
|
"category": "ImpactPack/Operation",
|
|
"description": "Convert binary masks into SEGS regions for the detailer pipeline."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "ComfyUI-Crystools",
|
|
"registryId": "ComfyUI-Crystools",
|
|
"displayName": "ComfyUI-Crystools",
|
|
"description": "Live system monitoring (GPU, RAM, disk) and rich image inspection inside your workflow. The most-installed quality-of-life pack on the registry.",
|
|
"iconUrl": "https://raw.githubusercontent.com/crystian/ComfyUI-Crystools/main/docs/screwdriver.png",
|
|
"repoUrl": "https://github.com/crystian/ComfyUI-Crystools",
|
|
"publisher": {
|
|
"id": "crystian",
|
|
"name": "Crystian"
|
|
},
|
|
"downloads": 1671447,
|
|
"githubStars": 1855,
|
|
"latestVersion": "1.27.4",
|
|
"license": "See repository LICENSE",
|
|
"lastUpdated": "2025-10-26T19:11:09.943366Z",
|
|
"supportedOs": ["OS Independent"],
|
|
"supportedAccelerators": ["GPU :: NVIDIA CUDA"],
|
|
"nodes": [
|
|
{
|
|
"name": "CCrystools_Show_Resources",
|
|
"displayName": "CCrystools_Show_Resources",
|
|
"category": "crystools/show",
|
|
"description": "Display GPU, RAM and disk usage live in the workflow."
|
|
},
|
|
{
|
|
"name": "CCrystools_Show_Image",
|
|
"displayName": "CCrystools_Show_Image",
|
|
"category": "crystools/show",
|
|
"description": "Inspect images at full resolution with metadata overlays."
|
|
},
|
|
{
|
|
"name": "CCrystools_Json",
|
|
"displayName": "CCrystools_Json",
|
|
"category": "crystools/json",
|
|
"description": "Compose and parse JSON inline for advanced workflows."
|
|
},
|
|
{
|
|
"name": "CCrystools_Pipe_To_Any",
|
|
"displayName": "CCrystools_Pipe_To_Any",
|
|
"category": "crystools/pipe",
|
|
"description": "Convert a pipe bus into individual outputs."
|
|
},
|
|
{
|
|
"name": "CCrystools_Save_Metadata",
|
|
"displayName": "CCrystools_Save_Metadata",
|
|
"category": "crystools/save",
|
|
"description": "Save images with workflow metadata embedded."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "rgthree-comfy",
|
|
"registryId": "rgthree-comfy",
|
|
"displayName": "rgthree-comfy",
|
|
"description": "Quality-of-life nodes that make complex workflows readable: Power Lora Loader, group bypassers, smarter reroutes, and inline debug widgets.",
|
|
"iconUrl": "https://comfy.rgthree.com/media/rgthree.svg",
|
|
"repoUrl": "https://github.com/rgthree/rgthree-comfy",
|
|
"publisher": {
|
|
"id": "rgthree"
|
|
},
|
|
"downloads": 3025389,
|
|
"githubStars": 3028,
|
|
"latestVersion": "1.0.2604070017",
|
|
"license": "See repository LICENSE",
|
|
"lastUpdated": "2026-04-07T04:19:24.689627Z",
|
|
"nodes": [
|
|
{
|
|
"name": "Power Lora Loader (rgthree)",
|
|
"displayName": "Power Lora Loader (rgthree)",
|
|
"category": "rgthree",
|
|
"description": "Stack multiple LoRAs in a single, foldable widget."
|
|
},
|
|
{
|
|
"name": "Fast Groups Bypasser (rgthree)",
|
|
"displayName": "Fast Groups Bypasser (rgthree)",
|
|
"category": "rgthree",
|
|
"description": "Toggle whole groups on or off without rewiring."
|
|
},
|
|
{
|
|
"name": "Seed (rgthree)",
|
|
"displayName": "Seed (rgthree)",
|
|
"category": "rgthree",
|
|
"description": "A predictable seed control with quick reset."
|
|
},
|
|
{
|
|
"name": "Reroute (rgthree)",
|
|
"displayName": "Reroute (rgthree)",
|
|
"category": "rgthree",
|
|
"description": "A clean reroute alternative with persistent labels."
|
|
},
|
|
{
|
|
"name": "Display Any (rgthree)",
|
|
"displayName": "Display Any (rgthree)",
|
|
"category": "rgthree",
|
|
"description": "Inspect any value with a compact debug widget."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "comfyui-kjnodes",
|
|
"registryId": "comfyui-kjnodes",
|
|
"displayName": "ComfyUI-KJNodes",
|
|
"description": "Daily-driver utilities for image, latent and string handling: color matching, batch counters, resize helpers, and prompt presets.",
|
|
"iconUrl": "https://avatars.githubusercontent.com/u/40791699",
|
|
"repoUrl": "https://github.com/kijai/ComfyUI-KJNodes",
|
|
"publisher": {
|
|
"id": "kijai",
|
|
"name": "Kijai"
|
|
},
|
|
"downloads": 3319866,
|
|
"githubStars": 2544,
|
|
"latestVersion": "1.3.9",
|
|
"license": "See repository LICENSE",
|
|
"lastUpdated": "2026-04-24T09:32:28.326616Z",
|
|
"nodes": [
|
|
{
|
|
"name": "ColorMatch",
|
|
"displayName": "ColorMatch",
|
|
"category": "KJNodes/image",
|
|
"description": "Match the colors of one image to another using statistics."
|
|
},
|
|
{
|
|
"name": "ImageResizeKJ",
|
|
"displayName": "ImageResizeKJ",
|
|
"category": "KJNodes/image",
|
|
"description": "Resize images with intuitive size and divisibility controls."
|
|
},
|
|
{
|
|
"name": "StringConstantMultiline",
|
|
"displayName": "StringConstantMultiline",
|
|
"category": "KJNodes/string",
|
|
"description": "A multi-line string constant suitable for prompts."
|
|
},
|
|
{
|
|
"name": "EmptyLatentImagePresets",
|
|
"displayName": "EmptyLatentImagePresets",
|
|
"category": "KJNodes/latent",
|
|
"description": "Quickly create empty latents at common resolutions."
|
|
},
|
|
{
|
|
"name": "GetImageSizeAndCount",
|
|
"displayName": "GetImageSizeAndCount",
|
|
"category": "KJNodes/image",
|
|
"description": "Read width, height and batch size from an image input."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "comfyui-easy-use",
|
|
"registryId": "comfyui-easy-use",
|
|
"displayName": "ComfyUI-Easy-Use",
|
|
"description": "Simplified, opinionated nodes that bundle common patterns into single drop-ins — full loader, pre-sampling, easy KSampler, and XY plotting.",
|
|
"iconUrl": "https://mintlify.s3.us-west-1.amazonaws.com/yolain/images/logo.svg",
|
|
"repoUrl": "https://github.com/yolain/ComfyUI-Easy-Use",
|
|
"publisher": {
|
|
"id": "yolain",
|
|
"name": "yolain"
|
|
},
|
|
"downloads": 2767609,
|
|
"githubStars": 2500,
|
|
"latestVersion": "1.3.6",
|
|
"license": "See repository LICENSE",
|
|
"lastUpdated": "2026-01-23T06:19:17.505188Z",
|
|
"nodes": [
|
|
{
|
|
"name": "easy fullLoader",
|
|
"displayName": "easy fullLoader",
|
|
"category": "EasyUse/Loaders",
|
|
"description": "Combined checkpoint, VAE and CLIP loader with sensible defaults."
|
|
},
|
|
{
|
|
"name": "easy preSampling",
|
|
"displayName": "easy preSampling",
|
|
"category": "EasyUse/PreSampling",
|
|
"description": "A unified pre-sampling node bundling common settings."
|
|
},
|
|
{
|
|
"name": "easy kSampler",
|
|
"displayName": "easy kSampler",
|
|
"category": "EasyUse/KSampler",
|
|
"description": "A simplified KSampler with extra quality-of-life options."
|
|
},
|
|
{
|
|
"name": "easy showAnything",
|
|
"displayName": "easy showAnything",
|
|
"category": "EasyUse/Util",
|
|
"description": "Display any value inline for debugging."
|
|
},
|
|
{
|
|
"name": "easy XYPlot",
|
|
"displayName": "easy XYPlot",
|
|
"category": "EasyUse/XYPlot",
|
|
"description": "Compose XY plots over arbitrary parameters."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "comfyui-advanced-controlnet",
|
|
"registryId": "comfyui-advanced-controlnet",
|
|
"displayName": "ComfyUI-Advanced-ControlNet",
|
|
"description": "ControlNet with timestep keyframes, per-frame masks, and advanced strength scheduling — essential for animation and batched-latent workflows.",
|
|
"repoUrl": "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet",
|
|
"publisher": {
|
|
"id": "kosinkadink",
|
|
"name": "Kosinkadink"
|
|
},
|
|
"downloads": 590539,
|
|
"githubStars": 967,
|
|
"latestVersion": "1.5.7",
|
|
"license": "See repository LICENSE",
|
|
"lastUpdated": "2026-03-30T01:40:06.836236Z",
|
|
"nodes": [
|
|
{
|
|
"name": "Apply Advanced ControlNet",
|
|
"displayName": "Apply Advanced ControlNet",
|
|
"category": "Adv-ControlNet/conditioning",
|
|
"description": "Apply ControlNet with timestep keyframes and per-frame masks."
|
|
},
|
|
{
|
|
"name": "ControlNetLoaderAdvanced",
|
|
"displayName": "ControlNetLoaderAdvanced",
|
|
"category": "Adv-ControlNet/loaders",
|
|
"description": "Load ControlNet models with the advanced wrapper."
|
|
},
|
|
{
|
|
"name": "Latent Keyframe Group",
|
|
"displayName": "Latent Keyframe Group",
|
|
"category": "Adv-ControlNet/keyframes",
|
|
"description": "Schedule ControlNet strength over a batch of latents."
|
|
},
|
|
{
|
|
"name": "Timestep Keyframe",
|
|
"displayName": "Timestep Keyframe",
|
|
"category": "Adv-ControlNet/keyframes",
|
|
"description": "Set ControlNet strength at a specific timestep."
|
|
},
|
|
{
|
|
"name": "Scaled Soft Mask",
|
|
"displayName": "Scaled Soft Mask",
|
|
"category": "Adv-ControlNet/masks",
|
|
"description": "Apply a soft attention mask to ControlNet conditioning."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "was-node-suite-comfyui",
|
|
"registryId": "was-node-suite-comfyui",
|
|
"displayName": "WAS Node Suite",
|
|
"description": "A broad utility suite covering image adjustments, compositing, text, math, and I/O — the original \"kitchen sink\" pack still relied on by thousands of workflows.",
|
|
"repoUrl": "https://github.com/WASasquatch/was-node-suite-comfyui",
|
|
"publisher": {
|
|
"id": "was",
|
|
"name": "WAS"
|
|
},
|
|
"downloads": 981051,
|
|
"githubStars": 1777,
|
|
"latestVersion": "1.0.1",
|
|
"license": "See repository LICENSE",
|
|
"lastUpdated": "2024-08-01T05:28:23.655235Z",
|
|
"nodes": [
|
|
{
|
|
"name": "Image Filter Adjustments",
|
|
"displayName": "Image Filter Adjustments",
|
|
"category": "WAS Suite/Image/Adjustment",
|
|
"description": "Adjust brightness, contrast, saturation and more."
|
|
},
|
|
{
|
|
"name": "Image Blending Mode",
|
|
"displayName": "Image Blending Mode",
|
|
"category": "WAS Suite/Image/Compositing",
|
|
"description": "Composite two images with Photoshop-style blend modes."
|
|
},
|
|
{
|
|
"name": "Text String",
|
|
"displayName": "Text String",
|
|
"category": "WAS Suite/Text",
|
|
"description": "A reusable text constant suitable for prompts."
|
|
},
|
|
{
|
|
"name": "Number to Float",
|
|
"displayName": "Number to Float",
|
|
"category": "WAS Suite/Number",
|
|
"description": "Cast integer or string values to a float."
|
|
},
|
|
{
|
|
"name": "Image Save",
|
|
"displayName": "Image Save",
|
|
"category": "WAS Suite/IO",
|
|
"description": "Save an image to disk with rich filename templating."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "comfyui_ipadapter_plus",
|
|
"registryId": "comfyui_ipadapter_plus",
|
|
"displayName": "ComfyUI_IPAdapter_plus",
|
|
"description": "Reference-image conditioning with IPAdapter — style transfer, Face ID, and multi-image embeddings. The most-installed conditioning pack on the registry, used in countless portrait, product, and animation workflows.",
|
|
"repoUrl": "https://github.com/cubiq/ComfyUI_IPAdapter_plus",
|
|
"publisher": {
|
|
"id": "matteo",
|
|
"name": "Matteo"
|
|
},
|
|
"downloads": 1208394,
|
|
"githubStars": 5938,
|
|
"latestVersion": "2.0.0",
|
|
"license": "GPL-3.0 license",
|
|
"lastUpdated": "2024-06-05T06:57:13.485481Z",
|
|
"nodes": [
|
|
{
|
|
"name": "IPAdapterUnifiedLoader",
|
|
"displayName": "IPAdapterUnifiedLoader",
|
|
"category": "ipadapter",
|
|
"description": "Load IPAdapter, image encoder and CLIP vision in one node."
|
|
},
|
|
{
|
|
"name": "IPAdapterFaceID",
|
|
"displayName": "IPAdapterFaceID",
|
|
"category": "ipadapter/faceid",
|
|
"description": "Apply Face ID embeddings for high-fidelity portrait reference."
|
|
},
|
|
{
|
|
"name": "IPAdapterStyleComposition",
|
|
"displayName": "IPAdapterStyleComposition",
|
|
"category": "ipadapter",
|
|
"description": "Reference an image for style without copying its content."
|
|
},
|
|
{
|
|
"name": "IPAdapterAdvanced",
|
|
"displayName": "IPAdapterAdvanced",
|
|
"category": "ipadapter",
|
|
"description": "Full-control IPAdapter with masking, weights, and noise injection."
|
|
},
|
|
{
|
|
"name": "IPAdapterEncoder",
|
|
"displayName": "IPAdapterEncoder",
|
|
"category": "ipadapter/embeds",
|
|
"description": "Encode reference images into IPAdapter embeddings for reuse."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|