Drop photos in, tweak details, export a ready-to-use bundle.
Everything happens in your browser — your images never leave
your computer.
The three-minute workflow
- Import. Click Import Images on the home view or drag a folder onto the window.
- Tweak (optional). Open Edit Images to add alt text, crop, or rotate.
- Export. Click Export, pick a preset, hit the big button. You get a ZIP with the optimised images and the HTML snippet to paste on your site.
That's it for most users. The rest of this page explains the more advanced details only when you need them.
Importing photos
Three ways to bring photos in:
- Drag-and-drop onto any part of the window.
- Click Import Images on the home view.
- Click Add Your Photo from inside the gallery.
Supported input: JPG, PNG, WebP. The app will also accept GIF (first frame only) and iPhone HEIC files, but those aren't advertised because results vary by browser.
Up to 100 images per session. Imported images stay in your browser for 14 days, then are auto-deleted. Click Clear all from the gallery to wipe them sooner.
The gallery
Each imported photo gets a card showing its thumbnail, filename, dimensions, and a small alt-text input. From the card you can:
- View & Edit (eye icon) — opens the full image in the lightbox where most of the work happens.
- Rename (pencil icon) — changes the base filename used in exports. Letters, numbers and hyphens only.
- Delete (bin icon) — removes the image from this session.
- Inline alt text — type a short description for accessibility and SEO. Saves automatically when you click out.
You can also select multiple images with the checkboxes and use the gallery's Export selected button to export just those.
Viewing & editing images
There are two full-screen views, both opened from the home screen and both navigable with the arrow keys:
- View Images — a clean viewer for just looking: the picture plus Play jigsaw, Print and Delete. Tapping any photo in the gallery opens this too.
- Edit Images — the full editor described below (alt text, metadata, crop/rotate, file-size estimate, export).
Alt text
A short description of what's in the image. Gets baked into the generated <picture> snippet as the alt attribute. Critical for screen readers and image search. Two or three concrete words is usually enough — describe what the image is, not "image of …".
More metadata fields (collapsed by default)
Optional fields that get exported as a Schema.org JSON-LD block alongside the <picture> snippet. Fill them in and Google's image search has better information to work with:
- Title — short headline. Also becomes a hover tooltip on the rendered image.
- Description — longer caption.
- Author / Photographer — your name.
- Copyright notice — e.g.
© 2026 Your Name.
- License URL — link to your terms (Creative Commons, etc.).
- Keywords — comma-separated.
Leave any field empty and it's omitted from the output. If all six are empty, no JSON-LD block is generated at all.
Estimate export size & Compare
The bar shows the original file size on the left. Click Estimate export size to run the real export pipeline on this one image and see the actual byte savings. Click Compare to swap the displayed image between original and the encoded preview — useful for checking quality before you commit to a full export.
Edit (crop & rotate)
Opens a dedicated editor with:
- Rotate 90° clockwise / counter-clockwise
- Flip horizontal / vertical
- Crop — drag a region on the image, then drag handles to resize or drag the box to move it. The aspect-ratio chips (Free, 1:1, 4:5, 16:9, 9:16, 3:2, Original) constrain the crop to common ratios. A rule-of-thirds grid appears inside the crop region as a composition guide.
- Social size — pick a platform target (Instagram, Facebook, X/Twitter, etc.) or Custom size… to type your own width × height. A correctly-shaped crop box appears ready to position; on Save the cropped area is resized to exactly that pixel size. A note warns if your selection is smaller than the target (it would be enlarged).
Click Save changes to bake the edits into a new image. Cancel discards. If you cropped a 4000×3000 photo to 1:1, your saved version is exactly the cropped pixels — no upscaling.
Delete / Print / Export this image
The toolbar lets you delete from inside the lightbox (with confirmation), print just this image (uses your printer's print dialog, no app chrome printed), or export this one image as a ZIP using your current export settings.
Export options
Size presets
Pick one from the dropdown:
- Standard — Max image 1400 px (default)
- Standard-1200 — Max image 1200 px (smaller default)
- Compact — 500 / 800 / 1200 px
- Large — 800 / 1200 / 1600 px
- Extended — 600 / 1000 / 1400 / 1800 px (more variants, larger bundle)
Or set a single custom width if you need an exact dimension.
Social media sizes
Tick any sizes you want — the four universal shapes people post everywhere (Square, Portrait, Landscape, Wide landscape) plus the recommended sizes for each platform (Instagram, Facebook, Twitter/X, LinkedIn, YouTube, Pinterest, TikTok — stories, headers, covers, thumbnails, Pins and banners). Each ticked size gets centre-cropped and exported as a separate JPG into its own folder inside the ZIP. (For per-photo control over what stays in frame, use the guided Make social media images task and choose Position each photo myself.)
Settings panel
The collapsed Settings button at the bottom of the Export overlay opens advanced controls:
- WebP / JPG quality — 1–100 sliders. Defaults are 82 and 85.
- Output format — WebP + JPG (default), WebP only, or JPG only.
- Max output dimension — caps every output width to this number. Useful for one-off exports of a small image.
- Folder structure — All in one folder or Per-image folders.
- Watermark — see below.
Watermark
Off by default. Pick a bundled mark (AI Generated, Public Domain, Copyright, Share Freely, Original Work, Sample) or upload your own PNG / SVG. Position is bottom-right (default) or bottom-left only — no centre or full-image overlay. Size and opacity are adjustable. Applies to every exported image and every variant.
What you get on export
A ZIP file (or, on Chrome/Edge, a folder you choose via Save to Folder) containing:
- An
images/ folder with each output size, in each format. E.g. my-photo-600.webp, my-photo-600.jpg, my-photo-1000.webp, …
- A
.picture.html snippet per image containing a complete <picture> element with srcset, sizes, alt, loading="lazy", and (if you filled them in) a Schema.org JSON-LD block.
- Social media folders (only if you ticked any) — e.g.
square/my-photo-std-square.jpg, instagram-story/my-photo-ig-story.jpg.
- A
_README.txt with a summary of what's included.
Copy the contents of any .picture.html straight into your site's HTML — no further editing needed.
Make a montage
The Make a montage task combines several photos (up to nine) into one image to print or post. Pick your photos and a size, and they're auto-arranged into a tidy layout. Choose a style:
- Grid - equal-sized cells.
- Mosaic - different-shaped photos that fit together.
- Feature - one large photo in the middle with the rest around it.
Sizes cover the social shapes (Square, Portrait, Landscape, Wide) and common home-printer sizes (6x4, 7x5, 8x6, 10x8, A4, Letter) at 300 dpi. You can drag a photo inside its frame to choose what stays in view, drag one photo onto another to swap them, shuffle the order, add an optional title, and set the gap and background colour. It exports a single image you can save, share, or print.
Playable jigsaw puzzles (Photo Gallery export)
When you build a Photo Gallery web page (the export that produces a ready-to-upload gallery site, not the plain Resize or Social bundles), every photo becomes a playable jigsaw puzzle for your visitors — on by default, with no extra setup, accounts, or plugins.
Difficulty & switching it off
The jigsaw is on by default. In the Photo Gallery export's advanced options you'll find Include a playable jigsaw puzzle under each image already ticked — untick it if you want a gallery without the game. The Default puzzle difficulty dropdown sets the level each puzzle opens at:
- Easy — about 9 pieces.
- Medium — about 16 pieces.
- Hard — about 30 pieces.
This sets the difficulty the puzzle opens at; your visitors can switch between Easy, Medium and Hard at any time while playing. The exact piece count adapts to each photo's shape so the pieces stay a sensible size.
What your visitors see
On the published gallery, a Play jigsaw button appears under each image and inside the image viewer (lightbox). Clicking it opens that photo as a real jigsaw — pieces are scattered, snap together into connected groups as they're placed, and the puzzle celebrates when it's complete. There's a difficulty switcher and a sound toggle inside the puzzle. Everything runs in the visitor's own browser; like the rest of the app it makes no network calls and needs no sign-in.
Speed & what gets exported
The puzzle engine is loaded only when a visitor first clicks Play jigsaw, so it never slows down the initial page load for people who just want to browse. Enabling the option adds two shared files — jigsaw.css and jigsaw.js — into the gallery's shared-code folder (alongside photohelper.css / photohelper.js). Upload the exported gallery folder as you normally would and the puzzles work on your live site automatically.
Privacy
Your images are decoded, resized, and re-encoded entirely in your browser - they are never uploaded. EXIF metadata (GPS coordinates, camera info, timestamps) is read once to apply rotation correctly and then discarded, so none of it goes into exported files.
The app itself makes zero network requests - no analytics, no telemetry. You can verify this in your browser's developer tools (Network tab).
This free version is supported by adverts (such as Google AdSense and Amazon). Those load from the advertisers' own servers and may set cookies, as described in their own notices and the website's privacy & consent settings — so the free version is not request-free. Your photos are unaffected: they are still processed only in your browser and are never sent to us or to any advertiser. The paid version carries no adverts and makes zero network requests.
Keyboard shortcuts
- Esc — close any overlay (lightbox, editor, gallery, settings)
- ← / → — previous / next image in the lightbox
Why image optimisation matters in 2026, how you'd do it by hand
with free tools, and where this app fits in.
Why bother?
An unoptimised modern phone photo is typically 4–10 MB. Modern AI-generated images can be much bigger still — Midjourney's latest output is routinely 7–15 MB per image. A single such photo on your homepage is bigger than the entire HTML, CSS, and JS of most websites combined.
That has four real costs:
- Search rankings. Google uses page speed as a ranking signal and has done since 2018. Slow pages rank lower. The Core Web Vitals metric most affected by images is Largest Contentful Paint (LCP) — Google explicitly recommends LCP under 2.5 seconds, and a single 8 MB hero image will blow past that on mobile data every time.
- Mobile data. Roughly half your visitors are on a phone. A 50 MB page costs them real money on capped plans, and many will just leave before it loads.
- Bandwidth cost. If you pay for hosting by the GB, oversized images are a direct bill.
- Accessibility. Images without alt text are invisible to screen reader users and to image search.
The manual workflow (without this app)
Here's what proper image optimisation looks like by hand. Per image. Per page.
- Open the photo in a free editor like GIMP, Photopea (a browser-based GIMP-alike) or Krita.
- Crop and rotate to your composition.
- Resize a copy to your largest target width (say 1400 px), without overwriting the original.
- Export As → JPEG, choose quality ~85, strip EXIF, save.
- Repeat for each width you want — 1000 px, 600 px. That's three JPGs so far.
- Now do all three again as WebP. Six files.
- Hand-write the
<picture> element. Get srcset and sizes right. Add width, height, alt, loading="lazy", decoding="async".
- Write the alt text. (If you're doing this properly, also write a longer description and decide on a copyright notice.)
- Repeat for each social platform you post to — Instagram square (1080×1080), Pinterest pin (1000×1500), YouTube thumbnail (1280×720), each centre-cropped to the right aspect ratio.
- Upload everything to your site and reference each filename correctly.
Realistic time per image, with practice, is 10–15 minutes. For a 12-image blog post that's two to three hours. The reason most sites don't bother is purely that.
How this app helps
Same workflow, condensed:
- Drag photos in.
- Type alt text (optional — five seconds per image).
- Click Export.
For each photo, the app produces the WebP + JPG variants at every size you asked for, plus social media crops, plus the <picture> snippet ready to paste. EXIF is stripped. Quality settings are sensible defaults you can override. A 12-image blog post takes about five minutes instead of three hours.
What the app deliberately does not do: replace a proper editor. If you need to retouch, paint, do colour grading, fine-tune curves, or remove objects from a photo, you still want GIMP. This app is for the optimisation step after you've decided what photos go on the site.
SEO benefits in detail
Page speed → ranking
Google's Core Web Vitals are now a confirmed ranking factor. The three metrics:
- Largest Contentful Paint (LCP) — should be ≤ 2.5 s. Almost always determined by the biggest image on the page.
- Interaction to Next Paint (INP) — responsiveness to clicks/taps. Not image-related directly.
- Cumulative Layout Shift (CLS) — should be < 0.1. Images without explicit
width and height cause layout shift. The generated snippet always includes these.
Image search visibility
Google Images is the world's second-largest search engine after regular Google. To get into it you need:
- Alt text that describes what's in the image.
- Filenames that read like English, not
IMG_4521.JPG. The app's Rename feature is for this.
- Structured data via JSON-LD — see the More metadata fields in the lightbox. Filling in title, description, author, copyright tells Google's image search exactly what it's looking at.
- Page context — Google reads the heading and text around the image. The app doesn't help with that, but it makes everything else easier.
Modern formats
WebP is roughly 25–35% smaller than JPG at the same visual quality. Every modern browser (Chrome, Edge, Firefox, Safari since 2020) supports it. The <picture> element lets you serve WebP to browsers that handle it and JPG to anything else — automatically, no JavaScript needed:
<picture>
<source type="image/webp" srcset="my-photo-600.webp 600w, ...">
<img src="my-photo-1000.jpg" srcset="..." alt="…" loading="lazy">
</picture>
AVIF would compress better still (40–50% smaller than JPG), but native browser AVIF encoding is unreliable in 2026 — many browsers silently fall back to PNG when asked, producing mislabelled files. This app deliberately doesn't ship native AVIF for that reason. A separate WASM-based AVIF module is planned for users who need it.
Responsive images explained
A 1400-pixel-wide image looks great on a desktop monitor, but is six times too big on a phone in portrait orientation. The phone downloads all those pixels anyway and throws away the ones it doesn't use. That's wasted bandwidth on the device with the worst connection.
The srcset + sizes attributes let the browser pick the right size for the actual display. On a 360-pixel-wide phone screen, the browser fetches the 600 px version. On a 4K desktop, it fetches the 1400 px version. You ship one HTML snippet; the browser does the right thing.
Social media images
Every platform has its own dimensions, and every platform re-compresses what you upload — often badly. Two practical implications:
- Match the platform's expected size before you upload. If you upload a 4000-pixel-wide image to Instagram, it gets compressed twice (your encoder + Instagram's). Upload at exactly the intended size (1080×1080 for square, 1080×1350 for portrait, 1080×1920 for story) and quality holds up better.
- Aspect ratio matters more than absolute size. An Instagram square that's actually 4:5 gets cropped, often badly. The app's social presets centre-crop to the exact platform dimensions so you control where the crop happens.
Every platform offers the four standard shapes people actually post — Square 1080×1080 · Portrait 1080×1350 · Landscape 1620×1080 · Wide landscape 1920×1080 — plus that platform's recommended sizes:
- Instagram — Story / Reel 1080×1920 · Feed landscape 1080×566
- Facebook — Shared post 1200×630 · Cover 851×315 · Story 1080×1920
- Twitter / X — Header 1500×500 (its posts are simply the standard shapes above)
- LinkedIn — Shared post 1200×627 · Banner 1584×396
- Pinterest — Standard Pin 1000×1500 · Long Pin 1000×2100
- YouTube — Thumbnail 1280×720 · Channel banner 2560×1440
- TikTok — Full-screen 1080×1920
Alt text — short, specific, no padding
The single best thing you can do for image accessibility and SEO at once. Three rules:
- Describe what the image is, not "image of". Bad: "Image of a dog". Good: "Tan terrier sitting in a flower bed".
- Don't keyword-stuff. Search engines penalise it and screen readers literally read every word out loud.
- Decorative images get empty alt. The snippet's
alt="" is intentional for purely decorative photos. If the image carries no information your text doesn't already convey, leave the alt field blank.
Free tools worth knowing
- GIMP — the classic free editor. Linux, Mac, Windows. Powerful, fairly steep learning curve.
- Photopea — browser-based GIMP/Photoshop alike. Works on a Chromebook or any machine without installing anything. Free with a small ad.
- Krita — free, focused on digital painting and illustration rather than photo editing.
- Squoosh — Google's single-image optimiser. Excellent for fine-grained quality control on one photo at a time. This app is roughly the bulk-batch equivalent.
- Browser DevTools → Lighthouse — built into Chrome and Edge. Runs a full performance audit on any page and tells you exactly which images are slowing you down.
One concrete checklist
Before publishing any page with images:
- Total image weight under 1 MB if at all possible. Use this app's Estimate export size to verify.
- Every meaningful image has alt text.
- Every image has explicit
width and height on the <img> (the snippet always does this).
- Hero images use
loading="lazy" only if they're below the fold; if they're the LCP element, drop the lazy.
- Filenames are human-readable.
- Social images are pre-cropped to platform dimensions, not uploaded raw.
This app handles the first four automatically once you've imported your photos. The last two need a moment of thought from you.