CASE STUDY — 01 / BATCH TOOL — Jul 2024
Batch watermarks 500+ images a minute, in the browser, without crashing it.

Creators and small stores need hundreds of branded images at once — product shots, thumbnails, social posts. Every tool I tried either charged per export, uploaded private images to somebody’s server, or simply froze the tab when the batch got big. So I built the tool I wanted: a fully client-side watermarking engine that treats the browser like a render farm.
The naive approach — loop over files, draw each to a canvas, export — dies fast. Fifty images in, the tab is a slideshow; two hundred in, it’s dead. The real problems were scheduling, memory, and keeping the UI alive while a heavy render queue runs underneath it.
I rebuilt the engine around an asynchronous render queue. Images are processed in controlled batches with yields back to the main thread, exports are chunked, and every object URL is revoked the moment it’s consumed. A memory guardrail watches heap pressure and throttles the queue before the browser gives up.
Images flow through a batching pipeline with explicit yields to the main thread — the UI stays at full framerate while hundreds of renders run underneath.
Canvas rendering tuned for throughput: pre-composited watermark layers, minimal state churn, and zero redundant draws per frame.
Object URLs revoked on consumption, chunked export passes, and queue throttling under heap pressure — large batches no longer crash the tab.
Position, scale, opacity and tile mode configured once and applied to the whole batch — built for people processing a full store catalog in one sitting.


“The browser is a render farm if you stop treating it like a form.”
— Build note — July 2024