6 min read · updated 2026-11-05

Animated emotes: getting a GIF under 1 MB

Twitch allows 1 MB and 60 frames for an animated emote. The frame count is rarely the problem — the byte cap is, and it is a compression problem rather than a length problem.

GIF is a format from 1987. It caps each frame at a 256-colour palette, has no real transparency (one palette index is designated invisible), and scales file size with frame count times palette size times pixel area.

Understanding that model is what lets you hit the cap without turning your emote into a slideshow.

The budgets

Discord is the surprise for most people: an animation that passes Twitch often fails Discord, because Discord allows far fewer bytes on a larger canvas.

PlatformCapFramesPractical note
Twitch1 MB60Two and a half seconds at 24fps
Discord256 KB—About a quarter of Twitch’s budget on a larger square
Slack128 KB50The tightest of the common platforms
YouTube1 MBn/aAccepts GIF, renders only the first frame

What actually costs bytes

  • What moves. GIF compresses by storing only changed regions between frames. A blink or a bounce is cheap; a full-frame pan or zoom is expensive.
  • Colour count. A 256-colour palette per frame is the maximum; reducing to 64 or 32 often halves the file with little visible loss on flat art.
  • Frame rate. Halving from 30fps to 15fps roughly halves the data and is usually invisible for an emote-scale loop.
  • Canvas size. Twitch renders at 28px but uploads are 112px — you cannot ship a 28px GIF instead.

A reliable approach

A seamless loop matters more than length. Chat repeats the GIF forever, and a visible seam becomes irritating within a few cycles.

  1. Design the loop with a still background and one moving element — a blink, a wave, a single bouncing item.
  2. Export at 112×112, 15fps, and keep it under two seconds.
  3. Encode with a two-pass palette: analyse the whole animation first, then apply one shared palette.
  4. If it still exceeds the cap, degrade deterministically: lower the frame rate, then reduce the palette, then trim the loop.
  5. Check the result at 28px — an animation that reads at 112px may turn into a flicker at chat size.

YouTube does not animate

YouTube accepts GIF uploads for membership emoji but displays a static image. If your set is animated, plan a static variant for YouTube and pick a frame that reads on its own.

Questions

Why does my animated emote work on Twitch but fail on Discord?

Discord allows 256 KB for an animated emoji on a 128px canvas, roughly a quarter of Twitch’s budget. Fewer frames, a smaller palette or a smaller moving region usually fixes it.

Can I use APNG instead of GIF?

For Discord stickers yes — APNG is accepted and gives real partial transparency. For Twitch channel emotes the accepted animated format is GIF.

How many frames should an emote loop use?

As few as the motion needs. A blink is often four to six frames. Twitch allows 60, but the byte cap usually binds long before that.

Make a set that reads at 28px

One character, every reaction, each scored before you download.

Build a set →