A high-performance server navigation utility built natively for the Revenge Discord mobile client (display name: Quick Server Switcher).
| Document | Purpose |
|---|---|
| HANDOFF.md | Maintainer / AI cold-start — current state, nav invariants, gotchas |
| HACKING.md | Developer setup, Hermes/IIFE constraints, debug loop |
| OPTIONS.md | Open work menu (reference IDs like A1, C4) |
| TESTING.md | Local just verify + Revenge device checklist |
| VLM.md | Local UI-TARS-1.5-7B vision gates for Android screenshots |
| PATHS.md | Runtime directories, launchctl commands, AI ops |
| CHANGELOG.md | Release notes and semver policy |
| .cursor/rules/ | Cursor agent rules (.mdc) — persistent AI instructions; read on handoff |
- Switcher sheet:
/serversopens a top-docked searchable panel (keyboard-safe); tap to jump. Bot-message list remains a fallback when sheet APIs are missing. - Fuzzy-search navigation: Jump via subsequence matching (e.g. typing
wshfindsWayland High School; subsequence needs 3+ characters). - Recent servers:
/servers recentand/servers r1jump slots; history recorded only when this plugin navigates. - Excluded servers: Skip noisy or similarly named guilds in search (optional hide from list).
- Ambiguous-match pick list: When several servers share the best score, lists them instead of guessing.
- Custom aliases: Map shortcodes to full server names in settings (e.g.
chess=Maynard-area Chess Club), with clipboard export/import. - Flat sidebar mode: Overrides Discord's native UI to present an alphabetically sorted, folder-free guild list (skipped gracefully if SortedGuildStore is missing).
- Smart pagination: Pages by item count (up to 40) and character budget so fallback replies stay under Discord's 2000-character limit, with numeric page aliases (
/servers 2). - Debug logging: Optional Metro/patch/command diagnostics plus Copy debug logs (version-stamped, clipboard-safe single line).
Jump path uses Discord deep links (openUrl), matching known-good Revenge plugins (JumpTo / Stealmoji). See HANDOFF.md before changing navigation.
Revenge fetches {url}/manifest.json, so you must paste a raw base URL (not the GitHub repo page):
https://raw.githubusercontent.com/frdminc/RevengeQuickSwitcher/main/
- Copy the URL above (trailing slash is fine).
- Open Discord on your device and go to User Settings → Revenge → Plugins.
- Tap Install a plugin / +, paste the URL, and confirm (allow unproxied install if prompted).
- Reload the client.
- Toggle the plugin on. An X on the toggle means start failed (see logging below).
If install fails with “Failed to fetch manifest”, you almost certainly pasted https://github.com/... instead of the raw.githubusercontent.com URL.
If the main plugin installs but will not enable, install this tiny plugin first:
https://raw.githubusercontent.com/frdminc/RevengeQuickSwitcher/main/smoke/
- If smoke enables (toggle stays on, wrench opens): Revenge loading works; the main plugin still has a start bug.
- If smoke also shows an X: the problem is broader (client/safe mode/network), not Quick Server Switcher logic.
- Safe Mode — Revenge Settings → disable Safe Mode if enabled (plugins do not start in safe mode).
- Developer settings — Revenge Settings → Developer (may require tapping the version repeatedly). Useful: debugger URL, React DevTools, Eval command.
/debug— built-in Revenge command; prints client/Revenge/React versions to chat.- In-plugin debug buffer (easiest to share) — open Quick Server Switcher settings → Copy debug logs, then paste into chat/GitHub. The paste is a single line (
|-separated) because Discord mobile clipboard often drops newlines. Logs persist across restarts and are stamped with the plugin version. - Logcat (Android) — with USB debugging:
adb logcat | grep -iE 'revenge|vendetta|Quick|plugin|hermes'. Plugin start errors are logged asPlugin <id> errored whilst loading. Switcher lines are tagged[QuickSwitcher]. - Plugin info sheet — the
iicon → Refetch after a main-branch update; Delete + reinstall if the hash is stuck.
When reporting a stuck switcher / failed jump, please include: Discord build (from /debug), whether Close dismisses the panel, whether the jump toast appeared, and the Copy debug logs paste.
Full setup, Hermes constraints, and device debug loop: HACKING.md. Agent / maintainer cold-start: HANDOFF.md.
- Node.js 18+ (Node 20+ recommended)
- npm
git clone https://github.com/frdminc/RevengeQuickSwitcher.git
cd RevengeQuickSwitcher
just install # or: npm install| Command | Description |
|---|---|
just build |
Bundle src/ to dist/index.js via esbuild |
just test |
Run unit tests (96) |
just typecheck |
Type-check all src/ modules (including index.tsx) |
just verify |
Run typecheck, tests, build, and manifest validation |
just clean |
Remove node_modules/ (keeps committed dist/) |
just clean-all |
Remove dist/ and node_modules/ |
Or use npm directly:
npm run build
npm test
npm run typecheck
npm run verifysrc/
index.tsx # Plugin entry: settings UI, flat sidebar patch, command wiring, openUrl jump
sheets.tsx # Top-docked switcher UI + dismiss-then-run
excludes.ts # Exclude-rule parse/match helpers
aliases.ts # Alias normalize / merge helpers for clipboard export-import
recents.ts # Recent-history helpers (low-risk plugin-only recording)
command.ts # /servers command logic (testable without Revenge mocks)
sidebar.ts # Flat sidebar flatten/sort + cache helpers
theme.ts # Settings color resolution (semantic tokens + fallbacks)
utils.ts # Pure helpers (fuzzy match, aliases, sanitization)
revenge-mod.d.ts # Type stubs for @revenge-mod/* imports
*.test.ts # Vitest unit tests
scripts/
build.mjs # Vendetta IIFE, ES2015, __QSS_VERSION__ inject
check-manifest.mjs # Validates manifest.json and dist/index.js (run via verify)
smoke/ # Minimal plugin for load isolation
dist/
index.js # Built output consumed by Revenge (commit after build)
manifest.json # Revenge plugin metadata (display name: Quick Server Switcher)
HANDOFF.md # AI / maintainer handoff
HACKING.md # Developer environment
OPTIONS.md # Open work menu (tracks + risk; closed summary)
TESTING.md # Local + device test plan
CHANGELOG.md # Release notes
After changing source files, run just build (or just verify) and commit the updated dist/index.js so the plugin loads correctly from GitHub.
/servers— open switcher (or bot-message list fallback)/servers query:<name>— fuzzy-search and jump (or open filtered sheet / pick list)/servers 2— jump to page 2 of the server list (fallback pagination)/servers recent— list recent jumps from this plugin/servers r1— jump to recent slot 1 (alsor2, …)
Configure Flat Sidebar, Debug Logging, Excluded servers, Recent servers, and Custom Aliases (with Copy / Import) under the plugin settings. Use Open switcher or Copy debug logs from settings as needed.
See OPTIONS.md for open work (and closed IDs) and CHANGELOG.md for release notes and the semver policy.
See TESTING.md for local verification (just verify) and the full Revenge device test plan.
Quick pre-release check:
just verifyThen walk the checklist at the bottom of TESTING.md on your device (OPTIONS A1).
- Fork the repo and create a branch.
- Make changes in
src/, runjust verify. - Update docs (
CHANGELOG.md/OPTIONS.md/ handoff notes) when behavior changes. - Open a pull request with a clear description of the change.
Bug reports and feature requests are welcome via GitHub Issues.
GitHub Actions runs npm run verify on every push and pull request to main (typecheck, tests, build, manifest check). See .github/workflows/ci.yml.