Docs Pricing Get live access

Discord Bot Setup

EdgeProof has two ways to read Discord channels:

Mode Pros Cons
bot (recommended) Faster (real-time Gateway events). No browser required. Runs headless. You must create a bot and get it added to the server. Requires server admin cooperation or your own server.
puppeteer Works with any channel you can see in a browser. No bot approval needed. Requires Chrome running with DevTools. Slower (polls every 30s).

edgeproof configure recommends bot mode and configures it for you. The rest of this guide is the manual reference for each mode.

Mode selection: EdgeProof uses bot mode automatically when DISCORD_BOT_TOKEN is set, and puppeteer otherwise. Set DISCORD_SOURCE_MODE explicitly (bot or puppeteer) to override that auto-detection.


1. Create a Discord application & bot

  1. Go to discord.com/developers/applications
  2. Click New Application → name it (e.g., "EdgeProof")
  3. Go to Bot → click Add Bot
  4. Under Token, click Reset Token and copy the token. This is your DISCORD_BOT_TOKEN
  5. Under Privileged Gateway Intents, enable:
    • Message Content Intent (required to read message text)

2. Add the bot to a server

Generate an invite URL:

https://discord.com/api/oauth2/authorize?client_id=YOUR_APP_ID&permissions=1024&scope=bot

Replace YOUR_APP_ID with your application's Client ID (found on the General Information page). Permission 1024 = Read Messages only.

Open the URL, select your server, authorize. The bot must have Read Messages permission on the target channel.

3. Get channel IDs

In Discord: right-click a channel → Copy Channel ID (requires Developer Mode, enable in User Settings → Advanced).

4. Configure

DISCORD_BOT_TOKEN=your-bot-token-here
DISCORD_CHANNEL_IDS=111122223333,444455556666

Setting DISCORD_BOT_TOKEN selects bot mode automatically. (Add DISCORD_SOURCE_MODE=bot if you want to be explicit.)

Optional: only process messages containing certain keywords (useful for channels that mix signal and discussion):

DISCORD_CHANNEL_FILTERS=BUY,SELL,ENTRY

Puppeteer mode (no bot required)

Use this when you cannot add a bot to the server but can see the channel in your own browser.

  1. Launch Chrome with the remote debugging port open.

    The --user-data-dir flag is mandatory, not optional. Since Chrome 136, Chrome ignores --remote-debugging-port entirely when it would attach to your normal profile (a security change that stops malware reading your cookies and saved passwords over the debug port). Dropping the flag makes Chrome start normally with no port open, and edgeproof doctor will report the CDP check as failed. Use an absolute path so the same profile is found no matter which directory you launch from; a relative path resolves against your current directory and silently creates a second, logged-out profile.

    macOS:

    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
      --remote-debugging-port=9222 \
      --user-data-dir="$HOME/.edgeproof-chrome"
    

    If you installed Chrome for one user only, it is under ~/Applications instead.

    Windows (PowerShell, the default in Windows Terminal):

    & "$env:ProgramFiles\Google\Chrome\Application\chrome.exe" `
      --remote-debugging-port=9222 `
      --user-data-dir="$env:USERPROFILE\.edgeproof-chrome"
    

    Windows (Command Prompt):

    "%ProgramFiles%\Google\Chrome\Application\chrome.exe" ^
      --remote-debugging-port=9222 ^
      --user-data-dir="%USERPROFILE%\.edgeproof-chrome"
    

    PowerShell and Command Prompt are not interchangeable here: PowerShell needs the leading & to run a quoted path and a backtick for line continuation, while Command Prompt uses ^. Pasting one into the other fails.

    If Chrome is not at that path, it is usually at one of:

    • %ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe (older installs)
    • %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe (installed for one user)

    Linux:

    google-chrome \
      --remote-debugging-port=9222 \
      --user-data-dir="$HOME/.edgeproof-chrome"
    

    The binary name varies by distribution and packaging. If google-chrome is not found, try google-chrome-stable, chromium, or chromium-browser. Snap and Flatpak builds are confined and may not be able to write a profile directory outside your home directory: prefer the .deb/.rpm build for this.

    You do not need to quit your normal Chrome. Chrome's single-instance rule is per profile, not per application: because the command above uses its own --user-data-dir, it starts a separate process with its own debugging port and leaves your everyday browser and tabs alone. Both run side by side.

    What does fail is launching the same profile twice. A second launch pointing at a profile that is already open hands your arguments to the running process and drops the flags, so no new port opens. If you need to change the port, quit that EdgeProof Chrome window first, not your main one.

    Verify it worked before going further:

    curl http://127.0.0.1:9222/json/version
    

    A JSON blob naming your Chrome build means the port is open. Connection refused means Chrome is not listening: re-check the --user-data-dir flag and that no other Chrome was already running. edgeproof doctor performs the same check.

  2. Log into Discord in that Chrome window and navigate to the signal channel.

    This window is the one EdgeProof reads from, and its login is stored in the profile directory, so you only do this once. Leave it running while EdgeProof runs; it does not have to be in front, and it is a different browser session from your everyday Chrome.

  3. Set in .env:

    DISCORD_SOURCE_MODE=puppeteer
    DISCORD_CHANNEL_URL=https://discord.com/channels/SERVER_ID/CHANNEL_ID
    CHROME_DEBUGGING_URL=http://localhost:9222
    

    Set DISCORD_SOURCE_MODE=puppeteer explicitly here, otherwise a leftover DISCORD_BOT_TOKEN in your .env would force bot mode.

  4. For multiple channels:

    DISCORD_CHANNEL_URLS=https://discord.com/channels/.../111,https://discord.com/channels/.../222
    

Channel name labels

Optionally label channels for the scoreboard/leaderboard display. This works in both bot and puppeteer mode: each channel becomes its own signal source, so the tournament can show which channel actually makes money. edgeproof configure prompts for these labels; you can also set them directly:

DISCORD_CHANNEL_NAMES=111122223333:Signals Alpha,444455556666:Options Flow

Without a label, a channel is attributed by its channel ID (e.g. discord:111122223333).