[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-94366":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":9,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":16,"hasPages":16,"topics":9,"createdAt":9,"pushedAt":9,"updatedAt":18,"readmeContent":19,"aiSummary":20,"trendingCount":14,"starSnapshotCount":14,"syncStatus":21,"lastSyncTime":9,"discoverSource":22},94366,"workflow_templates","Comfy-Org\u002Fworkflow_templates","Comfy-Org","ComfyUI template workflows",null,"https:\u002F\u002Fgithub.com\u002FComfy-Org\u002Fworkflow_templates","Python",731,159,0,47.61,false,"main","2026-08-24 04:01:22","# workflow_templates\n\nThis repo hosts the official ComfyUI **workflow templates** and **subgraph blueprints**.\n\n## Overview\n\n| Content | Description | Location |\n|---------|-------------|----------|\n| **Workflow Templates** | Full standalone workflows for the template picker | `templates\u002F`, `packages\u002F` |\n| **Subgraph Blueprints** | Reusable node components that appear in the node palette | `blueprints\u002F`, `packages\u002Fblueprints\u002F` |\n| **Template Site** | Astro SSG that showcases templates at [templates.comfy.org](https:\u002F\u002Ftemplates.comfy.org) | `site\u002F` |\n\nThe repository uses a **package-per-media** structure for Python distribution:\n\n- `packages\u002Fcore` – manifest + loader helpers shipped as `comfyui-workflow-templates-core`\n- `packages\u002Fmedia_*` – workflow template JSON + preview assets for each media type\n- `packages\u002Fblueprints` – subgraph blueprint JSON + preview assets as `comfyui-subgraph-blueprints`\n- `packages\u002Fmeta` and the root `pyproject.toml` – the `comfyui-workflow-templates` meta package\n\n### Template Site (`site\u002F`)\n\nThe `site\u002F` directory contains an independent Astro static site that provides a browsable, searchable interface for all workflow templates. It includes AI-generated descriptions, i18n support (11 languages), SEO optimization, and automated content pipelines. See [site\u002FAGENTS.md](site\u002FAGENTS.md) for full documentation.\n\n```bash\ncd site\npnpm install\npnpm run dev       # Start dev server at localhost:4321\npnpm run build     # Production build (runs prebuild pipeline automatically)\n```\n\n### Deployment Environments\n\nThe template site is deployed to four environments via GitHub Actions:\n\n```\nmain merge (version bump)\n  └─ PyPI publish ─► deploy-site.yml ─► Production (approved only)\n\nOnce per day (00:00 UTC)\n  └─ cron-rebuild-site.yml         ─► Production         (prod API, approved only)\n\nOnce per day (00:00 UTC)\n  └─ preview-cron.yml\n       ├─ main (prod API)          ─► Preview Prod        (prod API, all workflows)\n       └─ main (test API)          ─► Preview Test        (test API, all workflows)\n\nPR opened\u002Fupdated\n  ├─ preview-site.yml              ─► PR Preview (one-off)\n  └─ preview-cron.yml (label)      ─► PR Preview (daily, requires \"preview-cron\" label)\n```\n\n| Environment | Workflow | API | Status Filter | Vercel Flag | Alias Secret | Trigger |\n|-------------|----------|-----|---------------|-------------|--------------|---------|\n| **Production** | `deploy-site.yml` | Production | `approved` only | `--prod` | — | PyPI publish \u002F manual |\n| **Production** | `cron-rebuild-site.yml` | Production | `approved` only | `--prod` | — | Once per day (00:00 UTC) |\n| **Preview Prod** | `preview-cron.yml` (main, prod) | Production | None (all) | preview | `VERCEL_PREVIEW_ALIAS` | Once per day (00:00 UTC) |\n| **Preview Test** | `preview-cron.yml` (main, test) | Test | None (all) | preview | `VERCEL_PREVIEW_TEST_ALIAS` | Once per day (00:00 UTC) |\n| **PR Preview** | `preview-site.yml` | Configurable | None (all) | preview | — | PR changes |\n| **PR Preview** | `preview-cron.yml` (PR) | Test | None (all) | preview | — | Once per day (00:00 UTC) |\n\n**Status filtering** is controlled by the `PUBLIC_APPROVED_ONLY` environment variable at build time. When set to `'true'`, only workflows with `status: 'approved'` from the hub API index endpoint are included in the build. Preview environments omit this flag to show all workflows (pending, approved, rejected, deprecated) for internal review.\n\n## Quick Start\n\n| Task | Commands |\n|------|----------|\n| Add a workflow template | Edit `templates\u002F`, `bundles.json`, then `python scripts\u002Fsync\u002Fsync_bundles.py` |\n| Add a subgraph blueprint | Edit `blueprints\u002F`, `blueprints_bundles.json`, then `python scripts\u002Fsync\u002Fsync_blueprints.py` |\n| Import external blueprints | Copy JSONs to `blueprints\u002F`, then `python scripts\u002Fblueprints\u002Fimport_blueprints.py` |\n| Check node compatibility | `npm run validate:comfyui-nodes` (local ComfyUI) or see [`scripts\u002FREADME.md`](scripts\u002FREADME.md#comfyui-node-compatibility-check) |\n\n---\n\n- [workflow\\_templates](#workflow_templates)\n  - [Overview](#overview)\n  - [Quick Start](#quick-start)\n  - [Adding New Templates](#adding-new-templates)\n  - [Adding New Blueprints](#adding-new-blueprints)\n  - [Validation](#validation)\n\n## Adding New Templates\n\nI will demonstrate how to add a new template by walking through the process of adding the Wan text to video template.\n\n### 1 — Find Templates Folder\n\n[Set up ComfyUI_frontend dev environment](https:\u002F\u002Fgithub.com\u002FComfy-Org\u002FComfyUI_frontend?tab=readme-ov-file#development). In the `ComfyUI_frontend\u002F.env` file, add the line `DISABLE_TEMPLATES_PROXY=true` then start the dev server with `npm run dev`.\n\nCopy the `templates` folder from this repository to the `ComfyUI_frontend\u002Fpublic` folder.\n\n### 2 — Obtain Workflow\n\nEither\n\n- Create the workflow and export using `Save` => `Export`\n- Use an existing workflow. To extract the workflow json from an image, you can use this tool: \u003Chttps:\u002F\u002Fcomfyui-embedded-workflow-editor.vercel.app\u002F>\n\nI will get my workflow from the [ComfyUI_examples Wan 2.1 page](https:\u002F\u002Fcomfyanonymous.github.io\u002FComfyUI_examples\u002Fwan\u002F). To get the workflow from the video on that page, I'll drag the video into [comfyui-embedded-workflow-editor](https:\u002F\u002Fcomfyui-embedded-workflow-editor.vercel.app\u002F). Then I'll copy and paste it into a new json file on my computer.\n\n> [!IMPORTANT]\n>\n> Make sure you start ComfyUI with `--disable-all-custom-nodes` when creating the workflow file (to prevent custom extensions adding metadata into the saved workflow file)\n\n### 3 — Obtain Thumbnails\n\nIdeally, the thumbnail is simply the output produced by the workflow on first execution. As an example, see the output of the [**_Mixing ControlNets_** template](https:\u002F\u002Fdocs.comfy.org\u002Ftutorials\u002Fcontrolnet\u002Fmixing-controlnets):\n\n![](docs\u002Fpictures\u002Fcontrolnet-output-match-thumbnail.png)\n\nFor my Wan 2.1 template, I'll just use [the webp video](https:\u002F\u002Fcomfyanonymous.github.io\u002FComfyUI_examples\u002Fwan\u002Ftext_to_video_wan.webp) I got the workflow from.\n\n### 4 — Choose Thumbnail Type\n\nChoose the content type and hover effect (optional) for your thumbnail:\n\n| Content Types                                                                                                   | Hover Effects                                                                                                                |\n| --------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |\n| ![Image Element](docs\u002Fpictures\u002Fthumbnail-variants\u002Fdefault.gif)\u003Cbr>**Image**: Default image with no extra effect | ![Compare Slider](docs\u002Fpictures\u002Fthumbnail-variants\u002Fcompare-slider.gif)\u003Cbr>**Compare Slider**: Before\u002Fafter comparison tool   |\n| ![Video Player](docs\u002Fpictures\u002Fthumbnail-variants\u002Fvideo.gif)\u003Cbr>**Video**: Webp animation                        | ![Hover Dissolve](docs\u002Fpictures\u002Fthumbnail-variants\u002Fhover-disolve.gif)\u003Cbr>**Hover Dissolve**: Dissolves to 2nd image on hover |\n| ![Audio Controls](docs\u002Fpictures\u002Fthumbnail-variants\u002Faudio.gif)\u003Cbr>**Audio**: Audio playback                      | ![Hover Zoom](docs\u002Fpictures\u002Fthumbnail-variants\u002Fhover-zoom.gif)\u003Cbr>**Hover Zoom**: Same as default but zooms more             |\n\n> [!WARNING]\n>\n> For video thumbnails, thumbnails need to be converted to webp format first\n\nSince my Wan 2.1 thumbnail is already an animated video, I'll use a video thumbnail but choose not to add an effect.\n\n### 5 — Compress Assets\n\nAttempt to compress the assets. Since the thumbnails will never be taking up a large portion of the screen, it is acceptable to lower their size. It's also good to convert them to a space-efficient file format like webp or jpeg, applying a lossy compression algorithm (e.g., convert at 65% quality).\n\n[EzGif](https:\u002F\u002Fezgif.com\u002Fpng-to-webp) has free tools for changing resolution, compressing, and converting file types. Use whatever tool you are comfortable with.\n\n> [!TIP]\n>\n> Convert to webp first, then resize to a smaller resolution. You can maintain high quality and still get near 95% reduction if e.g., converting from png.\n\n### 6 — Rename and Move Files\n\nGive the workflow a filename that has no spaces, dots, or special characters. Then rename the thumbnail file(s) to match, but with a counter suffix.\n\n```\nyour_template_name.json\nyour_template_name-1.png\nyour_template_name-2.png\n```\n\nI'll name the Wan 2.1 template as `text_to_video_wan.json`. So my files will be:\n\n```\ntext_to_video_wan.json\ntext_to_video_wan-1.webp\n```\n\nThen move the renamed files to your templates folder.\n\n### 7 — Assign Bundle & Sync Assets\n\nEach template lives in one bundle (`media-image`, `media-video`, etc.). Update\n[`bundles.json`](bundles.json) with the template ID so the correct media package ships it.\nAfter editing `templates\u002F` or `bundles.json`, regenerate the manifest and copy assets into\nthe package directories:\n\n```bash\npython scripts\u002Fsync\u002Fsync_bundles.py\n# or via Nx  \nnpm run sync\n```\n\nThis step must be run before committing; CI will fail if the manifest\u002Fbundles are out of sync.\n\n### 8 — Add Entry to `index.json`\n\nThere's an [`index.json`](templates\u002Findex.json) file in the templates folder which is where template configurations are set. You will need to add your template to this file, using the fields outlined below:\n\n![](docs\u002Fpictures\u002Findex-json-fields.png)\n\nIf your template doesn't fit into an existing category, you can add a new one:\n\n```diff\n  {\n    \"moduleName\": \"default\",\n    \"title\": \"Basics\",\n    \"type\": \"image\",\n    \"templates\": [\n      {\n        \"name\": \"default\",\n        \"mediaType\": \"image\",\n        \"mediaSubtype\": \"webp\",\n        \"description\": \"Generate images from text descriptions.\"\n      },\n    ]\n  },\n+ {\n+   \"moduleName\": \"default\",\n+   \"title\": \"Your New Category\"s Name\",\n+   \"type\": \"video\",\n+   \"templates\": [\n+     {\n+       \"name\": \"your_template_name\",\n+       \"description\": \"A description of your template workflow\",\n+       \"mediaType\": \"image\",\n+       \"mediaSubtype\": \"webp\",\n+       \"description\": \"Your template\"s description.\",\n+       \"tutorialUrl\": \"https:\u002F\u002Flink-to-some-helpful-docs-if-they-exist.como\"\n+       \"thumbnailVariant\": \"zoomHover\",\n+     },\n+   ]\n+ }\n```\n\nThe Wan 2.1 template I'm adding already fits into the \"Video\" category, so I'll just add it there:\n\n```diff\n  {\n    moduleName: \"default\",\n    title: \"Video\",\n    type: \"video\",\n    templates: [\n      {\n        name: \"ltxv_text_to_video\",\n        mediaType: \"image\",\n        mediaSubtype: \"webp\",\n        tutorialUrl: \"https:\u002F\u002Fcomfyanonymous.github.io\u002FComfyUI_examples\u002Fltxv\u002F\"\n      },\n+     {\n+       \"name\": \"text_to_video_wan\",\n+       \"description\": \"Quickly Generate videos from text descriptions.\",\n+       \"mediaType\": \"image\",\n+       \"mediaSubtype\": \"webp\",\n+       \"tutorialUrl\": \"https:\u002F\u002Fcomfyanonymous.github.io\u002FComfyUI_examples\u002Fwan\u002F\"\n+     },\n    ]\n  },\n```\n\nThe `thumbnailVariant` field is where you add the choice of thumbnail variant.\n\nNow you can start ComfyUI (or refresh browser if already running) and test that your template works.\n\n> [!WARNING]\n>\n> Make sure to use double-quotes `\"` instead of single-quotes `'` when adding things to json files\n\n### 9 — Embed Models\n\nNow we need to embed metadata for any models the template workflow uses. This way, the user can download and run the workflow without ever leaving ComfyUI.\n\nFor instance, my Wan 2.1 template requires 3 models:\n\n- umt5_xxl_fp8_e4m3fn_scaled text encoder\n- wan_2.1_vae VAE\n- wan2.1_t2v_1.3B_bf16 model\n\n![alt text](docs\u002Fpictures\u002Fmodel_loaders.png)\n\nTo add them to the workflow json, find each associated node and add the metadata to their properties:\n\n```diff\n    {\n      \"id\": 39,\n      \"type\": \"VAELoader\",\n      \"pos\": [866.3932495117188, 499.18597412109375],\n      \"size\": [306.36004638671875, 58],\n      \"flags\": {},\n      \"order\": 0,\n      \"mode\": 0,\n      \"inputs\": [],\n      \"outputs\": [\n        {\n          \"name\": \"VAE\",\n          \"type\": \"VAE\",\n          \"links\": [76],\n          \"slot_index\": 0\n        }\n      ],\n      \"properties\": {\n        \"Node name for S&R\": \"VAELoader\",\n+       \"models\": [\n+         {\n+           \"name\": \"wan_2.1_vae.safetensors\",\n+           \"url\": \"https:\u002F\u002Fhuggingface.co\u002FComfy-Org\u002FWan_2.1_ComfyUI_repackaged\u002Fresolve\u002Fmain\u002Fsplit_files\u002Fvae\u002Fwan_2.1_vae.safetensors?download=true\",\n+           \"hash\": \"2fc39d31359a4b0a64f55876d8ff7fa8d780956ae2cb13463b0223e15148976b\"\n+           \"hash_type\": \"SHA256\",\n+           \"directory\": \"vae\"\n+         }\n+       ]\n      },\n      \"widgets_values\": [\"wan_2.1_vae.safetensors\"]\n    },\n```\n\n```diff\n    {\n      \"id\": 38,\n      \"type\": \"CLIPLoader\",\n      \"pos\": [12.94982624053955, 184.6981658935547],\n      \"size\": [390, 82],\n      \"flags\": {},\n      \"order\": 1,\n      \"mode\": 0,\n      \"inputs\": [],\n      \"outputs\": [\n        {\n          \"name\": \"CLIP\",\n          \"type\": \"CLIP\",\n          \"links\": [74, 75],\n          \"slot_index\": 0\n        }\n      ],\n      \"properties\": {\n        \"Node name for S&R\": \"CLIPLoader\",\n+       \"models\": [\n+         {\n+           \"name\": \"umt5_xxl_fp8_e4m3fn_scaled.safetensors\",\n+           \"url\": \"https:\u002F\u002Fhuggingface.co\u002FComfy-Org\u002FWan_2.1_ComfyUI_repackaged\u002Fresolve\u002Fmain\u002Fsplit_files\u002Ftext_encoders\u002Fumt5_xxl_fp8_e4m3fn_scaled.safetensors?download=true\",\n+           \"hash\": \"c3355d30191f1f066b26d93fba017ae9809dce6c627dda5f6a66eaa651204f68\",\n+           \"hash_type\": \"SHA256\",\n+           \"directory\": \"text_encoders\"\n+         }\n+       ]\n      },\n      \"widgets_values\": [\n        \"umt5_xxl_fp8_e4m3fn_scaled.safetensors\",\n        \"wan\",\n        \"default\"\n      ]\n    },\n```\n\n```diff\n    {\n      \"id\": 37,\n      \"type\": \"UNETLoader\",\n      \"pos\": [485.1220397949219, 57.094566345214844],\n      \"size\": [346.7470703125, 82],\n      \"flags\": {},\n      \"order\": 3,\n      \"mode\": 0,\n      \"inputs\": [],\n      \"outputs\": [\n        {\n          \"name\": \"MODEL\",\n          \"type\": \"MODEL\",\n          \"links\": [92],\n          \"slot_index\": 0\n        }\n      ],\n      \"properties\": {\n        \"Node name for S&R\": \"UNETLoader\",\n+       \"models\": [\n+         {\n+           \"name\": \"wan2.1_t2v_1.3B_bf16.safetensors\",\n+           \"url\": \"https:\u002F\u002Fhuggingface.co\u002FComfy-Org\u002FWan_2.1_ComfyUI_repackaged\u002Fresolve\u002Fmain\u002Fsplit_files\u002Fdiffusion_models\u002Fwan2.1_t2v_1.3B_bf16.safetensors?download=true\",\n+           \"hash\": \"6f999b0d6cb9a72b3d98ac386ed96f57f8cecae13994a69232514ea4974ad5fd\",\n+           \"hash_type\": \"SHA256\",\n+           \"directory\": \"diffusion_models\"\n+         }\n+       ]\n      },\n      \"widgets_values\": [\"wan2.1_t2v_1.3B_bf16.safetensors\", \"default\"]\n    },\n```\n\nYou can find the `hash` and `hash_type` for a model on huggingface (see below)or by calculating it yourself with a script or online tool.\n\n![finding hash on hugginface](docs\u002Fpictures\u002Ffinding-hugginface-hash.png)\n\n[Workflow spec](https:\u002F\u002Fdocs.comfy.org\u002Fspecs\u002Fworkflow_json) and [ModelFile Zod schema](https:\u002F\u002Fgithub.com\u002FComfy-Org\u002FComfyUI_frontend\u002Fblob\u002F6bc03a624ecbc0439501d0c7c2b073ca90e9a742\u002Fsrc\u002Fschemas\u002FcomfyWorkflowSchema.ts#L34-L40) for more details.\n\n> [!CAUTION]\n>\n> Ensure that the filename being downloaded from the links matches the filenames in the `widgets_values` exactly.\n\n### 10 — Embed Node Versions (optional)\n\nIf your template requires a specific version of Comfy or a custom node, you can specify that using the same process as with models.\n\nThe Wan 2.1 workflow requires the SaveWEBM node which wasn't fully supported until ComfyUI v0.3.26. I can add this information into the SaveWEBM node:\n\n```diff\n    {\n      \"id\": 47,\n      \"type\": \"SaveWEBM\",\n      \"pos\": [2367.213134765625, 193.6114959716797],\n      \"size\": [315, 130],\n      \"flags\": {},\n      \"order\": 9,\n      \"mode\": 4,\n      \"inputs\": [\n        {\n          \"name\": \"images\",\n          \"type\": \"IMAGE\",\n          \"link\": 93\n        }\n      ],\n      \"outputs\": [],\n      \"properties\": {\n        \"Node name for S&R\": \"SaveWEBM\",\n+       \"cnr_id\": \"comfy-core\",\n+       \"ver\": \"0.3.26\"\n      },\n      \"widgets_values\": [\"ComfyUI\", \"vp9\", 24, 32]\n    },\n```\n\nThis can help diagnose issues when others run the workflow and ensure the workflow is more reproducible.\n\n### 11 — Add Documentation Nodes (optional)\n\nIf your template corresponds with a page on https:\u002F\u002Fgithub.com\u002Fcomfyanonymous\u002FComfyUI_examples, https:\u002F\u002Fdocs.comfy.org\u002Fcustom-nodes\u002Fworkflow_templates, etc., you can add a `MarkdownNote` node with links:\n\n![](docs\u002Fpictures\u002Fdocs-markdown-node.png)\n\nRaw markdown used:\n\n```markdown\n### Learn more about this workflow\n\n> [Wan - ComfyUI_examples](https:\u002F\u002Fcomfyanonymous.github.io\u002FComfyUI_examples\u002Fwan\u002F#text-to-video) — Overview\n>\n> [Wan 2.1 Tutorial - docs.comfy.org](https:\u002F\u002Fdocs.comfy.org\u002Ftutorials\u002Fvideo\u002Fwan\u002Fwan-video) — Explanation of concepts and step-by-step tutorial\n```\n\n### 12 — Sync Translations\n\nBefore creating your PR, sync your template to all language versions using the translation management script.\n\n1. Run the translation sync script:\n   ```bash\n   python3 scripts\u002Fsync\u002Fsync_data.py --templates-dir templates\n   ```\n\n2. The script will:\n   - Auto-sync technical fields (models, date, size, etc.) to all language files\n   - Detect untranslated title\u002Fdescription fields\n   - Add your template to `scripts\u002Fdata\u002Fi18n.json` for translation tracking\n   - Generate language-specific template files (index.zh.json, index.ja.json, etc.)\n\n3. (Optional) Add translations in `scripts\u002Fdata\u002Fi18n.json`:\n   ```json\n   {\n     \"templates\": {\n       \"your_template_name\": {\n         \"title\": {\n           \"en\": \"Your Template Title\",\n           \"zh\": \"您的模板标题\"\n         },\n         \"description\": {\n           \"en\": \"Your template description\",\n           \"zh\": \"您的模板描述\"\n         }\n       }\n     }\n   }\n   ```\n\n4. Run sync again to apply your translations\n\nFor detailed instructions, see [scripts\u002FI18N_GUIDE.md](scripts\u002FI18N_GUIDE.md).\n\n### 13 — Create PR\n\n1. Fully test the workflow: delete the models, input images, etc. and try it as a new user would. Ensure the process has no hiccups and you can generate the thumbnail image on the first execution (if applicable).\n2. Verify all language files (index.zh.json, index.ja.json, etc.) are synced and committed\n3. Create a fork of https:\u002F\u002Fgithub.com\u002FComfy-Org\u002Fworkflow_templates (or just checkout a new branch if you are a Comfy-Org collaborator)\n4. Clone the fork to your system (if not a collaborator)\n5. Copy your new workflow and thumbnail(s) into the `templates` folder\n6. Add your changes to the `templates\u002Findex.json` file\n7. **Bump the version in the root `pyproject.toml`** ([example](https:\u002F\u002Fgithub.com\u002FComfy-Org\u002Fworkflow_templates\u002Fpull\u002F32))\n8. Commit and push changes\n9. Create a PR on https:\u002F\u002Fgithub.com\u002FComfy-Org\u002Fworkflow_templates\n\nVersion bumping and package building are automated via CI\u002FCD. Bumping the root `pyproject.toml` version automatically:\n- Detects which subpackages have changed since their last release\n- Bumps versions only for affected packages\n- Updates all dependency references\n- Builds and publishes packages to PyPI\n\nHere is the PR I made for the Wan template: https:\u002F\u002Fgithub.com\u002FComfy-Org\u002Fworkflow_templates\u002Fpull\u002F16\n\nOnce the PR is merged, if you followed step 6 correctly, a new version will be published to the [comfyui-workflow-templates PyPi package](https:\u002F\u002Fpypi.org\u002Fproject\u002Fcomfyui-workflow-templates).\n\n---\n\n## Adding New Blueprints\n\nSubgraph Blueprints are reusable workflow components that appear as single nodes in ComfyUI. They use the native ComfyUI subgraph format.\n\nFor detailed documentation, see [docs\u002FBLUEPRINTS.md](docs\u002FBLUEPRINTS.md).\n\n### Quick Guide\n\n#### Option 1: Import from External Source\n\n1. Copy blueprint JSON files to `blueprints\u002F` directory\n2. Run the import script to normalize names and generate metadata:\n\n   ```bash\n   python scripts\u002Fblueprints\u002Fimport_blueprints.py\n   ```\n\n3. Sync to packages:\n\n   ```bash\n   python scripts\u002Fsync\u002Fsync_blueprints.py\n   ```\n\n#### Option 2: Create in ComfyUI\n\n1. Build your workflow in ComfyUI\n2. Select nodes → Right-click → \"Create Subgraph\"\n3. Export the workflow JSON\n4. Copy to `blueprints\u002F` with a snake_case filename (e.g., `text_to_image_flux.json`)\n5. Run import and sync scripts\n\n### Blueprint File Structure\n\n```\nblueprints\u002F\n├── index.json                        # Generated metadata for UI\n├── index.schema.json                 # Validation schema\n├── text_to_image_flux_1_dev.json     # Blueprint (native ComfyUI subgraph format)\n├── text_to_image_flux_1_dev-1.webp   # Thumbnail (optional)\n└── ...\n```\n\n### Blueprint JSON Format\n\nBlueprints use the native ComfyUI subgraph format with `definitions.subgraphs`:\n\n```json\n{\n  \"id\": \"workflow-uuid\",\n  \"nodes\": [{\"id\": -1, \"type\": \"subgraph-uuid\", ...}],\n  \"definitions\": {\n    \"subgraphs\": [{\n      \"id\": \"subgraph-uuid\",\n      \"name\": \"Text to Image (Flux.1 Dev)\",\n      \"inputs\": [\n        {\"name\": \"text\", \"type\": \"STRING\"},\n        {\"name\": \"width\", \"type\": \"INT\"}\n      ],\n      \"outputs\": [\n        {\"name\": \"IMAGE\", \"type\": \"IMAGE\"}\n      ],\n      \"nodes\": [...],\n      \"links\": [...]\n    }]\n  }\n}\n```\n\n### Sync Commands\n\n```bash\n# Import and normalize external blueprints\npython scripts\u002Fblueprints\u002Fimport_blueprints.py\n\n# Generate manifest and sync to packages\npython scripts\u002Fsync\u002Fsync_blueprints.py\n```\n\n### Create PR\n\n1. Test the blueprint in ComfyUI\n2. Ensure `python scripts\u002Fsync\u002Fsync_blueprints.py` produces no changes\n3. Bump version in root `pyproject.toml`\n4. Create PR\n\n---\n\n## Validation\n\nCI automatically validates:\n\n| Check | Templates | Blueprints |\n|-------|-----------|------------|\n| JSON syntax | ✅ | ✅ |\n| Schema validation | ✅ | ✅ |\n| Bundle consistency | ✅ | ✅ |\n| Manifest sync | ✅ | ✅ |\n| Thumbnails | ✅ | ❌ (optional) |\n| ComfyUI node compatibility | ✅ (informational PR comment) | ❌ |\n\nRun locally before committing:\n```bash\npython scripts\u002Fsync\u002Fsync_bundles.py      # Templates\npython scripts\u002Fsync\u002Fsync_blueprints.py   # Blueprints\nnpm run validate:comfyui-nodes           # Optional: node baseline vs templates (needs running ComfyUI)\n```\n\nSee [`scripts\u002FREADME.md`](scripts\u002FREADME.md#comfyui-node-compatibility-check) for local vs static scan modes and log output.\n","这是一个为 ComfyUI 提供官方工作流模板与子图蓝图的资源库，用于快速构建和复用图像生成、视频处理等 AI 内容创作流程。核心功能包括：结构化组织的可直接加载的工作流模板（JSON 格式）、模块化子图组件（支持拖拽复用）、配套的 Astro 静态网站（templates.comfy.org）提供多语言搜索、AI 描述、SEO 和自动化内容更新。采用 Python 包分发机制，按媒体类型（如 image、video）拆分为独立可安装包。适用于 ComfyUI 用户快速启动项目、降低节点配置门槛，尤其适合提示工程实践、教学演示及团队标准化流程建设。",2,"trending"]