π¨ Send to DeviantArt
Publish straight to DeviantArt, no browser tabs
- images
You've just finished a render you actually want people to see, and now comes the part of the workflow no one built a node for: exporting the file, opening DeviantArt, fighting the upload form, and hoping you remembered the AI-generated checkbox. DeviantArtSender from sni10/DWA deletes that entire middle section. It's an output node that takes your finished image, uploads it to your DeviantArt account, and publishes it - title, tags, gallery folder, mature-content flags and all - the moment your pipeline finishes. No model runs here, no GPU work, no API key you pay for. It's the closest ComfyUI has to a "ship it" button.
How it actually works
Read the source and one thing jumps out: this node doesn't upload the image tensor in your graph. The images input exists to force graph ordering - so it runs after your sampler - but the file itself comes from disk. The node sleeps three seconds, globs folder_path for the newest png/jpg/jpeg/gif/bmp, and uploads that. That's why you need a SaveImage node writing into that folder first, and why the folder matters (more below).
Then it's a three-step OAuth dance against DeviantArt's API:
- Authenticate. On first run it opens your browser to
deviantart.com/oauth2/authorizewith a callback onhttp://localhost:8080/callback. You click Authorize, the tab says "successful," and it stores the tokens in a SQLite file (da_tokens.db) next to the node. It auto-refreshes from then on. - Stash upload. It submits the file to your sta.sh via
/stash/submit. - Publish. Unless you flip
publish_after_stashoff, it hits/stash/publishand prints the live deviation URL to your console.
The whole thing has one dependency - requests - and downloads nothing. If you're the cautious type, the entire pack is a few hundred lines of plain Python, trivially audit-able. That matters: any node carrying a credential and phoning home by design is exactly the shape this ecosystem got burned by once already (the LLMVISION malware incident). This one checks out - but make skimming a habit.
The inputs that matter
Most of the list is DeviantArt's upload form exposed as fields, so the only ones you must set are:
client_id/client_secret- from registering a free app atdeviantart.com/developers/register. Set the OAuth2 Redirect URI to exactlyhttp://localhost:8080/callbackor auth silently fails.folder_path- where your images land (defaultoutput).images- wire your output here so it runs last.
Everything else has sensible defaults: tags defaults to digital art, ai generated, is_ai_generated defaults to on (leave it on - DeviantArt wants AI work labeled), and the mature-content toggles (is_mature, mature_level, mature_nudity, and friends) only matter if you post adult work. Two you might actually tweak: display_resolution caps what viewers see (0 = original, up to 1920px), and publish_after_stash off means it only lands in your Stash for a manual review - a genuinely nice safety valve for a first run.
Two subtle traps in the code. add_watermark is silently ignored unless display_resolution is above 0 - the code only sends it when you're downscaling. And the node always sends noai=0: it marks your upload AI-generated but never opts it out of DeviantArt's training program. If that bothers you, set it in your DeviantArt account settings; the node won't do it for you.
Installing and first-time auth
Via ComfyUI Manager, search "DeviantArt Sender" and install. Manual, same thing:
cd ComfyUI/custom_nodes/
git clone https://github.com/sni10/DWA.git
Restart ComfyUI, add π¨ Send to DeviantArt (in the output category), paste your keys, run once to trigger the browser authorize, done.
Where people get burned
- "Authentication failed." The redirect URI isn't byte-for-byte
http://localhost:8080/callback, or something else is already squatting on port 8080. Free the port and retry. - "No image files found." Either
folder_pathis wrong, or the node ran before SaveImage wrote the file - the 3-second sleep handles most races but not "the image was never saved." - It uploaded the wrong image. Because it grabs the latest file in the folder, any other render saved after yours gets published instead. Point it at a dedicated output folder, not your general
output/. - Want to re-auth? Delete
da_tokens.dbfrom the pack folder and rerun.
One honest caveat: this is a young, single-node pack with essentially zero community track record (0 impressions on comfy.icu). It's small and readable enough to trust, but it's not the battle-tested choice rgthree's packs are. For a utility that posts to a public site where a bug means publishing something you didn't mean to, test it with publish_after_stash off first. After that it's a one-click "ship it."
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| folder_path | STRING | output | β |
| client_id | STRING | β | |
| client_secret | STRING | β | |
| tags | STRING | digital art, ai generated | β |
| display_resolution | COMBO | 0 - Original | 9 options: 0 - Original, 1 - 400px, 2 - 600px, 3 - 800px, 4 - 900px, 5 - 1024px, +3 |
| galleryids | STRING | β | |
| is_ai_generated | BOOLEAN | true | β |
| is_mature | BOOLEAN | false | β |
| mature_level | COMBO | none | 3 options: none, moderate, strict |
| mature_nudity | BOOLEAN | false | β |
| mature_sexual | BOOLEAN | false | β |
| mature_gore | BOOLEAN | false | β |
| mature_language | BOOLEAN | false | β |
| mature_ideology | BOOLEAN | false | β |
| feature | BOOLEAN | true | β |
| allow_comments | BOOLEAN | true | β |
| allow_free_download | BOOLEAN | true | β |
| add_watermark | BOOLEAN | false | β |
| publish_after_stash | BOOLEAN | true | β |
| titleopt | STRING | β | |
| artist_commentsopt | STRING | β |
Outputs (0)
No outputs