Smol for web agencies & developers

Image Optimization Workflow for Client Websites, on a Mac

Your build step cannot fix the camera original a client emails at five o’clock or the one an editor drags into the media library. Smol runs on your Mac, turns those originals into correctly sized AVIF, WebP and JPEG in batches from one written settings table that your whole team can follow, and uploads nothing.
  • Client originals to AVIF, WebP or JPEG in one batch
  • One settings table per slot, so nobody guesses a quality value
  • By default, originals stay untouched and results land beside them
  • Coding agents can drive it over MCP

$29 once per Mac · No subscription · Files never leave your Mac

Smol’s completion screen after a batch: 128 files complete, 2.4 GB before, 310 MB after, 87% saved, 2 minutes 41 seconds elapsed
By the Smol team12 min read

An image optimization workflow for client websites has four steps: keep the originals untouched, resize each image to the widest size its slot renders, encode AVIF with WebP or JPEG fallbacks, and give the client a written rule so the next upload does not undo the work. Smol covers the first three on your Mac. The rest of this page covers all four.

Which tool does the job depends on where the image enters the project, not on which encoder is best:

Which tool fits each way images reach a client project
Where the image comes fromRight toolWhat to set
Client or designer originals, before the repo or CMSSmol on a MacAVIF with a JPEG or WebP fallback, resized to the slot
Images committed to the repo and built by CIA build-time library such as sharpEncode in the pipeline, fail the build over budget
Images editors upload to the CMSA CMS plugin or an image CDNResize and convert on upload
Images the site’s visitors uploadA server-side transform or an image CDNNever a desktop app
One-off assets: press kits, README shots, social cardsSmol on a MacDefaults first, then check the file

Where do client sites lose their image bytes?

One place is the handoff. The templates can be flawless and the page still ships a camera original because someone dropped it into the media library on a Friday. Images account for the most bytes on the web: the HTTP Archive Web Almanac 2025 found the median desktop page used 1,059 KB of images and the median mobile page 911 KB, out of a median home page of 2.86 MB on desktop and 2.56 MB on mobile. Images accounted for the most bytes, ahead of JavaScript and fonts.

Those bytes show up in Largest Contentful Paint, which is judged at the 75th percentile of real page loads. A good value is 2.5 seconds or less and anything over 4.0 seconds is poor, per web.dev. Interaction to Next Paint should be 200 ms or less and Cumulative Layout Shift 0.1 or less (web.dev on the three vitals).

Be precise about what file compression can change. Google splits LCP into four sub-parts, with guideline shares of about 40% for time to first byte, under 10% for resource load delay, about 40% for resource load duration and under 10% for element render delay (web.dev, optimize LCP). A smaller file moves one of the four. Discovery, priority and reserved space are markup, and that is developer work that no compressor does for you. We cover it in image optimization for Core Web Vitals, measured and the how-to in image optimization for web developers. This page assumes you have read those or already know them.

What is specific to an agency is how the bytes arrive. Three doors: originals the client or a photographer sends you, exports your own designers make, and files the client’s editors upload after launch. You control the first two, and you can fix them in a folder. The third needs a rule, a plugin or a CDN, and the later sections say which.

What limits will the CMS and the browser put on your images?

Image limits and thresholds that shape client website deliverables, each with its source, read 9 October 2026
ConstraintFigureSource
Good LCP2.5 seconds or less at the 75th percentile; poor above 4.0 secondsweb.dev: LCP
Good INP and CLSINP 200 ms or less; CLS 0.1 or lessweb.dev: Core Web Vitals
Image bytes on the median page1,059 KB desktop, 911 KB mobile (2025)Web Almanac 2025
WordPress automatic downscalingImages over 2560 px on either side are scaled down by default (since 5.3.0); the threshold is filterableWordPress developer reference
WordPress AVIFUploads work from 6.5 if the host’s image library supports AVIF; check Tools, Site Health, Info, Media HandlingWordPress core blog
WebflowImages must not exceed 4 MB; lists PNG, JPEG, GIF, SVG, WebP and AVIF (developer documentation)Webflow Data API docs
ShopifyUnder 20 MB, up to 5000 × 5000 px or 25 megapixels; lists PNG, JPEG, TIFF, BMP, GIF, SVG, HEIC and WebPShopify Help Center
Squarespace20 MB limit, 500 KB or less recommended, 2500 px wide ideal; accepts only .jpg, .gif, .png, .webpSquarespace Help
AVIF in browsersAbout 96% of users; Chrome 85, Firefox 93, Safari 16.4, Edge 121caniuse: AVIF
WebP in browsersAbout 97% of users; Chrome 32, Firefox 65, Safari 16.0, Edge 18caniuse: WebP
Formats Google Search supportsBMP, GIF, JPEG, PNG, WebP, SVG and AVIFGoogle Search Central

