Upload to S3
No boto3 required, R2 and MinIO included
- image
- image
- url
IsekaiS3Upload ships your finished image straight from the graph to S3-compatible storage - AWS S3, Cloudflare R2, DigitalOcean Spaces, Backblaze B2, MinIO, Wasabi, Linode - and returns you the public URL. The headline feature is that it does this with plain HTTP and AWS Signature Version 4, which means no boto3, no extra cloud SDK, no dependency hell. For a custom node in 2026, that's practically a luxury.
How it works. You give it an image, a bucket_name, an object_key (the path/name in the bucket), and credentials. It signs the request itself with SigV4, PUTs the encoded image, and passes the image through untouched on one output while emitting the object's URL on the other. Because it's an output node, it also triggers a preview - the standard wiring is VAE Decode → S3 Upload → Preview, so the upload happens exactly when you'd otherwise save. It compresses before uploading: format is JPEG/PNG/WEBP (default JPEG), quality is 1–100 (default 90, with PNG's quality mapped to PIL's compress level). If your object_key has no extension, it appends one based on the format, so images/output becomes images/output.jpg.
Credentials come from AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables first, with the node's access_key_id / secret_access_key fields as a fallback - and it warns you that credentials typed into node inputs get stored in workflow JSON. It's the same warning the whole pack gives, and it's the right one. The endpoint_url field is how you reach non-AWS services: leave it empty for AWS (with region, default us-east-1), or point it at your R2/Spaces/MinIO endpoint for everything else.
Inputs that matter. Five, realistically:
bucket_nameandobject_key- required, no sensible defaults; these are your target.endpoint_url- the one that makes this node useful beyond AWS.format/quality- setqualityto 90-ish for JPEG; lower it when you're uploading thumbs or previews.acl- defaultprivate; flip topublic-readif the URL needs to be shareable, which it usually does if you're generating the URL to show someone.
Outputs: image (pass-through, for preview/save) and url (STRING, the generated object URL).
Install. Standard pack install: ComfyUI Manager → search "isekai" → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/isekai-sh/isekai-comfy-node
cd isekai-comfy-node
pip install -r requirements.txt
Restart; it's under Isekai → Upload. Set the two AWS env vars before launching ComfyUI and you won't be tempted to paste keys into the graph.
Common issues. The most common failure is credentials: missing or wrong keys throw an S3UploadError and the node logs [Isekai] S3 lines to the console - but because this is an output node, the failure can surface as an image that just "didn't save" with a dead URL rather than a loud crash. Check the console. For R2/Spaces remember endpoint_url must be the full region-scoped endpoint, not the dashboard URL, and that R2 buckets still want a region string even though it's cosmetic. The bucket must already exist - the node uploads, it doesn't create buckets. And the usual pack caveats apply: it's a small, barely-known pack, so you're on the README and your own testing for anything exotic. But the SigV4-without-boto3 approach is solid, and if you're on R2 for the free egress, this is a genuinely clean way to get generated images onto a CDN.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| bucket_name | STRING | — | |
| object_key | STRING | — | |
| access_key_idopt | STRING | — | |
| secret_access_keyopt | STRING | — | |
| regionopt | STRING | us-east-1 | — |
| endpoint_urlopt | STRING | — | |
| formatopt | COMBO | 3 options: JPEG, PNG, WEBP | |
| qualityopt | INT | 901–100 | — |
| aclopt | COMBO | 4 options: private, public-read, public-read-write, authenticated-read |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| url | STRING | — |