Repository navigation
Troubleshooting
Ordered roughly by how often each one is the actual cause.
Check role hierarchy first. Discord will not let a bot grant, remove or moderate anyone whose highest role sits above the bot's own — regardless of which permissions you granted. This affects the captcha, role menus and the honeypot.
Fix: Server Settings → Roles → drag PariahBot above every role it needs to act on.
/security captcha setup checks this up front and refuses with an explanation.
The others fail at the moment of use, which is why this is the first thing to
check.
Work through these in order:
-
Did you register them?
npm run deployafter any command change. -
Is
GUILD_IDset? If it's set, commands register to that one server only. Blank it to register globally. See Configuration. - Global commands can take up to an hour to propagate. They're often faster, but a brand-new global registration genuinely may not appear immediately. This is Discord-side; nothing to fix.
-
Was the bot invited with the
applications.commandsscope? Without it, the bot joins but can't register commands. Re-invite using the link in Bot Setup.
The commands show in the picker, but the bot isn't in the member list and
nothing answers. The app was added with only the applications.commands
scope, which lets it add commands without the bot itself joining. The usual
cause is the Install Link on the Developer Portal's Installation page,
whose default Guild Install scope is just applications.commands. Re-invite
using the link in Bot Setup, which has both bot and
applications.commands. To fix the Install Link too, add bot to its Guild
Install scopes, with permissions.
You registered globally while guild-scoped registrations still existed. Both sets show up. Clear the guild-scoped ones — see the snippet in Configuration.
Working as intended. Staff come in two levels (see Server-Roles):
-
"This is for admins": the command is admin-only (
/setup,/security,/mod configandremove-case,/bannedwordson/off and lists). It needs Discord's Administrator permission or an admin role (/setup admin-role add). A mod role isn't enough. - "This is for staff": it needs a mod role, an admin role or Administrator.
Manage Channels is deliberately not enough for either.
Locked out? If no admin roles are set, only Administrators can run
/setup. An Administrator has to run /setup admin-role add role:@YourRole.
Mod roles used to count as admin before admin roles existed, which is why a
server that only set mod roles now sees "This is for admins".
No member role is set, so the captcha would have no role to grant.
The captcha's whole job is handing out the member role, so it won't configure without one:
/setup member-role role:@Members
Or create it inline: /setup member-role name:Members color:#3498db.
Pending challenges are held in memory, so restarting the bot forgets them. The member just presses Start verification again for a fresh one. Challenges also expire after 5 minutes.
If it consistently fails after picking the right option, that's role hierarchy — see the top of this page.
- Are they staff, an admin or a mod? Those are always skipped, by design.
- Does the bot have Ban Members? Required even for the default "remove", because that's implemented as a softban (ban then immediate unban, so Discord purges their recent messages).
- Is the target above the bot in the role list? Same hierarchy rule.
Check /alerts status too — failures are reported through the alert system, so
if alerts aren't configured you won't see the error.
- Pinned messages are never deleted. That's deliberate.
- Does the bot have Manage Messages in that channel, and Read Message History to see the backlog?
-
/autodelete statusconfirms the channel is actually configured. - Time-based deletion runs on a sweep every 60 seconds, so expiry isn't instant.
See the troubleshooting table on Admin-Dashboard. The usual causes:
- the SSH tunnel isn't open
- the redirect URL isn't registered exactly (port included)
- the client secret was reset
- you're signed in to Discord with an account that doesn't own the bot
The startup log (journalctl -u pariahbot.service) says whether the
dashboard is listening, and if not, why.
-
Nothing yet? Only items published after the feed was added are posted. Run
/rss testto check the channel works. -
/rss listshows Couldn't read the feed. The site was down, moved, or blocks bots. Open the address in a browser. The bot keeps trying every 10 minutes. -
/rss listshows Couldn't post. The channel was deleted or the bot can't post there. Remove the feed and add it again. - "…is on a private or local network". By design, the bot never fetches addresses on its host's own network. See RSS-Feeds.
The reply always says which check failed:
- "…is staff": by design, the bot never acts on its own admins or mods. Take their role away first.
- "Your highest role isn't above…": you can only act on people below you, as with Discord's own kick and ban.
- "My highest role isn't above…": drag PariahBot above their highest role in Server Settings → Roles.
-
"I need the … permission": add it to the PariahBot role. Bots invited with the Required-only link before
/modexisted lack Kick Members and Timeout Members.
The right-click Kick member, Ban member and Timeout member actions missing? Refresh Discord with Ctrl+R. See Moderation.
- Joining a hub does nothing. The bot needs Manage Channels and Move Members, and to be able to see the hub's category.
-
/vcsays "Run this in #channel's own chat". Run it from the text box inside your voice channel. -
/vcsays admins turned that control off. See/voice list, and/voice owner-controlto turn it back on. - A new channel ignores a hub change. Hub settings apply to channels created afterwards.
The full table is on Temp-Voice-Channels.
- "I need the Manage Server permission." Add Manage Server to the bot's PariahBot role in Server Settings → Roles. Bots invited before banned words existed don't have it.
-
It's off.
/bannedwords statusshows Off. Run/bannedwords enable. - The sender is exempt. Discord never blocks members with Administrator or Manage Server, so test with a regular account. Also check Server Settings → AutoMod for exempt roles or channels on the PariahBot: banned words rules.
-
The word didn't match. Matching is whole-word:
catdoesn't block "category". Usecat*or*cat*. -
"The maximum number of rules was reached." The server already has six AutoMod keyword rules. Delete one you don't need in Server Settings → AutoMod, then
/bannedwords enableagain. -
Blocked, but not reported. Blocks go to the admin alerts. Check
/alerts status. A message blocked by an AutoMod rule the bot didn't create is never reported by the bot.
Work through these in order:
-
"Twitch/YouTube isn't set up on this bot's host yet." The credentials aren't in
hom.env, or the bot hasn't been restarted since you added them. It only readshom.envat startup. Runsudo systemctl restart pariahbot.service, then confirm the startup log no longer says… alerts are disabled. -
No alert channel.
/streamers listshows Alert channel: Not set. Run/streamers channel. -
A self-linked streamer lost the streamer role. Self-links only alert while the member holds it, checked on every alert. Give the role back, or have an admin
/streamers addthem so it isn't needed. - It was posted before the channel was added. Only new uploads and streams are announced. Wait for the next one.
- YouTube is just slow. Feeds refresh every few minutes and the bot checks every 2, so 2–10 minutes is normal. Twitch is about a minute.
-
A YouTube 24/7 or long-running stream. These are found through the channel's
/livepage, which is checked every 15 minutes, so give it that long. A 24/7 stream is only announced once, the first time it's seen, so it won't post again later. If one never appears, YouTube may have changed that page. See Known gaps on Streamer-Alerts. -
YouTube quota ran out. The log shows
YouTube refused the request (HTTP 403). Alerts resume after midnight Pacific. Check usage in Google Cloud under APIs & Services → YouTube Data API v3 → Quotas. -
Twitch credentials rejected. The log shows
Twitch rejected the client credentials. Check both values, and that the Twitch app is Confidential.
The ping arrives without notifying anyone? The ping role isn't mentionable. Enable Allow anyone to @mention this role, or give the bot Mention Everyone.
Work through these in order:
-
"Instagram isn't set up on this bot's host yet."
INSTAGRAM_ACCESS_TOKENorINSTAGRAM_BUSINESS_ACCOUNT_IDis missing fromhom.env, or the bot hasn't been restarted since. Restart it, and check the startup log no longer saysInstagram alerts are disabled. -
No channel.
/instagram listshows Channel: Not set. Run/instagram channel. - It was posted before the account was added, or more than 7 days ago. Only newer posts are shared.
- It's slow, not broken. The bot checks every 10 minutes.
- It's a story. Stories aren't available through the API.
-
The log says
Instagram says the access token is missing a permission. The token or the System User is missing something. Check the five permissions and the assigned Page and Instagram account, then generate a new token. See Check the token works on Instagram-Alerts. -
The log says
Instagram refused the access token. It was revoked, for example from the System User or by removing the app. Generate a new one. -
The log says
@name now belongs to a different account. The account renamed and someone else took the name./instagram removeit, then/instagram addits new username.
/instagram add says it couldn't read an account? Check the spelling. If
it's right, the account is personal, private or age-gated. Only public Business
or Creator accounts can be followed.
If the auto-update job is installed, it only acts when the tracked branch
actually moves — and it tracks one specific branch, main unless someone changed
it. If you merged to a different branch, nothing happens. Check, as the bot
user:
crontab -l # is the pariahbot-sync line there?
grep '^BRANCH=' /usr/local/sbin/pariahbot-sync # which branch is it watching?
tail -50 /opt/PariahBot/sync.logNo pariahbot-sync line means the job was never installed, or was turned off:
see Host Installation → Auto-update job to turn it on.
A repeated fatal: couldn't find remote ref <branch> in that log means the
tracked branch was deleted (e.g. after its PR merged) — point the job at main.
See Host Installation.
To force a sync now, as the bot user:
/usr/local/sbin/pariahbot-syncIn the container install, there's no git sync: see
Container Installation → Updates. update.log in
/opt/pariahbot-container records each update and any failed pull.
Run /logging status. It lists each section, its channel, and anything
stopping it, worded as the fix. The usual causes:
-
The section is off, or has no channel.
/logging setpicks one and switches it on. - The bot can't post there. It needs View Channel, Send Messages and Embed Links in the log channel.
- Kicks and bans, or Server changes, are silent. The bot needs View Audit Log on its role.
-
The whole feature is switched off. Check
/setup feature list. - Server changes made by the bot itself (temporary voice channels, role menus) are left out on purpose.
- Edits and deletions show no text. The bot's host hasn't switched on message text, or the message is older than a day or from before the bot last restarted.
Full guide: Server-Log.
sudo journalctl -u pariahbot.service -n 50 # systemd install
sudo docker logs pariahbot 2>&1 | tail -50 # container installCommon causes:
-
An invalid token was provided—DISCORD_TOKENis wrong, or was reset in the Developer Portal. -
Discord refused to connect: the bot asked for a privileged intent— switch on Server Members Intent in the Developer Portal (your application → Bot → Privileged Gateway Intents), and Message Content Intent too ifSERVER_LOG_MESSAGE_CONTENTis on. Then restart. Every install needs Server Members since the Server-Log arrived; see Bot-Setup. -
NODE_MODULE_VERSIONmismatch onbetter-sqlite3— native module built against a different Node version. Re-runnpm ci --omit=devunder Node 24. Note the sync job uses the bot user'snvm, so running it as root can produce this. -
A
SqliteErroron startup — the schema migrates itself on boot, so this usually means a hand-edited database. The DB is a single file atdata/pariahbot.sqlite.
sudo journalctl -u pariahbot.service -f # the bot itself
tail -f /opt/PariahBot/logs/commands.log # who ran what, and whether it failed
tail -f /opt/PariahBot/sync.log # auto-update jobIn the container install:
sudo docker logs -f pariahbot # the bot itself
sudo docker exec pariahbot tail -f logs/commands.log # who ran what
tail -f /opt/pariahbot-container/update.log # update job