Two things stand out. Webflow’s 4 MB is the tightest cap here and a full-size camera original can exceed it, while the 20 MB caps on Shopify and Squarespace reject only the largest. The Webflow figure is from its developer documentation, which is where we could open it, so confirm it in the Designer before you quote it to a client. The surprise is format acceptance. Shopify’s help page lists no AVIF and Squarespace says only .jpg, .gif, .png and .webp, so a blanket “convert everything to AVIF” rule breaks uploads on some hosted builders. AVIF belongs in files you host yourself, behind a <picture> element with a fallback, as MDN advises. For Shopify and Squarespace, deliver WebP or JPEG; Webflow’s documentation lists AVIF, so check the platform you are on.

WordPress needs a second look. It downscales anything over 2560 px, but the core team’s 5.3 announcement says the original image file is stored in the uploads directory, and wp_get_original_image_path() returns where it is. A multi-megabyte original keeps sitting in the uploads folder and in your backups. Downscaling is not the same as never having uploaded it.

Limits change with plans and platform releases, so treat the table as a dated snapshot. For any other CMS, search its help center for “image upload” and write the number into your handoff document.

Which Smol settings should an agency standardize on?

Start from this table, then adjust it against three of the client’s worst images. Quality numbers are not comparable across AVIF encoders, so judge the output, not the number.

Suggested Smol settings by website deliverable
DeliverableFormatQualityMaximum dimensionNotes
Hero photo, self-hostedAVIF65 to startWidth 800, 1600 and 2400 px, one run per rungThe default 2000 px cap would quietly shrink the 2400 rung
Same hero, fallbackWebP or JPG75 (default)Same rungsJPG through Compress; at 75 or below it uses 4:2:0 chroma
Content-width figureAVIF65 to start720 and 1440 pxTwo rungs is enough
Card or thumbnailAVIF or WebP65 / 75400 and 800 pxThe 800 rung covers 2× phones
Hosted builder (Shopify, Squarespace)WebP or JPG75Squarespace: 2500 pxNeither help page lists AVIF
Screenshot with colored textJPG90 or higherRaise the 2000 px cap if captures are largerCompress with output JPG; 4:4:4 chroma starts at 90
Background loop videoMP4, H.264“Web” (CRF 28)Reduce resolution; remove audioH.264 plays on more browsers than H.265; see H.265 vs H.264

The width ladder is the one from our developer guide: 800, 1600 and 2400 for a full-bleed hero, 720 and 1440 for a content figure, 400 and 800 for cards. A srcset width descriptor has to match the file’s real width, so set the resize mode to width at the rung and open one output to check its pixel width before you run the batch. Use fit only to cap oversized originals, because it limits the longer edge and a portrait image then comes out narrower than the rung. Smol also has presets, which save a set of settings on that Mac; check that a preset holds the format, quality and size you need before you rely on it. The table is the recipe.

Three defaults to know before a client batch. By default, output is a copy next to the original with a _compressed suffix, so originals are not overwritten. Images are resized to fit 2000 × 2000 px unless you change it, and that default is wrong for the 2400 rung. And metadata is stripped by default, which removes GPS from a client’s phone snapshots but also removes embedded credit lines, so keep the masters. Smol keeps the original if compressing would make a file larger.

