{"id":412,"date":"2026-04-18T10:10:00","date_gmt":"2026-04-18T14:10:00","guid":{"rendered":"\/blog\/?p=412"},"modified":"2026-05-10T00:48:31","modified_gmt":"2026-05-10T04:48:31","slug":"compress-gif-twitter-15mb","status":"publish","type":"post","link":"\/blog\/compress-gif-twitter-15mb","title":{"rendered":"Compress GIF for Twitter\/X (Under 15 MB Desktop \/ 5 MB Mobile)"},"content":{"rendered":"\n<p>Twitter\/X has different file size caps for GIF uploads on desktop (15 MB) and mobile (5 MB), and for a reaction GIF that\u2019s posted-and-shared by people on phones, the mobile limit is the one that matters. This guide covers what fits each limit, how to make a GIF that uploads cleanly across both, and the dimension and frame-rate constraints that affect playback in the X timeline.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jump to a section<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"#limits\">Twitter\/X GIF limits (2026)<\/a><\/li><li><a href=\"#mobile\">Why mobile matters more than desktop<\/a><\/li><li><a href=\"#cheat-sheet\">Settings cheat sheet<\/a><\/li><li><a href=\"#walkthrough\">Step by step in xconvert<\/a><\/li><li><a href=\"#mistakes\">Common mistakes that get GIFs rejected<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"limits\">Twitter\/X GIF limits (2026)<\/h2>\n\n\n\n<p>Twitter\/X\u2019s documented GIF specs:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"table table-hover\"><thead><tr><th>Spec<\/th><th>Limit<\/th><\/tr><\/thead><tbody><tr><td><strong>Desktop \/ web upload<\/strong><\/td><td><strong>15 MB<\/strong><\/td><\/tr><tr><td><strong>Mobile (iOS \/ Android app) upload<\/strong><\/td><td><strong>5 MB<\/strong><\/td><\/tr><tr><td><strong>Maximum dimensions<\/strong><\/td><td>1280 \u00d7 1080 px<\/td><\/tr><tr><td><strong>Frame rate<\/strong><\/td><td>No documented cap; keep \u2264 30 fps for smooth playback<\/td><\/tr><tr><td><strong>Maximum length<\/strong><\/td><td>No documented cap; practical: \u2264 6 seconds for engagement<\/td><\/tr><tr><td><strong>Per tweet<\/strong><\/td><td>1 GIF (cannot combine with other images)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>In practice, for a GIF that uploads reliably from any device, target <strong>5 MB<\/strong> so it works for both desktop and mobile uploads. If you know you\u2019re posting from desktop and the file is going to be downloaded by mobile users (Twitter handles that re-encode), 15 MB is fine \u2014 Twitter compresses GIFs on the server side for mobile delivery.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mobile\">Why mobile matters more than desktop<\/h2>\n\n\n\n<p>Most Twitter\/X engagement happens on mobile. If the GIF\u2019s source is high-resolution (a screen recording at 1920\u00d71080), it\u2019ll easily blow past 5 MB even at heavy compression \u2014 but most viewers will see it on a phone screen at ~360 px wide anyway. The visual difference between 1280 px source and 480 px source is invisible at typical mobile viewing sizes.<\/p>\n\n\n\n<p>The mobile cap is also the consistent cap across both upload paths. If you\u2019re tweeting on the go and the file\u2019s 8 MB, the upload fails. If you compress to under 5 MB once, it works everywhere.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"1000\" src=\"\/blog\/wp-content\/uploads\/2026\/05\/step-01-tool-17.png\" alt=\"GIF compressor showing the file extension, file compression mode tabs, and size targeting controls\" class=\"wp-image-468\" srcset=\"\/blog\/wp-content\/uploads\/2026\/05\/step-01-tool-17.png 1600w, \/blog\/wp-content\/uploads\/2026\/05\/step-01-tool-17-300x188.png 300w, \/blog\/wp-content\/uploads\/2026\/05\/step-01-tool-17-1024x640.png 1024w, \/blog\/wp-content\/uploads\/2026\/05\/step-01-tool-17-768x480.png 768w, \/blog\/wp-content\/uploads\/2026\/05\/step-01-tool-17-1536x960.png 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cheat-sheet\">Settings cheat sheet<\/h2>\n\n\n\n<p>Two tiers depending on where you\u2019ll upload from:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mobile-safe (under 5 MB) \u2014 recommended<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"table table-hover\"><thead><tr><th>GIF type<\/th><th>Resolution<\/th><th>FPS<\/th><th>Colors<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Reaction \/ face GIF<\/td><td>480 \u00d7 480<\/td><td>12<\/td><td>64<\/td><td>~3\u20134 MB for 4 sec<\/td><\/tr><tr><td>Screen recording<\/td><td>720 \u00d7 405<\/td><td>12<\/td><td>64<\/td><td>~4 MB for 5 sec<\/td><\/tr><tr><td>Animation \/ motion graphic<\/td><td>600 \u00d7 400<\/td><td>15<\/td><td>128<\/td><td>~4.5 MB for 4 sec<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Desktop-only (under 15 MB)<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"table table-hover\"><thead><tr><th>GIF type<\/th><th>Resolution<\/th><th>FPS<\/th><th>Colors<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Reaction \/ face GIF<\/td><td>720 \u00d7 720<\/td><td>18<\/td><td>128<\/td><td>~10 MB for 5 sec<\/td><\/tr><tr><td>Screen recording<\/td><td>1280 \u00d7 720<\/td><td>15<\/td><td>128<\/td><td>~13 MB for 6 sec<\/td><\/tr><tr><td>Animation \/ motion graphic<\/td><td>960 \u00d7 540<\/td><td>24<\/td><td>128<\/td><td>~12 MB for 5 sec<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For most use cases, <strong>target the mobile cap<\/strong> \u2014 Twitter\u2019s automatic transcoding makes a 5 MB GIF look almost identical to a 15 MB one when displayed in the timeline at 600 px wide.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"walkthrough\">Step by step in xconvert<\/h2>\n\n\n\n<p>For Twitter, you\u2019ll usually get away with just frame-dropping plus resolution. Quality is optional for extra savings.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Open <a href=\"https:\/\/www.xconvert.com\/compress-gif\">xconvert.com\/compress-gif<\/a> and click <strong>+ Add Files<\/strong> to pick your animated GIF.<\/li><li>In <strong>Advanced Options \u2192 Drop Frames<\/strong>, click the <strong>Drop Frames<\/strong> button \u2014 the default is ORIGINAL.<\/li><li><img decoding=\"async\" src=\"images\/step-02a-drop-frames-mode.png\" alt=\"Arrow pointing at the Drop Frames mode button\"><\/li><li>In the <strong>Frames To Drop<\/strong> dropdown that appears, pick <strong>Remove every 3rd frame<\/strong> \u2014 the standard GIF baseline. Drops a third of frames with no visible motion judder for typical reaction or screen content. Use every 2nd only for very smooth source content where one notch isn\u2019t enough to fit.<\/li><li><img decoding=\"async\" src=\"images\/step-02b-frames-dropdown.png\" alt=\"Arrow pointing at the Frames To Drop dropdown\"><\/li><li>In <strong>Image resolution<\/strong> (Resolution Percentage is the default mode), drag the <strong>By Percentage<\/strong> slider down hard \u2014 most Twitter viewers see GIFs in the timeline at ~600 px wide on desktop and ~360 px on mobile, so source dimensions above 480 px are wasted bytes:<\/li><li><strong>35\u201345%<\/strong> for Twitter mobile (5 MB cap) on a 1080p source<\/li><li><strong>50\u201360%<\/strong> for desktop-only (15 MB cap)<\/li><li><img decoding=\"async\" src=\"images\/step-03-resolution.png\" alt=\"Arrow pointing at the Resolution Percentage slider\"><\/li><li><strong>Heads-up \u2014 GIF will look worse than the source video.<\/strong> GIF caps the palette at 256 colors per frame and stores every frame as a full image. Photographic \/ gradient-heavy content visibly bands and posterizes vs. the MP4. That\u2019s the GIF format itself, not the compressor \u2014 if you can post MP4 instead, do (Twitter accepts MP4 up to 512 MB and auto-loops videos under ~60 seconds).<\/li><li>(Optional) Click <strong>Image Quality (%)<\/strong> for additional savings:<\/li><li><img decoding=\"async\" src=\"images\/step-04a-quality-mode.png\" alt=\"Arrow pointing at the Image Quality (%) mode button\"><\/li><li>Drag the <strong>Quality Percentage<\/strong> slider to <strong>~75%<\/strong> \u2014 Twitter\u2019s mobile delivery transcoding hides this much quality loss.<\/li><li><img decoding=\"async\" src=\"images\/step-04b-quality-slider.png\" alt=\"Arrow pointing at the Quality Percentage slider, instruction to drag to 75%\"><\/li><li>Click <strong>Compress<\/strong>. Wait. Download.<\/li><li>Verify file size is <strong>under 5 MB for mobile-safe<\/strong> or <strong>under 15 MB for desktop-only<\/strong> before tweeting.<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mistakes\">Common mistakes that get GIFs rejected<\/h2>\n\n\n\n<p><strong>1. GIFs over 1280 \u00d7 1080 dimensions.<\/strong> Twitter has a hard dimension cap. Bigger source GIFs get rejected even if file size is under 15 MB. Always confirm dimensions \u2264 1280 wide and \u2264 1080 tall.<\/p>\n\n\n\n<p><strong>2. Trying to combine a GIF with other images in one tweet.<\/strong> Twitter allows either 1 GIF OR up to 4 still images in a tweet \u2014 not mixed. If you want both, post the GIF and the images as a thread or separate tweets.<\/p>\n\n\n\n<p><strong>3. Uploading from mobile when over 5 MB.<\/strong> Twitter\u2019s mobile app silently fails or strips the upload when the file exceeds 5 MB. The desktop-web path is more forgiving, but for the same reason: you might post-and-forget on desktop and find later that mobile users see a broken thumbnail.<\/p>\n\n\n\n<p><strong>4. GIFs with paletted-out colors that look fine in preview but bad after upload.<\/strong> Twitter applies its own palette quantization on the server when delivering. Source GIFs with subtle color gradients (sunsets, skin tones, rendered shaders) sometimes look noticeably worse after Twitter\u2019s compression than they do in your preview. Test on the platform after upload.<\/p>\n\n\n\n<p><strong>5. Animated GIFs longer than 6 seconds.<\/strong> No hard limit, but engagement drops sharply after 6 seconds. Long looping GIFs look fine on file but feel boring in the timeline. Trim to the most expressive moments.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">Frequently Asked Questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Does Twitter convert my GIF to MP4?<\/h3>\n\n\n\n<p>Yes, in the timeline. Twitter serves GIFs as silent MP4 (H.264) for bandwidth efficiency on mobile. Your uploaded GIF is the source, but viewers see a transcoded MP4. That means a 15 MB GIF and a 4 MB GIF often look similar to viewers because the timeline player uses Twitter\u2019s compressed version of either.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I upload an MP4 instead of a GIF for the same look?<\/h3>\n\n\n\n<p>Yes. Twitter supports MP4 video uploads up to <strong>512 MB for non-Premium users on both desktop and mobile<\/strong>; auto-loop applies to videos under ~60 seconds. For a \u201clooping animation\u201d use case, an MP4 at 1280\u00d7720 H.264 is typically <strong>5\u201310\u00d7 smaller than the equivalent GIF<\/strong> with much better quality. Use <a href=\"https:\/\/www.xconvert.com\/convert-gif-to-mp4\">GIF to MP4 converter<\/a> if you want to switch formats.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why does my GIF look worse after Twitter than before?<\/h3>\n\n\n\n<p>Two reasons: (1) Twitter applies its own server-side compression when delivering, especially on mobile, (2) Twitter quantizes the color palette when transcoding to its delivery format. The fix is partial: upload at higher quality so Twitter\u2019s compression has more headroom. But for very subtle color content (sunsets, gradients), some quality loss after upload is unavoidable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does sound work in Twitter GIFs?<\/h3>\n\n\n\n<p>No. GIF format doesn\u2019t support audio, and Twitter\u2019s GIF transcode strips any embedded audio if the source had any (it usually doesn\u2019t). For audio + animation, upload an MP4 video with sound \u2014 that supports audio playback when users tap the tweet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How long should a Twitter GIF be?<\/h3>\n\n\n\n<p>3\u20136 seconds is the sweet spot for engagement. Reaction GIFs are typically 1\u20133 seconds; screen recordings or product demos work up to 6 seconds. Anything longer than 8 seconds, viewers swipe past before the loop completes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I post a GIF as a reply or quote tweet?<\/h3>\n\n\n\n<p>Yes \u2014 same upload limits. The 5 MB \/ 15 MB caps apply to any GIF in any tweet regardless of whether it\u2019s a top-level post, reply, quote tweet, or DM.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I edit a GIF after I tweet it?<\/h3>\n\n\n\n<p>No. Once a tweet is posted, the media is locked. Delete and re-tweet if you need to fix a GIF that uploaded poorly.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Try it now<\/h2>\n\n\n\n<p>Compress a GIF for Twitter\/X with the <a href=\"https:\/\/www.xconvert.com\/compress-gif\">xconvert GIF compressor<\/a> \u2014 set <strong>Specific file size<\/strong> to 4.5 MB (mobile-safe) or 14 MB (desktop only), keep <strong>Auto Scale<\/strong> on, click <strong>Compress<\/strong>. For Discord-specific GIF compression (10 MB free \/ 50 MB Nitro Basic), see <a href=\"\/blog\/compress-gif-discord-10mb\/\">Compress GIF for Discord<\/a>. For Slack animated emoji compression (128 KB cap), see <a href=\"\/blog\/slack-animated-emoji-128kb\/\">Slack Animated Emoji<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Twitter\/X has different GIF upload limits on desktop (15 MB) and mobile (5 MB). This guide covers exact xconvert settings to fit either limit, plus the 1280\u00d71080 dimension cap and what happens when GIFs go over.<\/p>\n","protected":false},"author":3,"featured_media":467,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,14],"tags":[],"class_list":["post-412","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to-guides","category-tools"],"_links":{"self":[{"href":"\/blog\/wp-json\/wp\/v2\/posts\/412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"\/blog\/wp-json\/wp\/v2\/comments?post=412"}],"version-history":[{"count":1,"href":"\/blog\/wp-json\/wp\/v2\/posts\/412\/revisions"}],"predecessor-version":[{"id":474,"href":"\/blog\/wp-json\/wp\/v2\/posts\/412\/revisions\/474"}],"wp:featuredmedia":[{"embeddable":true,"href":"\/blog\/wp-json\/wp\/v2\/media\/467"}],"wp:attachment":[{"href":"\/blog\/wp-json\/wp\/v2\/media?parent=412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"\/blog\/wp-json\/wp\/v2\/categories?post=412"},{"taxonomy":"post_tag","embeddable":true,"href":"\/blog\/wp-json\/wp\/v2\/tags?post=412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}