Crop it, compress it, annotate it, gallop. Free in your browser. No account.

Aug 2025Sep 2026
17 Sep 20269 of 9
Today: presets you preview on the photo before you keep them, an Original / Edited split to see what changed, and a Viper shrunk 92% without leaving the tab.v8.79 ↗
Nothing leaves your tab by accident.
Image Horse is a Rust engine compiled to WebAssembly. Editing happens on your own CPU, in the page, on every tier — including the free demo. Some things do reach a server. This table is where we say exactly which, so the choice is yours to make rather than ours to bury.
| Operation | Runs on | Detail |
|---|---|---|
| Crop, filters, transforms | Your machine | Rust → WASM, SIMD128 kernels |
| Layers, annotations, Bézier pen | Your machine | Real layer stacks, per-layer opacity |
| Encode PNG · JPEG · WebP · AVIF | Your machine | Resize and re-compress in one round-trip |
| Originals and edit history | Your machine | IndexedDB, undo to 1000 steps |
| Camera metadata | Your machine | Keep it, strip it, or drop GPS only |
| Background removal, object removal, OCR | Server, signed in | rembg · LaMa · Convex → Replicate |
| Cloud sync and share links | Server, signed in | Optional — the demo never uploads |
The engine is roughly 310 KB gzipped. That is the whole download, and after it lands the tab does the work.
In the editor
Brightness · Contrast · Blur · Crop · Align · Magic-wand select · Live histogram · Stroke stabilizer · Rectangles · Ellipses · Arrows · Bézier pen with fill · Callout pins · Text with drop shadows · Emoji · Blur, pixelate and black-box redaction · Layer masks · Eraser · Rulers and grids · Batch logo stamping · Grid mosaic gallery · OpenRaster export · Light, dark and system themes
Everything above is free and local. Sign in only when you want persistence, share links, or the AI passes — and the padlock in the UI tells you which is which before you click.
Your GPU does this blur 17× faster.
Measured against the engine's own SIMD blur on real hardware, not estimated: 5.3× at 512 pixels, 17.6× at 2048, and 53.8× once the radius gets wide. There is no crossover — the GPU wins on a single image.
None of it touches a pixel in the editor yet. It sits behind an opt-in flag while the correctness harness runs, because the GPU library does not fit the engine's size budget and the path has to live outside the WebAssembly boundary. When it lands it will be the same picture, sooner.
The letters are the real thing. Click, drag or press a key — they spring back.
From the blog
The Trail Log says what shipped. These are the ones that needed the argument written out — the decision, what it cost, and the measurements it was made on.
We moved the engine off the main thread. The pixels stayed put.
How Image Horse moved its Rust engine into a worker without ever sending a frame across a thread boundary — and why the obvious way to do it is impossible.
Open an image. No account, no upload.
Once it loads, the network is optional. Drop your connection mid-edit and nothing stops — none of the work was leaving this machine anyway. The editing happens in this tab, not on a server, so there is nothing to be slow and nothing to go down.