Webflow images,
80% smaller.

Webplow scans every collection in your Webflow CMS, re-encodes images to WebP and AVIF, re-uploads them to your CDN, and patches every reference — including the inline images hiding in rich text. Optionally writes alt text via Claude vision.

All your images. One pass.

Compressing · streaming·0 / 215
hero-banner-fall.png0%
team-headshot.jpg0%
case-study-cover.avif→ webp
office-pano-wide.jpgqueued
Total saved0.0 MB

Live preview · simplified

Why we built it.

Webflow is great until you have a CMS full of 4 MB JPEGs. We hit that wall on a client site — page load times started creeping, Lighthouse scores started slipping, and the only fix was the kind of grind nobody wants. Download every image, run it through TinyPNG, re-upload, find every reference, update by hand. For a CMS with a few thousand assets, that's a week of busywork.

Webplow is what we built so we'd never do that again. It started as a script. Then it became a UI. Then it grew an alt-text feature, a streaming progress bar, a rate-limit-aware queue, and a bunch of small touches that only matter once you've actually run it on a real site. Today it's the thing we point at every Webflow project we touch.

Webflow doesn't compress your CMS images, so your team uploads 4 MB JPEGs that someone has to fix.

What's inside.

01Connect, then scan everything.

You drop in a Webflow API token and Webplow walks every site, every collection, and every image field — including the inline images embedded in rich-text HTML, which most tools quietly skip. You pick which collections matter; everything else stays untouched.

Live items and draft items each have their own Webflow endpoint, and Webplow detects which is which before writing back. Nothing gets stuck in draft state because the wrong API was used.

Webflow CMS · scanning·0 / 6
Posts478 · 92 inlineskippedqueuedscanning…
Authors89skippedqueuedscanning…
Case studies156 · 23 inlineskippedqueuedscanning…
Pages12skippedqueuedscanning…
Tags7skippedqueuedscanning…
Style guide0skippedqueuedscanning…

02Re-encode, never twice.

Webplow knows what it's looking at. AVIF stays AVIF. Existing WebP gets re-encoded at quality 82, effort 6. PNG and JPEG convert to WebP at the preset you pick — Light, Balanced, or Max. The same image never gets compressed twice.

Re-encoding runs on Sharp + libvips on the server. The Light preset is what we ship with; we've never had a client site visibly change between before and after.

03Patch the rich-text inline images.

This is the part that takes the week if you do it by hand. Most tools touch the CMS image field and call it done. Webplow patches the HTML inside rich-text fields too — the inline screenshots in blog posts, the diagrams in docs — rewriting every <img> tag with the new Webflow-CDN URL.

The same dedup pass means common assets are processed once and propagated everywhere they're referenced. Original fileIds are preserved when updating CMS image fields, so nothing else in your site notices.

rich-text · patch·01 / 03
<p>Our team gathered at the warehouse...</p>
<img src="https://uploads-ssl.webflow.com/cdn/posts/team-photo.jpg
" />
<p>Discussing the next quarter...</p>
238 / 412 references rewritten
Posts
0 / 92
Cases
0 / 23
Docs
0 / 18

04And — alt text, generated.

Switch modes and Webplow finds every image without alt text, runs it through Claude Haiku vision, and writes the description back to the right field. Including, again, the rich-text inline ones. 50 per batch, 125-character cap, batch-flushed so progress survives a dropped tab.

Claude · alt text·01 / 03
warehouse-floor.jpg

125-char limit
Patched in CMS · rich-text inline
Batch-flushed · resumable

Under the hood.

Six things that took longer than the demo would suggest.

  • SSE with heartbeatsLong-running compressions stream progress over Server-Sent Events. 15-second heartbeats keep the connection alive through proxies and CDNs that would otherwise close it.
  • Webflow rate-limit awareThrottled to ~428 ms per request (Webflow's 140/min ceiling) with automatic 429 backoff using the Retry-After header. Never gets the API token suspended.
  • Asset deduplicationMany CMS fields reference the same image. Webplow processes each unique URL exactly once, then propagates the rewrite to every reference — orders of magnitude faster on shared assets.
  • Live + draft item handlingWebflow distinguishes live and draft items with different endpoints. Webplow detects which is which and writes correctly to both, so nothing gets stuck in draft state.
  • Zero data persistenceTokens stay in memory for the duration of the run. No database, no disk, no logs. Close the tab — everything's gone.
  • Configurable quality presetsLight (q80) for safe defaults, Balanced (q60) for a strong reduction, Max (q40) when bytes really matter. AVIF outputs follow their own curve.
~80%
smaller, end to end
50
images per streaming batch
0
bytes persisted
1 hr
max per run

A few questions.

The ones we get most often. Anything else: hello@practa.ai.

Visually, no — these are perceptually lossless settings tuned for web. WebP at 80 is indistinguishable from a 4 MB JPEG in a browser. The Light preset is the safe default; Max trades visible artifacts for size only when you really need it.

Webflow caps the API at 140 requests per minute, and Webplow respects that. 5,000 unique images is roughly 60–90 minutes of total processing including re-encoding and re-upload. The progress UI tells you the truth — no fake "almost done".

The token lives in browser memory for the run, never persisted, never logged. The app is stateless — there's no database storing anything. Close the tab and there's no trace.

Got a different CMS? Different problem?

Webplow is one of the workflows we ship under the standard Practa subscription. Tell us what's slow, broken, or annoying — we build, host, and maintain it.