← Blog

How to make Twitch sub emotes that pass the 1MB cap (2026)

By Arjun Varma··5 min read

Twitch rejects animated sub emotes over 1MB. Here's the exact pipeline that keeps every emote under the cap without losing quality, including frame-count fallback and APNG vs GIF tradeoffs.

Twitch enforces a strict 1MB hard cap on animated sub emotes — uploads that exceed it are rejected at the dashboard with no retry guidance. The 1MB limit applies to each tier separately (28×28, 56×56, 112×112), and most AI emote tools blow past it on the largest tier because they encode at full quality and let upload fail.

Why animated emotes commonly fail the cap

Twitch's animated emotes ship as GIF, and GIF gets bigger as frame count and color count grow. A 10-frame GIF at 112×112 with full RGBA color and no quantization runs about 1.4-2MB — comfortably over the cap. Naive AI tools encode lossless and push the upload regardless, which Twitch then rejects.

The frame-count fallback pattern

Pile's animation pipeline tries 10 frames first. If the encoded GIF is over 1MB, it re-encodes at 8 frames, then 6, then 4. By the bottom of the ladder every output fits the cap, and 4 frames is enough for most reaction loops (laugh, wave, shake) to read as motion. We pair this with neuquant palette quantization (better than octree for character art with limited colors) and a chroma-key pass that paints sub-128-alpha pixels solid magenta — eliminates the black-halo artifact GIF normally gets on anti-aliased edges.

APNG vs GIF — when to use which

FormatTwitchDiscordBest for
GIF✓ RequiredAcceptedTwitch sub tiers — Twitch rejects APNG
APNG✗ Rejected✓ PreferredDiscord — full alpha, smoother motion

Ship both for every animated emote. Discord gets the APNG (smoother, full alpha). Twitch gets the GIF in its tier-specific folder. Pile's ZIP delivery does this automatically — every animated emote in the pack ships as both formats with the right filename and folder structure.

Checklist for shipping a Twitch-compliant pack

  • Generate at 256×256 master, export to 28×28, 56×56, 112×112 separately (not one image auto-downscaled)
  • Encode GIF with frame-count fallback (10 → 8 → 6 → 4) until under 1MB
  • Use neuquant or similar quality palette quantizer; not octree
  • Apply chroma-key for transparency (alpha threshold + magenta key) — kills the black halo
  • Ship APNG separately for Discord (Twitch will reject it anyway)
  • Filenames match reaction names so the upload picker stays readable

If you'd rather not build this pipeline yourself, Pile ships every paid pack pre-validated against the 1MB cap with GIF + APNG dual delivery. $9 for a 20-emote pack.

Ready to ship a pack?

20 character-locked emotes, every platform size, $9 per pack. No subscription required.

Make my first pack →