<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Serhii Kalyna</title>
    <description>The latest articles on DEV Community by Serhii Kalyna (@serhii_kalyna_730b636889c).</description>
    <link>https://dev.to/serhii_kalyna_730b636889c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3820869%2Ff684a191-0ecb-4858-9f64-dd15a4ad9e07.png</url>
      <title>DEV Community: Serhii Kalyna</title>
      <link>https://dev.to/serhii_kalyna_730b636889c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/serhii_kalyna_730b636889c"/>
    <language>en</language>
    <item>
      <title>AVIF in 2026: why it's the best format for web images</title>
      <dc:creator>Serhii Kalyna</dc:creator>
      <pubDate>Thu, 02 Apr 2026 16:30:31 +0000</pubDate>
      <link>https://dev.to/serhii_kalyna_730b636889c/avif-in-2026-why-its-the-best-format-for-web-images-epj</link>
      <guid>https://dev.to/serhii_kalyna_730b636889c/avif-in-2026-why-its-the-best-format-for-web-images-epj</guid>
      <description>&lt;p&gt;AVIF has been available since 2020, but it's only in 2026 that it became the obvious default choice for web images. Browser support crossed 94.9%, Google officially recommends it in PageSpeed Insights, and the compression advantages over JPG are too large to ignore. Here's what you need to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AVIF?
&lt;/h2&gt;

&lt;p&gt;AVIF (AV1 Image File Format) is an image format developed by the Alliance for Open Media — a consortium that includes Google, Apple, Mozilla, Microsoft, and Netflix. It uses the AV1 video codec to compress images, which is why it achieves compression rates that traditional image codecs like JPG can't match.&lt;/p&gt;

&lt;p&gt;AV1 was designed for video — it's optimized for the kind of complex, natural content that appears in photos and real-world scenes. When you use it for a single image frame instead of a video stream, you get dramatically better compression than JPG's DCT-based algorithm, which dates back to 1992.&lt;/p&gt;

&lt;h2&gt;
  
  
  The compression numbers
&lt;/h2&gt;

