ComfyUI-JobNotify
A ComfyUI extension.
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 bycomfy node publish.[project.urls] Repository— replace with the real repository URL.
License
Apache-2.0. See LICENSE.