About this remapper

RecolorImage does one thing: it changes a colour you name into a colour you also name, and leaves every pixel that was not selected exactly as it found it.

Why a whole page for one operation

Colour replacement sits inside every general image editor and is badly served by nearly all of them. It arrives as a slider marked tolerance, computed as a distance in RGB, with no indication of what has been selected until the operation has already run. The result is a control that works on flat graphics, misbehaves on photographs, and gives no way to tell the two situations apart until the picture is wrong.

Building it alone makes room for the parts that get cut when it is a menu item. A perceptual working space rather than an RGB one. Three tolerances instead of a single conflated number. A live mask and a coverage figure, so the most common failure — a selection that quietly grew — is visible before it is committed rather than after. A mask recomputed at full resolution at export instead of scaled up from the preview. And a palette path for indexed files that does the job in 768 bytes rather than by decoding something that was never continuous in the first place.

What it will not grow into

There is a strong pull, once a colour engine exists, to add the next thing. Named presets. A grading stage. An automatic exposure fix, since the lightness channel is already separated and it would take an afternoon. A brush that erases. Each of those belongs to a different page, and the list of which page is not kept a secret: exposure, contrast and white balance are somebody else’s subject, so is sharpening, so are scratches and tears, and so is removing an object from inside the frame. This page will keep refusing them, and the refusal is what keeps the sliders on it about one thing.

The limits are written into the pages rather than into a support article. A black garment cannot be made yellow. A white shirt in front of a white wall cannot be separated from it by any tolerance setting, because they are the same colour. An animated GIF contributes one frame. Wide-gamut sources are converted to sRGB before anything is measured. None of that is pleasant to advertise and all of it saves somebody an afternoon.

How it is built

Nothing runs on a server; the deployment is a set of static files. The whole tool is JavaScript and WebAssembly running in the tab: a decoder, a conversion into OKLab, a mask evaluated as arithmetic over typed arrays, and an encoder. There is no account, no queue and no job identifier, because there is nowhere for a job to be queued. Image data is never posted anywhere: decode, mask, remap and encode all happen inside this tab's memory, and that memory is released when you leave.

The way it is meant to pay for itself is advertising, and the honest state of that is worth one sentence: no advertising is on the page yet, because the domain is still waiting on AdSense review, and until it clears every placement renders nothing rather than holding a gap open for something that cannot arrive. The positions were settled in advance and will not move when they start filling — below the reading on a tool route, at the breaks of an essay, never over the picture and never inside the rail, each one reserving its height from the first paint so the page does not jump. That is the entire business model. There is nothing here to buy, and no account to be upsold from.

Where to go from here