&lt;p&gt;At equivalent visual quality (measured by SSIM/DSSIM), AVIF consistently beats JPG by 40–60%:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;File size vs JPG&lt;/th&gt;
&lt;th&gt;Browser support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JPG&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;All browsers &amp;amp; apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebP&lt;/td&gt;
&lt;td&gt;~30% smaller&lt;/td&gt;
&lt;td&gt;95.67%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVIF&lt;/td&gt;
&lt;td&gt;~50% smaller&lt;/td&gt;
&lt;td&gt;94.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JPEG XL&lt;/td&gt;
&lt;td&gt;~45% smaller&lt;/td&gt;
&lt;td&gt;14.7% (Safari only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A real example from my own testing with libvips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JPEG (q80): 540 KB&lt;/li&gt;
&lt;li&gt;WebP: 350 KB (−35%)&lt;/li&gt;
&lt;li&gt;AVIF: 210 KB (−61%)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not a cherry-picked example — Netflix's internal benchmarks across a diverse image dataset showed AVIF achieving ~50% better compression than JPG on average.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AVIF wins over WebP in 2026
&lt;/h2&gt;

&lt;p&gt;WebP was Google's previous recommendation and it's still a solid format. But AVIF has caught up in browser support (94.9% vs 95.67%) while delivering meaningfully better compression.&lt;/p&gt;

&lt;p&gt;The gap matters at scale. If you have 1,000 product images averaging 400 KB as JPG:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebP: ~270 KB each → 270 MB total&lt;/li&gt;
&lt;li&gt;AVIF: ~200 KB each → 200 MB total&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's 70 MB less bandwidth per 1,000 images served. For high-traffic sites, this compounds into significant CDN cost savings and faster page loads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Web Vitals impact
&lt;/h2&gt;

&lt;p&gt;Largest Contentful Paint (LCP) measures how quickly the main image on a page loads. It's a Google ranking signal and one of the Core Web Vitals metrics.&lt;/p&gt;

&lt;p&gt;Large images are the most common cause of poor LCP scores. Switching from JPG to AVIF typically reduces image payload by 40–60%, directly improving LCP. Google's PageSpeed Insights will flag JPG images as a performance opportunity and explicitly recommend AVIF as the preferred replacement.&lt;/p&gt;

&lt;p&gt;For e-commerce sites where product images are the LCP element, converting to AVIF is the highest-impact single change for page performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser support in 2026
&lt;/h2&gt;

&lt;p&gt;AVIF achieved Baseline status in 2024:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome 85+ (2020)&lt;/li&gt;
&lt;li&gt;Firefox 93+ (2021)&lt;/li&gt;
&lt;li&gt;Safari 16+ (2022)&lt;/li&gt;
&lt;li&gt;Edge 121+ (2024)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ~5% without support is primarily legacy mobile browsers and Internet Explorer. For most sites, you can serve AVIF as the primary format with a JPG fallback using the HTML &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"image.avif"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/avif"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"image.webp"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/webp"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Browsers download only the first format they support.&lt;/p&gt;

&lt;h2&gt;
  
  
  The encoding speed problem
&lt;/h2&gt;

&lt;p&gt;AVIF's biggest practical limitation is slow encoding. While JPG encodes in ~2ms and WebP in ~168ms, AVIF takes 1–2 seconds per image with the libaom reference encoder.&lt;/p&gt;

&lt;p&gt;This makes real-time AVIF encoding impractical for user-uploaded content without a job queue. For static assets (product photos, blog images, landing page assets), encode offline during your build process and serve the pre-encoded AVIF files.&lt;/p&gt;

&lt;p&gt;Alternative encoders help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;rav1e&lt;/strong&gt; — faster than libaom, slightly larger files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SVT-AV1&lt;/strong&gt; — good balance of speed and compression&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my Rust + libvips backend for &lt;a href="https://convertifyapp.net/avif-to-jpg" rel="noopener noreferrer"&gt;Convertify&lt;/a&gt;, I use libvips's built-in AVIF support which wraps libaom. For batch conversion of user files, the encoding time is acceptable. For real-time conversion of large files, it's a constraint worth planning around.&lt;/p&gt;

&lt;h2&gt;
  
  
  AVIF transparency and animation
&lt;/h2&gt;

&lt;p&gt;Unlike JPG, AVIF supports full alpha channel transparency. This makes it a potential replacement for PNG in web contexts — smaller files with the same transparency support.&lt;/p&gt;

&lt;p&gt;AVIF also supports animation, making it an alternative to GIF. Animated AVIF files are significantly smaller than GIF while supporting a full color range (GIF is limited to 256 colors).&lt;/p&gt;

&lt;h2&gt;
  
  
  What about JPEG XL?
&lt;/h2&gt;

&lt;p&gt;JPEG XL (JXL) is technically superior to AVIF in some dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better compression at high quality settings (~20% smaller than AVIF)&lt;/li&gt;
&lt;li&gt;Progressive decoding (shows usable image with 1% of data loaded)&lt;/li&gt;
&lt;li&gt;Lossless JPEG transcoding (20% smaller, byte-perfect reconstruction)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is browser support: 14.7% as of early 2026, limited to Safari 17+.&lt;/p&gt;

&lt;p&gt;The big news: Chrome Canary 145 shipped a Rust-based JXL decoder in late 2025, reversing Google's 2022 decision to remove JXL support. Realistic stable Chrome support: H2 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My recommendation:&lt;/strong&gt; Use AVIF now. Watch JXL for H2 2026 when Chrome stable support arrives. Don't wait.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical implementation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For static sites:&lt;/strong&gt; Convert during build. Store both AVIF and JPG. Use &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; for fallback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For CDNs:&lt;/strong&gt; Cloudflare, Cloudinary, and Imgix serve AVIF automatically via Accept header negotiation. Upload once, let the CDN handle format selection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Next.js:&lt;/strong&gt; The &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; component serves AVIF automatically for supported browsers since Next.js 13.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For WordPress:&lt;/strong&gt; ShortPixel, Imagify, and WebP Express all support AVIF conversion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For manual conversion:&lt;/strong&gt; Tools like &lt;a href="https://convertifyapp.net/avif-to-jpg" rel="noopener noreferrer"&gt;Convertify&lt;/a&gt; handle batch AVIF conversion without requiring local tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AVIF is the right default for web images in 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ 94.9% browser support — effectively universal with JPG fallback&lt;/li&gt;
&lt;li&gt;✅ ~50% smaller than JPG at the same quality&lt;/li&gt;
&lt;li&gt;✅ Recommended by Google PageSpeed Insights&lt;/li&gt;
&lt;li&gt;✅ Transparency and animation support&lt;/li&gt;
&lt;li&gt;⚠️ Slow encoding — plan around it for real-time use cases&lt;/li&gt;
&lt;li&gt;⚠️ Limited app support outside browsers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation is straightforward. The performance gains are significant. There's no good reason to keep shipping JPG for web images in 2026.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>performance</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why I added internal linking to my image converter (and what changed in Google)</title>
      <dc:creator>Serhii Kalyna</dc:creator>
      <pubDate>Tue, 31 Mar 2026 17:11:48 +0000</pubDate>
      <link>https://dev.to/serhii_kalyna_730b636889c/why-i-added-internal-linking-to-my-image-converter-and-what-changed-in-google-19jn</link>
      <guid>https://dev.to/serhii_kalyna_730b636889c/why-i-added-internal-linking-to-my-image-converter-and-what-changed-in-google-19jn</guid>
      <description>&lt;p&gt;I've been building &lt;a href="https://convertifyapp.net" rel="noopener noreferrer"&gt;Convertify&lt;/a&gt; — a free image converter powered by Rust + libvips. Two weeks in, Google had indexed 18 of my 186 static pages. The numbers were moving, but slowly.&lt;br&gt;
Then I read a recommendation that changed my approach: internal linking is 80% of cluster SEO.&lt;/p&gt;
&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;My converter pages existed in isolation. /heic-to-jpg had no idea /heic-to-png existed. Google couldn't see a cluster — just a collection of unrelated tools.&lt;/p&gt;
&lt;h3&gt;
  
  
  What I built
&lt;/h3&gt;

&lt;p&gt;A RelatedConversions component that generates contextual links on every page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RELATED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;heic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;avif&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;avif&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RelatedConversions&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// generates links like "HEIC to PNG", "WEBP to JPG" etc.&lt;/span&gt;
  &lt;span class="c1"&gt;// deduplicates, shows related formats from both source and target&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the homepage — "Popular Conversions". On converter pages — "Related Conversions". Every page now links to 6-8 related pages.&lt;/p&gt;

&lt;h3&gt;
  
  
  The immediate result
&lt;/h3&gt;

&lt;p&gt;Deployed on day 15. The same day I submitted the key pages for re-indexing in Search Console.&lt;br&gt;
Within 24 hours Google crawled the updated pages. The internal links give Googlebot a clear path through the entire site — it no longer needs to discover pages through the sitemap alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's next
&lt;/h3&gt;

&lt;p&gt;Still too early to see ranking changes — SEO takes weeks. But the site now looks like a cluster to Google, not a collection of isolated tools. That's the foundation for ranking multiple pages simultaneously for the same search query.&lt;/p&gt;

&lt;h4&gt;
  
  
  Stats so far (week 3, day 2):
&lt;/h4&gt;

&lt;p&gt;18 pages indexed (up from 2 three weeks ago)&lt;/p&gt;

&lt;p&gt;Building in public. Follow along if you're curious how Rust + Next.js SSG performs for SEO.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building Convertify in public. Previous posts:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/serhii_kalyna_730b636889c/how-i-fixed-google-ignoring-160-pages-migrating-from-vite-spa-to-nextjs-ssg-1mfh"&gt;How I fixed Google ignoring 160 pages: migrating from Vite SPA to Next.js SSG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/serhii_kalyna_730b636889c/avif-converter-why-i-built-one-and-what-i-learned-la"&gt;AVIF converter: why I built one and what I learned&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/serhii_kalyna_730b636889c/jpeg-xl-in-chrome-145-what-it-means-for-web-developers-1n1m"&gt;JPEG XL in Chrome 145: what it means for web developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>buildinpublic</category>
      <category>seo</category>
      <category>webdev</category>
      <category>rust</category>
    </item>
    <item>
      <title>AVIF converter: why I built one and what I learned</title>
      <dc:creator>Serhii Kalyna</dc:creator>
      <pubDate>Mon, 23 Mar 2026 16:04:29 +0000</pubDate>
      <link>https://dev.to/serhii_kalyna_730b636889c/avif-converter-why-i-built-one-and-what-i-learned-la</link>
      <guid>https://dev.to/serhii_kalyna_730b636889c/avif-converter-why-i-built-one-and-what-i-learned-la</guid>
      <description>&lt;p&gt;Large images slow down websites, frustrate users, and hurt SEO. Modern formats like AVIF promise smaller sizes with better quality, but the ecosystem is still young. I decided to explore AVIF and build my own converter to see what works in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AVIF
&lt;/h2&gt;

&lt;p&gt;AVIF images can be 50–70% smaller than JPEG or PNG at similar or better visual quality. This means faster loading times, lower bandwidth, and improved PageSpeed scores. Yet, support for AVIF in editing tools and converters is still limited, which makes it hard for developers and content creators.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built my own converter
&lt;/h2&gt;

&lt;p&gt;Existing tools are either slow, require file uploads (privacy concerns), or are paid. I wanted a converter that is fast, privacy-first, and free. That led me to create &lt;strong&gt;Convertify&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rust&lt;/strong&gt; for performance-critical processing
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;libvips&lt;/strong&gt; as a high-speed image processing backend
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js SSG&lt;/strong&gt; for static landing pages and SEO
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AVIF encoding is slower than JPEG/PNG
&lt;/li&gt;
&lt;li&gt;Browser compatibility is still patchy
&lt;/li&gt;
&lt;li&gt;UX: making drag &amp;amp; drop intuitive without blocking the main thread
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Conversion speed improved significantly with Rust + libvips
&lt;/li&gt;
&lt;li&gt;PageSpeed scores for test pages increased
&lt;/li&gt;
&lt;li&gt;Early users appreciated privacy-first, instant conversion
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;AVIF adoption will grow as tools improve. Building your own converter is a great way to learn about modern image formats and get early traction. Check out a quick AVIF-to-JPG demo &lt;a href="https://convertifyapp.net/avif-to-jpg" rel="noopener noreferrer"&gt;Convertifyapp&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I fixed Google ignoring 160 pages: migrating from Vite SPA to Next.js SSG</title>
      <dc:creator>Serhii Kalyna</dc:creator>
      <pubDate>Sat, 21 Mar 2026 17:59:51 +0000</pubDate>
      <link>https://dev.to/serhii_kalyna_730b636889c/how-i-fixed-google-ignoring-160-pages-migrating-from-vite-spa-to-nextjs-ssg-1mfh</link>
      <guid>https://dev.to/serhii_kalyna_730b636889c/how-i-fixed-google-ignoring-160-pages-migrating-from-vite-spa-to-nextjs-ssg-1mfh</guid>
      <description>&lt;h1&gt;
  
  
  How I fixed Google ignoring 160 pages: migrating from Vite SPA to Next.js SSG
&lt;/h1&gt;

&lt;p&gt;I've been building &lt;a href="https://convertifyapp.net" rel="noopener noreferrer"&gt;Convertify&lt;/a&gt; — a free image converter &lt;br&gt;
that supports HEIC, WebP, AVIF, PNG, JPG and 20+ formats.&lt;/p&gt;

&lt;p&gt;The problem: after weeks of work, Google had indexed exactly &lt;strong&gt;2 pages&lt;/strong&gt; out of 160+.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Google ignored my pages
&lt;/h2&gt;

&lt;p&gt;My app was a Vite React SPA. Every route looked like this in HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Convertify&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/assets/index.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Google crawls without executing JavaScript. So every single page — &lt;br&gt;
/heic-to-jpg, /webp-to-png, /avif-to-jpg — returned identical empty HTML. &lt;br&gt;
Google saw them all as duplicates and indexed only the homepage.&lt;/p&gt;
&lt;h2&gt;
  
  
  The fix: Next.js App Router + generateStaticParams
&lt;/h2&gt;

&lt;p&gt;I migrated to Next.js and used &lt;code&gt;generateStaticParams()&lt;/code&gt; to pre-render &lt;br&gt;
all format pairs at build time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateStaticParams&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;heic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jpeg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;webp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;avif&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gif&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bmp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tiff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;formats&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;formats&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-to-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: &lt;strong&gt;186 static HTML pages&lt;/strong&gt; generated at build time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server components for SEO content
&lt;/h2&gt;

&lt;p&gt;The key insight: not everything needs to be a client component.&lt;/p&gt;

&lt;p&gt;I split the page into two parts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client (interactive):&lt;/strong&gt; DropZone, Settings, ConvertButton, FilesViewer&lt;br&gt;
&lt;strong&gt;Server (static HTML):&lt;/strong&gt; FAQ, HowToConvert, SupportedFormats, Header, Footer&lt;/p&gt;

&lt;p&gt;For server components I replaced MUI Accordion with native HTML &lt;code&gt;&amp;lt;details&amp;gt;/&amp;lt;summary&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// No 'use client', no JavaScript, pure HTML&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FAQ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;from&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;to&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;dl&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;faqs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;faq&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;details&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;faq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;faq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;answer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;details&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;dl&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Google gets full FAQ content without running any JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic metadata per page
&lt;/h2&gt;

&lt;p&gt;Instead of react-helmet-async, Next.js handles metadata server-side:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateMetadata&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-to-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Convert &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; Online Free — Convertify`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Free online &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; converter.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;alternates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canonical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://convertifyapp.net/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every page now has unique title, description and canonical tag in the HTML &lt;br&gt;
— no JavaScript required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Before: 2 indexed pages&lt;/li&gt;
&lt;li&gt;After: 186 static pages pre-rendered&lt;/li&gt;
&lt;li&gt;PageSpeed Desktop: 100/100 Performance, 100/100 SEO&lt;/li&gt;
&lt;li&gt;PageSpeed Mobile: 83/100 Performance, 100/100 SEO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mobile performance hit comes from MUI (emotion) on the client side. &lt;br&gt;
Working on reducing that next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SPAs are SEO poison&lt;/strong&gt; for content pages. Use SSG or SSR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split server/client components&lt;/strong&gt; — only interactive parts need JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native HTML elements&lt;/strong&gt; (&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;) work great for accordions 
and are fully server-renderable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;generateStaticParams&lt;/strong&gt; is incredibly powerful for programmatic SEO pages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're building a tool with many landing pages — don't make the same &lt;br&gt;
mistake I did. Start with Next.js from day one.&lt;/p&gt;




&lt;p&gt;Check out &lt;a href="https://convertifyapp.net" rel="noopener noreferrer"&gt;Convertify&lt;/a&gt; if you need to convert &lt;br&gt;
HEIC, WebP, AVIF or any other image format — free, no signup, no limits.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>seo</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>JPEG XL in Chrome 145: what it means for web developers</title>
      <dc:creator>Serhii Kalyna</dc:creator>
      <pubDate>Thu, 19 Mar 2026 08:09:10 +0000</pubDate>
      <link>https://dev.to/serhii_kalyna_730b636889c/jpeg-xl-in-chrome-145-what-it-means-for-web-developers-1n1m</link>
      <guid>https://dev.to/serhii_kalyna_730b636889c/jpeg-xl-in-chrome-145-what-it-means-for-web-developers-1n1m</guid>
      <description>&lt;p&gt;Chrome 145 quietly shipped something big: a native JPEG XL decoder. After dropping JXL support in 2022 and years of community pushback, Google reversed course. JXL is now viable in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;Before Chrome 145, JPEG XL had only Safari support (~14%). Now with Chrome on board, you're looking at 70%+ coverage overnight. Firefox has JXL in nightly builds. Edge follows Chrome. The holdout is older Chrome versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why JXL is different from AVIF and WebP
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;AVIF&lt;/th&gt;
&lt;th&gt;WebP&lt;/th&gt;
&lt;th&gt;JPEG XL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compression vs JPEG&lt;/td&gt;
&lt;td&gt;~50%&lt;/td&gt;
&lt;td&gt;25-34%&lt;/td&gt;
&lt;td&gt;35-55%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encode speed&lt;/td&gt;
&lt;td&gt;Slow&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lossless&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Progressive decode&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lossless JPEG recompression&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The lossless JPEG recompression is unique — you can transcode existing JPEGs to JXL with zero quality loss and ~20% size reduction. No other format can do this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you use JXL today?
&lt;/h2&gt;

&lt;p&gt;For new projects: yes, with a JPEG fallback. The &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element handles this cleanly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"image.jxl"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/jxl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"image.avif"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"image/avif"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For existing projects: wait 6-12 months until Chrome 145+ penetration is high enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling support in 2026
&lt;/h2&gt;

&lt;p&gt;The weak point is still encoder tooling. Lightroom and Photoshop don't export JXL natively yet. For now the options are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cjxl&lt;/code&gt; CLI (libjxl reference encoder)&lt;/li&gt;
&lt;li&gt;ImageMagick 7.1+&lt;/li&gt;
&lt;li&gt;libvips 8.13+&lt;/li&gt;
&lt;li&gt;Online converters like &lt;a href="https://convertifyapp.net" rel="noopener noreferrer"&gt;Convertify&lt;/a&gt; for quick testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;JXL won't replace AVIF for pure compression use cases. But for archival, lossless JPEG migration, and high-quality photography workflows — it's now the best option available in a browser.&lt;/p&gt;

&lt;p&gt;The next 12 months will tell if the ecosystem catches up.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>webperf</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AVIF vs WebP vs HEIC vs JPEG XL: which image format should you use in 2026?</title>
      <dc:creator>Serhii Kalyna</dc:creator>
      <pubDate>Mon, 16 Mar 2026 19:48:03 +0000</pubDate>
      <link>https://dev.to/serhii_kalyna_730b636889c/avif-vs-webp-vs-heic-vs-jpeg-xl-which-image-format-should-you-use-in-2026-4gn0</link>
      <guid>https://dev.to/serhii_kalyna_730b636889c/avif-vs-webp-vs-heic-vs-jpeg-xl-which-image-format-should-you-use-in-2026-4gn0</guid>
      <description>&lt;p&gt;If you've ever wondered whether to use AVIF, WebP, or just stick with JPEG — this is the guide I wish existed when I was building &lt;a href="https://convertifyapp.net" rel="noopener noreferrer"&gt;Convertify&lt;/a&gt;, a free image converter that handles 20+ formats including all of these.&lt;/p&gt;

&lt;p&gt;Let me cut through the noise with actual data.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Lossy savings vs JPEG&lt;/th&gt;
&lt;th&gt;Browser support&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AVIF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~50% smaller&lt;/td&gt;
&lt;td&gt;94.9%&lt;/td&gt;
&lt;td&gt;General web delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25–34% smaller&lt;/td&gt;
&lt;td&gt;95.67%&lt;/td&gt;
&lt;td&gt;Fallback, simple graphics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JPEG XL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;35–55% smaller&lt;/td&gt;
&lt;td&gt;14.74% (Safari only)&lt;/td&gt;
&lt;td&gt;High quality, archival&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HEIC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~50% smaller&lt;/td&gt;
&lt;td&gt;12% (Safari only)&lt;/td&gt;
&lt;td&gt;Apple ecosystem only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Recommended today:&lt;/strong&gt; AVIF → WebP → JPEG fallback chain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compression: the real numbers
&lt;/h2&gt;

&lt;p&gt;At equivalent visual quality (measured by SSIM/DSSIM):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AVIF&lt;/strong&gt; — ~50% smaller than JPEG (Netflix research, Ctrl.blog 600-image study)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebP&lt;/strong&gt; — 25–34% smaller than JPEG&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JPEG XL&lt;/strong&gt; — 35–55% smaller than JPEG, but &lt;strong&gt;20% smaller than AVIF&lt;/strong&gt; at high quality (Cloudinary, 40,000+ image test)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HEIC&lt;/strong&gt; — ~50% smaller than JPEG, but patent issues kill web use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real example — a 2000×2000 product photo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JPEG (q80):   540 KB  (baseline)
WebP:         350 KB  (−35%)
JPEG XL:      260 KB  (−52%)
AVIF:         210 KB  (−61%)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AVIF wins at low-to-medium bitrates. JPEG XL wins at high quality.&lt;/strong&gt; For most web photography, AVIF is the right call.&lt;/p&gt;




&lt;h2&gt;
  
  
  Encoding speed matters too
&lt;/h2&gt;

&lt;p&gt;This is where AVIF has a real problem:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Encoding time (approx)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JPEG&lt;/td&gt;
&lt;td&gt;~2.5 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebP&lt;/td&gt;
&lt;td&gt;~168 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JPEG XL&lt;/td&gt;
&lt;td&gt;~seconds (but fast mode available)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVIF&lt;/td&gt;
&lt;td&gt;1–2+ seconds per image&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;AVIF is &lt;strong&gt;slow to encode&lt;/strong&gt;. If you're doing batch conversions, you feel this immediately. JPEG XL's encoder was designed for speed — at its default settings it runs ~100× faster than AVIF in throughput while achieving comparable compression.&lt;/p&gt;

&lt;p&gt;Decoding matters for users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JPEG: ~0.39 ms (fastest)&lt;/li&gt;
&lt;li&gt;WebP: ~24 ms&lt;/li&gt;
&lt;li&gt;AVIF: ~155 ms (5.4× slower than JPEG)&lt;/li&gt;
&lt;li&gt;JPEG XL: similar to AVIF, but with &lt;strong&gt;progressive decoding&lt;/strong&gt; — renders usable preview with just 1% of data downloaded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JPEG XL's progressive rendering is a big deal for large hero images on slow connections. Neither WebP nor AVIF can do this at all.&lt;/p&gt;




&lt;h2&gt;
  
  
  Browser support in 2026
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Support&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WebP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95.67%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baseline "Widely Available" since 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVIF&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Baseline 2024, all major browsers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JPEG XL&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14.74%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Safari 17+ only, Chrome Canary 145 behind flag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HEIC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12.03%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Safari 17+ only, no other browser plans&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;WebP and AVIF are effectively universal. The remaining gaps are legacy browsers — handle them with JPEG fallback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The big news for JPEG XL:&lt;/strong&gt; Google reversed its 2022 decision to remove JPEG XL from Chrome. In November 2025, Chrome engineering welcomed a Rust-based decoder contribution. It landed in Chromium Canary 145. Realistic default Chrome support: &lt;strong&gt;H2 2026&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;HEIC has 12% support entirely from Safari. Chrome, Firefox, Edge — no plans due to HEVC patent complexity. HEIC on the web is dead.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to use each format
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use AVIF when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Serving photos, thumbnails, product images&lt;/li&gt;
&lt;li&gt;You want the best compression for most visitors&lt;/li&gt;
&lt;li&gt;You need animated images (86% smaller than GIF per Google web.dev)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use WebP when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need the universal fallback behind AVIF&lt;/li&gt;
&lt;li&gt;Simple graphics, logos, illustrations&lt;/li&gt;
&lt;li&gt;You don't have time to think about it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use JPEG XL when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Professional photography workflows (already supported in iPhone 16 Pro ProRAW)&lt;/li&gt;
&lt;li&gt;You need lossless compression (48% smaller than PNG)&lt;/li&gt;
&lt;li&gt;Lossless JPEG transcoding (20% size reduction, byte-perfect reconstruction)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wait for Chrome stable before shipping to web visitors&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use HEIC when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're Apple-only (iPhone, Mac, iPad native apps)&lt;/li&gt;
&lt;li&gt;Need to convert for web → &lt;a href="https://convertifyapp.net/heic-to-jpg" rel="noopener noreferrer"&gt;convert HEIC to JPG or WebP instantly&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's actually deployed in 2026?
&lt;/h2&gt;

&lt;p&gt;W3Techs data (March 2026):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PNG: 77.7% of websites&lt;/li&gt;
&lt;li&gt;JPEG: 72.4%&lt;/li&gt;
&lt;li&gt;WebP: &lt;strong&gt;19.4%&lt;/strong&gt; (1 in 5 sites)&lt;/li&gt;
&lt;li&gt;AVIF: &lt;strong&gt;1.3%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;JPEG XL: &amp;lt; 0.1%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AVIF usage grew &lt;strong&gt;386% between 2022–2024&lt;/strong&gt; but still sits at 1.3%. The gap between "supported" and "deployed" is real. CDN auto-negotiation is the fastest path — Cloudflare, Cloudinary, and Shopify's CDN all serve AVIF automatically without you changing a line of frontend code.&lt;/p&gt;




&lt;h2&gt;
  
  
  The practical implementation
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element is still the right approach:&lt;/p&gt;

&lt;p&gt;If you're using a CDN — just use &lt;code&gt;Accept&lt;/code&gt; header negotiation and let the CDN decide.&lt;/p&gt;

&lt;p&gt;If you're converting images manually (e.g. iPhone HEIC photos for web), you can do it in one line with libvips (what I use in Convertify's Rust backend):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vips copy input.heic output.avif
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or just use &lt;a href="https://convertifyapp.net" rel="noopener noreferrer"&gt;convertifyapp.net&lt;/a&gt; — free, no signup, batch up to 10 files. 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next: AV2 and the Chrome decision
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AV2&lt;/strong&gt; was announced by Alliance for Open Media in September 2025 — the next-generation codec that will eventually succeed AVIF. 53% of AOM members plan implementation within 12 months of release. Don't hold off on AVIF waiting for AV2 — that's a 2028+ story.&lt;/p&gt;

&lt;p&gt;The format landscape for 2026–2027:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Ship AVIF + WebP fallback now&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;👀 &lt;strong&gt;Watch JPEG XL&lt;/strong&gt; — Chrome stable target H2 2026&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Skip HEIC for web&lt;/strong&gt; — convert it on upload&lt;/li&gt;
&lt;li&gt;🔭 &lt;strong&gt;AV2&lt;/strong&gt; — 2028+ horizon&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;AVIF is the best format for most web images in 2026. Implement it with WebP fallback using &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;. Use a CDN if you can — it handles everything automatically.&lt;/p&gt;

&lt;p&gt;If you're dealing with HEIC files from iPhone or need to convert between formats, check out &lt;a href="https://convertifyapp.net" rel="noopener noreferrer"&gt;Convertify&lt;/a&gt; — I built it specifically because every other converter was slow or required signup.&lt;/p&gt;

&lt;p&gt;What format are you using in production? Drop a comment — curious how many teams have made the jump to AVIF.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built something with image processing? I'm &lt;a href="https://x.com/app_convertify" rel="noopener noreferrer"&gt;@app.convertify&lt;/a&gt; on X.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>img</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I built a free HEIC image converter with Rust + libvips</title>
      <dc:creator>Serhii Kalyna</dc:creator>
      <pubDate>Thu, 12 Mar 2026 18:06:11 +0000</pubDate>
      <link>https://dev.to/serhii_kalyna_730b636889c/how-i-built-a-free-heic-image-converter-with-rust-libvips-4gm</link>
      <guid>https://dev.to/serhii_kalyna_730b636889c/how-i-built-a-free-heic-image-converter-with-rust-libvips-4gm</guid>
      <description>&lt;h1&gt;
  
  
  How I built a free HEIC image converter with Rust + libvips
&lt;/h1&gt;

&lt;p&gt;I needed a simple tool to convert HEIC photos from iPhone to JPG and WebP. &lt;br&gt;
Most online converters require signup or add watermarks, so I built my own.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Rust + Axum + libvips&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React + Vite + MUI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: VPS with Caddy reverse proxy&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The hardest part — HEIC support
&lt;/h2&gt;

&lt;p&gt;Getting HEIC to work was the biggest challenge. The package manager version &lt;br&gt;
of libheif was too old and didn't support newer iPhone photo formats. &lt;br&gt;
I had to build libheif 1.21.2 from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cmake &lt;span class="nt"&gt;-DCMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Release &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;-DLIBHEIF_ENABLE_PLUGIN_LOADING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ON &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;-DWITH_DAV1D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ON &lt;span class="se"&gt;\&lt;/span&gt;
      ..
make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why libvips?
&lt;/h2&gt;

&lt;p&gt;libvips is significantly faster than ImageMagick for large files — it streams &lt;br&gt;
pixels through a pipeline without loading the entire image into memory. &lt;br&gt;
For batch conversion of 10 images this makes a real difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;All uploaded files are automatically deleted from the server within 6 hours. &lt;br&gt;
No account required, no watermarks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Supports 20+ formats: HEIC, HEIF, WebP, PNG, JPG, AVIF, TIFF, BMP, GIF.&lt;br&gt;
Batch convert up to 10 images at once.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://convertifyapp.net" rel="noopener noreferrer"&gt;convertifyapp.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code coming soon on GitHub.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
