How do I save GIFs from X (a.k.a. Twitter)?
GIFwrapped no longer supports downloading GIFs from X (formerly known as Twitter). The app no longer displays GIFs from the platform, and as of version 2024.1, it blocks queries to both the 'twitter.com' and 'x.com' domains.
Why stop supporting the feature?
The feature required constant maintenance due to frequent updates to the Twitter website, which often broke the functionality. Maintaining it became increasingly challenging and time-consuming, as changes could render it non-functional within days of a GIFwrapped release.
This maintenance consumed valuable development time and distracted from other important features, without actively contributing to the app's sales. GIFwrapped is a solo project, managed by a single developer who handles everything from coding to customer support, alongside a full-time job and family responsibilities. Given these constraints, it was not feasible to continue supporting a feature that frequently broke and required significant upkeep.
As a result, GIFwrapped no longer supports downloading GIFs from Twitter, and there are no plans to reinstate this feature in the future.
Why was it difficult to maintain?
To discover GIFs in a tweet, GIFwrapped would first load up the tweet URL in a hidden browser configured to monitor changes to both the HTML and any additional JSON packages that might be fetched by the page. This was important because Twitter doesn't serve its pages with the content embedded; instead, the content is loaded via one of those JSON packages and then built by the JavaScript.
While this sounds simple, it often involved pointing GIFwrapped to exactly the right spot. Twitter obfuscates the IDs and class names in the HTML, making them unreliable, and subject to change almost every time Twitter updated its code. This meant tweets needed to be identified through their HTML tags alone, which is easier said than done (like finding a specific needle in a pile of other needles).
The additional JSON packages supported this feature, as they provide a more structured form of the page's content. They were often the response to a private API endpoint, typically a raw GraphQL-like dump of data to be parsed by the JavaScript and rendered into HTML. This structure changed somewhat regularly, and so GIFwrapped looked for what it thought might be a tweet based on the JSON's structure. If this changed too much (i.e. certain properties got renamed or removed entirely), it also broke, as GIFwrapped wouldn't recognise it anymore.
These two approaches were designed to provide redundancy, so if one failed, the other would continue to work. In practice, they often both broke simultaneously, as Twitter actively made changes to both while continuing to develop Twitter's feature set.
Last updated 4 August, 2024
Not helpful?
If you haven't found the answer you're looking for, you can head back to the list of FAQs, or get in touch and ask your question directly!