What does it buy? On our published benchmark, 24 PNG photographs compressed to AVIF at quality 65 came out 92.1% smaller; that starts from lossless PNG, so it flatters the result. Separately, 24 high-quality JPEG photographs recompressed as JPEG at the defaults came out 69.3% smaller, which is the closer comparison if your originals are already JPEG. At matched SSIMULACRA2 scores, Smol’s AVIF needed 22 to 26% fewer bytes than the best JPEG. Those test images are small, 768 × 512 film photographs, so read the percentages as direction, not as a promise for a full-size camera hero. The format question has its own page, AVIF conversion on a Mac, and converting PNG to WebP covers the fallback.

What does an image optimization workflow for client websites look like, step by step?

  1. Baseline the page

    Run PageSpeed Insights on the key templates and write down the heaviest images and the image bytes per template. This is the before number for the client report in the last step.

  2. Freeze the originals

    Copy everything the client sent into an originals/ folder and never edit it. It is the master every rung below is cut from. iPhone photos arrive as HEIC: use Compress with the output set to JPG, never Convert, and see converting HEIC to JPG on a Mac.

  3. Make one folder per rung

    By default, Smol writes its output beside the input with a _compressed suffix, so outputs for different rungs would land in the same folder with the same names. Give each rung its own copy of the originals:

    mkdir -p work/800 work/1600 work/2400
    for r in 800 1600 2400; do cp originals/* work/$r/; done
  4. Compress each folder to the table row

    Drop work/1600 onto Smol. Choose Compress, output format AVIF, quality 65, resize mode width at 1600. Do the same for the other rungs. Whole folders and mixed file types work in one batch. Open the three largest outputs and check edges, gradients and any text.

  5. Move the outputs out and name them by width

    Check one output’s name first; the loop assumes name_compressed.avif. Moving the outputs after every pass also keeps the next pass from compressing them again:

    mkdir -p web
    rung=1600; ext=avif
    for f in work/$rung/*_compressed.$ext; do
      b=$(basename "$f" "_compressed.$ext")
      mv "$f" "web/$b-$rung.$ext"
    done

    Repeat for the other rungs. Then run each folder again with output format WebP or JPG (still Compress) and move those the same way. This gives hero-800.avif, hero-1600.avif and hero-2400.avif, with matching fallbacks.

  6. Check that every image got an output

    Smol keeps the original when compressing would make a file larger, which for a format ladder may mean that image has no AVIF and your picture element has a hole. List the gaps (change the extension to match yours):

    for f in originals/*.jpg; do
      b=$(basename "$f" .jpg)
      [ -f "web/$b-1600.avif" ] || echo "missing: $b"
    done
  7. Mark up, measure and report

    Add width and height, srcset and fetchpriority on the one LCP image; the picture markup is in our developer guide. Run PageSpeed Insights again and send the client a before and after line: image bytes per template, and the LCP change.

How do you stop clients uploading huge photos to their CMS?

You cannot stop them with a tool alone. You choose where the check sits, and each place fails differently.

Four ways to keep a client’s media library lean and when each one fails
ApproachWorks whenFails when
A one-page image spec in the handoffEditors read it and have a resize toolA new hire never saw the document
Smol on the editors’ Macs, with the Finder Quick ActionThe client team is on Macs, each Mac has a license, and people will right-clickAnyone on Windows or a phone uploads directly
Resize and convert on upload (plugin or CDN)Every upload goes through the CMSThe CMS keeps the original anyway, as WordPress does
A hard cap in the CMSThe cap is lower than a camera original (Webflow: 4 MB)Pixels are huge but bytes are small

Our default advice is two layers. Put the automatic layer in the CMS, because it catches every editor, and put the spec in the handoff, because it teaches them why a full-size camera original is not a hero. If the client team is on Macs and cares, Smol’s Finder Quick Action makes compression a right-click. It uses whatever settings were last configured in that Mac’s app, and every Mac running Smol needs its own license, so that is a cost to put in the proposal. We wrote up the do-it-yourself Automator version in adding a compress Quick Action to Finder.

A watched folder is tempting for an “upload-ready” drop box, and it has one known defect: it can make already-optimized files larger. Use it only for folders of fresh, unoptimized files such as screenshots or camera exports, never for a folder holding finished assets. The measurement is in watching a folder and compressing what lands in it.

What do agencies use today, and how does Smol compare?

Image optimization options for an agency compared on cost, strengths and limits
OptionCostDoes wellLimits for agency work
sips (built into macOS)FreeMuch faster than Smol in our test: a shell loop over 24 small images took under a second, against about 7 seconds in SmolOn macOS 27, the version we tested, writes AVIF and HEIC but not WebP; keeps EXIF
ImageOptimFreeLossless and pixel-identical at its defaults: it saved 8.9% on our JPEGs and 4.3% on our PNGsWrites neither WebP nor AVIF; last release 29 October 2023
SquooshFreeRuns in your browser tab, so the image stays local; good for tuning one imageOne image at a time in our test
TinyPNGFree web tierHandles WebP, AVIF, JPEG and PNG; has an API; free web uploads allow 20 images of 5 MB each at onceYour client’s files are uploaded to a third party
WordPress optimizer pluginsVariesRun on every editor’s upload, with bulk passes over an existing libraryWordPress only; some process on the vendor’s servers, so read each plugin’s terms
Image CDN (Cloudflare Images and similar)Usage-billedTransforms at request time, so one master serves every widthCloudflare bills per unique transformation: the first request for each version in a calendar month counts as one
sharp in the buildFreeWrites JPEG, PNG, WebP, GIF, AVIF and TIFF, reviewable and repeatable in CIOnly sees images that are in the repo
Smol$29 onceFolders of mixed files, AVIF and WebP, reusable settings, nothing leaves the MacMac only, not the fastest, no lossless mode, no SVG

The table’s sources: ImageOptim and Squoosh are compared against Smol in our ImageOptim test and the Squoosh comparison; the roundup of Mac tools is the best image compressor for Mac; and the built-in command has its own guide in the sips command. TinyPNG’s figures are from its homepage, Cloudflare’s from its transformations documentationsharp’s from its own site, and the ImageOptim release date from its update feed, all read on 9 October 2026. Our Smol versus TinyPNG page goes deeper on the upload question.

That upload question is a contract question for an agency. Unreleased campaign imagery and client-supplied product shots may sit under an NDA or a services agreement, so check whether they do; sending them to an online compressor means a third party receives them. Smol processes files on the Mac, has no account, and uploads nothing. Whether a given online tool is allowed under your client agreement is for you and the client to decide; we are not giving legal advice.

Can a coding agent or an API do this inside our pipeline?

A coding agent can, on a Mac with Smol running. Smol includes a Model Context Protocol server, and Claude Code, Codex and Google Antigravity each connect with one click from the Smol for AI panel. The agent then calls compress, convert, strip-metadata and preset tools with explicit parameters, on local files. It cannot touch your license or install updates, every path must be absolute, and originals are not overwritten by default.

Where that fits an agency day: a developer is in Claude Code editing a client’s template, and a folder of new product photos has just arrived. A prompt is enough:

Compress every image in /Users/me/clients/acme/incoming to AVIF at 1600 px wide
and list any file that did not get smaller.

Agents can also list and create presets, so “set up reusable image settings for this client” is a task you can hand over once. The CI side of the same problem, a byte budget that fails the build, is in compressing images before you commit. One caution: Smol keeps files on the Mac, but what your AI client sends to its own model provider is that client’s business. Check its data settings before pointing an agent at embargoed assets.

An agent on your laptop is still not a server. When the compression has to run where your client’s visitors upload files, the paid Smol API (plans from $20 a month) does it on the server side; the Mac app does not belong in that path.

How does an agency roll this out to a team?

Pay once per Mac. Solo is $29 for one Mac. Team is $49 for three Macs, with seats managed from an admin dashboard. Enterprise is $20 per seat for 5 to 500 seats, so five people is $100. A four-Mac shop buys Team plus Solo ($78) or the five-seat Enterprise minimum ($100). There is no subscription, no per-file quota and no daily cap, and updates are free. The pricing page has the checkout for each.

Consistency comes from two things. The first is the settings table above, copied into your handbook and your client handoff template, because a table is the one artifact every teammate and every client can read. The second is the settings each person enters from it on their own Mac. A preset saves settings on the Mac where it was made, so each person recreates it from the table. We make no promise that two Macs produce identical files, so the written table is the shared artifact, and your check is opening the same three worst images on each machine.

A note on who this is for. Smol needs macOS 13 or later on Apple Silicon, or macOS 14 or later on Intel. A shop with Windows machines in the mix needs the CMS-side layer for those people. If your team spans design, content and campaigns as well as engineering, the design studio and marketing team pages cover their halves of the same handoff, and photographers delivering to clients covers the people who send you the originals.

When is Smol the wrong tool for a web agency?

Seven cases, starting with the two that matter most for production work.

The images live in the repo and CI deploys them. Use a build-time library. sharp writes JPEG, PNG, WebP, GIF, AVIF and TIFF. A build step cannot be forgotten and a desktop app can. Smol is not a build tool for Linux CI.

Editors or visitors upload images all day. Then the transform has to happen at the CMS or at an image CDN, and Smol cannot sit in that path. Cloudflare Images, Cloudinary, imgix and a self-hosted sharp service are all reasonable.

You need many widths of many images. A catalog of hundreds of products at three rungs each is thousands of files by hand. A CDN generates the widths from one master at request time. Smol does the rungs fine for a landing page, not for a catalog; the e-commerce product images page is where that case is treated properly.

You need the pixels untouched. Smol has no lossless mode. Brand masters, print artwork and anything you will re-edit should go through ImageOptim or stay as they are.

You want a script, not an app. A sips loop finished 24 small images in under a second against Smol’s 7. If your batch is recurring and JPEG is enough, script it.

Your deliverable is SVG, or JPEG XL. Smol writes neither. Logos and icons should be SVG, which no raster compressor touches.

Your team is not on Macs. Smol is macOS only. Nobody on Windows or Linux can use it, and that is a hard stop for a mixed team.

Where it earns its price: the pile that never reaches a pipeline. Client originals, press kits, README screenshots, the folder someone AirDropped the hour before launch. For the plain version of that job there is compressing images for the web.

Frequently asked questions

What image formats should I deliver on a client website in 2026?

AVIF first, with a WebP or JPEG fallback in a picture element, for files you host yourself. caniuse puts AVIF at about 96% of users and WebP at about 97%. On hosted builders check the platform: Squarespace accepts only .jpg, .gif, .png and .webp, and Shopify’s help page lists no AVIF, so deliver WebP or JPEG there.

How do I stop clients uploading oversized images to their CMS?

Use two layers. Put resizing and conversion in the CMS or a CDN so every upload is caught, and give editors a one-page image spec with a maximum pixel width and file size. WordPress downscales over 2560 px but stores the original in the uploads directory, so downscaling alone does not stop storage and backup bloat. Webflow’s developer documentation says images must not exceed 4 MB.

Can I convert a whole folder of client images to AVIF and WebP on a Mac?

Yes. Drag the folder onto Smol, choose Compress with output AVIF and a quality, then move the results out and run it again for the WebP or JPG fallback. Use Compress, not Convert, so the quality applies. By default, Smol writes copies beside the originals with a _compressed suffix. Mind the default 2000 px resize cap on larger hero rungs.

How much do images affect Core Web Vitals?

Mostly LCP. Good LCP is 2.5 seconds or less at the 75th percentile, and the median desktop page carries 1,059 KB of images according to the Web Almanac 2025. A smaller file only shortens resource load duration, about 40% of a good LCP in Google’s guidance. Discovery, priority and reserved width and height are markup fixes.

Should an agency use an image CDN instead of a desktop app?

For anything uploaded after launch or needing many widths, yes. A CDN transforms at request time and covers every editor. Cloudflare Images, for example, bills per unique transformation. A desktop app is better for client originals, press kits and one-off assets that never enter a pipeline. The two do different jobs: the CDN for the site, the Mac app for the pile before it.

Can Claude Code or Codex compress client images through Smol?

Yes, on a Mac running Smol. Claude Code, Codex and Google Antigravity connect over the Model Context Protocol and call compress, convert and preset tools on local files. Every path must be absolute, originals are not overwritten by default, and an agent cannot touch your license. For server-side uploads, use a server-side transform or an image CDN instead.

Keep reading

Smol for other teams