{"id":48645412,"url":"https://github.com/nyxxbit/discord-quest-completer","last_synced_at":"2026-06-10T00:00:34.511Z","repository":{"id":349545929,"uuid":"1119342911","full_name":"nyxxbit/discord-quest-completer","owner":"nyxxbit","description":"Auto-complete every Discord Quest in seconds. Paste one script, get all rewards. Resilient module loader, auto-claim, adaptive speed. No installs, no tokens, no dependencies.","archived":false,"fork":false,"pushed_at":"2026-06-05T19:37:45.000Z","size":156,"stargazers_count":201,"open_issues_count":3,"forks_count":13,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-06-05T21:16:22.770Z","etag":null,"topics":["automation","discord","discord-automation","discord-orbs","discord-quests","discord-rewards","discord-tools","javascript","orb-farming","orion","overlay","quest-completer","userscript"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nyxxbit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-19T06:02:37.000Z","updated_at":"2026-06-05T19:37:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nyxxbit/discord-quest-completer","commit_stats":null,"previous_names":["nyxxbit/discord-quest-completer"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/nyxxbit/discord-quest-completer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyxxbit%2Fdiscord-quest-completer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyxxbit%2Fdiscord-quest-completer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyxxbit%2Fdiscord-quest-completer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyxxbit%2Fdiscord-quest-completer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nyxxbit","download_url":"https://codeload.github.com/nyxxbit/discord-quest-completer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyxxbit%2Fdiscord-quest-completer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34130642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","discord","discord-automation","discord-orbs","discord-quests","discord-rewards","discord-tools","javascript","orb-farming","orion","overlay","quest-completer","userscript"],"created_at":"2026-04-10T03:14:38.693Z","updated_at":"2026-06-10T00:00:34.501Z","avatar_url":"https://github.com/nyxxbit.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Orion\n\n**Auto-complete every Discord Quest in seconds** \u0026mdash; v4.9.1\n\n[![Version](https://img.shields.io/badge/v4.9.1-5865F2?style=for-the-badge\u0026logo=discord\u0026logoColor=white)](https://github.com/nyxxbit/discord-quest-completer)\n[![Stars](https://img.shields.io/github/stars/nyxxbit/discord-quest-completer?style=for-the-badge\u0026color=faa61a)](https://github.com/nyxxbit/discord-quest-completer/stargazers)\n[![License](https://img.shields.io/badge/MIT-green?style=for-the-badge)](LICENSE)\n\nCompletes all Discord Quests automatically \u0026mdash; game, video, stream, activity, and achievement quests. Paste one script into DevTools, get every reward. No installs, no tokens, no dependencies.\n\n**Works on every Discord update** \u0026mdash; no hardcoded paths, uses `constructor.displayName` for resilient module detection.\n\n[Get Started](#quick-start) \u0026bull; [How It Works](#how-it-works) \u0026bull; [Configuration](#configuration)\n\n\u003c/div\u003e\n\n---\n\n\u003e [!CAUTION]\n\u003e **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 has shifted from theoretical to real. Use at your own discretion. Honest summary of the trade-off: faster Orbs vs. a non-zero chance of a quest-rewards strike on your account.\n\n---\n\n\u003e [!WARNING]\n\u003e **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.\n\u003e\n\u003e **Workarounds (any of these works on Stable):**\n\u003e 1. **Paste the userscript with [Vencord](https://vencord.dev/) installed** \u0026mdash; Orion v4.6+ auto-detects Vencord and uses its boot-time-injected Webpack API to restore full functionality.\n\u003e 2. **Install the [OrionQuests Vencord userplugin](vencord-plugin/)** \u0026mdash; no console pasting, runs at Discord boot, exposes `/orion start|stop|status` slash commands. Best long-term option for Stable users.\n\u003e 3. Or use **[Discord Canary](https://canary.discord.com/download)** (vanilla, no mods), where the native userscript extraction still works.\n\n---\n\n## Why Orion?\n\n- **Covers all 5 quest types** \u0026mdash; PLAY, STREAM, VIDEO, ACTIVITY, and ACHIEVEMENT_IN_ACTIVITY. Most other tools only handle PLAY (game-time) quests.\n- **Userscript and Vencord plugin in one repo** \u0026mdash; pick whichever fits your setup. Both share the same engine, both kept in sync.\n- **Auto-claiming** \u0026mdash; Claim rewards directly from the dashboard. Tries to claim automatically (if enabled), or provides a smart interactive button if captcha is needed.\n- **Resilient module loader** \u0026mdash; finds Discord stores by class name, not minified paths. Dual extraction path (Vencord API + native fallback) survives Discord webpack changes.\n- **Smart rate limiting** \u0026mdash; exponential backoff on 429/5xx, skip-list for dead quests, randomized polling intervals. Distinguishes between global and endpoint limits, non-blocking retries.\n- **Fault-tolerant execution** \u0026mdash; One failed quest won't break the queue (`Promise.allSettled`).\n- **Zero setup** \u0026mdash; single paste into the console. No Node.js, no npm, no extensions.\n\n---\n\n## Quick start\n\n\u003e [!IMPORTANT]\n\u003e **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.\n\n**1.** Open Discord ([Canary](https://canary.discord.com/download) recommended \u0026mdash; console enabled by default)\n\n**2.** Press `Ctrl + Shift + I` \u0026rarr; Console tab\n\n**3.** Paste [`index.js`](index.js) and hit Enter\n\n\u003e `Shift + .` toggles the dashboard. Click **STOP** to kill it instantly.\n\n\u003cdetails\u003e\n\u003csummary\u003eEnable console on stable Discord\u003c/summary\u003e\n\nClose Discord, edit `%appdata%/discord/settings.json`:\n\n```json\n{ \"DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING\": true }\n```\n\nRestart Discord.\n\u003c/details\u003e\n\n---\n\n## How it works\n\nOrion 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 \u0026mdash; all through Discord's own authenticated API client.\n\n```\nQuestStore → filter incomplete → JIT enroll → dispatch tasks → poll progress → auto-claim → done\n```\n\n| Quest type | What Orion does |\n|------------|----------------|\n| **Video** | Sends fake `video-progress` timestamps with natural 7-9.5s polling intervals and precise float payloads |\n| **Game** | Injects a spoofed process into `RunStore` with real metadata from Discord's app registry |\n| **Stream** | Patches `StreamStore.getStreamerActiveStreamMetadata` with synthetic stream data |\n| **Activity** | Heartbeats against a voice channel to simulate participation |\n| **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](tools/orion-relay/) (zero client mods needed), [Vencord plugin](vencord-plugin/) if installed, or direct `fetch` on web Discord. Skips cleanly on age-gated/delisted activities |\n\n---\n\n## Dashboard\n\nDraggable overlay styled to match native Discord design. Live-sorts tasks so you always see what matters:\n\n| Priority | State | Visual |\n|----------|-------|--------|\n| 1st | **Running** (highest progress first) | Blue accent, circular progress bar |\n| 2nd | **Queued** | Orange accent, dimmed |\n| 3rd | **Completed** / **Action Required** | Green checkmark + Interactive CLAIM or ACTION REQUIRED buttons |\n\nDesktop notifications fire on each quest completion.\n\n---\n\n## Auto \u0026 In-UI Claiming\n\nYou can configure Orion's claiming behavior via the `TRY_TO_CLAIM_REWARD` setting.\n\n- **Automated Claiming:** If enabled, tries to claim instantly upon completion.\n- **In-UI Button:** If auto-claim fails due to captcha, or is disabled, a **CLAIM REWARD** button appears directly on the task card.\n\n---\n\n## Configuration\n\nMost settings are now configurable through the **quest picker UI** that appears before the script starts:\n\n- **Reward filters** \u0026mdash; Toggle quests by reward type (Orbs, Avatar Decorations, In-Game Items)\n- **Quest checkboxes** \u0026mdash; Select/deselect individual quests\n- **Auto-enroll** \u0026mdash; Automatically accept quests before running them (default: ON)\n- **Auto-claim** \u0026mdash; Attempt to claim rewards on completion (default: OFF to avoid captcha)\n\nAdvanced settings can still be tweaked in the `CONFIG` object before pasting:\n\n```js\nconst CONFIG = {\n    HIDE_ACTIVITY: false,        // suppress \"Playing...\" from friends list\n    MAX_LOG_ITEMS: 60,           // UI log limit\n};\n```\n\n---\n\n## Error handling\n\n| Scenario | Behavior |\n|----------|----------|\n| **429 / 5xx** | Exponential backoff, re-queued up to `MAX_RETRIES`, distinguishes global vs endpoint limits |\n| **404 on enroll** | Quest added to skip-list, script continues |\n| **Repeated failures** | Task abandoned after `MAX_TASK_FAILURES` consecutive errors |\n| **25 min timeout** | Task force-stopped, cycle advances |\n| **Missing modules** | Required modules validated on boot; optional ones log a warning |\n| **Claim fails** | Falls back to CLAIM button in dashboard |\n| **Fatal crash** | Unconditionally releases `window.orionLock` so the script can be re-run without refreshing |\n\n---\n\n## Architecture\n\nSingle-file IIFE. No build tools, no external deps.\n\n```\nindex.js\n├─ CONFIG / SYS / RUNTIME      tunables, frozen system limits, active cleanups\n├─ ErrorHandler                classifies HTTP errors (retry / skip / fatal)\n├─ Logger                      DOM dashboard + task state + log output\n├─ Traffic                     FIFO request queue with exponential backoff\n├─ Patcher                     RunStore / StreamStore monkey-patching\n├─ Tasks                       VIDEO, GAME, STREAM, ACTIVITY, ACHIEVEMENT handlers\n├─ loadModules()               dual-path extraction (Vencord API + native fallback)\n└─ main()                      discover → JIT enroll → execute → claim → loop\n```\n\n### Module detection\n\nUnlike 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.\n\nFor a full internal tour of the script, see [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).\n\n---\n\n## Alternatives\n\nOrion isn't the only tool in this space. If our approach doesn't fit your setup, these projects might:\n\n- **[markterence/discord-quest-completer](https://github.com/markterence/discord-quest-completer)** \u0026mdash; Native Windows app (Tauri/Rust + Vue). Creates dummy game executables that satisfy Discord's process detection without injecting into the client at all. **Most resilient long-term** because it doesn't depend on Discord internals. Trade-off: **PLAY quests only** (no VIDEO/STREAM/ACTIVITY/ACHIEVEMENT support), Windows-only, requires WebView2.\n- **[nicola02nb/completeDiscordQuest](https://github.com/nicola02nb/completeDiscordQuest)** \u0026mdash; Vencord plugin (also a BetterDiscord port available). Smaller and simpler than ours, port of [aamiaa's original snippet](https://gist.github.com/aamiaa/204cd9d42013ded9faf646fae7f89fbb) that started this whole space. Mature (online since Sep 2025).\n- **[nvckai/Discord-Web-Auto-Quest-Extension](https://github.com/nvckai/Discord-Web-Auto-Quest-Extension)** \u0026mdash; Chrome extension. One-click install but VIDEO-focused.\n\nWhy Orion if these exist:\n\n- We're the **only** tool covering all 5 quest types with one codebase.\n- Userscript + Vencord plugin **share the same engine** in this repo, so behavior matches across install paths.\n- Active development (multiple releases per month, community PRs merged on the same day they land).\n\nHonest 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.\n\n---\n\n## Contributing\n\nContributions are welcome \u0026mdash; bug reports, PRs, and docs. Start with [`CONTRIBUTING.md`](CONTRIBUTING.md) for the checklist and code style. Use the issue templates when reporting bugs or requesting features.\n\n---\n\n## Changelog\n\n### v4.9.1\n- **Fix: Vencord plugin skipped GAME/STREAM quests on desktop** \u0026mdash; The plugin detected \"desktop\" by probing `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](https://github.com/nyxxbit/discord-quest-completer/issues/35).\n\n### v4.9\n- **`ACHIEVEMENT_IN_ACTIVITY` auto-bypass works on stock Discord Desktop** \u0026mdash; no Vencord, no BetterDiscord, no client mod. The trick is a tiny localhost HTTP relay ([`tools/orion-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.\n- **Transport picker priority** \u0026mdash; `_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.\n\n### v4.8.2\n- **Userscript hands off discordsays POSTs to the Vencord plugin when installed** \u0026mdash; New `_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.\n\n### v4.8.1\n- **Honest CSP error message + Vencord native bypass** \u0026mdash; Testing v4.8 surfaced that Discord's renderer CSP (`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](vencord-plugin/) gained a native module (`native.ts`) that runs the discordsays POSTs in the Electron main process where CSP doesn't apply \u0026mdash; **confirmed working in production against real ACHIEVEMENT_IN_ACTIVITY quests**.\n\n### v4.8\n- **ACHIEVEMENT_IN_ACTIVITY auto-bypass** \u0026mdash; New OAuth2 → discordsays.com handshake. When Discord's heartbeat endpoint rejects (HTTP 403, which it does for most current Achievement quests), Orion now authorizes against the activity's own backend, mints a proxy ticket, and POSTs the target progress directly. No more 25-minute passive wait, no more \"join the activity manually\". The previous picker toggle to skip these is now mandatory behavior \u0026mdash; if both paths fail (typically age-gated or delisted activities like *The Odyssey*), the quest is skipped cleanly instead of blocking a queue slot. **Note: the discordsays.com POSTs are blocked by Discord's renderer CSP \u0026mdash; the userscript can only complete the OAuth handshake locally. See [v4.8.1](#v481) for the workaround.**\n- **2x faster video polling** \u0026mdash; Video heartbeats now run at 3.5-4.75s instead of 7-9.5s. Cuts each video quest's wall-clock in half. Discord's server-side validation accepts the faster cadence.\n- **Two parallel video quests** \u0026mdash; Video concurrency raised from 1 to 2. Two video quests complete simultaneously instead of serially.\n- **Fix `TypeError: Cannot read properties of null` on gear-icon click** \u0026mdash; 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.\n\n### v4.7\n- **Collapse-on-double-click + drag boundaries** \u0026mdash; Double-click the header to minimize the panel to a 50px stub; double-click again to expand. The dashboard can no longer be dragged outside the viewport on either axis. Picker options panel hidden behind a new gear icon (`⚙️`) for a cleaner first-paint. Thanks to @TirOFlanc in [#32](https://github.com/nyxxbit/discord-quest-completer/pull/32).\n- **Skip manual activities** \u0026mdash; New picker toggle. When ACHIEVEMENT_IN_ACTIVITY quests fall back to passive mode (waiting for you to actually play the activity), the script now optionally fail-fast skips them so the queue keeps moving instead of blocking a slot for 25 minutes. Default off. Resolves [#33](https://github.com/nyxxbit/discord-quest-completer/issues/33).\n- **Random 1-30min delay between cycles** \u0026mdash; New picker toggle. Injects a randomized idle gap between quest cycles for anti-detection during long AFK runs. Default off (preserves current behavior). Implements the request in [#30](https://github.com/nyxxbit/discord-quest-completer/issues/30).\n- **Dashboard persists when rewards are unclaimed** \u0026mdash; The widget no longer auto-shuts down the moment the last quest completes if any task still has a CLAIM button waiting. Click STOP manually after claiming. Resolves [#31](https://github.com/nyxxbit/discord-quest-completer/issues/31).\n\n### v4.6.3\n- **Fix CSP violation in credit text** \u0026mdash; The header's `by syntt_` was an `\u003ca\u003e` 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/\u003cid\u003e`). Replaced with a plain `\u003cspan class=\"dev-credit\"\u003e` and moved styling into the stylesheet. Resolves [#29](https://github.com/nyxxbit/discord-quest-completer/issues/29).\n\n### v4.6.2\n- **Native UI overhaul** \u0026mdash; Replaced hardcoded hex colors with Discord's native CSS variables. The widget now automatically adapts to Light, Dark, AMOLED, and custom themes.\n- **Circular progress \u0026 decluttering** \u0026mdash; Switched linear progress bars to circular indicators (hover to see exact percentages). Completed quests now hide unnecessary text to keep the interface clean.\n- **Desktop environment guard** \u0026mdash; The script now checks for `window.DiscordNative`. Game and Stream quests are automatically hidden and skipped if you run the script in a web browser.\n- **Removed window position saving** \u0026mdash; Dropped `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.\n- **Optimistic UI \u0026 under-the-hood fixes** \u0026mdash; Added a local ticker for smooth visual progress updates.\n\n### v4.6.1\n- **Louder completion sound** \u0026mdash; Bumped the gain on the quest-completion ping (0.12 \u0026rarr; 0.45) and arpeggio (0.18 \u0026rarr; 0.55). Headphone users were complaining the tone was inaudible.\n\n### v4.6\n- **Vencord integration** \u0026mdash; `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](https://github.com/nyxxbit/discord-quest-completer/issues/20)\n- **Sentry-proof native extraction** \u0026mdash; The push callback fires once per registered runtime; Discord ships Sentry's stripped runtime alongside the real one. The capture now picks the require with the largest `.c`, ignoring Sentry's tiny instance. Resolves [#23](https://github.com/nyxxbit/discord-quest-completer/issues/23) and [#26](https://github.com/nyxxbit/discord-quest-completer/issues/26)\n- **Sound on completion** \u0026mdash; New picker toggle plays a soft tone after each quest finishes and a 3-note arpeggio when the whole queue is done. Useful with auto-claim off so you can come back before the captcha times out. Resolves [#24](https://github.com/nyxxbit/discord-quest-completer/issues/24)\n\n### v4.5.5\n- **Hotfix Canary regression from v4.5.4** \u0026mdash; first attempt at the dual-capture path. Superseded by v4.6's Sentry-proof solution.\n\n### v4.5.4 (broken on Canary \u0026mdash; use v4.5.5+)\n- **Resilient `loadModules`** \u0026mdash; `__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\n- **CSS `:disabled` styling** \u0026mdash; Claim button disabled/failed states are driven by `:disabled` and a `.failed` modifier class. No more inline-style assignments scattered across handler code\n- **Filter handler dedup** \u0026mdash; The reward-filter and type-filter click handlers were near-identical; now collapsed into a single `FILTER_KINDS` table-driven path\n- **Icon resolution simplification** \u0026mdash; 7-arm if/else chain in `Logger.render` replaced with a single ternary expression\n\n### v4.5.3\n- **Pending state** \u0026mdash; Unenrolled quests now wait for manual acceptance in Discord instead of failing when auto-enroll is disabled.\n- **Ghost-task fix** \u0026mdash; Unenrolled and hidden quests no longer attempt execution or time out in the background.\n- **Claim button lock** \u0026mdash; Prevented API spam and visual state resets by locking the \"Claim Reward\" button during UI renders.\n- **Picker refactor** \u0026mdash; Moved UI logic inside `Logger` and switched to native HTML forms for resilient state collection.\n- **Dynamic filters** \u0026mdash; Added Quest Type filtering.\n\n### v4.5.2\n- **Fix NodeList error** \u0026mdash; `$$` 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\n\n### v4.5.1\n- **Fix (De)select All** \u0026mdash; The toggle button now correctly checks/unchecks visible quest checkboxes without hiding them. Reward filters remain independent. Button label syncs with actual checkbox state\n\n### v4.5\n- **Quest picker UI** \u0026mdash; Script no longer starts immediately. A visual quest picker shows all available quests with checkboxes, color-coded by reward type (Orbs, Avatar Decorations, In-Game Items). Filter entire reward categories with one click, select/deselect individual quests, then hit START\n- **Options panel** \u0026mdash; Toggle auto-enroll and auto-claim directly from the picker UI before starting. No more editing CONFIG to control these behaviors\n- **Reward type filters** \u0026mdash; Pill buttons at the top let you enable/disable entire reward categories. Disabling \"Orbs\" hides and unchecks all Orb quests instantly\n\n### v4.4\n- **JIT enrollment** \u0026mdash; Quests enroll one at a time right before execution instead of in bulk, eliminating mass-enrollment detection vectors\n- **Natural video polling** \u0026mdash; Replaced static 1s intervals with 7\u0026ndash;9.5s polling using 6-decimal float timestamps that match native Chromium player behavior\n- **Randomized delays** \u0026mdash; All fixed-interval API calls now use randomized timing ranges to break predictable patterns\n- **Correct Windows PIDs** \u0026mdash; Fake game process IDs generated as multiples of 4 to comply with Windows NT kernel architecture\n- **Sequential execution** \u0026mdash; Both game and video tasks now run sequentially (concurrency\u0026nbsp;=\u0026nbsp;1) to avoid parallel request spikes\n- **Proper cleanup** \u0026mdash; Removes `#orion-styles` element on shutdown, debug logging for previously silent catch blocks\n\n### v4.3\n- **GO TO QUESTS button** \u0026mdash; Achievement quests in `RUNNING` 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 page\n- **Resilient router detection** \u0026mdash; New `findRouter()` locates Discord's minified `transitionTo` by source signature (`\"transitionTo -\"`), no hardcoded paths\n- **Standardized log tags** \u0026mdash; Unified prefixes across the codebase (`[System]`, `[Network]`, `[Task]`, `[Cycle]`, `[Enroll]`, `[Claim]`) for consistent, readable output\n- **Cleaner UI logs** \u0026mdash; `debug` level messages now go to DevTools only and no longer spam the in-app dashboard\n- **Achievement progress display** \u0026mdash; Progress text now omits the `s` (seconds) suffix for `ACHIEVEMENT` quests since their target is a count, not a duration\n- **Fixed progress text updates** \u0026mdash; Restored missing `progress-text` class so live progress numbers update correctly on task cards\n\n### v4.2\n- **Native UI Claiming:** Added in-UI claiming via Claim Reward button.\n- **Rigid Configuration:** Moved hardcoded system limits to a frozen `SYS` object and added `TRY_TO_CLAIM_REWARD` config.\n- **Fault-Tolerant Concurrency:** Switched to `Promise.allSettled` to prevent queue crashes on a single task failure.\n- **Strict Garbage Collection:** Added `RUNTIME.cleanups` to track and safely flush active event listeners on script stop.\n- **RPC \u0026 Lock Failsafes:** Forces dummy PID `9999` to reliably clear \"Playing\" status, and releases `window.orionLock` on fatal errors.\n- **Granular Rate Limiting:** Differentiates between global (queue-freezing) and endpoint-specific API limits.\n\n### v4.1\n- Resilient `loadModules()` \u0026mdash; uses `constructor.displayName` instead of hardcoded `.A/.Z/.Ay/.ZP` paths\n- Auto-claim rewards (optimistic POST + captcha fallback with CLAIM button)\n- Adaptive video speed (6-22 API calls instead of 180 for 900s quests)\n- `ACHIEVEMENT_IN_ACTIVITY` handler for milestone-based quests\n- `WATCH_VIDEO_ON_MOBILE` progress tracking fix\n- Task sorting by progress percentage\n- Per-cycle try-catch for crash isolation\n- Fixed scroll (After activating the script, it turned blue when hovered)\n\n### v4.0\n- Fixed Issue #5: enrollment 404 no longer crashes the script\n- ErrorHandler module with retry/skip/fatal classification\n- Traffic queue with exponential backoff for 5xx errors\n- Skip-list for permanently failed quests\n- Idempotent cleanup in GAME/STREAM handlers\n\n---\n\n## Disclaimer\n\nThis tool is for **educational and research purposes only**. Automating user actions violates Discord's [Terms of Service](https://discord.com/terms). The developer is not responsible for any account suspensions or bans. Use at your own risk.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nBuilt by [**syntt_**](https://discord.com/users/1419678867005767783)\n\nIf this helped you, drop a star \u0026mdash; it keeps the project alive.\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnyxxbit%2Fdiscord-quest-completer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnyxxbit%2Fdiscord-quest-completer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnyxxbit%2Fdiscord-quest-completer/lists"}