Slate is an image editor that runs entirely in your browser. No install. No upload. Nothing leaves your device.
It's one HTML file (~200 KB). You can use it online, or download it and open index.html directly from your disk — same app, fully offline.
There are four ways to open an image:
After opening an image via drag, paste, or fallback file picker, Slate suggests picking a workspace folder. This is a single folder on your disk where edited images will be saved as sidecar files. Once set, Ctrl+S saves there directly with no dialog.
Selection tools all work the same way: draw a rectangle on the canvas, adjust it, then apply. Hold Shift while dragging to lock to a square. Nudge with arrow keys (Shift + arrow for 10 px).
Commit with Enter or the floating Apply button. Cancel with Esc.
Each annotation lives as an editable layer. A floating Layers panel at the top-right of the canvas lists every layer with move-up/down, show/hide and delete controls. Layers flatten into the image automatically on Save or when you apply a transform (crop, rotate, flip, resize, sharpen, adjust). Undo and redo work across both layer changes and destructive transforms — pre-flatten layer state is recovered correctly.
Whenever a drawing tool (pencil, arrow, shape) is active, the floating bar shows that tool's settings — colour picker, thickness slider, and tool-specific extras. Each colour you use is remembered as a small recent-swatch shown next to every colour picker (drawing tools' bar and the text modal). The list keeps the last 8 colours and persists across reloads; click any swatch to apply that colour instantly.
I activates the eyedropper. Click any pixel on the image to capture its colour. The hex value goes to your clipboard and is applied to all four annotation tools' colour settings (pencil, arrow, shape, text). The eyedropper then returns to whichever drawing tool you came from, so the new colour appears in the bar immediately and you can keep working without re-clicking the tool.
Non-selection operations that affect the whole image:
History goes back 50 steps. Ctrl+Z to undo, Ctrl+Shift+Z to redo. The history resets when you open a new image.
Slate gives you three ways to save, and a smart default:
Saved files are timestamped with yymmddhhmmss, e.g. photo-260424143005.jpg. This means successive saves always get unique names and you can trace each file back to its vintage.
Slate remembers your last open file and edits. If you refresh the page or come back later, it offers to resume where you left off. The original file contents are stored locally in IndexedDB — never uploaded. Layers (text, arrows, pencil, shapes) also survive a reload — the resume dialog brings back both the image and the editable layer stack you had.
The four buttons at the bottom of the toolbar (above Help) operate on a folder of images, not a single open file. They light up once you've opened a folder via Ctrl+Shift+O or set a workspace folder.
Plays the current album as a fullscreen slideshow.
Apply one or more transforms to every image in a folder. Tools → Batch.
{original}, {index}, {counter:04}, {date}, {camera}, {w}, {h})batch-output/ subfolder, a different folder, or overwrite-in-place (with confirmation)Tools → Contact sheet / gallery turns the current album into one of two artifacts:
gallery.html file with thumbnails as data URLs, click-to-zoom lightbox with arrow-key navigation. Self-contained — share it, host it, open offline. Optional embed of the full-size images so the gallery page travels with the originals.Tools → Lossless JPEG rotate. For a JPEG file open in Slate, this rotates the file by 90° / 180° / 90° CCW without re-encoding — only the EXIF orientation tag is flipped. The pixel bytes stay untouched, so quality loss is exactly zero. Any modern viewer (browser, photo app, OS thumbnail) honours the orientation tag and renders the image rotated.
Read: JPG, PNG, WebP, GIF (first frame), AVIF, SVG, BMP — natively. HEIC / HEIF via Safari's built-in decoder when available, falling back to a tiny WASM library lazy-loaded the first time you open one. TIFF, JPEG-XL, PSD via the same lazy-load pattern. TGA and DDS are bundled into the page (the libraries are small enough). RAW files (CR2, NEF, ARW, DNG, RAF, ORF) are read by extracting the embedded full-resolution JPEG preview that every TIFF-based RAW container carries — no full sensor demosaicing, but enough to view, crop, and re-export.
Write: PNG, JPEG, WebP, TIFF. Tools → Lossless JPEG rotate also writes JPEGs that have only their EXIF orientation tag flipped — pixel bytes untouched, zero quality loss.
The first time you open a format that needs a CDN-loaded decoder, you'll see a "Loading X decoder…" toast for a moment. After that, the browser caches it.
Slate runs entirely in your browser. No network connection is needed after the page loads — the HTML file has no external dependencies.
When you open a JPEG, Slate parses its EXIF metadata and shows basic fields (camera, date, ISO) in the image info panel. When exporting, EXIF is stripped by default — the canvas re-encode naturally removes it. Uncheck Strip EXIF in the export dialog to re-embed the original EXIF into JPEG exports.
A condensed reference. Full list available in the in-app help (?).
| Open file | Ctrl+O |
| Open folder | Ctrl+Shift+O |
| Paste | Ctrl+V |
| Smart save | Ctrl+S |
| Export dialog | Ctrl+Shift+S |
| Undo / Redo | Ctrl+Z · Ctrl+Shift+Z |
| Fit to window | Ctrl+0 or double-click |
| Crop / Redact / Blur / Pixelate | C · R · B · X |
| Text / Arrow / Freehand / Shapes | Shift+T · A · P · S |
| Eyedropper | I |
| Prev / next image | ← · → |
| Fullscreen | F |
| Help | ? |