How it works
Fit as many prints on a page as the paper allows, without losing a pixel
Photo labs charge per print. A home printer, a pack of photo paper and this page get you the same 4×6-style prints for the cost of paper — and you keep full control of the crop.
It packs the page for youTell it how many photos per sheet and the shape you want. It works out the largest print that fits inside your margins, and shows the exact size and how much of the paper is used.
It never cuts something important without telling youEvery photo carries a badge showing how much was trimmed to fit. Click it to slide the crop, zoom, rotate, or switch to Fit to keep the whole picture.
It saves at print qualitySheets are rendered once at 300 dpi straight from your original files and stored losslessly — PNG, or raw pixels in the PDF. What you see is what the printer gets.
FAQ
Questions people ask
Is this free? What's the catch?
Free, no account, no catch. It's a small tool built to scratch an itch: printing a stack of family photos at home without paying per print. It's open source under the MIT license.
Where do my photos go?
Nowhere. Files are read by your browser, laid out by your browser, and saved by your browser. There's no server behind this page — it's a single HTML file on a static host. You can confirm it yourself: open your browser's developer tools, watch the Network tab, and drop in photos; or turn off Wi-Fi after the page loads and keep working.
One exception worth knowing: the first time you add an iPhone HEIC file, the page fetches a small decoder library from a public CDN (jsDelivr). That request contains no photo data.
Why can't I get exactly 4×6?
You can, if the paper allows. Two true 4×6 prints fit on a letter sheet with room to spare, but a third doesn't. So the default is four per sheet at about 3.4×5.1 inches with quarter-inch margins — the same 3:2 shape, just slightly smaller, using far less paper. Set Photos per sheet to 2 and Max long edge to 6 for true 4×6s, or choose 4×6 as the paper size to print one per sheet on 4×6 photo paper.
What does the −11% badge mean?
That's how much of the photo was trimmed to fill the print shape. Phone photos are 4:3, prints are 3:2, so about 11% comes off the long edge by default. Click the photo and drag to choose which part goes; use Fit to keep the whole photo with white bars instead. Sheets containing a photo trimmed more than 5% get _cropped in their filename so you can double-check before printing.
How do I print at the right size?
In the print dialog choose 100% or Actual size, not "Fit to page" or "Scale to fit". The files carry a 300 dpi tag so most software will get this right by default, but "fit to page" overrides it and shrinks the sheet slightly. Borderless mode is not needed — the default quarter-inch margins keep everything inside the printable area.
Why are the files so big?
Because they're lossless. A letter sheet at 300 dpi is 2550×3300 pixels, and a PNG of that with photos on it lands around 15–25 MB. A JPEG would be a quarter the size but every save would throw away detail, and the point of this tool is that your prints don't. The PDF uses the same lossless pixels, so expect similar sizes per page.
Does it work with iPhone HEIC photos?
Yes. Safari reads them natively; Chrome, Edge and Firefox can't, so on those browsers the page loads a WebAssembly build of the open-source libheif decoder the first time it sees a HEIC. Decoding runs in the background and each file is only decoded once. A big batch of HEICs takes longer than JPGs — the progress bar at the top shows where it's at.
Which browsers?
Current Chrome, Edge, Firefox and Safari on desktop. It works on phones and tablets too, but adjusting crops is easier with a mouse or trackpad. Very old browsers without Web Workers fall back to a slower single-threaded path; the output is identical.
Can I run it offline or on my own machine?
Yes — see the Download tab. It's one HTML file. Open it from your computer and everything works the same, apart from the HEIC decoder, which still needs an internet connection the first time.
Download
Run it on your own computer
The whole tool is one HTML file. Save it, double-click it, and it opens in your browser with no install and no server. Handy if you'd rather not trust any website with your photos, or if you're somewhere without a connection.
You are already running the offline copy. It is the same single file the public site serves.
It's the exact file this page is served from — CSS, code and the zip library are all inside it. Fonts and iPhone HEIC support are the only things fetched from the internet, and the page works without them.
Privacy
Built so there's nothing to trust
The safest place for your photos is where they already are. This page is designed so it can't collect them even if it wanted to.
No uploadsPhotos are opened with your browser's file API and never sent anywhere. There is no upload endpoint.
No server, no accountsThe site is a static file. Nothing runs on the other end, nothing is logged, and there's nothing to sign in to.
No analytics or trackingNo cookies, no third-party scripts beyond the two libraries named on this page, no fingerprinting.
Local storage onlyYour layout settings (paper size, margins) are remembered in your browser's own storage. Decoded HEIC pixels are cached in the browser's private scratch space during a session and cleared on the next visit.
InspectableThe source is a single readable HTML file. View the page source, or check the Network tab while you use it.
Open sourceMIT licensed. Host your own copy, or run it from your desktop.
Licenses
What this is built from
Layout My Prints is released under the MIT License. You may use, copy, modify and redistribute it, with the license notice kept, and it comes with no warranty.
JSZip 3.10.1
Packages the exported PNG sheets into a zip; embedded in this page. Dual-licensed MIT or GPL-3.0-or-later; used here under MIT. Copyright (c) 2009–2016 Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso. github.com/Stuk/jszip
libheif-js 1.23.2 (libheif and libde265 compiled to WebAssembly)
Decodes iPhone HEIC files in browsers that can't. Licensed LGPL-3.0. It is not bundled with this page or the offline copy; it's fetched from jsDelivr as a separate, replaceable file only when a HEIC is opened, which is how the LGPL intends libraries to be used. Sources: libheif-js, libheif. HEIC images are HEVC-encoded, and HEVC is subject to patent pools in some jurisdictions; this project distributes no HEVC decoder.
IBM Plex Sans and IBM Plex Mono
Loaded from Google Fonts, with a system-font fallback. SIL Open Font License 1.1. github.com/IBM/plex