3.0 KiB
Decisions
This document records the main design decisions and their reasons.
ADR-1: Use the real client
Decision. Run the real Vesktop client. Do not use a third-party selfbot protocol library.
Reason. The popular selfbot libraries are archived or deprecated. Stale protocol emulation is a ban risk. The real client sends official traffic.
ADR-2: Validated capability layer
Decision. The core exposes a small, fixed action list. The core validates all input. The core returns structured errors. All logic lives in the external daemon.
Reason. The split gives three properties:
- The daemon cannot run arbitrary code in the client.
- A daemon bug cannot crash the client or send malformed data to Discord.
- Core patches stay small, so an upstream rebase is easy.
Consequence. A new capability needs a small core change. The action list is the contract.
ADR-3: CDP is a fallback, not the primary transport
Decision. The project validated control over Chrome DevTools Protocol. The primary transport is the validated core bridge.
Reason. CDP needs no Vesktop patch. However, CDP evaluates raw code in the page. It bypasses the core-side validation and rate limits. The project keeps the probe as a development tool.
Status. The daemon uses CDP at this time. The core-bridge transport is pending.
ADR-4: No bespoke client
Decision. Do not write a new Electron shell for Discord.
Reason. Vesktop maintains the desktop integration for Vencord, for example settings, themes, quick CSS, and the native plugin bridge. A bespoke shell must reimplement that surface. Vesktop already does this work.
Consequence. Keep the patch small and isolated. This approach is cheaper than a new shell.
ADR-5: Two pacing layers
Decision. The daemon paces all commands with a random delay of 500 to 2800 ms. The core adds a hard limit of 500 ms between sends and 30 sends per minute.
Reason. The daemon policy looks human. The core limit is a safety net. A daemon bug cannot cause a send flood.
ADR-6: Pin the profile directory
Decision. DATA_DIR is $VENCORD_USER_DATA_DIR, else $VESKSLOP_DATA_DIR, else
<appData>/veskslop.
Reason. The Discord session lives in the Electron profile. An app rename or a version update must not move the profile. A stable path keeps the login.
ADR-7: Separate token file
Decision. The QR tool writes the account token to a file. The client seeds the token at startup when no session exists.
Reason. The token file survives a profile reset. It also survives a change in the Discord storage format. The recovery path is one QR scan.
ADR-8: Trigger log limits
Decision. Keep the last 100 triggers from trusted users and the last 30 triggers from untrusted users.
Reason. The limits keep memory small. The trusted limit is larger because those messages matter more.
ADR-9: One live test target
Decision. The only permitted live-send target is user zzib (177117296140091393).
Reason. Tests must not send messages to other users. DMs to zzib are safe and permitted.