Review setup first
.vanity quick enables the detector and tracker, may change log to delete, and selects an announcement channel. It is not a test mode.Independent tracker
The tracker attributes joins when it can compare cached invite-use counts. Turning off its announcements does not stop statistics from updating.
Actions and limits
The current Link Guard callback attempts to delete every detected message before applying the selected action, including
log mode.Access and scope
Configuration commands run in a server and require nativeAdministrator or the compatible virtual authorization Headless applies to that check. The /vanity slash command only toggles the detector; the other configuration groups described here are prefix commands. Detector, allowlist, tracker, and reward settings are scoped separately to each server.
Link Guard
The detector checks Discord invitations and links in messages. The server’s official vanity invite code is allowed automatically; allowlists add exceptions. You can allow an invite/code, URL or domain, subdomain wildcard, path, or one of thediscord, youtube, and roblox categories. Paths match the configured path prefix, and a domain rule also matches its subdomains. Up to 120 link rules and 80 exempt roles are stored. An exempt role prevents its members from triggering the detector; it does not grant moderation permissions.
Available actions are log, delete, warn, timeout, kick, and ban. Timeout duration is limited to 1–10,080 minutes. Headless logs matches and, on the active detection path, attempts to delete every blocked message in every mode before running the response. Therefore, log does not guarantee that the message remains: the code also posts a notice after the delete attempt. If Discord rejects deletion or a sanction, the operation may be partial; sanction failures are sent to Logs.
Detector commands
Detector commands
- Status — Command:
.vanity· Effect: Shows detector state, action, timeout, allowed invites/links, and tracker state. - Enable / pause — Command:
.vanity on·.vanity off·/vanity enabled:true|false· Effect: Changes the detector flag; does not enable or disable the tracker. - Quick setup — Command:
.vanity quick [#channel]· Effect: Enables the module, detector, and tracker; selects a channel; attempts invite synchronization; and changeslogtodeleteiflogwas the saved action. - Response — Command:
.vanity action ACTION· Effect:ACTIONmust belog,delete,warn,timeout,kick, orban. - Duration — Command:
.vanity timeout <minutes>· Effect: Saves a timeout from 1 to 10,080 minutes; default is 10. - Invites — Command:
.vanity allow <invite>·.vanity disallow <invite>· Effect: Adds or removes an invite code/URL from the allowlist. - Links — Command:
.vanity allowlink <domain or URL>·.vanity disallowlink <domain or URL>· Effect: Adds or removes a rule; at most 120 entries are stored. - Role bypass — Command:
.vanity role @Role·.vanity unrole @Role· Effect: Adds or removes exempt roles; at most 80 are stored.
.vn, .v, .van, and .inviteguard. quick turns controls on directly; it does not ask for confirmation or test the trigger. The delete attempt can occur before a timeout, kick, or ban action fails.What happens when a message is posted
What happens when a message is posted
Headless detects invitations and links, normalizes each match, and checks codes, domains/paths, and exempt roles against the server configuration. If there are no blocked matches, it does nothing. Otherwise it creates a
vanity_detected event with part of the message and selected action, attempts to send it to Logs, attempts to delete the message, and then applies the response. An allowed match does not allow every other link in the same message; each match must pass its own rule.Invite Tracker
The tracker is independent from link filtering. When a member joins, Headless compares the available invite-use counts with the previous cache. If it can identify the code and inviter, it updates per-server statistics by inviter and code; if attribution fails, the join is unknown or is not added to an inviter. It cannot reconstruct activity from before tracking began..vanity tracker sync rereads and caches current invitations; the bot needs Manage Server to query invites. It does not import historical joins. announce off only stops tracker welcome messages: statistics can continue to update. If the configured channel is unavailable, the runtime may fall back to the general Logs channel.
Configure and inspect the tracker
Configure and inspect the tracker
- View status — Command:
.vanity tracker· Note: Shows destination, format, and a statistics summary. - Enable / pause — Command:
.vanity tracker on·.vanity tracker off· Note:onalso enables the Vanity module;offdoes not disable Link Guard. - Choose a channel — Command:
.vanity tracker channel [#channel]· Note: Without a channel, uses the current channel if it is a text channel. - Announcements — Command:
.vanity tracker announce STATE· Note:STATEacceptsonoroff; disables only posting, not attribution. - Format — Command:
.vanity tracker format FORMAT· Note:FORMATacceptsembedortextand selects the join message format. - Template — Command:
.vanity tracker template [text]· Note: Variables:{member},{member_name},{inviter},{inviter_name},{invite},{joins}, and{server}. Template is limited to 450 characters. - Synchronize — Command:
.vanity tracker sync· Note: Requires the bot to haveManage Serverto read current invitations. - Statistics — Command:
.vanity tracker stats [@member]· Note: Without a member, shows up to 10 inviters; with a member, shows joins and up to eight codes.
.vanity group.Vanity Status reward
This reward watches the custom Discord presence, not messages containing invitations. Control it with.vanity promo status on|off; statuscode <code> and removestatuscode <code> maintain up to 20 codes. Headless can assign up to 20 roles configured with .vanity promo role @Role. The bot needs the privileged Presence intent enabled in the Discord application, a member available in the gateway state, Manage Roles, and a role position high enough to assign the configured roles. .vanity promo statuschannel #channel selects the panel destination; .vanity promo scan checks only members currently cached by the server.
.vanity promo statusremove on|off controls removal when the status code disappears; the delay accepts 0–604,800 seconds. Removal is best effort: if Discord rejects a role removal, the stored assignment can stop reflecting reality while the member still has the role. Periodically verify hierarchy and existing roles.
Note:
.vanity promo on|off controls the status panel/announcements, while .vanity promo status on|off controls the role reward. These are separate toggles. The panel also supports a template, title, ping text (without active mentions), thumbnail, banner, and GIF.
Automatic promotion when a member posts an invite is configured in the
.vanity promo group, but its message callback is not connected in the reviewed runtime. Do not treat it as an active feature. The implemented reward is the Vanity Status reward.Steps
1
Review the current action and permissions
Run
.vanity and verify the bot’s permissions. Do not use quick as a test: it enables both the detector and tracker and may change log to delete.2
Keep exceptions narrow
Allow only the invites, domains/paths, and roles that should be exempt. Test each allowed URL with a server test case.
3
Decide whether to enable the detector
Because the callback attempts message deletion even in
log mode, enable it only when that behavior is approved. Select an explicit action and monitor Logs.4
Configure the tracker or reward separately
Synchronize invites for the tracker. For status rewards, enable Presence intent, validate role hierarchy, and configure roles and status channel separately.
