Batch Watermark Tool
Stamp a text or logo watermark across a whole batch of photos and download a zip — nothing is ever uploaded anywhere.
Drop in a batch of JPEG, PNG, or WebP photos, set up a text ("PROOF") or your own logo image as a watermark — position, size, color, opacity, even a crop-resistant tiled pattern — watch it update live on a real preview, then download every watermarked photo in one zip. Everything happens in your browser; nothing is uploaded, and there's no per-batch image cap. One-time purchase, works offline forever.
What it does
What it does: Redraws each dropped image onto a canvas, composites a text or logo watermark on top at a configurable position/size/color/opacity, and re-encodes it via the browser's own canvas.toBlob() — the same canvas-redraw-and-re-encode approach the Batch Image Resizer uses, reusing its exact hand-rolled zip writer for the download. A live preview (built from the same drawing function used for the real output, so what you see is exactly what you get) updates instantly as you adjust settings, using the first photo in your batch as the sample. Position it with a corner/edge preset or click anywhere on the preview to place it exactly; optionally tile it in a repeating diagonal grid across the whole photo so cropping out one corner doesn't remove the watermark.
Who it's for: Photographers and anyone else sending preview-quality images to a client before payment — proofs, drafts, sample galleries — who needs those images visibly, durably marked as not-yet-licensed without touching each file by hand in an editor.
Example scenario: A wedding photographer has just finished a shoot and needs to send the couple 80 proof images to choose their favorites from, before the final licensed set is paid for and delivered. They drag all 80 into this tool, type "PROOF" as the watermark text, turn on tiling so the mark survives someone cropping around it, and download one zip — instead of opening each photo in an editor 80 times, or trusting an online tool that uploads client photos to a server it doesn't control.
What it explicitly does not do:
- Does not resize, compress, crop, or otherwise edit the photo beyond drawing the watermark on top — for resizing, that's the companion Batch Image Resizer tool in this line.
- Does not decode HEIC (iPhone's native format) in most browsers — dropped in, it's reported as a clean per-file error rather than crashing the batch.
- Does not make a tiled watermark literally impossible to remove — a determined person with editing skills can still paint one out. Tiling is a real, meaningfully higher bar against casual cropping and screenshotting, not a cryptographic guarantee.
- Does not embed any invisible/forensic watermark (steganographic or metadata-based tracing) — this is a visible stamp only.
- Does not store or remember anything between sessions — reload the page and the last batch, logo, and settings are gone.
- Does not enforce a maximum batch size, but very large batches are limited by your browser's own memory, same as the Resizer.
Features
- Stamps a text watermark (your own wording, font, color, size) or an uploaded logo image across a whole batch of photos, and downloads every result as one zip
- Nine position presets (corners, edges, center) plus click-anywhere-on-the-preview custom placement, applied consistently across every photo in the batch regardless of each one's size
- Optional tiled mode repeats the watermark in a diagonal grid across the entire photo — verified by pixel-sampling the output to reach every edge and corner region, not just eyeballed
- Live preview built from the exact same drawing code used for the real output — what you see while adjusting settings is what ends up in the zip, not an approximation
- A bad file (corrupted, unsupported format, 0 bytes) or a corrupted logo upload is rejected with a clear, specific error message — it never stops or crashes the rest of the batch
- Runs entirely offline in your browser — no network requests, no analytics, no per-batch image cap
Browser support
| Platform | Result | Notes |
|---|---|---|
| Desktop Safari (macOS) | Full | Opened and visually confirmed in the real, installed Safari app (empty-state screenshot, `screenshots/platform-safari-empty.png`). Full functional flow — mixed batch with text and logo watermarks, tiling, corrupted-file and corrupted-logo error handling, zip download and re-extraction — additionally verified through WebKit, the same engine Safari runs on, via Playwright. |
| Desktop Chrome (macOS) | Full | Opened and visually confirmed in the real, installed Chrome app (`screenshots/platform-chrome-empty.png`). Full functional flow verified through Chrome's own Blink/Chromium engine, including a 50-image performance batch that completed in ~0.7s with zero console errors. |
| Desktop Firefox (macOS) | Full | Opened and visually confirmed in the real, installed Firefox app (`screenshots/platform-firefox-empty.png`). Full functional flow verified through Firefox's own Gecko engine — identical pass/fail results and pixel-identical watermark output to Chromium and WebKit on the same test batch. |
| Edge / Brave | Not separately tested | Both are Chromium-based like Chrome, where the tool was confirmed Full; neither is independently installed on this machine. |
| iOS Safari (iPhone/iPad) | Not verified | No physical iOS device available. The tool's rendering engine (WebKit) was fully verified via Playwright, and the click-to-browse file picker and touch-tap interactions both work correctly under a real touch-input emulation (see the small-viewport row below) — but this is not the same as running on actual iOS hardware, and it is not claimed as such. |
| Android Chrome | Full | Tested on a real Android device in Chrome — works. |
| Small-viewport / touch | Verified via desktop emulation | Tested under Chromium's iPhone 13 device emulation (390×844, touch input enabled): the two-column settings/preview layout correctly collapses to a single stacked column, and a real `tap()` (not a mouse click) on a position-preset button and the Apply button both worked correctly — confirmed by screenshot (`screenshots/mobile-emulated-done.png`) and by the resulting zip containing correctly watermarked photos. |
Functional testing — text watermarks (custom text/font/color/size/opacity), logo watermarks (uploaded as a data URI, corrupted-logo rejection via real `Image()` decode validation), all 9 position presets plus click-to-place custom positioning, tiled diagonal repeat coverage, mixed-batch error handling (corrupted file, 0-byte file, non-image file silently skipped), console-clean confirmation on a normal run, and a 50-image performance batch — was run end-to-end through all three real browser engines (Chromium, Gecko, WebKit) via Playwright. The downloaded zip's contents were independently re-opened and pixel-sampled with Python/Pillow at the exact expected watermark coordinates, not inferred from reading the code or eyeballing a screenshot.
FAQ
Does my file get uploaded anywhere?
No. The entire tool is one static HTML file with no server component and no network calls. You can open it with your Wi-Fi off, or read the page's source yourself to confirm there's nothing that sends data anywhere — your logo image never leaves your browser either.
Can I use my own logo?
Yes. Upload any image file (PNG with transparency works best) as the logo watermark; it's read directly in your browser as a data URI and never touches a server. If the file is corrupted or not a real image, the tool tells you clearly and keeps whatever logo you had loaded before, rather than silently failing.
Does a tiled watermark actually protect against cropping?
It repeats the mark in a diagonal grid across the entire photo, not just one corner, so cropping out any single spot still leaves the mark elsewhere in the frame — genuinely verified by sampling actual output pixels across every region of a test image, edges and corners included. It's a real, meaningfully higher bar than a single corner stamp, not an unremovable guarantee — someone with real editing skill and enough time could still paint around it.
Does this work on my iPhone/iPad?
Not tested on physical iOS hardware, so it isn't claimed as verified either way. The underlying browser engine (WebKit/Safari) and touch-tap interactions were both confirmed working under a real touch-input emulation on desktop; drag-and-drop of files onto a web page isn't available on iOS regardless of the tool, so you'd use "click to browse" there.
What happens to my file if I lose the download?
Nothing is stored by the tool anywhere — your original files are untouched on your computer the whole time, so you can just process the batch again. If you reload the page before downloading the zip, you'll need to re-drop the files and reconfigure the watermark; nothing is held across a reload.
Can I use this for client or commercial work?
Yes — personal and commercial use are both fine, including watermarking client proofs before delivery.
Is there a subscription?
No. One-time purchase, yours to keep and reuse forever.
Is there a limit on how many images I can process at once?
No hard cap is enforced by the tool. It was tested cleanly on a 50-image batch, completing in under a second with zero errors; very large batches are limited only by your browser's own memory, not an artificial cap like the 5-image limit some free online watermarking tools impose.
- ✓ Runs 100% offline in your browser
- ✓ Single HTML file — no install, no dependencies
- ✓ No account, no telemetry, no tracking
- ✓ Buy once — yours forever
After checkout you get an instant download link. Open the file in any modern browser and it just works.
Pairs well with
✓ runs entirely on your device — Wi-Fi off? Still works.
accounts sign-ups cloud uploads none
✓ your files stay where you put them
Prefer to try before buying? The browser versions of every tool run free at tools.untracked.tools — no upload, ever.