Nodes/550W Watermark & Text Eraser/550W Native Image Erase
ComfyUI Node

550W Native Image Erase

Strip a watermark off an IMAGE tensor, no file picker involved

By sunshinehu·Created 21 days ago·Updated 21 days ago· 1
550W Native Image Erase
  • image
  • result_json
◄operation_id►
◄confirm_chargefalse►
◄languageen►
◄auth_modeapi_key►

What it is, and why the "native" in the name matters

The pack has two ways to send an image for erasure. 550W Remove Image Watermark reads a file out of ComfyUI/input that you pick from a dropdown. 550W Native Image Erase takes a live IMAGE socket - so the picture can come from anywhere in your graph: a Load Image, a fresh generation, an upscale, an inpaint.

That difference is the useful one. A stock photo with an agency watermark, or a render with a logo your checkpoint baked in, goes straight in - no save-and-reupload dance.

It's still a remote service, mind you. "Native" means the input is native ComfyUI, not that anything runs locally.

What goes in

  • image - the tensor. One image per submission - the node rejects a batch before it touches the network, so four images won't quietly save you three round trips. Watch the caps too: 40 megapixels and 50 MiB.
  • operation_id - your stable handle for this job, 8 to 64 characters of letters, digits and ._:-. Treat it like a database key, not a label: if the request outcome is unknown and you re-queue, the same ID is what lets the service recognize it as the same operation instead of a second billable one. "test" fails, "erase-run-01-a" passes.
  • confirm_charge - a boolean, default off, and a hard gate. False means the node raises Invalid input and sends nothing. This is the single most confusing failure in the whole pack: a correct-looking workflow producing a one-word error, because a checkbox nobody noticed is unticked. It exists so a stray Ctrl+Enter can't spend your credits, and it does its job a little too well.
  • language - en or zh-CN. Error-message wording only; it does not change which region's service you hit.
  • auth_mode (optional) - api_key (default) or oauth.

Output: result_json, one STRING. It's an output node, so it runs whenever you queue, wired or not.

The mechanism, briefly

The tensor is checked first - 4D, batch size exactly 1, 3 or 4 channels, sane pixel counts, all finite - then clipped to 8-bit and written to a PNG in a temp directory that's deleted as soon as the attempt finishes.

Then it's a multipart POST to the image endpoint with your credentials and a sync flag, and back comes the service's JSON. The reply carries a task ID rather than a finished picture, so plan for the query step:

Native Image Erase (result_json) → Image Task Query (paste the task_id) → Image Result → Preview / Save Image

That manual hop is the friction of this pack: no poll-until-done loop, so you read the task ID out of the JSON, paste it into the query node, and queue again.

One pleasant side effect of the temp-PNG route: the file that leaves your machine contains only pixels. ComfyUI PNGs normally carry the whole workflow graph as text chunks, so uploading your original would ship your prompt, checkpoint names and node graph with it. You still shouldn't send media you don't own, but you aren't leaking your workflow.

Install

ComfyUI Manager → search 550W Watermark & Text Eraser → install → restart, or by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/sunshinehu/comfyui-550w-media
cd comfyui-550w-media
python -m pip install -r requirements.txt   # ComfyUI's interpreter, not a fresh venv

requests, requests-toolbelt, keyring. No second torch runtime, no ffmpeg, no CUDA work - the erasing happens elsewhere. Python 3.11+.

Credentials are environment variables, deliberately:

export FIFTYW_API_KEY="..."   # https://eraser.550wai.com/api/
export FIFTYW_USER_NO="..."

Set them wherever ComfyUI launches, restart, and don't be surprised they aren't node widgets - that's the point: a shared workflow never ships your key.

Snags to expect

"Invalid input" covers four different situations, which is unhelpful: charge not confirmed, an operation ID that's too short or has a bad character, a batch where a single image was expected, or an image over the pixel cap. If you get it, check those four before assuming the service is down.

Don't replay a timeout. The error string says it: "Request outcome unknown; query the task before retrying". A blind resubmission after a network hiccup is a second charge for the same picture, and the pack deliberately doesn't retry for you.

Alpha and precision. A 4-channel tensor goes out as RGBA, a 3-channel one as RGB, but either way the pixels are clipped to 8-bit. Fine for watermark removal; worth remembering in a long edit chain.

No batching, no loop. For a folder of 400 images this isn't the tool - the file-picker sibling plus a scripted HTTP call fits better, and a local instruction-edit pass is worth pricing first. The service earns its credits on "I have hundreds of these and no time."

Category550W

Inputs (5)

NameTypeDefaultDescription
imageIMAGE—
operation_idSTRING—
confirm_chargeBOOLEANfalse—
languageCOMBOen2 options: en, zh-CN
auth_modeoptCOMBOapi_key2 options: api_key, oauth

Outputs (1)

NameTypeDescription
result_jsonSTRING—