Enhance your X experience.
A modular plugin system for X (formerly Twitter) - available as a browser extension and a desktop app.
Installation • Plugins • Development • Create a Plugin • Contributing
Chrome Web Store and Firefox Add-ons listings coming soon.
Manual install (Chrome/Chromium):
- Clone and build (see Development)
- Go to
chrome://extensions, enable Developer mode - Click Load unpacked and select
packages/extension/dist
Download the latest release for your platform:
| Platform | Formats |
|---|---|
| Windows | .exe installer, portable |
| Linux | AppImage, .deb |
| macOS | .dmg (ARM & x64) |
The desktop app includes everything the extension offers, plus exclusive features like Discord Rich Presence, system tray integration, window transparency, and auto-updates.
BetterX ships with many plugins - all toggleable at runtime from the settings panel. Here are some highlights:
- AdBlocker - hide sponsored posts and ads from your feed
- BringTwitterBack - revert X branding back to Twitter (logo, buttons, labels)
- FixUpX - auto-convert copied tweet URLs to FixupX / vxTwitter embeds
- GifFavorites - add a favorites category to the GIF picker, like Discord
- MeowAd - replace ads with cute cats :3
- QuickEmoji - Discord-style
:emoji:syntax in the tweet composer - TweetScreenshot - one-click screenshot button on every tweet
...and more. Open the BetterX settings panel to browse and configure all of them.
git clone https://github.com/Feur-Inc/BetterX.git
cd BetterX
bun installpackages/
core/ # Shared plugin API, UI components, theme engine
plugins/ # All built-in plugins
extension/ # Chrome/Firefox browser extension (MV3)
desktop/ # Electron desktop app
# Build everything
bun run build
# Build individual packages
bun run build:core
bun run build:plugins
bun run build:extension
bun run build:desktopRequirements:
- Bun 1.x (
curl -fsSL https://bun.sh/install | bash) - Linux, macOS, or Windows (WSL)
Steps:
git clone https://github.com/Feur-Inc/BetterX.git
cd BetterX
bun install
cd packages/extension
bun run build:firefox # outputs to dist/firefox/
bun run pack:firefox # creates dist/betterx-firefox.zipThe resulting dist/betterx-firefox.zip is the exact file submitted to AMO.
# Full dev experience with hot-reload
cd packages/desktop
bun run dev:allimport { definePlugin, Devs, OptionType } from "@betterx/core";
export default definePlugin({
name: "MyPlugin",
description: "Does something cool",
authors: [Devs.YourName],
// Optional: restrict to a platform
// platform: "desktop",
options: {
someToggle: {
type: OptionType.BOOLEAN,
default: true,
description: "Enable the cool thing",
},
},
start() {
// Plugin enabled - set up observers, inject UI, etc.
const value = this.settings.store.someToggle;
},
stop() {
// Plugin disabled - clean up
},
});Add your plugin to packages/plugins/src/MyPlugin/index.ts and it will appear in the settings panel on both platforms.
X enforces a strict Content Security Policy that blocks most external requests from page scripts. BetterX provides two proxy helpers that route requests through a CSP-exempt context (the extension background service worker, or Electron's main process on desktop):
import { proxyImage, proxyFetch } from "@betterx/core";Fetches an image and returns a data: URL safe to use anywhere a URL is accepted.
// In a plugin's start():
const src = await proxyImage("https://example.com/sprite.png");
el.style.backgroundImage = `url('${src}')`;
myImg.src = src;Fetches any URL and returns { ok, status, text, json }.
// GET
const { ok, json } = await proxyFetch("https://api.example.com/data");
// POST
const res = await proxyFetch("https://api.example.com/save", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ key: "value" }),
});
if (res.ok) console.log(res.json);Note: Never use raw
fetch()or hardcode external URLs in<img src>/background-image- they will be blocked by X's CSP in the extension. Always go throughproxyImage/proxyFetch.
Contributions are welcome! Whether it's a new plugin, a bug fix, or an improvement to the core - feel free to open a PR.
- Fork the repo
- Create a feature branch (
git checkout -b my-feature) - Make your changes and test on both extension and desktop
- Submit a pull request
- Inspired by Vencord
- Thanks to SauceyRed for the original Bring Twitter Back concept
- Thanks to all contributors
BetterX is released under the GNU General Public License v3.0.
