Sources
YouTube · Steam · Twitter · Gmail
Discord Channels
Active Rules
routing rules configured
Bot Status
checking...
Quick Status
# Discord Channels
Recent Activity
from logs
Loading...
Built-in Commands
Command Role Restrictions
Restrict sensitive commands to specific roles. If no roles are set, Discord permissions apply.
Custom Commands
Automatically warn, kick, ban or timeout members who use banned words or phrases.
View, create and delete roles on your Discord server.
Registered Profiles
Allowed Channels
Loading…
Payment Webhook URLs
Copy these URLs into your Xendit / Flip dashboard as the callback/webhook URL.
Xendit
Flip
Configured Middlemen
Loading…
Post a message to any channel at a set time, or on a recurring daily/weekly schedule.
⚙ General
Enable Ticketing
Channel prefix
Ticket channels are named <prefix>-0001
Max open tickets per user
Max total open tickets (server-wide)
0 = unlimited. Prevents channel spam during surges.
🔔 Notifications
Ping support role(s) when ticket opens
Pings are sent inside the ticket channel — staff see the ticket without needing to watch a separate channel.
Auto-close after inactivity (hours)
Set to 0 to disable. The bot warns the opener 1 hour before closing.
# Channels
Tickets category
If blank, the bot auto-creates a "Tickets" category when the first ticket is opened.
Transcript log channel
Closed ticket transcripts + summary embed are posted here.
🛡 Support Roles
These roles get view + manage_messages access to every ticket channel automatically.
📋 Open Tickets
Loading…
🔔 Default Messages
⏱ Global Minimum Interval
Floor for all check intervals — users cannot set lower than the global minimum. Per-platform intervals must also respect this floor.
Global minimum (min)
YouTube (min)
Steam (min)
Twitter (min)
Gmail (min)
RSS (min)
Twitch (min)
Reddit (min)
Reddit score update window — how many days to keep refreshing score/comment counts on posted embeds.
Reddit score window (days)
🐦 Twitter Cookies
auth_token
ct0
Bearer Token
⚠ Cookies expire periodically. Refresh from DevTools → Application → Cookies.
🎮 Twitch Credentials
Client ID
Client Secret
Get these from dev.twitch.tv → Your Console → Register Your Application.
📧 Gmail Authorization
Checking...
Opens Google login in a popup. Authorize once per Gmail account. Requires credentials.json to be uploaded first.
📦 Export / Import Data
Export your sources, routing, channels and moderation config. Import to restore or transfer to another server.
Overwrites current server config
🤖 Bot Identity

Override the bot's display name and avatar for this server. Applies to all notification embeds sent to this server.

🤖
Bot Name
Avatar URL
Banner URL
Bio / About Me
Loading...
⊞ Sources # Channels ⇄ Routing ⚙ Settings 🛡 Moderation 🎭 Roles 🔔 Notif Roles ⌘ Commands ☰ Logs 🎴 Profile Cards 🤝 Middleman 🎫 Ticketing 🗓 Scheduling
⏏ Uninstall, Reinstall & Deleted Channels
Uninstall (bot leaves server)

Discord does not revert anything automatically when a bot leaves. Every channel, role, permission overwrite, and message the bot created stays exactly as-is — Discord owns that data, not the bot. To clean up before uninstalling, use the optional cleanup steps in the uninstall confirmation dialog (accessible from the server selector).

Stays in Discord
All channels, categories, messages
All roles and their assigned members
All permission overwrites
Config on server (routing, channels, settings) — saved on disk, not deleted
Removed / Stops
Bot member entry disappears from server
Slash commands unregistered
All monitoring, reactions, events — same as "Bot Stopped"
Reinstall (bot rejoins server)

When the bot is re-invited, on_ready runs a full recovery sequence for every server it joins.

1
Config restored from disk — all routing rules, channel assignments, settings, and roles config are still on disk under guilds/<guild_id>/. Nothing is lost.
2
System channels verified — bot checks each system channel by its saved ID. If a channel still exists, it is reused. If missing, the bot looks for it by name inside the "MAMA NUI System" category. If still not found, it creates a new one.
3
New Member channels verified — same logic for #welcome, #rules, #roles-picker, #submissions, #anonymous. Missing channels are recreated under the "New Member" category.
4
Role Gate reconciliation runs — any member without a gate role gets re-gated. See the ⚠ warning in the Bot Stopped section above.
5
Slash commands re-synced — all slash commands (including custom ones) are re-registered to the server.
Bot-Created Channels Deleted

What happens depends on which channel was deleted and whether the bot is currently running.

