javascriptreverse-engineeringsecuritywebwriteup

Gemini watermark remover that charges you to run your own CPU

A site charged money to remove Gemini watermarks. The entire thing ran in your browser. The daily limit was localStorage. The anti-devtools were harder to crack than the actual algorithm.

/3 min read

I found a site called Gemini Watermark Cleaner that removes the badge Google puts on Gemini-generated images. It had a pricing page, a Product Hunt launch, a Chrome extension. The developer claimed it used "a powerful client-side inpainting model (shoutout to the LAMA architecture!)" and the site advertised "Advanced inpainting technology for invisible watermark removal."

None of that was true. The whole thing is one formula running in your browser, and they charge $9.99 to unlock unlimited use.

The site

The UI is clearly AI-generated. Gradient hero, three feature cards ("Fast Processing", "100% Private", "Professional Quality"), upsell banners everywhere. The copy reads like someone asked ChatGPT for landing page text. The Product Hunt post from the developer ("Hefty") is the same thing, emoji bullet points, "One-Click Magic," "I'm here all day to answer your questions. Cheers, Hefty."

You get three free uses per day. After that, it shows "Free quota: 3 / day · Used 3 · Remaining 0" and an "Unlock unlimited" button pointing to a $9.99 lifetime purchase.

The three-per-day limit is stored in localStorage. That's it. No server, no account, no token. Clear your site data and you're back to three. Open incognito and you have three more.

The anti-devtools

This is where they actually put effort in.

Opening devtools immediately triggers a debugger statement in an infinite loop. Your browser freezes on a breakpoint you didn't set, in dynamically generated code. The normal "never pause here" workaround doesn't work because the source keeps changing.

If you get past that by disabling breakpoints before opening devtools, the site detects that devtools are open and stops working. Processing silently fails. Close devtools and everything works again.

Then there are decoy network requests. The site fires off HTTP requests that look like API calls to a processing backend. If you're watching the network tab trying to find how the "generation" works, you'd find requests to chase down. You'd spend time trying to figure out the server-side pipeline, the auth, the request format.

There is no server-side pipeline. The requests are unrelated to the watermark removal. They're just there to send you on a goose chase. Everything happens in a Web Worker in your browser.

The anti-devtools were genuinely harder to get past than the actual algorithm was to understand.

What it actually does

I pulled the page locally and dug through the webpack chunks. The app loads your image into a canvas, grabs the pixel data, and sends it to a Web Worker with two alpha maps. There's one for a 48px Gemini badge and one for a 96px badge. The alpha maps are Float32Arrays hardcoded in the JavaScript bundle.

The worker:

  1. Picks the small or large template based on image dimensions.
  2. Assumes the badge is in the bottom-right corner at a fixed offset (32px margin for small, 64px for large).
  3. Reverses the blend.

The formula:

original = (observed - logoValue * alpha) / (1 - alpha)

The Gemini watermark is composited onto the image with a known alpha profile. If you know the alpha values and the overlay color, you undo it. Per pixel, per channel, clamp to 0–255.

No AI. No inpainting. No LAMA. No OpenCV. Reverse-alpha-deblending against a hardcoded template, for one specific watermark, at two sizes, in one position.

Rebuilding it

I pulled out the alpha maps and the pixel math and rebuilt it as a local tool. One HTML file, one JS file, one CSS file, one alpha map file. No framework, no build step, no server. Does the exact same thing as the original site, because there was never anything more to it.

Code

The rebuilt tool is here: github.com/GooglyBlox/gemini-watermark-remover