Self-hosted service
FxEmbed/FxEmbed avatar
FxEmbed/FxEmbed

FxEmbed: Fix X/Twitter and Bluesky Embeds on Discord and Telegram

Fix X/Twitter and Bluesky embeds! Use multiple images, videos, polls, translations and more on Discord, Telegram and others.

5,443 stars256 forksTypeScriptMIT

At a glance

What is it?
FxEmbed powers fxtwitter.com and fixupx.com, the services that restore videos, polls, multiple images, and translations when X/Twitter or Bluesky links are shared on Discord, Telegram, or any other platform that renders Open Graph previews. The codebase is a TypeScript Cloudflare Worker, MIT licensed, and self-hostable.
Who is it for?
FxEmbed is the right choice for teams and communities that need reliable embed previews for X/Twitter or Bluesky posts on Discord or Telegram and want to control the infrastructure. Self-hosting requires familiarity with Cloudflare Workers and the supplementary documentation at docs.fxembed.com for credential setup.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 25, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The Embedding Gap on Discord and Telegram

When you paste a link from x.com or twitter.com into Discord or Telegram, the platform's link preview system sends an HTTP request to that URL and reads the Open Graph tags in the response. X Corp's servers return limited metadata for these bot requests: the account name and a thumbnail appear, but the video player is stripped, polls are hidden, and multi-image posts collapse to a single frame. FxEmbed solves this by acting as an intermediary. When a user changes the domain in a link, replacing twitter.com with fxtwitter.com or x.com with fixupx.com, FxEmbed's Cloudflare Worker receives the request, retrieves the real post data, and returns an HTML page with accurate Open Graph tags that include video embeds, all images in a mosaic layout, poll results, and translated text. Bluesky links work the same way by prefixing bsky.app with fx to reach fxbsky.app.

How the Worker Routes Requests by Domain

FxEmbed runs as a Cloudflare Worker, executing at Cloudflare edge nodes rather than on a traditional server. The worker dispatches each request by reading the Host header, which identifies which configured domain the link used. The codebase defines several domain categories, each triggering different output. The standard domains fxtwitter.com, fixupx.com, and twittpr.com produce the full embed. Prefixes like d. or dl. trigger the direct-media domains and return the raw video or image URL rather than an embed page. The t. prefix gives text-only output. The i. prefix produces Telegram Instant View formatting. The g. prefix forces gallery layout, and the m. prefix always runs the mosaic compositor. The video. prefix domain transcodes video to a broadly compatible format. The polyglot.fxembed.com domain handles translations and requires a separate access token. Each of these roles is declared as an environment variable in .env.example, making the mapping explicit and editable in a self-hosted deployment.

Self-Hosting with Docker Compose

FxEmbed ships a Dockerfile and a docker-compose.yml that run the Cloudflare Workers local runtime through Wrangler. The base image is node:24-bookworm-slim rather than Alpine because Wrangler's workerd binary is glibc-linked and does not run on musl. Before building, copy the three example configuration files and edit them for your deployment:

bash
cp .env.example .env
cp wrangler.example.toml wrangler.toml
cp branding.example.json branding.json

Then build and start the container:

bash
docker compose up -d --build

The worker listens on port 8787. Because routing depends on the Host header, pass it explicitly when testing a specific realm:

bash
curl -H "Host: fxtwitter.com" -H "User-Agent: Discordbot/2.0" "http://localhost:8787/user/status/123"

Stop the service with:

bash
docker compose down

Environment variables from .env are bundled at image build time. A change to domain lists or other build-time configuration requires rebuilding the image. Runtime secrets such as CREDENTIAL_KEY and EXCEPTION_DISCORD_WEBHOOK can be passed through the shell or the Compose .env file without a rebuild.

Credential Setup and the Limits of Local Mode

The most significant friction in a self-hosted FxEmbed instance is credential management. The project uses an encrypted credentials system, with npm scripts named credentials:encrypt, credentials:push, credentials:pull, and credentials:change-country handling the lifecycle. These credentials are the Twitter API tokens that allow FxEmbed to fetch post data beyond what unauthenticated requests return. The README does not walk through obtaining these credentials from scratch; that process requires reading the supplementary documentation at docs.fxembed.com. The Docker setup runs Wrangler in local dev mode, which is adequate for testing but is not a production Cloudflare deployment. An EXCEPTION_DISCORD_WEBHOOK can be configured for error reporting. A self-hosted instance is most practical for teams that need custom branding, want to operate in an environment where external services are blocked, or need to audit the code that processes their community's links.

Multi-Image Support via the Mosaic Package

Platforms like Discord display only one image per Open Graph embed. When a post contains multiple images, FxEmbed combines them into a single composite using its Mosaic package, which lives in packages/ inside the repository. Mosaic is a separate module built by contributor Antonio32A and improved by Syfaro, Deer Spangle, and dangeredwolf. It arranges the original images into a grid and encodes the result as a single image that satisfies the single-preview constraint. Force-mosaic domains (the m. prefix variants) apply this behavior even to single-image posts. The standard embed path also triggers Mosaic when a post has more than one image. For Bluesky, a separate mosaic domain at mosaic.fxbsky.app handles the same role. This packaging decision means that multi-image compositing is an internal dependency rather than an external service call during production deployments.

FxTwitter vs. vxTwitter as a Fxtwitter Alternative

vxTwitter is the other widely cited embed fix for X/Twitter links on Discord and Telegram. Both are independently developed services that intercept Open Graph requests. FxEmbed covers Bluesky through fxbsky.app, which vxTwitter does not. FxEmbed's mosaic compositor is built into the Worker via the packages/ directory, while vxTwitter handles its own approach to multi-image posts. The two projects differ in which specific post types they handle correctly at any given time, and the gap between them changes as X Corp modifies its API and embed behavior. For teams deciding which proxy to self-host, the practical questions are: which service was updated most recently, which one handles the specific content types that appear in your community (polls, long-form posts, age-restricted content), and whether Bluesky support matters. FxEmbed and vxTwitter are both MIT licensed.

Editorial conclusion

FxEmbed is the right choice for teams and communities that need reliable embed previews for X/Twitter or Bluesky posts on Discord or Telegram and want to control the infrastructure. Self-hosting requires familiarity with Cloudflare Workers and the supplementary documentation at docs.fxembed.com for credential setup. Teams with no interest in self-hosting can use fxtwitter.com or fixupx.com directly without touching the code. The project remains active: the last push was on 2026-09-25 and it carries the MIT license.

Frequently asked questions

What does fxTwitter mean?

The prefix fx was chosen by the FxEmbed project to produce the fxtwitter.com domain. It stands for the action of fixing broken X/Twitter embeds on platforms like Discord and Telegram.

What is fixupx used for?

fixupx.com is one of the domain names operated by FxEmbed. Replacing x.com in a link with fixupx.com routes the request through the FxEmbed Cloudflare Worker, which returns correct Open Graph embed metadata to Discord and Telegram.

What is the difference between vxTwitter and fxTwitter?

Both are independently developed services that fix X/Twitter embeds on Discord and Telegram and share no code. FxEmbed (fxtwitter.com) also covers Bluesky through fxbsky.app and includes a Mosaic package for combining multiple images into a single preview.

How to fix twitter link embed?

Change twitter.com to fxtwitter.com or x.com to fixupx.com in the link before pasting it into Discord or Telegram. FxEmbed's Cloudflare Worker intercepts the Open Graph request and returns the correct embed metadata, including videos, polls, and multi-image mosaics.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/fxembed-fxembed.svg)](https://hysenlabs.com/projects/fxembed-fxembed)