Extensions/ComfyUI-JobNotify
ComfyUI Extension

ComfyUI-JobNotify

A ComfyUI extension.

By t22m003·Created 2 months ago·Updated 2 months ago· 0
t22m003/ComfyUI-JobNotify
Nodes
On cloudLocal install
Stars0
Updated2 months ago
Readme

ComfyUI-JobNotify

A global extension that plays a notification sound in the front-end and sends an event to an arbitrary webhook when a ComfyUI job (prompt) completes.

No graph node required. Just drop the package into custom_nodes/ and it is always active. Configure it from the ComfyUI settings screen (⚙ Settings) under the Job Notify group.

Features

  • Completion sound (separate tones for success vs. error/interrupted)
  • Built-in synthetic tones + custom sound URL override
  • JSON payload delivery to any webhook (via a backend proxy to avoid CORS)

Settings

Sound

| Setting | Description | |---------|-------------| | Play sound on completion | Whether to play a sound on completion | | Volume | Volume (0–1) | | Success sound | Synthetic tone for success (chime / beep / none) | | Error sound | Synthetic tone for error/interrupted (buzzer / low-beep / none) | | Success custom sound URL | Custom sound URL for success (overrides the tone when non-empty) | | Error custom sound URL | Custom sound URL for errors (overrides the tone when non-empty) |

Webhook

| Setting | Description | |---------|-------------| | Enable webhook | Enable webhook delivery | | Webhook URL | Destination (http:// or https://) | | Send on | always / success / error (error includes interruptions) | | HTTP method | POST or PUT | | Content-Type header | Content-Type used when sending (default: application/json) | | Payload template (JSON) | JSON template with placeholders |

Template placeholders

Placeholders must be placed inside double quotes. Values are JSON-escaped before substitution.

| Token | Meaning | |-------|---------| | {status} | success / error / interrupted | | {workflow_name} | Name of the executed workflow (active tab name at submit time; (unsaved) if not saved) | | {prompt_id} | Prompt ID | | {node_id} | ID of the failing node (only when applicable) | | {node_type} | Type of the failing node (only when applicable) | | {exception_message} | Exception message (on error) | | {exception_type} | Exception type (on error) | | {queue_remaining} | Most recent queue remaining count | | {timestamp} | Client time (ISO 8601) | | {comfy_host} | ComfyUI host (window.location.host) |

Slack example

A minimal example that notifies only the workflow name and outcome:

{"text":"ComfyUI job {status} — {workflow_name}"}

How the webhook is delivered

Sending directly from the browser to Slack / Discord etc. with fetch fails due to CORS, so the front-end POSTs the rendered payload to the ComfyUI server's /jobnotify/webhook, and the server side (aiohttp) forwards it to the external URL.

Known limitations

  • The webhook proxy POSTs from the server to the arbitrary user-configured URL (assumes a local, single-user setup).
  • SSRF-style guarding is limited to http:// / https:// scheme validation only.
  • When used in a deployed environment (comfyui-one-platform), adding the URL to the whitelist may be required separately.

Install

Clone into ComfyUI/custom_nodes/ (or install via ComfyUI-Manager) and restart ComfyUI. After restart, Job Notify appears in the settings screen. No extra Python dependencies (ComfyUI's bundled standard library + aiohttp only).

Publishing (Comfy Registry)

Before publishing to the Comfy Registry, fill in the placeholders in pyproject.toml:

  • [tool.comfy] PublisherId — required. An empty value is rejected by comfy node publish.
  • [project.urls] Repository — replace with the real repository URL.

License

Apache-2.0. See LICENSE.