Inspired by Robin Universe's TwitFix, rewritten in TypeScript as a Cloudflare Worker to scale, packed with even more features and best-in-class user privacy 🔒.
We all have videos of memes and other things from Twitter we want to quickly share with friends. With normal Twitter links, embedding videos is often broken on Discord and impossible on Telegram. But using FixTweet, we embed the raw mp4 file so it's compatible with just about anything supporting video embeds.
On Discord, we'll also automatically embed videos linked from other platforms, such as YouTube, so they can play without having to open a browser.
If you want to share the results of a Twitter poll, you can do so by just linking the Tweet using FixTweet.
Quote tweets and their media can provide important context to a Tweet. So we'll automatically add said context, and even media if there isn't already media embedded in the quote.
You can translate a tweet into any other supported language, with the original and translated text displayed as space allows.
Just append a tweet with its 2-letter ISO language code. So for English, add /en
at the end.
Want to link directly to a Tweet's media without the embed? You can easily do that using FixTweet.
There are a few supported ways to do this:
- Add
d.
ordl.
before the domain (so,d.twittpr.com
ordl.fxtwitter.com
) - Add
.mp4
to the end of videos or.jpg
to the end of images, after the tweet ID - Add
/dl
or/dir
between the domain and the username
Examples from above:
https://d.twittpr.com/dangeredwolf/status/1548119328498728960
https://fxtwitter.com/dangeredwolf/status/1548117889437208581.jpg
https://fxtwitter.com/dl/dangeredwolf/status/1548117889437208581
Tweets with multiple images are supported, so you can do something like this and it will pick the correct one:
https://d.twittpr.com/dangeredwolf/status/1547514042146865153/photo/3
Otherwise, it will default to the first image.
The default Twitter embeds include t.co link shorteners, which make it difficult to know where the link is heading. We automatically replace t.co links with their original links to make things clearer.
We use Twitter's color data for either the first image/video of the tweet, or the author's profile picture. It makes the embed's appearance more aesthetic, as well as in line with the content of the Tweet.
FixTweet doesn't save logs of what tweets you're sending, nor do we have a public record of what tweets are being embedded by FixTweet.
In fact, because our core embedding and API service uses Cloudflare Workers, FixTweet can only run when you send it a request. Its memory doesn't stick around, and it doesn't have a file system or database to access at all. That is how we keep our privacy promise by building it into the architecture. My goal is always to provide a good public service, and FixTweet doesn't have any ads or tracking to make money off of, nor do we sell data (or even have data to sell).
Note: We use Cloudflare to cache FixTweet responses to make repeat access faster, which have a maximum TTL of 1 hour. Temporary real-time logging in the terminal (specifically wrangler tail
) may be used only by the developer while the Worker is being serviced or debugged (to make sure things work as they should), however these logs are only shown in the terminal and are never saved or used for any other purpose. URLs that cause runtime errors in the script (aka Exceptions, usually exceedingly rare unless there was a faulty update pushed out or Twitter API is down) may be logged for a developer to diagnose the issue that is preventing your embed from working.
On a different note, if the person who posted a FixTweet link forgot to strip tracking parameters (like ?s
and &t
), we strip it upon redirecting to the Tweet as they are only used for Twitter telemetry and advertising.
In many ways, FixTweet has richer embeds and does more. Here's a table comparing some of FixTweet's features compared to Twitter default embeds as well as other embedding services
¹ Discord will attempt to embed Twitter's video player, but it is unreliable
² Neither FixTweet or vxTwitter have a public embed ledger, for privacy reasons. vxTwitter still stores all responses in a database / JSON file controlled by the owner. FixTweet by contrast relies on Cloudflare caching of responses: there is no link store accessible to the owner.
³ Discord uses a custom embed container for Twitter.com to enable multi-image, which is unfortunately not available to other websites.
⁴ On GitHub, BetterTwitFix (vxTwitter) claims to support this feature, however in my testing as of mid-July 2022, this does not seem to work.
⁵ External media requiring web containers, such as YouTube, won't embed in Telegram because Telegram doesn't support it. Plain media will work in Telegram, and it works either way inside Discord.
TwitFix and its derivatives have quite a few dependencies you need to rely on. You need to set up a server somewhere, install Python, all its dependencies, then either set up youtube-dl
(more resource intensive) or beg Twitter for API access, and optionally set up a database, otherwise it uses the file system to cache.
FixTweet was written from the start as a lightweight, TypeScript-based Cloudflare Worker. Cloudflare Workers are completely free for up to 100,000 requests per day, per account. Cloudflare Workers are fast to set up and your script is distributed in their datacenters around the world for lower latency.
FixTweet does not need a database nor a Twitter API key: It takes a similar approach to youtube-dl
where it pretends to be a logged-out Twitter web user, fetching a guest token and making API requests from there. As far as I can tell, this basically means we have "unlimited" read-only access to Twitter's API, including things they don't expose in their public API, useful for polls and other features.
Clone the repo, install Node.js and run npm install
in the repo directory. Copy wrangler.example.toml
to wrangler.toml
and add your Cloudflare account ID, and change the name of your worker if you need to. Also copy .env.example
to .env
and change HOST_URL, DIRECT_MEDIA_DOMAINS to your desired domain and whatever else you need to do. Authenticate with Cloudflare with npx wrangler login
, then do npx wrangler publish
(or npm run publish
).
Once you're set up with your worker on *.workers.dev
, add your worker to your custom domain.
Populate Sentry details in your .env
to use Sentry in your product to catch exceptions.
They all run the exact same worker and function identically... mostly.
fxtwitter.com
is the primary domain these days, with twittpr.com
as an alternative that allows for quick sed replacement. pxtwitter.com
was our original domain, but we consider that to be deprecated now.
The way we handle this is that on post-deprecation Tweets linked using pxtwitter.com
, instead of saying "FixTweet", it will have a notice that we've moved to fxtwitter.com
. The embeds and redirects will still work, and Tweets posted before deprecation will not be unaffected at all, but it will gently encourage people to migrate by applying the notice to newer Tweets.
pxtwitter.com
was our original domain for the project, bought the day before we launched FixTweet (then known as pxTwitter). I was trying to find something memorable and px
kinda sounds like "pix" or can mean "pixels" which is fitting as a service that can embed images, videos, etc. Not long after, I bought twittpr.com
because it's easier to do sed replacement with on Discord (s/e/p
), and because it had a p
in it, it was sorta related to pxTwitter. They have always functioned identically.
A couple weeks later, I acquired the fxtwitter.com
domain from RobinUniverse and alongside this rebranded the project as FixTweet and shifted fxtwitter.com
to be the primary domain instead of pxtwitter.com
. Like the addition of twittpr.com
this domain works identically to the others.
Telegram's embedding servers sometimes never even send us a request to embed a URL, possibly due to their servers being overloaded. If you have a link that is broken you can try one of FixTweet's other domains (fxtwitter.com
, pxtwitter.com
, twittpr.com
) or use Webpage Bot to try to clear the cache of the embed.
No problem! You can pick any specific photo from a Tweet using Twitter's own URL syntax (/photo/1
is the first photo of a tweet) and we'll render you the full-resolution original image.
Licensed under the permissive MIT license. Feel free to send a pull request!
- Improved support for multi-image with large height differences
- Discord bot
Feel free to open an issue
Mosaic Multi-image combiner by Antonio32A
& other contributions by Burner, Deer-Spangle, Antonio32A