# endcord/endcord-mobile architecture

> Architecture diagram of the GitHub repository endcord/endcord-mobile, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/endcord/endcord-mobile
- Repository: https://github.com/endcord/endcord-mobile

## Overview

Endcord Mobile combines an Android installer/loader with a shared runtime bundle used on Android and iOS. The principal Android workflow takes an installed or downloaded Discord app, rebuilds it with Endcord, and installs the result; inside Discord, the loader starts the bundle, which initializes themes, settings, compatibility APIs, and plugins. The README documents major capabilities and platform roles; source excerpts show selected startup, network, and update-worker relationships. Unverified links are omitted or dashed.

Main entry points: [`bundle/src/index.ts`](https://github.com/endcord/endcord-mobile/blob/next/bundle/src/index.ts) (Bundle startup), [`android/installer/app/src/main/java/app/revenge/manager/ui/screen/installer/InstallerScreen.kt`](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/ui/screen/installer/InstallerScreen.kt) (Installer screens), [`android/installer/app/src/main/java/app/revenge/manager/updatechecker/worker/UpdateWorker.kt`](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/updatechecker/worker/UpdateWorker.kt) (Discord update checks), [`android/installer/app/src/main/java/app/revenge/manager/domain/manager/InstallManager.kt`](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/manager/InstallManager.kt) (Install management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_installer["Android Installer"]
  node_installer_ui["Installer screens<br/>[InstallerScreen.kt]"]
  node_download["APK downloads<br/>[DownloadManager.kt]"]
  node_patch_steps["Patch workflow"]
  node_install_manager["Install management<br/>[InstallManager.kt]"]
  node_install_service["Install callbacks"]
  node_preferences[("Installer preferences")]
  node_update_worker["Discord update checks<br/>[UpdateWorker.kt]"]
  node_rest_repository["REST repository<br/>[RestRepository.kt]"]
  node_rest_service["REST endpoints<br/>[RestService.kt]"]
  node_http_service["HTTP client<br/>[HttpService.kt]"]
end

subgraph group_loader["Android Loader"]
  node_xposed_entry["Xposed entry<br/>[Main.kt]"]
  node_plugin_install["Plugin installation"]
  node_repo_store[("Plugin repositories<br/>[RepoStore.kt]")]
  node_source_store[("Plugin sources<br/>[SourcesStore.kt]")]
  node_ios_integration["iOS integration"]
end

subgraph group_bundle["Shared Runtime"]
  node_bundle_entry["Bundle startup<br/>[index.ts]"]
  node_settings["Settings and UI<br/>[index.ts]"]
end

subgraph group_addons["Add-ons and APIs"]
  node_theme_runtime["Themes and fonts<br/>[index.ts]"]
  node_plugin_runtime["Plugin runtime<br/>[index.ts]"]
  node_compatibility["Vendetta compatibility<br/>[plugins.ts]"]
  node_mobile_plugins["Built-in plugins<br/>[manifest.ts]"]
end

node_user(("Android user"))
node_discord_app["Discord app"]

node_user -->|"starts install"| node_installer_ui
node_installer_ui -.->|"uses installed app"| node_discord_app
node_installer_ui -.->|"requests download"| node_download
node_download -.->|"supplies APK"| node_patch_steps
node_patch_steps -.->|"installs rebuilt app"| node_install_manager
node_install_manager -.->|"receives result"| node_install_service
node_installer_ui -.->|"configures"| node_preferences
node_update_worker -->|"refreshes installed app"| node_install_manager
node_update_worker -->|"reads settings"| node_preferences
node_update_worker -->|"requests versions"| node_rest_repository
node_rest_repository -.->|"delegates requests"| node_rest_service
node_rest_service -->|"sends requests"| node_http_service
node_xposed_entry -->|"hooks package"| node_discord_app
node_xposed_entry -.->|"loads runtime"| node_bundle_entry
node_plugin_install -->|"reads indexes"| node_repo_store
node_plugin_install -->|"records sources"| node_source_store
node_bundle_entry -->|"initializes themes"| node_theme_runtime
node_bundle_entry -->|"updates plugins"| node_plugin_runtime
node_bundle_entry -->|"initializes compatibility"| node_compatibility
node_bundle_entry -->|"initializes settings"| node_settings
node_mobile_plugins -.->|"loaded by runtime"| node_plugin_runtime
node_ios_integration -->|"runs shared bundle"| node_bundle_entry

click node_installer_ui "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/ui/screen/installer/InstallerScreen.kt"
click node_download "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/manager/DownloadManager.kt"
click node_patch_steps "https://github.com/endcord/endcord-mobile/tree/next/android/installer/app/src/main/java/app/revenge/manager/installer/step"
click node_install_manager "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/manager/InstallManager.kt"
click node_install_service "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/installer/session/SessionInstallerService.kt"
click node_preferences "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/manager/PreferenceManager.kt"
click node_update_worker "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/updatechecker/worker/UpdateWorker.kt"
click node_rest_repository "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/repository/RestRepository.kt"
click node_rest_service "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/network/service/RestService.kt"
click node_http_service "https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/network/service/HttpService.kt"
click node_xposed_entry "https://github.com/endcord/endcord-mobile/blob/next/android/loader/app/src/main/kotlin/io/github/revenge/xposed/Main.kt"
click node_plugin_install "https://github.com/endcord/endcord-mobile/blob/next/android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/PluginInstallMethods.kt"
click node_repo_store "https://github.com/endcord/endcord-mobile/blob/next/android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/repos/RepoStore.kt"
click node_source_store "https://github.com/endcord/endcord-mobile/blob/next/android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/repos/SourcesStore.kt"
click node_bundle_entry "https://github.com/endcord/endcord-mobile/blob/next/bundle/src/index.ts"
click node_settings "https://github.com/endcord/endcord-mobile/blob/next/bundle/src/core/ui/settings/index.ts"
click node_theme_runtime "https://github.com/endcord/endcord-mobile/blob/next/bundle/src/lib/addons/themes/index.ts"
click node_plugin_runtime "https://github.com/endcord/endcord-mobile/blob/next/bundle/src/lib/addons/plugins/index.ts"
click node_compatibility "https://github.com/endcord/endcord-mobile/blob/next/bundle/src/core/vendetta/plugins.ts"
click node_mobile_plugins "https://github.com/endcord/endcord-mobile/blob/next/bundle/src/plugins/manifest.ts"
click node_ios_integration "https://github.com/endcord/endcord-mobile/tree/next/ios"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_installer_ui,node_download,node_patch_steps,node_install_manager,node_install_service,node_preferences,node_update_worker,node_rest_repository,node_rest_service,node_http_service,node_user toneBlue
class node_xposed_entry,node_plugin_install,node_repo_store,node_source_store,node_ios_integration toneAmber
class node_bundle_entry,node_settings toneMint
class node_theme_runtime,node_plugin_runtime,node_compatibility,node_mobile_plugins toneRose
class node_discord_app toneIndigo
```

## Components

### Android Installer

- [Installer screens](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/ui/screen/installer/InstallerScreen.kt): `android/installer/app/src/main/java/app/revenge/manager/ui/screen/installer/InstallerScreen.kt`
- [APK downloads](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/manager/DownloadManager.kt): `android/installer/app/src/main/java/app/revenge/manager/domain/manager/DownloadManager.kt`
- [Patch workflow](https://github.com/endcord/endcord-mobile/tree/next/android/installer/app/src/main/java/app/revenge/manager/installer/step): `android/installer/app/src/main/java/app/revenge/manager/installer/step`
- [Install management](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/manager/InstallManager.kt): `android/installer/app/src/main/java/app/revenge/manager/domain/manager/InstallManager.kt`
- [Install callbacks](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/installer/session/SessionInstallerService.kt): `android/installer/app/src/main/java/app/revenge/manager/installer/session/SessionInstallerService.kt`
- [Installer preferences](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/manager/PreferenceManager.kt): `android/installer/app/src/main/java/app/revenge/manager/domain/manager/PreferenceManager.kt`
- [Discord update checks](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/updatechecker/worker/UpdateWorker.kt): `android/installer/app/src/main/java/app/revenge/manager/updatechecker/worker/UpdateWorker.kt`
- [REST repository](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/domain/repository/RestRepository.kt): `android/installer/app/src/main/java/app/revenge/manager/domain/repository/RestRepository.kt`
- [REST endpoints](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/network/service/RestService.kt): `android/installer/app/src/main/java/app/revenge/manager/network/service/RestService.kt`
- [HTTP client](https://github.com/endcord/endcord-mobile/blob/next/android/installer/app/src/main/java/app/revenge/manager/network/service/HttpService.kt): `android/installer/app/src/main/java/app/revenge/manager/network/service/HttpService.kt`

### Android Loader

- [Xposed entry](https://github.com/endcord/endcord-mobile/blob/next/android/loader/app/src/main/kotlin/io/github/revenge/xposed/Main.kt): `android/loader/app/src/main/kotlin/io/github/revenge/xposed/Main.kt`
- [Plugin installation](https://github.com/endcord/endcord-mobile/blob/next/android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/PluginInstallMethods.kt): `android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/PluginInstallMethods.kt`
- [Plugin repositories](https://github.com/endcord/endcord-mobile/blob/next/android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/repos/RepoStore.kt): `android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/repos/RepoStore.kt`
- [Plugin sources](https://github.com/endcord/endcord-mobile/blob/next/android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/repos/SourcesStore.kt): `android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/repos/SourcesStore.kt`
- [iOS integration](https://github.com/endcord/endcord-mobile/tree/next/ios): `ios`

### Shared Runtime

- [Bundle startup](https://github.com/endcord/endcord-mobile/blob/next/bundle/src/index.ts): `bundle/src/index.ts`
- [Settings and UI](https://github.com/endcord/endcord-mobile/blob/next/bundle/src/core/ui/settings/index.ts): `bundle/src/core/ui/settings/index.ts`

### Add-ons and APIs

- [Themes and fonts](https://github.com/endcord/endcord-mobile/blob/next/bundle/src/lib/addons/themes/index.ts): `bundle/src/lib/addons/themes/index.ts`
- [Plugin runtime](https://github.com/endcord/endcord-mobile/blob/next/bundle/src/lib/addons/plugins/index.ts): `bundle/src/lib/addons/plugins/index.ts`
- [Vendetta compatibility](https://github.com/endcord/endcord-mobile/blob/next/bundle/src/core/vendetta/plugins.ts): `bundle/src/core/vendetta/plugins.ts`
- [Built-in plugins](https://github.com/endcord/endcord-mobile/blob/next/bundle/src/plugins/manifest.ts): `bundle/src/plugins/manifest.ts`

### Other components

- **Android user**
- **Discord app**

## Connections

- Android user → Installer screens: starts install (evidence: `README.md`)
- Installer screens → Discord app: uses installed app
- Installer screens → APK downloads: requests download
- APK downloads → Patch workflow: supplies APK
- Patch workflow → Install management: installs rebuilt app
- Install management → Install callbacks: receives result
- Installer screens → Installer preferences: configures
- Discord update checks → Install management: refreshes installed app (evidence: `android/installer/app/src/main/java/app/revenge/manager/updatechecker/worker/UpdateWorker.kt`)
- Discord update checks → Installer preferences: reads settings (evidence: `android/installer/app/src/main/java/app/revenge/manager/updatechecker/worker/UpdateWorker.kt`)
- Discord update checks → REST repository: requests versions (evidence: `android/installer/app/src/main/java/app/revenge/manager/updatechecker/worker/UpdateWorker.kt`)
- REST repository → REST endpoints: delegates requests
- REST endpoints → HTTP client: sends requests (evidence: `android/installer/app/src/main/java/app/revenge/manager/network/service/RestService.kt`)
- Xposed entry → Discord app: hooks package (evidence: `android/loader/app/src/main/kotlin/io/github/revenge/xposed/Main.kt`)
- Xposed entry → Bundle startup: loads runtime
- Plugin installation → Plugin repositories: reads indexes (evidence: `android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/PluginInstallMethods.kt`)
- Plugin installation → Plugin sources: records sources (evidence: `android/loader/app/src/main/kotlin/io/github/revenge/xposed/tweaks/plugins/PluginInstallMethods.kt`)
- Bundle startup → Themes and fonts: initializes themes (evidence: `bundle/src/index.ts`)
- Bundle startup → Plugin runtime: updates plugins (evidence: `bundle/src/index.ts`)
- Bundle startup → Vendetta compatibility: initializes compatibility (evidence: `bundle/src/index.ts`)
- Bundle startup → Settings and UI: initializes settings (evidence: `bundle/src/index.ts`)
- Built-in plugins → Plugin runtime: loaded by runtime
- iOS integration → Bundle startup: runs shared bundle (evidence: `README.md`)
