Portfolio·Guide

Resolution vs performance for portfolio images

A hero that looks crisp on your MacBook can look soft on a phone and expensive on a cellular connection. Portfolio delivery is a resolution × device-pixel-ratio × format problem. Get the math once, then let a real media pipeline do the repetitive work.

Delivery basics

What actually decides sharpness on the web

  1. Modern formats first

    In 2026, AVIF and WebP are the default delivery lane for photography on the web, not optional enhancements. JPEG remains a compatibility fallback, not the primary export you should hand a CDN.

  2. DPR is why phones look soft

    A 375px-wide CSS layout at 2× device pixel ratio is asking for roughly a 750px-wide asset. At 3×, you are closer to 1125px. “Looks sharp on my laptop” never ran that request.

  3. Different surfaces, different budgets

    Full-bleed heroes, grid thumbnails, and lightbox full-views need different pixel and byte targets. One export setting cannot honestly serve all three.

  4. EXIF is not copyright

    GPS and camera trails are a privacy policy problem, not proof of authorship. Keep color-profile handling intentional. Attribution lives in contracts, notices, and registration.

The 2026 baseline

Generic guides still talk as if WebP were exotic. For photography and high-detail stills, AVIF often lands noticeably smaller than WebP at comparable visual quality; WebP remains the broad modern default when AVIF is unavailable. JPEG is for awkward clients and legacy edges, not for your primary public grid.

On ArtInStack, Cloudflare Image Resizing serves `format=auto` so the edge picks AVIF or WebP from one master, not a folder of hand-exported codec variants. Encoders change year to year; treat “30–50% smaller” claims as directional. What matters for a portfolio is perceptual quality at a byte budget the page can afford.

DPR math, worked once

Layout width is CSS pixels. Sensor sharpness on the device is closer to CSS width × devicePixelRatio. Example: a phone gallery column at 375 CSS px and DPR 2 should be backed by an asset nearer 750 px on the long edge for that slot, not your 2400 px master dumped into every img tag.

That is also why a “retina export” that only exists as one huge JPEG fails twice: it wastes bandwidth on thumbs and still isn’t described to the browser as a responsive set. srcset / sizes (or a platform equivalent) is how the right candidate is chosen.

Portfolio size targets you can actually use

Developer blogs quote one hero number. Portfolios need a small matrix. Use these as planning bands, then let ArtInStack generate variants. Don’t hand-maintain five folders forever.

SurfaceTypical max widthByte budget (directional)Notes
Full-bleed hero~1600–1920 CSS px (serve 2× candidates as needed)Often ~80–150 KB with modern codecsOne strong frame; avoid shipping a 4K master to every visitor
Grid thumbnail~400–800 px asset for common column widthsTens of KB each when packed wellMany per page; byte budget multiplies fast
Lightbox / full view~1600–2400 px depending on layoutHigher than thumbs; still not a RAWLoad on demand; don’t preload every lightbox candidate

Surface-aware delivery (not one export forever)

Dense grids and lightboxes have different cost curves. One “compress to 80% JPEG” setting cannot honestly serve both.

ArtInStack splits the job on purpose: portfolio grids prefer a generated thumbnail (one efficient image per tile) so a 40-image page stays cheap and fast. When a visitor opens a frame, lightbox and photo-detail views pull from your master through Cloudflare Image Resizing (modern formats via `format=auto`, with responsive width candidates). Sharpness shows up where someone is actually looking.

EXIF, GPS, and what photographers worry about

ArtInStack extracts and stores EXIF (including GPS when present) for Media and map features. Public location display is a publication policy (redact or hide per portfolio), not a promise that every CDN derivative silently erases the trail.

Client shoot locations in GPS tags are still a privacy problem for public pages. Decide what visitors should see. Accessibility belongs in alt text you write, not in leftover camera metadata. Copyright is not “whatever EXIF survived the hop.” Put attribution in visible credits, watermarks you chose, and legal terms.

One master, delivery by surface

You upload a master you trust. ArtInStack keeps that master, generates a lightweight thumb for grid scanning, and uses Cloudflare image transformation from the master when a visitor opens the work. Hierarchy on a public page: grid tiles → thumb first; lightbox / photo detail → Cloudflare candidates from the master. You still choose master quality and crop intent. You should not maintain three export folders by hand.

SurfaceWhat ArtInStack servesWhy
Portfolio gridGenerated thumb (single efficient image)Many tiles per page; bytes multiply fast. Avoid a transform per tile by default
Lightbox / photo detailCloudflare from master (`format=auto` + width candidates)Someone is looking closely: serve sharpness and modern codecs on demand
Your libraryMaster preservedProofing quality stays yours; web delivery is derived, not a silent rewrite of the original

Good delivery vs fake “optimization”

Good: derive lighter public assets from a master you still own. Bad: a host recompresses your upload into one soft “web JPEG,” calls it optimization, and still ships that same file into every grid cell. That is disk savings dressed as performance. See The myth of unlimited storage.

For layout choices that change how large a tile is on the page, read The layout trap: aspect ratios and CSS grids. For how heavy a library can get on disk, use the Photography Cloud Storage & Cost Estimator.

Sharp where it matters, light where it multiplies

Upload masters you trust. Grids stay on thumbs; open views get Cloudflare-smart candidates, so the page stays fast without looking soft.

Also in Guides: The layout trap: aspect ratios and CSS grids · Video-first portfolio presentation · The myth of unlimited storage

All Portfolio guides · Guides home