Behind the Scenes10 min readApril 5, 2026

How We Built 18 Image Tools That Never Touch Your Files

Every image tool on PixelTools processes your files entirely in your browser. No uploads, no servers, no privacy risk. Here's the exact technical architecture — and why client-side processing is faster than any server-based alternative.

Alex Morgan · Lead Developer · April 5, 2026
Canvas API browser-based image processing

The Problem with Every Other Image Tool

When we started building PixelTools, every existing online image tool worked the same way: you upload your file, it travels to a server in some data center, gets processed, and comes back to you. This model has three fundamental problems:

1
Privacy: Your images — personal photos, confidential product shots, sensitive documents — are transmitted to and temporarily stored on a third-party server. Even with HTTPS encryption, you're fundamentally trusting that server operator with your data.
2
Speed: Server round-trip latency adds 0.5–2 seconds to every operation. For a batch of 20 images, that's 10–40 seconds of waiting for server responses that could be eliminated entirely.
3
Scalability cost: Processing images server-side requires expensive compute infrastructure. This is why most tools impose file size limits, batch limits, or paywalls — the server costs are real.

We wanted to build something different: tools that are fundamentally private by architecture, not just by policy. The solution was already built into every modern browser.

The HTML5 Canvas API: The Core Technology

The Canvas API is a built-in browser feature that lets JavaScript draw and manipulate 2D graphics in real time. It's been standard in all major browsers since 2012 and is the technology behind browser-based games, data visualization libraries like D3.js, and — as we discovered — complete image processing pipelines.

Here's the fundamental insight: image processing is just pixel manipulation. Compression, format conversion, resizing, rotation, brightness adjustment — all of these operations are ultimately just reading pixel values, transforming them according to some algorithm, and writing new pixel values. The Canvas API gives JavaScript full access to do exactly this.

// How PixelTools compresses an image (simplified)

const canvas = document.createElement('canvas');

const ctx = canvas.getContext('2d');

canvas.width = image.width;

canvas.height = image.height;

ctx.drawImage(image, 0, 0); // Draw to canvas

canvas.toBlob(

(blob) => downloadFile(blob), // Download result

'image/jpeg'

,

0.80 // 80% quality — never leaves browser

);

This is the complete core of our image compressor. The image loads into browser memory, gets drawn to a canvas, and toBlob() re-encodes it as JPEG at the specified quality. No network request. No server. Pure browser computation.

How Each Tool Works: Under the Hood

Image Compressor

Canvas API + toBlob()

Loads the image into a Canvas, then uses toBlob() with a JPEG MIME type and quality parameter (0.1–1.0). The quality parameter maps to the JPEG quantization matrix — higher quality = less quantization = larger file.

100% local — zero network requests

Image Resizer

Canvas API + drawImage()

Creates a Canvas at the target dimensions, then drawImage() with the source and destination coordinates. The browser's built-in bilinear interpolation handles the pixel resampling. For downscaling, this produces excellent quality.

100% local

Format Converters (JPG to WEBP, PNG to JPG, etc.)

Canvas API + toBlob() with MIME type

Same as compression, but with a different MIME type in toBlob(). 'image/webp' produces WEBP output, 'image/png' produces PNG. The browser's built-in codec handles the encoding.

100% local

EXIF Remover

Canvas API (EXIF stripped by design)

This is the subtle one. Drawing an image to Canvas and re-exporting it via toBlob() automatically strips all EXIF metadata — because Canvas only stores pixel data, not file metadata. The EXIF removal is a side effect of the Canvas round-trip.

100% local — metadata never leaves your device

Image Cropper

Canvas API + drawImage() clipping

Uses drawImage() with a clipping region — the source x, y, width, and height parameters specify which region of the source image to draw. The canvas is sized to the crop dimensions.

100% local

Brightness & Contrast

Canvas API + getImageData() + putImageData()

Uses getImageData() to access raw pixel data as a Uint8ClampedArray, then iterates through each pixel (RGBA values 0–255) applying the brightness/contrast transformation formula, and uses putImageData() to write back the modified pixels.

100% local

Image Watermark

Canvas API + fillText() + globalAlpha

Draws the source image to Canvas, then uses fillText() or drawImage() to overlay the watermark text or image at the specified position, opacity, and font. The compositing happens entirely in the browser.

100% local

Favicon Generator

Canvas API + custom ICO encoder

Creates multiple Canvas elements at different sizes (16×16, 32×32, 48×48, 192×192), draws the source image to each, then uses a custom ICO encoder written in JavaScript to package them into a .ico file. The ICO format is the only part that required custom code beyond the native Canvas API.

100% local

Performance: Client-Side vs Server-Side

One of the counterintuitive truths about client-side image processing: it's often faster than server-based tools. Here's why:

Processing Time: Client-Side vs Server-Side (1MB JPEG, 80% quality)

StepPixelTools (Client)Typical Server Tool
File upload to server0ms (no upload)800–2000ms
Server queue wait0ms100–500ms
Processing time50–200ms100–400ms
Download result0ms (local blob)300–800ms
Total time50–200ms1.3–3.7 seconds

The elimination of upload and download latency makes client-side processing 10–20x faster for typical images. For large files (5MB+), the difference is even more pronounced.

The Privacy Architecture: Why "We Don't Store Files" is Different From "We Can't Access Files"

Most privacy-focused services say "we don't store your files." That's a policy statement — it relies on you trusting that they're telling the truth and that they haven't been compromised.

PixelTools' privacy guarantee is architectural, not policy-based: we literally cannot access your images because they never leave your browser. There's no server-side code path that touches your image data. Even if our entire infrastructure were compromised, an attacker couldn't access files that never reached our servers.

You can verify this yourself in 30 seconds: open Chrome DevTools (F12) → Network tab → upload an image to any tool on PixelTools → watch the network requests. You'll see requests for static assets (JavaScript, CSS), but zero requests that upload your image data. The image stays entirely within your browser's memory.

This matters most for: photographers sharing sensitive subjects, journalists with source photos, medical professionals with patient images, businesses with confidential product photos before launch, and anyone who simply wants to know their personal photos aren't passing through an unknown server.

Limitations of Client-Side Processing

Being honest about the limitations of our approach:

Complex operations are slower on older devices: Processing a 20MB image with pixel-level operations (brightness, contrast) on a 5-year-old smartphone takes 2–3 seconds. On a modern device, it's under 200ms.
AVIF encoding isn't supported everywhere: The Canvas API doesn't support AVIF encoding in all browsers yet. We use WEBP as our modern format recommendation because it has universal Canvas encoding support.
Advanced compression algorithms aren't available: Browser-native JPEG compression uses standard quantization. Advanced tools like MozJPEG or Guetzli can achieve better compression at the same quality, but require server-side processing or WebAssembly.
Batch processing for 100+ images is slow: Processing 100 images sequentially in the browser is slower than a server farm doing it in parallel. For large batch jobs, dedicated server tools are still the right choice.

For 95% of use cases — single image processing, small batches, mobile use — client-side processing is strictly superior. For the edge cases where server-side is better, we'll be transparent about that rather than pretending our approach is perfect for everything.

See It in Action

Try any of the 18 tools and watch the Network tab in DevTools. You'll see exactly zero image upload requests. That's the architecture working as designed.

Back to BlogBy Alex Morgan · April 5, 2026

We use cookies to analyze traffic and improve your experience. All image processing stays 100% local — we never upload your files. Privacy Policy