Nodes/ComfyUI DeviantArt Sender/🎨 Send to DeviantArt
ComfyUI Node

🎨 Send to DeviantArt

Publish straight to DeviantArt, no browser tabs

By sni10Β·Created 2 months agoΒ·Updated 2 months agoΒ· 0
🎨 Send to DeviantArt
  • images
    β—„folder_pathoutputβ–Ί
    β—„client_idβ–Ί
    β—„client_secretβ–Ί
    β—„tagsdigital art, ai generatedβ–Ί
    β—„display_resolution0 - Originalβ–Ί
    β—„galleryidsβ–Ί
    β—„is_ai_generatedtrueβ–Ί
    β—„is_maturefalseβ–Ί
    β—„mature_levelnoneβ–Ί
    β—„mature_nudityfalseβ–Ί
    β—„mature_sexualfalseβ–Ί
    β—„mature_gorefalseβ–Ί
    β—„mature_languagefalseβ–Ί
    β—„mature_ideologyfalseβ–Ί
    β—„featuretrueβ–Ί
    β—„allow_commentstrueβ–Ί
    β—„allow_free_downloadtrueβ–Ί
    β—„add_watermarkfalseβ–Ί
    β—„publish_after_stashtrueβ–Ί
    β—„titleβ–Ί
    β—„artist_commentsβ–Ί

    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:

    1. Authenticate. On first run it opens your browser to deviantart.com/oauth2/authorize with a callback on http://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.
    2. Stash upload. It submits the file to your sta.sh via /stash/submit.
    3. Publish. Unless you flip publish_after_stash off, it hits /stash/publish and 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 at deviantart.com/developers/register. Set the OAuth2 Redirect URI to exactly http://localhost:8080/callback or auth silently fails.
    • folder_path - where your images land (default output).
    • 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_path is 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.db from 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."

    Categoryoutput

    Inputs (22)

    NameTypeDefaultDescription
    imagesIMAGEβ€”
    folder_pathSTRINGoutputβ€”
    client_idSTRINGβ€”
    client_secretSTRINGβ€”
    tagsSTRINGdigital art, ai generatedβ€”
    display_resolutionCOMBO0 - Original9 options: 0 - Original, 1 - 400px, 2 - 600px, 3 - 800px, 4 - 900px, 5 - 1024px, +3
    galleryidsSTRINGβ€”
    is_ai_generatedBOOLEANtrueβ€”
    is_matureBOOLEANfalseβ€”
    mature_levelCOMBOnone3 options: none, moderate, strict
    mature_nudityBOOLEANfalseβ€”
    mature_sexualBOOLEANfalseβ€”
    mature_goreBOOLEANfalseβ€”
    mature_languageBOOLEANfalseβ€”
    mature_ideologyBOOLEANfalseβ€”
    featureBOOLEANtrueβ€”
    allow_commentsBOOLEANtrueβ€”
    allow_free_downloadBOOLEANtrueβ€”
    add_watermarkBOOLEANfalseβ€”
    publish_after_stashBOOLEANtrueβ€”
    titleoptSTRINGβ€”
    artist_commentsoptSTRINGβ€”

    Outputs (0)

    No outputs