add-model-page
add, update, or remove model pages in the ComfyUI website.
Trigger phrases
Add a model page for <model-name>Update the model page for <model-name>Remove <model-name> from model pages
Phase 1 — Parse the request
Extract:
- action:
add|update|remove - model-name: raw string (e.g.
flux1-schnell,flux1_dev.safetensors)
Normalize to a slug: lowercase, replace _ and . with -, strip file extensions.
Example: flux1_dev.safetensors → flux1-dev
Architecture overview
Models come from two sources merged at build time:
| File | Purpose |
|---|---|
apps/website/src/config/generated-models.json |
Auto-generated from workflow_templates (slug, name, directory, huggingFaceUrl, workflowCount, displayName, thumbnailUrl, docsUrl) |
apps/website/src/config/model-metadata.ts |
Hand-curated overrides (docsUrl, blogUrl, featured) — only add entries that need overrides |
apps/website/src/config/models.ts |
Merges the two above; exports typed Model[] |
To regenerate the JSON from workflow_templates:
pnpm tsx apps/website/scripts/generate-models.ts
This writes apps/website/src/config/generated-models.json directly.
Thumbnails are populated from local .webp files in workflow_templates/templates/ — no network access needed.
Phase 2 — Gather model data (ADD / UPDATE)
Run the generator to get fresh data, then find the model:
pnpm tsx apps/website/scripts/generate-models.ts
jq '.[] | select(.slug | contains("MODEL_SLUG"))' \
apps/website/src/config/generated-models.json
The JSON fields are:
slug— URL slugname— exact filename or display name for partner nodeshuggingFaceUrl— download URL (empty for partner nodes)directory—diffusion_models|loras| … |partner_nodesworkflowCount— integerdisplayName— human-readable name
If no match and it is a known API/partner model, add it to API_PROVIDER_MAP in
generate-models.ts and re-run. Otherwise tell the user.
Phase 3 — Check for existing entry
jq --arg slug "${SLUG}" '.[] | select(.slug == $slug)' \
apps/website/src/config/generated-models.json
- Match found + action is
add→ switch to UPDATE flow automatically - No match + action is
update→ stop and tell the user
Phase 4A — ADD: new partner/API model not in workflow_templates
For partner nodes (no local file), add an entry to API_PROVIDER_MAP in
apps/website/scripts/generate-models.ts:
mymodel: { name: 'My Model', slug: 'my-model' },
Then re-run pnpm tsx apps/website/scripts/generate-models.ts — it will appear
in generated-models.json automatically.
If you also want a docsUrl, blogUrl, or a link to the hub model page, add an entry to model-metadata.ts:
'my-model': {
docsUrl: 'https://docs.comfy.org/tutorials/...',
blogUrl: 'https://blog.comfy.org/...',
hubSlug: 'my-model', // slug at comfy.org/workflows/model/{hubSlug} — only set if the page exists (returns 200)
featured: true
}
No changes to models.ts or translations.ts are needed.
Phase 4B — UPDATE: edit existing entry
Only model-metadata.ts needs editing for most updates (docsUrl, blogUrl,
featured). For displayName or directory changes, edit the entry directly in
generated-models.json (until the next generator run would overwrite it — then
fix the source in generate-models.ts).
Phase 4C — REMOVE: delete entry
Remove the entry from generated-models.json (or mark it with canonicalSlug
pointing to the replacement). No translation file changes needed.
Phase 5 — Verify TypeScript
pnpm typecheck 2>&1 | grep -E "error|warning" | head -20
Fix any type errors before proceeding. Common issues:
ModelDirectorytype not matching a newdirectoryvalue — add it to the union- JSON import shape mismatch —
generated-models.jsonmust matchOutputModel
Phase 6 — Create PR
BRANCH="add-model-page-MODEL-SLUG" # or update- / remove-
git checkout -b $BRANCH
git add apps/website/src/config/generated-models.json \
apps/website/scripts/generate-models.ts \
apps/website/src/config/model-metadata.ts
git commit -m "feat(models): add model page for MODEL-SLUG"
git push -u origin $BRANCH
gh pr create \
--title "Add model page: MODEL-SLUG" \
--body "$(cat <<'EOF'
Adds a new model page entry for MODEL-SLUG.
## Changes
- `generated-models.json`: regenerated with new entry (workflowCount N, directory DIRECTORY)
- `model-metadata.ts`: editorial overrides (docsUrl, featured) if needed
EOF
)"
For UPDATE use branch update-model-page-MODEL-SLUG.
For REMOVE use remove-model-page-MODEL-SLUG.
Error states
| Situation | Response |
|---|---|
| Model not in workflow templates | Ask user to verify spelling or add it manually as a partner node |
| Slug already exists (add) | Switch to update flow automatically |
| Slug not found (update/remove) | Stop and ask user to confirm |
| Typecheck fails | Fix the error before pushing |