.gif support was one of the trickier parts!
Browsers don't expose which frame a GIF is showing, so we parse it ourselves with gifuct-js, pre-compute alpha masks for every frame, then use elapsed time per-frame delays to stay in sync. Text reflows around the current frame's shape in real-time.
(Another alternative is to render frames manually instead of relying on the browser's <img> playback)