Blur & Error Placeholders
Every image renders behind a Blurhash placeholder decoded client-side, with a built-in error overlay if the source can't be resolved.
One Twig component turns any image into a fully responsive, Blurhash-placeholder, zero-CLS, AVIF/WebP-negotiated
Drop one Twig component into a template. Progressive Image Bundle resolves the source, works out every size your layout actually needs, generates content-addressed variants, and renders a real <picture> element with Blurhash placeholders and zero layout shift — no LiipImagineBundle required.
composer require tito10047/progressive-image-bundleThat's it — the bundle resolves real dimensions, computes what each breakpoint needs, and generates every variant on first request. Full walkthrough in the Getting Started guide.
Requires PHP 8.3+ and Symfony 6.4, 7.4, or 8.1+.
Every workflow you rely on today has a PGI equivalent — plus the responsive, zero-CLS pipeline Liip never had.
| Feature | Progressive Image Bundle | LiipImagineBundle |
|---|---|---|
| Standalone URL function (Twig) | pgi_filter() | imagine_filter() |
| On-the-fly HTTP resolve route | ✓ | ✓ |
| CLI cache warm / remove | ✓ | ✓ |
| Responsive <picture>/srcset out of the box | ✓ | — |
| Blurhash placeholder + zero CLS | ✓ | — |
| AVIF/WebP content negotiation | ✓ | — |
| Real post-processing (jpegoptim/pngquant/cwebp/avifenc) | ✓ | — |
| Content-addressed, immutable cache (no cache-busting) | ✓ | — |
| Three generation strategies (sync / terminate / async) | ✓ | — |
| DDD core with contract tests per extension point | ✓ | — |
Full breakdown and a filter-set migration table in the Getting Started guide.
Progressive Image, on the blue channel. The bundle spends its time pushing bytes through the R, G and B planes of every image it touches — blue felt like the right home for it: clean, a little technical, no punchline required.
Running in production on mostka.sk and vsetkosada.sk.