👊 Discord, your way. Revenge is a client modification for Discord Android. 🧪 Experimental. Use at your own risk!
Find a file
Palm f6a796f02f
chore: merge feat/external-and-native-plugins to main (#10)
This PR introduces native and external plugins support. The list of changes here are NOT comprehensive and only mentions the most important changes. Check commits from `00047da` to `d2c7f47` (and diff) for full list of changes.

BREAKING CHANGES:

- lib/modules!: Renamed `callBridgeMethod*` to `callNativeMethod*` and interface `Methods` to `NativeMethods`. This is to achieve naming consistency with the native API and be more clear.
- lib/storage!: Renamed to `@revenge-mod/json-storage`. A storage can be in any arbitrary format. While there's little potential for non-JSON storage formats, but the naming should allow for it regardless. This is not a drop-in replacements. There are breaking changes in export names and new APIs.
- plugins/revenge.api.storage!: Renamed to `revenge.api.jsonStorage`. Plugin options are renamed and its structure has changed as well.
- Native now holds the path for official storage APIs. This update uses new paths without any migration!
- lib/plugins!: `Plugin.errors` is now read-only. Use `Plugin.reportError(e)` instead.
- lib/plugins!: `Plugin.flags` has been completely removed in favor of these methods: `Plugin.requireReload()`, `Plugin.disable()`.
- New versioning system: Allowing any amount of number segments, with prerelease support.
  - Any number of segments is supported: 1, 1.0, 1.0.0, 1.0.0.0, ...
  - Prerelease labels are compared "digit-run", similar to Debian.
  - Plugins must specify a version.
  - User-facing plugins should use CalVer. API plugins should use SemVer.
    Revenge APIs use SemVer while the new `discord` dependency parses the Discord version string directly.
- Dependency is now a Map, with support for version ranges and optional. Suggested URL is removed. (See new repo system)
- Plugins will now have to declare a dependency on `revenge.api` (Revenge API version) and `discord` (Discord version).
- Manifest now requires a format version (currently `1`)

New APIs:

- lib/plugins/utils: Utilities to format versioning
- lib/discord/design: `FloatingActionButton` types

Features:

- New repo system: Repository design is inspired by Linux package repositories.
  - Repos host manifest, versions, channels, download URL/size, and hash for multiple plugins.
  - New dependency system: Plugins are versioned, and shouldn't break when updates come.
    Plugins can now declare dependency on supported Discord/Revenge API versions, so they won't break with auto-updates.
    Dependencies can be optional, but dependency on `revenge.api` and `discord` must be required.
    Dependents are soft-disabled when dependencies don't satisfy. Once satisfied, the plugin can start again.
  - All updates for running plugins REQUIRE a reload to prevent stale linking issues. Both native and JS-side.
  - Update checking is handled entirely by JS. But the native-side still handles installation, indexing, and verification.
  - Local indexes are updated against remote indexes. Dependency checking always uses local indexes.
  - Users can add custom repositories and custom their priority order. URL is the identity.
- Plugins can now have custom data URI icons instead of being restricted to React Native app assets.
- External plugin installs require UI confirmation before installing.
- Pending Update and Pending Reload filters in Plugins page.
- Ability to browse external plugins in repositories. Official repository will be added soon.

Fixes/Refactor:

- lib/modules/native/fs: `rmSync` not actually deleting anything.
- Refactored Plugin-related settings to a separate "Plugin Settings" plugin.
- Masonry layout fixes in landscape.
- Removed dead code.
- Fixed sorting for 'Enabled first'.
- Updated native method names to be more consistent.
- Make methods more 'safe' by removing non-null assertion casts.
2026-07-25 23:48:15 +04:00
.github/workflows ci(build): remove fetch-depth from checkout 2025-07-21 21:26:13 +07:00
.vscode chore: use biome v2 2025-06-03 16:22:59 +07:00
assets chore(README): add assets 2025-04-16 14:56:51 +07:00
lib fix(plugins/settings.plugins): match the version, channel, and repo exactly from the card when installing plugins from the Browse screen 2026-07-26 02:01:58 +07:00
patches fix: update broken package patch 2025-08-06 20:55:41 +07:00
scripts fix: build compilation failing 2026-06-10 23:59:04 +07:00
shims chore(shims): remove bad file in tsconfig 2025-09-02 10:25:08 +07:00
src fix(plugins/settings.plugins): match the version, channel, and repo exactly from the card when installing plugins from the Browse screen 2026-07-26 02:01:58 +07:00
types feat(lib/modules): support native to JS bridge 2026-07-06 23:48:27 +07:00
.editorconfig chore: use biome v2 2025-06-03 16:22:59 +07:00
.gitignore chore: initial commit 2025-03-21 19:59:16 +07:00
biome.json chore: update dependencies 2026-07-26 00:26:13 +07:00
bun.lock chore: update dependencies 2026-07-26 00:26:13 +07:00
bunfig.toml chore: update bunfig 2025-11-12 14:59:11 +07:00
LICENSE chore: add LICENSE 2025-07-12 01:43:28 +07:00
package.json chore: update dependencies 2026-07-26 00:26:13 +07:00
README.md chore(README): clarify more on how external scripts should map imports 2025-08-25 21:52:05 +07:00
tsconfig.json fix(plugins/developer-kit): proper error message for websocket disconnects 2026-02-26 17:22:29 +07:00


             

Revenge

Discord, your way. Revenge is a client modification for Discord Android.

Revenge aims to be a lightweight and lightning-fast client modification for Discord Android, while being user-friendly and developer-first. It provides a powerful framework, allowing developers to make add-ons with ease. The sky is the limit!

❓ About

This repository releases Hermes Bytecode to be executed on official Discord Android clients. The bytecode is not standalone and is meant to be used with official bootstrappers listed in the ⬇️ Download section.

💪 Features

  • 🔌 Plugins: Extend Discord with custom features
  • 🎨 Themes & Fonts: Customize Discord's appearance to your liking
  • 🧪 Experiments: Try out Discord's new features before they're rolled out

⬇️ Download

These are the official Revenge ways to install Revenge:

Using the installation methods above will currently install Revenge Classic. You'll need to update from Revenge Classic to Revenge Next manually.

⬆️ Updating to Revenge Next

It is recommended to do a separate installation of Revenge before updating to Revenge Next.
Revenge Next does not offer an easy way to downgrade to Revenge Classic.

To update to Revenge Next from Revenge Classic, follow these steps:

  1. Download the latest release asset from Revenge Next's Actions tab.
  2. Extract the built bundle and host a local HTTP server that serves the revenge.bundle file.
  3. In Revenge Classic, go to Settings > Revenge, and toggle on Developer Settings.
  4. Navigate back, and head into the Developer section.
  5. Edit the Load from custom URL field to point to the URL of the revenge.bundle file you hosted.
  6. Restart Discord, and you should be running Revenge Next!

🔄️ Updating builds

Revenge Next is updated regularly with new features and bug fixes. To update to the latest build, follow these steps:

  1. Host a HTTP server that points to a new revenge.bundle file.

  2. Head to Settings > Developer (under the Revenge section).

  3. Tap on the Evaluate JavaScript option.

  4. Paste and evaluate the following snippet. Make sure to modify the URL to point to your newly hosted revenge.bundle file:

    var REVENGE_UPDATE_URL = "<URL here, keep the quotes>";
    revenge.discord.native.FileModule.writeFile("documents", "pyoncord/loader.json", JSON.stringify({"customLoadUrl":{"enabled":true,"url":REVENGE_UPDATE_URL}}), "utf8");
    "URL updated, please reload Revenge"
    
  5. Restart Discord.

👷 Developing with Revenge Next

You'll need to have Bun installed. Once you have Bun, follow these steps:

# Install dependencies
bun install

# Build Revenge Next
bun run build

# Build Revenge Next with debugging enabled (slow, don't use in production)
bun run build --dev
# Start the development server
bun run dev

# Build as production
bun run dev --prod

Builds are generated at dist/revenge.bundle.

# Build types for external consumers
bun run types

Types are generated at dist/types. To consume, include <dir>/globals.d.ts, and map @revenge-mod/* to <dir>/lib/*.
Bundlers will need to map imports to property access on revenge turning kebab-case and snake_case to camelCase. Example: @revenge-mod/discord/modules/main_tabs_v2 to revenge.discord.modules.mainTabsV2