CONTENTS02 +
Animating the site's sigil as an APNG, how it compares with GIF, WebP and AVIF, and the format's long road to a W3C standard.
I wanted the sigil on this site to move: a pulse climbing the circuit trunk from the roots to the canopy, with the faint grain at its edges intact. GIF drops that grain, because a GIF pixel is either fully see-through or not at all. AVIF keeps it, but an AVIF animation is really a video. Animated PNG kept every pixel exactly, and the file came out at 663 KB.
Eighteen years after the PNG group rejected it, APNG became part of the W3C standard in June 2025, and every major browser already showed it. Discord and Signal both take APNG for animated stickers.
Each frame starts from the paper-coloured sigil this site already uses, filled with its orange. A pale band with soft top and bottom edges then slides up through the sigil’s transparency mask, so it lights only the parts of the tree it passes over. ImageMagick draws the 24 frames and ffmpeg packs them into one file. The first attempt failed with “APNG does not support multiple palettes”. ImageMagick had saved the frames with few colours as palette PNGs, each with its own palette, and an APNG’s frames have to share one. Writing every frame as full 32-bit colour fixed it:
magick base.png highlight.png -compose Over -composite png32:f07.png # one of the 24 framesffmpeg -framerate 12 -i f%02d.png -pix_fmt rgba -pred mixed -plays 0 -f apng sigil-pulse.png
-plays 0 makes it loop forever, and -pred mixed lets the encoder choose a PNG filter for each row. Here that saved 9 KB, about 1.4%.
I sent the same 24 frames through every other image format a browser will animate. It opens on APNG against GIF, where the difference is plainest in the roots and the faint grain around the ring.
The sizes follow from what each format is allowed to throw away. APNG throws away nothing: every frame is compressed losslessly, as a still PNG is, and the encoder can only skip the parts of a frame that haven’t changed since the previous one. The band sweeps through half the sigil’s height in every frame, so there is little to skip, and each frame costs about 28 KB, two-thirds of the 43 KB a single still takes. Lossless WebP keeps the same exact pixels with a stronger compressor and comes out a third smaller. Lossy WebP and AVIF give up precision for size, and AVIF, which is built on the AV1 video codec, also predicts each frame from its neighbours. That is how it gets down to 57 KB, softening the grain only slightly.
Twenty-one years to a standard
APNG began at Mozilla. In 2003 Mozilla dropped MNG, the PNG group’s own animation format, because its decoder library added 300 KB to the browser. In 2004 Stuart Parmenter and Vladimir Vukićević wrote APNG as a lighter replacement, aimed at small interface animations such as the throbber that spins while a page loads. Their trick was to keep the first frame as ordinary PNG image data and put the animation in three extra chunks (acTL, fcTL and fdAT). A decoder that has never heard of APNG skips chunks it doesn’t know, so it shows the first frame as a still image. The cost of that trick is that nothing outside the file says it moves: an APNG is a .png like any other.
Firefox 3 shipped it in 2008, after its trunk builds had carried it since March 2007. A month after those trunk builds, in April 2007, the PNG Development Group voted not to make APNG an official extension, and for years it stayed a Mozilla format that Opera also happened to support. Apple added it in Safari 8 in 2014 and made it the preferred format for animated iMessage stickers in iOS 10. Chrome followed in version 59 in 2017, and Edge in 2020, when it moved to Chromium. Internet Explorer never did.
The W3C chartered a PNG Working Group in 2021, put APNG into the first public draft of the PNG Third Edition in October 2022, and published that edition as a W3C Recommendation on 24 June 2025, with image/apng registered as its media type. The same edition also brought HDR support to PNG.
libpng, the reference PNG library, has been slower still. It ignored APNG for as long as the PNG group did, so Linux distributions spent years carrying an outside patch that added it, because Firefox needed it. Three days after the Recommendation, on 27 June 2025, APNG support was merged into libpng’s development branch, which is now the 2.0 line. The current stable release, 1.6.59 from September 2026, still treats the animation chunks as unknown data. A program that reads PNGs through a released libpng sees only the first frame, unless it parses the animation chunks itself.
Where it fits
Outside the browser, the places you’re most likely to meet APNG are sticker packs. Discord takes it for server stickers of up to 512 KB, Signal for stickers of up to 300 KB and three seconds, and Apple’s iMessage has preferred it since iOS 10. Making one is easy enough: ffmpeg and ImageMagick both write it. Editing one is harder: GIMP can open it but not save it, and LibreOffice shows only the first frame.
On a web page, it earns its bytes when the pixels have to come through exactly and the edges are soft, as with the sigil, or when the place you’re posting it asks for APNG. Everywhere else, AVIF or lossy WebP will show nearly the same animation for a fraction of the size, and every current browser plays both.
CITE THIS POST
Referencing this in a paper or thesis? Here’s a BibTeX entry.
1@misc{galicz2026animated,2 author = {Galicz, Mikl{\'o}s},3 title = {{Animated PNG in 2026: Standard at Last, and Still Heavy}},4 year = {2026},5 month = nov,6 howpublished = {\url{https://blackfyre.ninja/blog/animated-png-in-2026-standard-at-last-and-still-heavy/}},7 url = {https://blackfyre.ninja/blog/animated-png-in-2026-standard-at-last-and-still-heavy/},8 urldate = {2026-11-10},9 note = {Blog post, blackfyre.ninja}10}