dont-track-me-google
Firefox and Chrome extensions to prevent Google from making links ugly.
Auto-complete every Discord Quest in seconds. Paste one script, get all rewards. Resilient module loader, auto-claim, a…
git clone https://github.com/nyxxbit/discord-quest-completer.gitnyxxbit/discord-quest-completerAuto-complete every Discord Quest in seconds — v4.9.7
Completes all Discord Quests automatically — game, video, stream, activity, and achievement quests. Paste one script into DevTools, get every reward. No installs, no tokens, no dependencies.
Works on every Discord update — no hardcoded paths, uses constructor.displayName for resilient module detection.
Get Started • How It Works • Configuration
Caution
Discord is actively cracking down on quest automation (April 2026+). Some users have received system messages flagging their accounts after running automation tools (any tool, not just this one). The risk is real now, and enforcement can hit the entire Discord account, not only quest rewards. Use at your own discretion. Honest trade-off: faster Orbs vs a non-zero chance of an account strike.
The ACHIEVEMENT_IN_ACTIVITY bypass does more than spoof progress. To complete those quests it runs a real OAuth2 authorization against the quest's application (scopes identify applications.commands applications.entitlements), mints a proxy ticket, posts forged progress to the activity backend at discordsays.com, then revokes the authorization it created. Full flow: authorize -> proxy ticket -> discordsays authorize -> discordsays progress -> revoke. It is forging quest progress on a logged-in account, which is exactly what Discord is enforcing against. If you don't want that on your main account, don't run it there. Orion asks for explicit confirmation before each app authorization (the userscript shows a popup; the Vencord plugin keeps it behind an off-by-default setting), and the only data sent to discordsays.com is that app's OAuth code, the proxy ticket, and the target progress count — never your Discord token, email, or password.
Warning
Vanilla Discord Stable is partially incompatible. A recent Stable build changed the webpack runtime so webpackChunkdiscord_app.push no longer exposes the live module cache post-boot.
Workarounds (any of these works on Stable):
/orion start|stop|status slash commands. Best long-term option for Stable users. If you use nin0's UserpluginInstaller, paste https://github.com/nyxxbit/discord-quest-completer into its Install Plugin field and it installs and self-updates from there.Promise.allSettled).Important
Partial Browser/Mobile Support. Orion runs in Discord web version or on mobile browsers Discord (via script-injection extensions like Kiwi Browser) for web-compatible quests (e.g., Video, Activity). However, GAME and STREAM quests are automatically filtered out as they are impossible outside the Discord Desktop client.
1. Open Discord (Canary recommended — console enabled by default)
2. Press Ctrl + Shift + I → Console tab
3. Paste index.js and hit Enter
Shift + .toggles the dashboard. Click STOP to kill it instantly.
Close Discord, edit %appdata%/discord/settings.json:
{ "DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING": true }
Restart Discord.
Orion extracts Discord's internal webpack stores (QuestStore, RunStore, Dispatcher, etc.) and uses them to spoof game processes, send fake video progress, and dispatch heartbeat signals — all through Discord's own authenticated API client.
QuestStore → filter incomplete → JIT enroll → dispatch tasks → poll progress → auto-claim → done
| Quest type | What Orion does |
|---|---|
| Video | Sends fake video-progress timestamps with natural 7-9.5s polling intervals and precise float payloads |
| Game | Injects a spoofed process into RunStore with real metadata from Discord's app registry |
| Stream | Patches StreamStore.getStreamerActiveStreamMetadata with synthetic stream data |
| Activity | Heartbeats against a voice channel to simulate participation |
| Achievement | Tries heartbeat spoof first; if Discord rejects, forges the Discord Says OAuth handshake to mark progress directly. The discordsays POSTs auto-route through the best available transport: Orion Relay (zero client mods needed), Vencord plugin if installed, or direct fetch on web Discord. Skips cleanly on age-gated/delisted activities |
Draggable overlay styled to match native Discord design. Live-sorts tasks so you always see what matters:
| Priority | State | Visual |
|---|---|---|
| 1st | Running (highest progress first) | Blue accent, circular progress bar |
| 2nd | Queued | Orange accent, dimmed |
| 3rd | Completed / Action Required | Green checkmark + Interactive CLAIM or ACTION REQUIRED buttons |
Desktop notifications fire on each quest completion.
You can configure Orion's claiming behavior via the TRY_TO_CLAIM_REWARD setting.
Most settings are now configurable through the quest picker UI that appears before the script starts:
Advanced settings can still be tweaked in the CONFIG object before pasting:
const CONFIG = {
HIDE_ACTIVITY: false, // suppress "Playing..." from friends list
MAX_LOG_ITEMS: 60, // UI log limit
};
| Scenario | Behavior |
|---|---|
| 429 / 5xx | Exponential backoff, re-queued up to MAX_RETRIES, distinguishes global vs endpoint limits |
| 404 on enroll | Quest added to skip-list, script continues |
| Repeated failures | Task abandoned after MAX_TASK_FAILURES consecutive errors |
| 25 min timeout | Task force-stopped, cycle advances |
| Missing modules | Required modules validated on boot; optional ones log a warning |
| Claim fails | Falls back to CLAIM button in dashboard |
| Fatal crash | Unconditionally releases window.orionLock so the script can be re-run without refreshing |
Single-file IIFE. No build tools, no external deps.
index.js
├─ CONFIG / SYS / RUNTIME tunables, frozen system limits, active cleanups
├─ ErrorHandler classifies HTTP errors (retry / skip / fatal)
├─ Logger DOM dashboard + task state + log output
├─ Traffic FIFO request queue with exponential backoff
├─ Patcher RunStore / StreamStore monkey-patching
├─ Tasks VIDEO, GAME, STREAM, ACTIVITY, ACHIEVEMENT handlers
├─ loadModules() dual-path extraction (Vencord API + native fallback)
└─ main() discover → JIT enroll → execute → claim → loop
Unlike other scripts that break on every Discord update, Orion finds stores by their class name (QuestStore, RunningGameStore, etc.) via constructor.displayName. The Dispatcher is found by structural signature (_subscriptions + subscribe + dispatch), and the API client by its unique .del method. No hardcoded minified paths.
For a full internal tour of the script, see docs/ARCHITECTURE.md.
Orion isn't the only tool in this space. If our approach doesn't fit your setup, these projects might:
Why Orion if these exist:
Honest disclosure: we depend on Discord's webpack/internals. Every Discord update has a chance of breaking us. markterence's process-injection approach is structurally less brittle for users who only need PLAY quests.
Contributions are welcome — bug reports, PRs, and docs. Start with CONTRIBUTING.md for the checklist and code style. Use the issue templates when reporting bugs or requesting features.
https://github.com/nyxxbit/discord-quest-completer into nin0's UserpluginInstaller and it clones, builds and self-updates from there, no manual clone or file copying (#42). That installer does a plain git clone into src/userplugins, and Vencord's build only reads index.ts(x) and native.ts from the top level of a plugin folder, so the plugin sources had to move out of vencord-plugin/ and up to the repo root; a subdirectory layout cannot work with either. vencord-plugin/README.md moved to docs/VENCORD-PLUGIN.md. The userscript keeps its path and its raw URL and is not part of the plugin build — both esbuild and the installer resolve index.tsx ahead of index.js. A CI job now clones Vencord, checks this repo out the way the installer would, builds, and asserts the plugin reached the renderer and main-process bundles with the slash command registered and no userscript leakage; it builds against Vencord's default branch weekly, so an upstream change that breaks the plugin shows up there instead of in a bug report. The quest engine itself is unchanged this release.taskConfigV2 moved the application off the quest config and onto each task (tasks.PLAY_ON_DESKTOP.applications[0].id); config.application.id no longer exists, so every game/stream quest fell through to a ?? 0 fallback and injected a process claiming to be application 0. Discord could never match that to the quest, so it never sent a single heartbeat and the quest sat at 0% (#43). This hit Canary first and has since reached Stable. Canary also derives quest eligibility from getVisibleGame / getVisibleRunningGames / getRunningDiscordApplicationIds / getCandidateGames, which the old patch left empty — all four are now patched when present and restored on cleanup. Two things had been hiding the failure: the dashboard ticker incremented progress locally every second regardless of heartbeats, so a quest earning nothing still showed a bar climbing to 100%, and nothing failed until the 25-minute timer. The ticker now extrapolates only from the last real heartbeat, so it can't run past what Discord reported, and a game/stream task with no heartbeat inside 90s aborts with a clear message. Progress also reads the task key detected from the config instead of a hardcoded PLAY_ON_DESKTOP (so PLAY_ON_DESKTOP_V2 resolves) and seeds from the server's stored value on start. The legacy config.application.id path remains as a fallback for clients that haven't picked up the change yet.bypassAchievement still read config.application.id directly and returned early when it resolved to nothing, so every ACHIEVEMENT_IN_ACTIVITY quest fell straight through to "Cannot auto-complete" without ever attempting the Discord Says flow. It now uses the application id already resolved for the task, keeping the legacy read as a fallback and the numeric guard unchanged. Verified end to end against live quests on both engines: the userscript completes the quest through the localhost relay, the Vencord plugin through its native module, and in both cases the temporary OAuth grant is revoked afterwards while pre-existing authorizations are left untouched.activeQuests() actually filters on.Standalone: false) into %APPDATA%\Vencord, which has no git repo, so Vencord threw not a git repository every launch and showed "can't check for updates" (#39). The plugin was never the cause; it was the build flags. The bundle is now built --standalone --disable-updater, which turns the updater off cleanly (no error, and no risk of the standalone HTTP updater silently reverting the dist to vanilla and deleting the plugin). Honest tradeoff, now documented: Vencord is frozen at the bundled version; to get updates back, reinstall official Vencord and re-run the installer. INSTALL.cmd now backs up your existing Vencord build to dist.orion-backup first so it's undoable. Userscript and plugin source are unchanged this release; only the installer bundle differs. Root cause was pinned by a senior review panel that read the Vencord updater internals.redirect: "error" on every discordsays.com fetch (userscript and native module) so a 3xx can't bounce the auth token to another host. The native module validates the questId and Referer, not only the appId. The relay reflects CORS only to Discord origins, drops non-allowlisted headers, caps the body size, and checks the Host. Also fixed a stored-DOM-injection bug — a crafted quest or reward name could inject markup into the dashboard; all server-controlled strings are now escaped. Plus assorted hardening: guarded JSON parsing of activity responses, NaN-safe quest expiry, and listener/audio/shutdown leak fixes. docs/ARCHITECTURE.md rewritten to match the current engine.finally block, so a failed bypass never leaves the quest's app authorized on your account, and it only revokes the grant Orion created (diffed against a pre-flow snapshot of your existing grants) so it won't touch an authorization that already existed before the run. The localhost relay no longer follows redirects and rejects any host or path outside the two discordsays.com endpoints it needs. The userscript and the Vencord native module both validate the application id is numeric before building any URL (closes the SSRF angle). The README now spells out the full OAuth lifecycle and the account-level ban risk. The non-tech installer bundle is English-only now (INSTALL.cmd).window.DiscordNative, which isn't reliably visible from the plugin's execution context. Game quests were wrongly skipped with requires desktop app. Skipping. even on Discord Desktop, while the userscript handled them fine. Switched to Vencord's build-time IS_DISCORD_DESKTOP / IS_VESKTOP globals. Resolves #35.ACHIEVEMENT_IN_ACTIVITY auto-bypass works on stock Discord Desktop — no Vencord, no BetterDiscord, no client mod. The trick is a tiny localhost HTTP relay (tools/orion-relay/) that the userscript probes on boot. Discord's CSP allows connect-src http://127.0.0.1:* (for RPC with games); the relay forwards POSTs to *.discordsays.com from outside the browser sandbox. One PowerShell script + one .cmd launcher, ~100 lines total. Download from the release page, double-click to start, leave the window open, paste the userscript. Done._bypassPost now tries (1) Orion Relay on 127.0.0.1:43210, (2) Vencord plugin via VencordNative.pluginHelpers.OrionQuests, (3) DiscordNative HTTP probes (best-effort for future Discord builds), (4) direct fetch (web Discord). First hit wins._bypassPost transport picker. On Discord Desktop with Vencord + OrionQuests plugin installed, the userscript console script now detects VencordNative.pluginHelpers.OrionQuests and routes the CSP-blocked POSTs through the plugin's native module instead of failing. So ACHIEVEMENT_IN_ACTIVITY auto-completes from the standalone userscript too, as long as the Vencord plugin is also installed. Also probes DiscordNative.http, DiscordNative.fileManager.fetchURL, and a few sibling paths as a best-effort fallback in case a future Discord build exposes generic HTTP. On web Discord (no Vencord, no CSP), direct fetch works.connect-src allowlist) blocks the final fetch() to *.discordsays.com from the userscript. Steps 1-2 of the bypass (OAuth2 authorize + proxy-ticket mint) work; step 3 (POST to the activity backend) does not. The userscript now detects the CSP failure and prints a clear message pointing to the Vencord plugin instead of "Failed to fetch". The Vencord plugin port gained a native module (native.ts) that runs the discordsays POSTs in the Electron main process where CSP doesn't apply — confirmed working in production against real ACHIEVEMENT_IN_ACTIVITY quests.TypeError: Cannot read properties of null on gear-icon click — The options gear stays mounted in the header after the picker closes, but its panel doesn't. Added a null guard so post-picker clicks no longer throw.⚙️) for a cleaner first-paint. Thanks to @TirOFlanc in #32.by syntt_ was an <a> with inline onmouseover / onmouseout handlers. Discord enforces strict CSP and rejected the inline handlers with a console error; the link itself also redirected to /@me (Discord's URL scheme does not open user profiles via discord.com/users/<id>). Replaced with a plain <span class="dev-credit"> and moved styling into the stylesheet. Resolves #29.window.DiscordNative. Game and Stream quests are automatically hidden and skipped if you run the script in a web browser.localStorage usage for tracking the widget's coordinates to fix console spam and window.localStorage is undefined errors on newer Discord builds where storage access is restricted.loadModules now uses window.Vencord.Webpack directly when Vencord is installed. Restores full functionality on modern Discord Stable, where the native chunk push hook can no longer reach the live module cache. Resolves #20.c, ignoring Sentry's tiny instance. Resolves #23 and #26loadModules — __webpack_require__ is now captured via the chunk callback closure instead of relying on push()'s return value. Some Discord builds return undefined from push; the callback always fires with the require argument:disabled styling — Claim button disabled/failed states are driven by :disabled and a .failed modifier class. No more inline-style assignments scattered across handler codeFILTER_KINDS table-driven pathLogger.render replaced with a single ternary expressionLogger and switched to native HTML forms for resilient state collection.$$ now returns a real Array so .every() works on visible quest cards. Resolves TypeError: visible.every is not a function when clicking (De)select All#orion-styles element on shutdown, debug logging for previously silent catch blocksRUNNING state now show an ACTION REQUIRED status with a navigation button that uses Discord's native router (transitionTo('/quest-home')) to jump straight to the quest pagefindRouter() locates Discord's minified transitionTo by source signature ("transitionTo -"), no hardcoded paths[System], [Network], [Task], [Cycle], [Enroll], [Claim]) for consistent, readable outputdebug level messages now go to DevTools only and no longer spam the in-app dashboards (seconds) suffix for ACHIEVEMENT quests since their target is a count, not a durationprogress-text class so live progress numbers update correctly on task cardsSYS object and added TRY_TO_CLAIM_REWARD config.Promise.allSettled to prevent queue crashes on a single task failure.RUNTIME.cleanups to track and safely flush active event listeners on script stop.9999 to reliably clear "Playing" status, and releases window.orionLock on fatal errors.loadModules() — uses constructor.displayName instead of hardcoded .A/.Z/.Ay/.ZP pathsACHIEVEMENT_IN_ACTIVITY handler for milestone-based questsWATCH_VIDEO_ON_MOBILE progress tracking fixThis tool is for educational and research purposes only. Automating user actions violates Discord's Terms of Service. The developer is not responsible for any account suspensions or bans. Use at your own risk.
Built by syntt_
If this helped you, drop a star — it keeps the project alive.
more like this
Firefox and Chrome extensions to prevent Google from making links ugly.
A to-do list that runs your Claude Code agents — capture anywhere, dispatch in parallel, review from your phone.
Arduino library and MATLAB/Simulink API for the AutomationShield Arduino expansion boards for control engineering educa…
search projects, people, and tags