Source of Disruptor Proxy, a proxy client for Windows, Linux, macOS, and Android built on Xray-core.
This repository is the source, where releases are built, and where they are published - grab a build from Releases. Guides live on the Wiki.
- Frontend: AzerothJS (
.azerothcomponents, fine-grained reactivity) + Tailwind CSS, bundled with Vite. - Shell: Tauri 2 - a Rust-backed native window around the web frontend, roughly 10-20x smaller than an Electron equivalent.
- Proxy core: bundled
app-xray(Xray-core), driven via generated JSON configs and Tauri commands (src-tauri/src/lib.rs). - Storage: IndexedDB for the server catalogue (
src/lib/db/), scales to thousands of rows without a backend.
npm install
npm run tauri dev
npm run dev alone runs just the frontend in a browser. Tauri-specific APIs no-op outside the desktop shell - fine for UI work, not for anything touching the proxy engine, geo files, or the updater.
| Script | Does |
|---|---|
npm run dev |
AzerothJS dev server only (browser, no Tauri shell) |
npm run tauri dev / npm run desktop |
Full desktop app in dev mode |
npm run check |
azeroth check - typechecks and lints the whole frontend in one pass |
npm run lint / npm run lint:fix |
ESLint on its own (including .azeroth files) |
npm run build |
Production frontend build |
npm run desktop-build |
Full production Tauri build (installer) |
npm run android / npm run android-apk |
Android dev on a device/emulator / assemble an APK |
npm run fetch-core [-- --target linux-64] |
Download + checksum-verify the Xray core for a target |
npm run tauri icon <path> |
Regenerate every platform icon from one square source image |
npm run release -- <version | patch | minor | major> |
Bump the version, commit, tag, and push - see Releasing below |
src/ frontend (.azeroth components, stores, lib)
app/ shell, router, nav, titlebar, tray
pages/ one file per route
features/ feature-grouped components (configs, connection, subscriptions, routing, import)
components/ shared UI primitives
stores/ app state (createStore-based, one file per domain)
lib/ non-UI logic: db, search/filter, i18n, routing rules, xray config building
assets/ logo source files (see the icon script above)
src-tauri/ Rust shell
src/lib.rs Tauri commands: xray process lifecycle, geo file downloads, config generation
tauri.conf.json app identity, window config, updater endpoint, bundle targets
icons/ generated by `tauri icon`; do not hand-edit
scripts/
release.mjs version bump + tag + push, see Releasing below
Everything happens in this repo: it builds and signs the installer, and it is where users and the auto-updater get it from.
npm run release -- patch # or: minor, major, or an explicit X.Y.Z
npm run release -- patch --dry-run # see every step first, changes nothing
What that does, and what happens after:
- Bumps
package.json,src-tauri/Cargo.toml, and syncsCargo.lock's own entry; commits and tags (vX.Y.Z); pushes both. - The pushed tag triggers
.github/workflows/release.yml: builds and signs, then publishes a draft release on this repo - the Windows installer + its.sig, the.deb, the.apk, and thelatest.jsonthe updater polls. Nothing else is bundled (no MSI, AppImage, or macOS build). - Review the draft on GitHub, then publish it manually. A draft is invisible to the updater and to anonymous downloads until you do.
The updater's public key lives in tauri.conf.json; the matching private key is a GitHub Actions secret (TAURI_SIGNING_PRIVATE_KEY) on this repo, never committed. The release is published by the default GITHUB_TOKEN.
MIT.
