Vencord-style mods for the Element (Matrix) desktop client.
Pick a patch, apply, restart. Undo any time.
Element Mods patches the app's bundled webapp to load a set of JavaScript mods. Everything is local: no telemetry, no server, and every change can be reverted with one command.
Unofficial project, not affiliated with Element or the Matrix.org Foundation.
- Node.js 18+
- A Linux install of Element (e.g.
/opt/Element-Nightlyor/opt/Element)
npm installRun commands from this directory with node src/cli.js. Since the app lives
in /opt (root-owned), any command that writes to it needs sudo:
node src/cli.js detect # auto-detect the install path
node src/cli.js path /opt/Element-Nightly # set the Element install path
sudo node src/cli.js apply # patch ElementThen restart Element. All patches are loaded but disabled by default; toggle them on/off in Settings -> Modding.
Other commands:
node src/cli.js list # show available patches and patch status
node src/cli.js status # show whether the app is currently patched
sudo node src/cli.js restore # restore the original webappClick a patch to see its description.
Autocorrect
LanguageTool-style spelling and grammar checker for the message composer. Mistakes are underlined (red for spelling, blue for grammar); click one for suggestions, Ignore or Disable rule. It works with any LanguageTool-compatible backend, either your own server or the official API, configured in Settings -> Autocorrect.
Force User Status
Force-enables Element's built-in MSC4426 User Status feature (the emoji/text status row in your user menu and the status editor in Settings) even when your homeserver does not advertise support for the org.matrix.msc4429 unstable feature it requires. Element silently force-disables that feature on servers that don't support it, so the setting alone does nothing β this patch bypasses the server-support check. Restart is recommended after enabling.
Works on any server, including matrix.org and custom servers.
Status Control
Lets you control your presence from your profile picture in the top-left corner. Right-click it to pick a status: Online, Away, Offline, Busy or Automatic (left-click keeps the normal user menu), and the chosen mode is forced on the server β Element's own idle/away logic can no longer change it. The current status is shown as a presence dot on your avatar.
GIF Picker
Adds a GIF picker button to the message composer to search GIFs from Giphy or Klipy (switchable via a dropdown in the picker header; your last choice is remembered) and send them into the current room.
To use it you need a (free) API key for each provider:
- Giphy: go to https://developers.giphy.com, sign in, click Create an App and copy the API key.
- Klipy: go to https://partner.klipy.com/api-keys, create a platform, click Create Key and copy it.
- In Element, open the GIF picker, pick the provider in the dropdown, and click the gear (β) icon in its header.
- Paste the key into the field and press Enter.
Keys are stored locally in your browser's localStorage and never leave your machine.
Hidden Features
Adds a 'Hidden Features' tab to the Settings dialog with toggle switches for Element features that aren't exposed in the normal UI: the MSC4426 user-status system (status rows in your user menu/Settings plus an automatic π on-call status), QR-code login, reaction images, developer mode, timeline debug panels, hidden-event display and more. Changes take effect after restarting the app.
Hide Room
Right-click a room and choose 'Hide room' to remove it from the room list. Hidden rooms are saved locally and can be unhidden from a 'Hidden rooms' tab in Settings.
Message Subscriptions
Creates local-only subscription channels: a channel that gathers every message containing a word you pick from a channel you pick, visible only to you (everything is stored locally, nothing is sent to any server). Configure subscriptions in Settings -> Subscriptions by choosing a source channel and typing a word. Each subscription appears as a button in the left sidebar, below the pinned rooms; clicking it opens a live view (newest first) of every matching message, with a button to jump to each one in its real room. It updates in real time as new matching messages arrive.
For example: choose the channel Escalade Support-DEV and the word notidoc β every message in that channel containing "notidoc" will appear in your new subscription channel.
Message Logger
Remembers message text locally and shows deleted messages in red, with a dismiss button that restores the grey 'Message deleted' placeholder.
Modding Tab
Adds a 'Modding' tab to the Settings dialog showing the mod platform version and the list of active patches.
No Quick Settings
Removes the quick settings menu. Clicking the settings gear (bottom of the space panel) opens the full Settings page directly.
Pin Rooms
Pin/unpin rooms via the room right-click menu and show them as avatar buttons in the left sidebar, below the spaces.
Room List Sections
Adds a 'Room list' tab to the Settings dialog to show or hide each section of the conversation list (Unreads, People, Rooms, Mentions, Invites). It also adds a new Latest section that lists every conversation (rooms and chats together) in chronological order, from the most recent message to the oldest.
Save Message
Right-click a message to save it, and open a 'Saved messages' page from a new button in the left sidebar.
Themes
Theme engine modeled after Vencord's theme system: apply and manage custom CSS themes (bundled, added by URL, pasted, or generated from an uploaded image β a color palette is extracted from the image and turned into a theme automatically.
npm install
npm test # validates manifests and runs patch self-checksPatches live in patches/<id>/ (a manifest.json plus an index.js). See CONTRIBUTING.md to write your own.
sudo node src/cli.js restore