System Channels (#commands, #submissions, #admin-review, #mod-log, #errors, #anonymous-log)
While bot is running: bot logs [!] Channel {id} not in cache. Functions that target that channel (mod log, error alerts, slash commands) silently fail until restart.
On next restart: ensure_system_channels automatically recreates the missing channel under "MAMA NUI System" and updates the saved ID.
New Member Channels (#welcome, #rules, #roles-picker, #submissions, #anonymous)
While bot is running: welcome messages, role picking, anonymous relay silently stop for that channel until restart.
On next restart: ensure_new_member_channels automatically recreates any missing channel under the "New Member" category.
Notification Target Channels (routing destinations)
While bot is running: bot logs a warning and silently drops that notification. No crash, no retry.
On restart: same — the bot does not recreate routing target channels. You must go to the Routing page and update the rule to point to a different channel.
Rule of thumb: system and New Member channels are auto-recovered on restart. Routing target channels are not — update the routing rule manually.
⊞ Sources
Sources
Dashboard User

Sources are external accounts the bot actively monitors. When new content is detected (video, tweet, email, game update, RSS post), a notification embed is delivered to the Discord channels mapped in Routing.

YouTube
New video uploads. Requires Channel ID (UC…).
Steam
Game news & announcements. Requires App ID.
Twitter / X
New tweets. Requires session cookies (see Settings).
Gmail
New incoming emails. Requires Gmail authorization (see Settings).
RSS
New posts from any public RSS feed URL.
Twitch
Stream live alerts. Requires Client ID & Secret (see Settings).
Reddit
New posts from a subreddit. No credentials needed.
TikTok (legacy)
Blocked on VPS/datacenter IPs. Code preserved — requires residential proxy to activate.
How to use
  1. 1Go to Sources → click + Add Account
  2. 2Select a platform and fill in the required identifier (Channel ID, App ID, username, or feed URL)
  3. 3Save — the source card appears with a status indicator
  4. 4Go to Routing and create a rule linking this source to a Discord channel. Without a routing rule, no notification is ever delivered.
Toggle behavior
StateBehavior
ONSource is actively polled at the configured interval. New content triggers a Discord notification.
OFFSource is paused. No polling occurs and no notifications are sent until re-enabled.
Errors & reasons
ErrorReasonFix
Invalid Channel IDYouTube channel ID is wrong or the channel doesn't existVerify the ID starts with UC… on YouTube Studio → Settings
Twitter cookie expiredSession cookies (auth_token / ct0) have been invalidated — Twitter rotates them periodicallyRe-paste fresh cookies from browser DevTools → Application → Cookies on twitter.com
Gmail not authorizedNo OAuth token found for this Gmail accountGo to Settings → Gmail Authorization → Authorize Gmail
Failed to fetch RSSFeed URL returned an error or is unreachableConfirm the URL is valid and publicly accessible
No routing targetsSource has no enabled routing rule pointing to an active channelAdd a rule on the Routing page
Reddit — Daily Score & Comment Update

Reddit embeds are kept up to date automatically. Every day at midnight the bot fetches the latest score and comment count for every Reddit post it delivered in the last 7 days and edits the Discord embed in-place. The last line of each embed (💬 X comments • ⬆️ Y) is replaced with the fresh values. Posts older than 7 days are dropped from the update queue.

BehaviorDetail
TriggerOnce daily at midnight (server local time) — independent of the per-source check interval
ScopeAll Reddit posts delivered within the configured update window (default 1 day), across all subreddits and all servers. Configurable in Owner Controls.
What changesOnly the score/comment stats line at the bottom of the embed description — title, URL, flair, and image are untouched
Post deleted on RedditFetch returns no data — that post is silently skipped; its Discord embed is left as-is
Discord message deletedEdit fails — logged as a warning, loop continues to the next post
Bot stopped at midnightDaily update does not run for that day — embeds keep the last-refreshed stats until the next midnight the bot is running
Repost Mode

By default the bot delivers a Discord embed with title, 300-char description and a thumbnail URL. Each source can opt into Repost mode (Edit Source → Repost section) for richer delivery:

ModeBehavior
Standard embedDefault. Title + 300-char description + thumbnail URL. Discord auto-unfurls the link.
RepostDrops the truncated embed. Include text sends the full body (no 300-char cap, up to 4096 chars). Include media downloads the image/video and uploads it as a native Discord attachment.
Trigger repostSame as Repost — but only when the post matches a keyword (case-insensitive substring) or regex pattern. No match → falls back to standard embed.

Trigger search fields: any subset of Title, Body, Tags / flair / hashtags. Empty keywords + empty patterns = always match. If a downloaded file exceeds Discord's 25 MB upload limit, the bot silently falls back to the standard embed for that post. YouTube (videos too large) and Twitch (live streams) cannot upload their primary media — the dashboard warns when these modes are picked for those platforms.

# Channels
Notification Channels 📢 Notification tab
Dashboard User

Discord channels eligible to receive source notifications. A channel must exist here and have a matching Routing rule to receive any messages.

How to use
  1. 1Go to Channels → Notification tab → click + Add Channel
  2. 2Pick a Discord channel from the dropdown (fetched live from your server)
  3. 3Toggle the channel ON to activate it, then create a Routing rule
Toggle behavior
StateBehavior
ONChannel is active. Routing rules targeting it will deliver notifications.
OFFChannel is disabled. No notifications are delivered even if a Routing rule targets it.
New Member Channels 🆕 New Member tab
Dashboard User

Channels auto-created in a New Member category. New members can only access these channels until they pick a role via Role Gate. This is also where the welcome message is sent.

Toggle behavior per channel
ChannelToggle ONToggle OFF
#welcomeWelcome embed is sent to this dedicated channel when a new member joinsWelcome message falls back to Discord's default system channel (typically general chat)
#rulesRules channel is visible in the New Member categoryChannel is hidden / removed from the category
#roles-pickerReaction roles message is posted here; members react to pick a roleRole Gate cannot function — no channel for members to pick roles from
#anonymousMembers can type here and the bot intercepts the message, deletes the original, and reposts it as 💬 Anonymous — identity hidden from everyone except the anonymous-logThe anonymous channel is removed; /anon command still works if used in other channels but the channel-based auto-intercept stops
⚠ Turning OFF #roles-picker while Role Gate is enabled will lock new members with no escape path.
Why a message shows as "Anonymous"

When a member posts in #anonymous or runs /anon, the bot deletes their original message and reposts it with a 💬 Anonymous header. The member's real identity is never shown in public — only visible in #anonymous-log (System channel) for moderation. This is by design.

System Channels ⚙ System tab
Admin Role

Hidden management channels auto-created under a MAMA NUI System category. Only the configured Admin Role can see this category.

Toggle behavior per channel
ChannelToggle ONToggle OFF
#commandsBot slash command output is delivered here; visible to Admin Role onlyNo dedicated channel for command output
#submissions/submit form results are posted hereSubmissions are not forwarded anywhere
#admin-reviewAdmin review panel availableFeature disabled
#mod-logAll mod actions (kick/ban/warn/timeout) are logged hereMod actions are not logged to Discord
#errorsBot runtime errors are reported here in real timeErrors are only visible in the Dashboard Logs page
#anonymous-logEvery anonymous message posted via /anon or #anonymous channel is logged here with the real sender's identity, channel, and message content — visible only to Admin RoleAnonymous messages are still delivered publicly but the real sender is never recorded anywhere
Admin Role

Set via System tab → Admin Role dropdown. Only members with this role can see the MAMA NUI System category. Without an Admin Role set, the category is visible only to server administrators (Manage Server permission).

⇄ Routing
Routing
Dashboard User

Routing rules are the bridge between a Source and a Discord channel. Without a routing rule, no notification is ever delivered — there is no default fallback. Each rule maps one source to one or more notification channels.

Prerequisite: A source must exist on the Sources page, and a notification channel must exist on the Channels → Notification tab, before a routing rule can be created.
How to use
  1. 1Add a source on the Sources page (e.g. a YouTube channel)
  2. 2Add a Discord channel on Channels → Notification tab and toggle it ON
  3. 3Go to Routing → click + Add Rule
  4. 4Select the source and the target channel(s) → Save
  5. 5Ensure the rule toggle is ON to activate delivery
Toggle behavior
StateBehavior
ONRule is active. New content from the source is delivered to the mapped channel(s).
OFFRule is paused. Source is still monitored but no message is sent to Discord. Use this to temporarily mute a source without deleting the rule.
Send Latest Post

Each routing rule has a Send Latest Post button. Clicking it fetches the most recent item from that source and delivers it immediately to the mapped channel(s) — identical to an automatic notification, including any configured ping role. The item is also marked as seen so the bot will not re-post it on the next check.

Errors & reasons
ErrorReasonFix
No targets foundSource has no enabled routing rule pointing to an active channelCreate or enable a routing rule and ensure the target channel is toggled ON
Channel not foundThe mapped Discord channel was deleted from the serverRemove the rule, re-add the channel in Channels, and create a new rule
Missing permission: Send MessagesBot does not have "Send Messages" in the target channelGrant the bot that permission in Discord's channel settings
⚙ Settings
🔔 Default Messages
Dashboard User

Per-platform notification settings. Each platform has two fields:

FieldWhat it does
Prefix MessageText displayed above the embed in Discord when a notification is sent. Leave blank for no prefix text.
Ping RoleA Discord role that gets @mentioned alongside every notification for that platform. Members with this role receive a ping. Leave unset for silent delivery.
Ping roles apply to both automatic notifications and manual "Send Latest Post" triggers from the Routing page.
⏱ Check Intervals
Dashboard User

How often (in minutes) the bot polls each platform for new content. Minimum 10 minutes per source — enforced server-side. Lower intervals are more real-time but increase API load.

🐦 Twitter Cookies
Dashboard User

Twitter/X is accessed via browser session cookies — no official API key. Three values are required: auth_token, ct0, and Bearer Token.

How to get the values
Bearer Token — Open twitter.com (logged in) → DevTools (F12) → Network tab → filter Fetch/XHR → scroll or interact on the page to trigger requests → click any request to api.twitter.comRequest Headers → find authorization: Bearer AAAA…
auth_token & ct0 — Same DevTools → Application tab → Cookieshttps://twitter.com → find auth_token and ct0
Errors & reasons
ErrorReasonFix
Cookie expired / 403Twitter invalidated the session. Happens every few weeks.Open twitter.com → DevTools (F12) → Application → Cookies → copy fresh auth_token and ct0
Validate: FAILCookies are present but invalid or mismatchedLog out and back into twitter.com, then re-copy all three values
📧 Gmail Authorization
Dashboard User

Gmail uses OAuth2. Requires credentials.json (from Google Cloud Console) to be uploaded first. Each user then authorizes their Gmail account once via the dashboard popup. The token auto-refreshes.

Errors & reasons
ErrorReasonFix
credentials.json missingGoogle OAuth2 app credentials have not been uploadedSettings → Google Console → Upload File
Token expired / revokedUser revoked access in Google Account settings, or token is corruptRe-authorize via Settings → Gmail Authorization → Authorize Gmail
Popup blockedBrowser blocked the OAuth authorization popupAllow popups for the dashboard domain in browser settings
📦 Export / Import Data
Dashboard User

Export your entire config (sources, channels, routing, moderation) as a JSON file for backup or transfer. Import overwrites the current server config. Optionally include Twitter cookies in the export.

🎮 Twitch Credentials
Dashboard User

Twitch is accessed via the official Helix API. Two values are required: Client ID and Client Secret from a registered Twitch application.

How to get credentials
  1. 1Go to dev.twitch.tv → Log in → Your Console
  2. 2Click Register Your Application → fill in name and redirect URI (any URL)
  3. 3Copy the generated Client ID and generate a Client Secret
  4. 4Paste both into Settings → Twitch Credentials → Validate Credentials
Errors & reasons
ErrorReasonFix
Validate: FAILClient ID or Secret is wrong or the app was deletedRe-check dev.twitch.tv → regenerate Client Secret if needed
401 UnauthorizedAccess token request failed — credentials rejected by TwitchEnsure the application is not deactivated on the Twitch developer console
Unlike Twitter cookies, Twitch credentials do not expire as long as the application remains active on dev.twitch.tv.
🤖 Bot Identity
Dashboard User

Override the bot's display name and avatar for your server. Changes take effect immediately in Discord.

FieldNotes
Bot NameLeave blank to use the global default name set by the admin
Avatar URLMust be a direct image link (PNG, JPG). Leave blank to use the global default avatar.
Use Reset to Default to remove any per-server override and revert to the global bot identity.
🛡 Moderation
📜 Rules
Dashboard User

Define server rules as sections (header + content). The bot posts them to the #rules channel. The #rules channel must be enabled in Channels → New Member tab.

Post modes
ModeBehavior
Embed (per section)Each rule section is posted as a separate Discord embed message
Merged (single message)All sections are combined into one embed
👋 New Member / Welcome
Dashboard User

An embed message sent automatically when a new member joins the server. Supports two placeholders: {user} mentions the new member, {server} inserts the server name.

Welcome channel toggle (Channels → New Member tab)
StateBehavior
#welcome ONWelcome embed is sent to the dedicated #welcome channel inside the New Member category
#welcome OFFWelcome embed falls back to Discord's default system channel (the server's built-in "system messages channel", usually general chat)
Mention toggle
StateBehavior
Mention ONWelcome message includes an @mention of the new member, sending them a notification
Mention OFFMessage is posted without pinging the new member
🚫 Auto-Mod
Dashboard User

Word and phrase rules that trigger automatic moderation actions when a member's message matches.

Available actions
ActionWhat happens
WarnBot sends a warning message in the channel; no role or permission change
TimeoutMember is server-muted for a configurable duration
KickMember is removed from the server (can rejoin)
BanMember is permanently banned (cannot rejoin unless unbanned)
Toggle behavior (per rule)
StateBehavior
ONRule is active — matching messages trigger the configured action immediately
OFFRule is paused — matching messages pass through without any action
Errors & reasons
ErrorReasonFix
Missing permission: Ban MembersBot's role lacks the Ban permission in DiscordServer Settings → Roles → bot role → enable "Ban Members"
Missing permission: Kick MembersSame as above, for KickGrant "Kick Members" to the bot's role
Cannot timeout member above botTarget member has a higher role than the bot in the role hierarchyMove the bot's role above all member-facing roles in the Discord role list
✎ Form Builder
Dashboard User

Customizes the modal fields shown when a member runs /submit. Up to 5 fields, each with a label, placeholder, and optional required toggle. Completed submissions are posted to #submissions (must be enabled in Channels → System tab).

🐢 Slowmode
Dashboard User

Rate-limits message sending in specific channels. Certain roles can be exempt so moderators are never throttled.

Enforcement mode
ConditionBehavior
No exempt roles configuredUses Discord's native slowmode — enforced by Discord's own infrastructure
One or more exempt roles setBot-enforced slowmode — only members without an exempt role are rate-limited; exempt members post freely
Delay range: 1 second minimum — 21,600 seconds (6 hours) maximum.
🎭 Roles
Permission Hierarchy
how authority flows in your server
Role Tiers
Server Owner
Discord-level full control. Cannot be moderated by the bot.
Admin Role
Sees System channels · Manages roles, channels, permissions · All mod commands
Moderator Role
/kick /ban /timeout /warn · Can be granted Bypass Slowmode via Role Privilege
Standard Member
Full channel access · /status · /submit · Reaction roles
New Member
Role Gate active → only #roles-picker visible until a role is picked
The bot's role must sit above any role it manages in Discord's role list. Otherwise kick/ban/timeout will fail.
Channel Permission Resolution

Discord resolves permissions from lowest to highest specificity. A more specific rule always wins.

① @everyone Base permissions — applies to all members with no role override
▼ overridden by
② Role Override Set via Role Channel Permission — applies to everyone with that role
▼ overridden by
③ Member Override Set via Member Channel Permission — targets a specific user, highest priority
▼ final resolved permission
✓ Effective Permission What the member can actually do in that channel
Category vs Channel
LevelApplies toCan be overridden by
CategoryAll channels inside it (inherited)Channel-level setting
ChannelThat specific channel onlyRole or Member override
🎭 Roles Manager
Dashboard User

View all server roles, create new ones (name + color), or delete existing ones. Changes apply directly to Discord in real time.

⚠ Deleting a role is permanent — all members who held that role lose it immediately.
🔒 Basic Permission
Dashboard User

Four sub-panels for controlling what roles and members can see or do:

Sub-panelWhat it controls
Default VisibilityWhich categories newly created roles cannot see by default
Role PresetApply a server-wide permission level to a role (View-only / Standard / Moderator / Admin)
Role Channel PermissionAllow/Deny specific permissions on channels or categories for a role. Empty role = @everyone. Empty channel = server-wide.
Member Channel PermissionSame as Role Channel Permission but targets individual members
⚡ Button Roles
Dashboard User

Members gain or lose a role by reacting with an emoji to a bot message posted in #roles-picker.

How to use
  1. 1Roles → Button Roles → Emoji-Role Pairs → + Add Pair — map one emoji to one role
  2. 2Reaction Role Messages → + Create Message — group pairs into a message
  3. 3Click Post to #roles-picker
The #roles-picker channel must be enabled in Channels → New Member tab.
🚪 Role Gate
Dashboard User

Restricts new members to the New Member category — only #roles-picker is accessible — until they react to pick a role. Once a role is chosen, they gain full server access.

Toggle behavior
StateBehavior
ONAll new members are locked to #roles-picker on join. All other channels are inaccessible until a role is picked.
OFFMembers can access all channels they have permission for immediately after joining. No role requirement.
Errors & reasons
ErrorReasonFix
No pairs selectedRole Gate has no role pairs — members have no buttons to clickCreate emoji-role pairs first (Button Roles tab), then select them in Role Gate config
#roles-picker not enabledChannel is OFF or was never createdEnable #roles-picker in Channels → New Member tab
Config change edge cases
ScenarioWhat happens
Gate post deleted in DiscordNo roles are stripped. Members who already have the gate role keep it and retain their channel access. The stored message_id becomes orphaned — no new member can unlock until you re-post the gate message.
Swap both emoji and role (emoji A + role A → emoji B + role B)Members who already have role A keep it — nothing strips it. Channel permission overwrites for role A are not removed (perm setup is additive only), so those members still see channels. New members must react with emoji B to get role B.
Change which role an emoji maps to (emoji A → role A becomes emoji A → role B)Emoji A now only maps to role B in the config. New reactions grant role B. Members who previously got role A keep it as an orphaned leftover — it is never stripped. Channel access via role A's old overwrites also remains.
Change which emoji maps to a role (emoji A → role A becomes emoji B → role A)Role A is now triggered by emoji B. Reactions on emoji B grant role A correctly. Old members who reacted with emoji A already have role A — nothing changes for them. New members must use emoji B.
Old gate role's channel overwrites after a swapThe old role's view_channel=True overwrites are never automatically removed. To clean up, manually remove the old role's channel overwrites in Discord server settings, or delete the role entirely.
⛔ Role Penalty
Dashboard User

Restrict a role via Discord permission denies — applied as long as the role is assigned. Useful for a muted or punished role. Optional auto-timeout fires on role assign and clears on removal.

PenaltyEffect
Cannot Send MessagesRead-only access to all channels
Cannot Attach FilesNo image or file uploads
Cannot Post LinksNo link embeds or previews
Cannot Add ReactionsCannot react to any message
Cannot Use External EmojiOnly this server's own emoji are allowed
Auto-Timeout on AssignServer-wide timeout (minutes) applied when role is assigned; 0 = disabled
⭐ Role Privilege
Dashboard User

Grant a trusted role extra permissions that override default restrictions. Applied directly to the Discord role — enforced by Discord.

PrivilegeEffect
Bypass SlowmodeCan send messages freely regardless of any channel slowmode
Post LinksLink embeds and previews always allowed
Attach FilesCan upload images and files in any channel
Use External EmojiCan use emoji from other Discord servers
Mention @everyone / @hereCan ping all members (use carefully)
🔔 Notification Roles
How It Works
Dashboard User

Notification Roles let members self-subscribe to @mention pings for specific content types (e.g. coupons, game updates). Members click a button in Discord to opt in or out — no commands needed.

Member Flow
StepWhat happens
1. See panel in #roles-pickerPanel posted by admin with subscribe buttons
2. Click a buttonBot gives them the notification role (ephemeral: 🔔 Subscribed)
3. Bot posts notificationBot @mentions the role → only subscribers get pinged
4. Click again to unsubscribeRole removed, no more pings (ephemeral: 🔕 Unsubscribed)
Admin Setup Flow
StepWhere
1. Create Discord roles for notificationsDiscord or Roles Manager
2. Add emoji→role pairs in Button Roles tabRoles → Button Roles
3. Build a panel using those pairs as buttonsRoles → 🔔 Notif Roles → Create Panel
4. Post the panel to #roles-picker📤 Post (auto-selects #roles-picker)
5. (Optional) Set trigger words per buttonSaved Panels → button row → trigger field → ✓
Trigger Words & Emoji

Each notification button can have an optional trigger word or emoji. When an admin or the bot posts a message containing that trigger, the bot replies and @mentions the subscribed role.

TypeMatching ruleExample
KeywordCase-insensitive substring — trigger appears anywhere in the messageTrigger: COUPON → matches "New COUPON code!"
EmojiExact match — the emoji must appear in the messageTrigger: 🎫 → matches "🎫 Redeem now"
⚠ Triggers only fire for messages from admins (Administrator / Manage Server permission) or the bot itself (e.g. anonymous posts). Regular member messages are ignored.
After saving a trigger (✓), the bot picks it up immediately — no restart or repost needed.
⚠ Role Permissions Warning

Notification roles must have zero channel permission overwrites. They are purely for @mentions — not for controlling access.

If a notification role has a deny overwrite on a channel, it will override the gate role's allow, and verified members who subscribe will lose channel access.

If members lose access after clicking a button:
Go to Saved Panels → click 🔧 Fix Perms on the affected panel. This clears all channel overwrites from every notification role in that panel immediately. Members regain access without any action on their part.
Fix Perms runs automatically on every Save and Post — this issue only occurs if a role was created directly in Discord before being added to a panel.
Per-Source Ping Roles
Dashboard User

In Settings → Default Messages, each platform (YouTube, Steam, Twitter, etc.) has its own ping roles list. Every notification from that platform automatically @mentions the configured roles — no trigger word needed.

FeatureWhen it pingsWho sets it up
Notif Role buttonOnly when a trigger word matches (optional)Admin enters trigger per button
Per-source ping rolesEvery single notification from that platformAdmin adds role in Settings → Default Messages
Both systems are independent. You can use one, both, or neither.
📋 #roles-picker Post Behavior — Edge Cases

All three tabs (Button Roles, Role Gate, Notification Roles) post to #roles-picker and store a message_id to track the live Discord message. The behavior differs per tab in edge cases.

Editing a saved entry
TabWhat "Edit/Save" doesHow to push changes to Discord
⚡ Button RolesUpdates saved data only — Discord message unchangedClick Update Post to PATCH the live message in-place
🚪 Role GateUpdates config only — Discord message unchangedClick Update Post to PATCH the live message in-place
🔔 Notif RolesUpdates saved data only — Discord message unchangedClick ✏ Edit Post to PATCH the live message in-place
Message manually deleted in Discord
TabWhat happens
⚡ Button RolesStale message_id is auto-cleared next time the tab loads (404 check). "Update Post" will fail until cleared. Click 📤 Post to create a new message.
🚪 Role GateStale message_id is auto-cleared on every dashboard load (404 check). Re-post when ready.
🔔 Notif RolesNo auto-check. If ✏ Update Post fails with a "Message was deleted" error, the stale reference is cleared automatically then. Click 📤 Post to create a new message.
Posting twice (without deleting the first)
TabWhat happens
⚡ Button RolesNew message created, message_id updated. Old Discord message becomes an orphan — buttons on it are silently ignored by the bot. Delete the old message manually.
🚪 Role GateSame — new message created, old message orphaned. Reactions on the old message are ignored. Delete it manually.
🔔 Notif RolesThe old Discord message is automatically deleted before the new one is posted — no orphan left in the channel.
Deleting a saved entry (dashboard) while the post is still in Discord
TabWhat happens
⚡ Button RolesDiscord message stays. Reactions no longer assign roles (bot can't find the entry). Delete the Discord message manually to avoid confusion.
🔔 Notif RolesDiscord message stays with working buttons — the bot resolves role from the button's custom_id regardless of whether a panel entry exists. Delete the Discord message manually before removing the panel.
⌘ Commands
Commands
Dashboard User

Slash commands available in Discord. Built-in commands cover bot status and moderation. Custom commands let you define your own keyword triggers.

Built-in commands
CommandWhat it doesDefault permission
/statusShows bot status and uptimeAny member
/submitOpens the Form Builder modal for member submissionsAny member
/roleAssigns or removes a role from a memberManage Roles
/kickKicks a member from the serverKick Members
/banPermanently bans a memberBan Members
/timeoutTemporarily mutes a member (Discord server timeout)Moderate Members
/warnIssues a formal warning to a memberKick Members
/reddit_updateManually refreshes score and comment counts on all Reddit embeds posted in the last 7 daysAdministrator
/anonSends a message anonymously to the current channel — bot deletes the original and reposts it as 💬 Anonymous. Real identity is logged in #anonymous-log.Any member (if anonymous is enabled)
/embed <url> [note]Posts a rich embed for any URL. Twitter/X uses the API (full author + text); YouTube falls back to a plain link so Discord renders the native player; all others use Open Graph tags (title, description, image). Optional note appears above the embed.Any member
— Ticketing —
/ticket panelPosts the Open Ticket embed + button in this channel. Members click it to open a ticket.Manage Channels
/ticket close [reason]Closes the current ticket — saves full transcript, posts to log channel, deletes channel after 5 s.Ticket opener or Manage Channels
/ticket claimClaims (or releases) the current ticket. Claimer is recorded in the close log embed.Support role or Manage Channels
/ticket add <user>Grants a member view + send access to the current ticket channel.Manage Channels
/ticket remove <user>Revokes a member's access. Cannot remove the ticket opener.Manage Channels
Command Role Restrictions

Override the default Discord permission with a specific role requirement. If set, only members with that role can run the command, regardless of their native Discord permissions.

StateBehavior
No role setDiscord's own permission system applies (e.g. /kick requires "Kick Members")
Role setOnly members with the specified role can run the command. Native Discord permissions are bypassed.
Custom Commands

Create your own slash commands with a custom name and a bot response (plain text or embed). Useful for FAQs, server info, or pinned announcements triggered on demand.

Errors & reasons
ErrorReasonFix
Missing applications.commands scopeBot was not invited with the slash commands OAuth scopeRe-invite the bot including the applications.commands scope
Unknown commandA new command was added but not yet synced to DiscordWait for the next bot restart — commands sync on startup. Contact the bot admin if it persists.
Missing permissionsBot lacks the Discord permission required for the actionReview the bot's role permissions in Discord Server Settings → Roles
☰ Logs
Logs
Dashboard User

Two log streams — Bot activity and Dashboard changes — displayed in a real-time viewer with level filters and date navigation.

Bot log tab — filters
FilterWhat it shows
AllEvery log entry without filtering
InfoBot startup events, task lifecycle, general status messages
PostsNotifications successfully delivered to Discord (one entry per delivery)
ErrorFailed fetches, authentication errors, missing permissions, unhandled exceptions
Dashboard log tab

Records every configuration change made through the dashboard (who changed what and when). Kept forever — never rotated or deleted.

Log rotation & date picker

Bot logs rotate daily. The date picker shows up to the last 7 days of history. Logs older than 7 days are automatically deleted. "Today" always points to the current live log file.

Toolbar actions
ActionBehavior
↺ RefreshFetches the latest entries from the server immediately
Clear ViewClears the displayed log in your browser only — the log file on disk is not affected
The bot log auto-refreshes every 60 seconds while the Logs page is open.
🎴 Profile Cards
Overview
Dashboard User

Community profile cards for your server members. Each member registers a profile with stats, collection info, and a customizable Armory — rendered as a Pillow-generated PNG card. Achievements are auto-assigned based on activity milestones.

Commands
CommandWho can useWhat it does
/card registerAny memberOpens a template in chat. Member fills it in and sends it back. Bot parses, validates, saves, and renders the profile card.
/card editAny member with a profileSame template flow as register — pre-fills existing values for editing.
/card profile [user]Any memberDisplays the profile card for the specified user, or the caller's own card if no user is provided.
/card deleteAny member with a profilePermanently deletes the caller's profile.
/card badgesAny member with a profileShows the caller's current achievement badge slots and progress toward locked achievements.
Context menu

Right-click any member → AppsView Profile Card — delivers their card as an ephemeral message visible only to you.

Channel restriction

If a commands channel is set in Card → Settings, all /card commands only work in that channel. Members attempting to use them elsewhere get a silent ephemeral error.

👤 Profiles Tab
Dashboard User

Browse all registered member profiles for the selected server. The count is shown next to the tab label.

↻ Re-check All

Runs the achievement evaluation logic across every profile in the server. Useful after adding new achievement definitions or changing thresholds — auto-assigns the best earned badge to each empty slot without waiting for the daily loop.

🏆 Achievements Tab
Dashboard User

Define the achievement badges members can earn. Each achievement has a condition type and a threshold value. Achievements are evaluated on profile save, on the daily midnight loop, and when "↻ Re-check All" is triggered.

Condition types
ConditionTriggers when
Total LoginsMember's cumulative login count reaches the threshold
Login StreakMember's consecutive daily login streak reaches the threshold
StarsMember's star count (profile field) reaches the threshold
Col. Taimanin (X/Y)Member's Taimanin collection count reaches the threshold
Server BoosterMember is actively boosting the server (no threshold — binary)
Badge slots

Each profile has 6 badge slots mapped to these condition categories: server_booster · logins · streak · stars · collection · undecided. When multiple achievements qualify for the same slot, the one with the highest threshold value is used.

📋 Form Tab
Dashboard User

Customize the fields shown in the template members fill in during /card register and /card edit. Toggle individual fields off to hide them from the template.

Player Name is always required and cannot be toggled off. It is the only field enforced as mandatory — all others are optional even when shown.
⚙ Settings Tab
Dashboard User
General
SettingBehavior
Enable Profile Card SystemWhen OFF, all /card commands return an error to the member. Existing profiles are preserved on disk — nothing is deleted.
Commands ChannelIf set, /card commands are restricted to this channel. Leave unset to allow commands in any channel.
Collection Max Values

Sets the denominator for the collection progress bar on the profile card. For example, if Taimanin max is 42, a member with 20 shows 20/42. Used for display only — does not gate registration.

Commands

Toggle individual /card sub-commands on or off globally. Disabled commands return an error to members — useful for temporarily locking registration while migrating data.

CommandToggle OFF effect
/card registerNew members cannot register profiles
/card editExisting members cannot update their profile
/card profileNo one can view profile cards via slash command
/card deleteMembers cannot delete their own profile
View Profile Card (right-click)The context menu App entry is disabled — right-clicking a member no longer shows it
/card badges has no individual toggle — it follows the global Enable toggle. If the system is enabled, badges is always available.
Daily Loop & Login Tracking

Every midnight (server local time) the bot increments total_logins +1 and login_streak +1 for every registered profile. If a full day was missed (the last loop ran more than ~24 h ago), the streak resets to 1.

Achievement re-evaluation

After incrementing stats, the daily loop re-evaluates all achievement conditions for every profile and auto-assigns newly earned badges — same logic as "↻ Re-check All" in the dashboard.

Note: If the bot is stopped at midnight, the daily increment does not run for that day. The missed day will cause the login streak to reset on the next loop.
🤝 Middleman (MM-RMT)
Overview
Dashboard User

An escrow system that runs entirely inside Discord. Any server member initiates a trade by calling /mm_rmt, selects the buyer, seller, and middleman, and the bot creates a private thread for all three parties. The bot DMs the buyer with payment instructions and the seller requesting their bank details. All confirmation flow happens through buttons inside the thread.

Commands
CommandWhoWhat it does
/mm_rmtAny member (allowed channels only)Opens an escrow. Parameters: @buyer, @seller, @middleman, amount (IDR), description.
/mm_disputeBuyer or seller (inside thread)Raises a dispute, locks the thread, and pings the middleman.
Manual Mode
Dashboard User

The middleman provides static bank/e-wallet details or a static QRIS image URL. Payment transfer and fund forwarding are done manually by the middleman.

Flow
  1. Bot DMs buyer with the middleman's bank account or QRIS.
  2. Bot DMs seller asking for their bank/e-wallet receiving details.
  3. Buyer transfers money to middleman, then clicks Payment Sent to Middleman.
  4. Middleman verifies receipt, then clicks Forward Payment to Seller.
  5. Seller receives funds, then clicks Payment Received from Middleman.
  6. All three parties click Close Transaction → thread archived.
Timer

1 hour. If the buyer does not confirm payment before expiry, the transaction is marked expired and the thread is archived automatically.

Automatic Mode
Dashboard User

The middleman configures a Xendit or Flip API key (per middleman, not shared). The bot generates a dynamic QRIS or Virtual Account and sends it to the buyer. Webhook callbacks auto-detect payment receipt.

Flow
  1. Bot generates QRIS/VA via API and DMs the buyer.
  2. Bot DMs seller asking for their bank/e-wallet receiving details.
  3. Xendit/Flip webhook fires → bot auto-announces payment confirmed in thread.
  4. Buyer and Middleman both click Forward Payment to Seller to release funds.
  5. Bot calls the disbursement API automatically if amount < configured threshold. Otherwise, admin clicks Disburse in dashboard.
  6. Seller + buyer click Transaction Complete → thread archived.
Timer

24 hours from transaction creation.

Disbursement threshold

Configurable per middleman. Transactions below the threshold are disbursed automatically via API. Those at or above the threshold are flagged pending_disbursement and require admin approval in the Transactions tab.

Config Tab — Dashboard
Dashboard User
Allowed Channels

Select which channels allow /mm_rmt. Leave empty to allow the command everywhere.

Payment Webhook URLs

Copy these URLs into your Xendit or Flip dashboard as the callback/webhook URL. Requires WEBHOOK_BASE_URL to be set in .env.

Middlemen

Add any server member as a middleman. Per-middleman settings:

SettingDescription
ModeManual (static bank/QRIS) or Automatic (Xendit/Flip API)
Bank / QRISManual only: bank name, account number, account name, or a static QRIS image URL
Provider & API KeysAuto only: Xendit or Flip; separate payment key and disbursement key
Payment MethodAuto only: QRIS (QR image sent to buyer) or Virtual Account
Fee Type / ValueFlat IDR amount or percentage — added to buyer's total
Auto-disburseWhether to call disbursement API automatically vs. wait for admin approval
Threshold (IDR)Amounts below this are auto-disbursed; at or above require admin click
Transactions Tab — Dashboard
Dashboard User

View all escrow transactions for the selected server. Filter by status. Click any row to see full detail (bank info, confirmation flags, disbursement ID).

Status reference
StatusMeaning
pending_paymentWaiting for buyer to pay the middleman
payment_confirmedPayment received (webhook) or buyer confirmed (manual)
pending_disbursementBoth parties clicked Forward; amount ≥ threshold — admin must click Disburse
disbursedFunds sent to seller (API or manual)
completedAll required parties clicked Close — thread archived
disputedDispute raised — thread locked, awaiting admin resolution
expiredTimer elapsed before payment was confirmed
cancelledDispute resolved with Refund Buyer outcome
Disburse button

Appears on pending_disbursement rows. For automatic mode, calls the Xendit/Flip disbursement API using the seller's bank details captured via DM. For manual mode, simply marks the transaction as disbursed (admin did it physically).

Dispute resolution

Click Resolve on a disputed transaction. Choose Refund Buyer (cancels transaction) or Pay Seller (moves to pending_disbursement for manual disburse). Does not move funds automatically — admin must handle the actual transfer for refunds.

🎫 Ticketing
Overview
Dashboard User

Discord-native support ticket system. Each ticket is a private text channel under a "Tickets" category, visible only to the opener, configured support roles, and the bot. Configured in the Ticketing dashboard page — no JSON editing required.

Commands
CommandWho can useWhat it does
/ticket panelManage ChannelsPosts the Open Ticket embed + button in the current channel. Members click it to open a ticket.
/ticket close [reason]Ticket opener or Manage ChannelsSaves full transcript, logs it to the log channel, then deletes the channel after 5 seconds.
/ticket claimSupport role or Manage ChannelsClaims (or releases) this ticket. The claimer is recorded in the close log. Also available as the Claim button in the ticket channel.
/ticket add <user>Manage ChannelsGrants a user view + send access to the current ticket channel.
/ticket remove <user>Manage ChannelsRevokes a user's access. Cannot remove the ticket opener.
Flow

Member clicks Open Ticket → modal asks for a subject → bot creates a private channel → welcome embed + Close Ticket and Claim buttons posted. Support roles are pinged in the same message (configurable).

Transcript on close

Full transcript (no limit). Posted to the log channel as a code block (≤1900 chars) or a .txt file. Close embed includes: subject, opener, closer, claimer, message count, open time, and optional reason.

Auto-close

Set auto_close_hours > 0. The bot checks every 30 minutes using Discord snowflake timestamps (no extra API calls). At hours − 1, it warns the opener; at hours it closes automatically.

Config (ticket_config.json)
FieldDefaultEffect
enabledfalseFeature toggle — must be true for the Open Ticket button to work
support_role_ids[]Roles that get view + manage_messages on every ticket and can claim tickets
category_idnullCategory to create tickets under; auto-creates "Tickets" if not set
log_channel_idnullChannel where closed-ticket transcripts are posted
max_open_per_user1How many open tickets a single member can have at once
ticket_prefix"ticket"Channel name prefix (e.g. "ticket-0001")
ping_support_on_opentrueWhether to @ping support roles when a ticket is opened
auto_close_hours0Hours of inactivity before auto-close; 0 = disabled
🗓 Scheduling
Overview
Dashboard User

Post a plain-text message to any Discord channel on a schedule. The bot checks every 60 seconds for due schedules across all guilds.

Schedule types
TypeWhen it firesAfter firing
onceAt the specified date/time (ISO format)Auto-disabled — will not fire again
dailyEvery day at the specified HH:MM (server local time)Repeats indefinitely
weeklyOn selected weekdays at the specified HH:MM (server local time)Repeats on those days
Double-fire protection

Each schedule stores a last_run timestamp. Daily and weekly schedules will not fire more than once per calendar day, regardless of bot restarts.

Errors & limits
If the target channel is deleted, the schedule is silently skipped — update or delete it from the dashboard.
If the bot is stopped at the scheduled time, that firing is missed. The schedule resumes normally on next restart.
Only plain-text messages are supported — no embeds or attachments.
🤖 All Bots
Start, stop, or restart all user bots at once via pm2.
Checking...
⚙ Dashboard Process
Restart or stop the Flask dashboard server.
⚠ Stopping requires SSH access or pm2 to restart.
🔐 Sessions
Force all users to log out. Useful after a security incident or credential rotation.
🔒 Disable Login
Disable Login Button
When ON — only users in the whitelist can log in or stay logged in. Anyone not in the whitelist is blocked at login and force-logged out if already in a session.
👥 Users Whitelist
Whitelist Enabled
Only Discord user IDs listed here can log in. Anyone not listed is blocked and force-logged out of existing sessions.
Loading users...