anvilyx.

Moderation that keeps a record you can point at.

A Discord server-management bot with a web console. Warnings, timeouts, kicks and bans write numbered cases scoped to your server. Auto-moderation reads the same ledger a human writes to, so the fourth offence today counts as the fourth. Configured from a browser or from the command line.

Everything is off when you install it. All ten feature modules default to off, so a freshly invited bot does nothing until you turn something on. Worth knowing before you install: this is not a bot that starts acting the moment it joins.

What it does · What it will not do

Does

Moderation on one ledger

Warn, timeout, kick, ban, unban, untimeout and note each write a numbered case. Numbers are never reused, so “case 42” stays a reference a member can appeal against.

Automatic and human actions write to the same ledger — a warning issued this morning counts toward the escalation this afternoon. A case records whether a rule fired or a person acted and refuses to blur the two. Notes and reversals are recorded but do not count as strikes, so nobody is escalated for being forgiven.

Auto-moderation that remembers

Discord’s own rules run server-side and cost nothing per message. On top of that a client-side engine exists for one reason: Discord blocks a message but never notices it is the member’s fourth today. The ledger drives an escalation ladder with per-role ceilings, exempt roles and channels, and a strike-expiry window.

When the engine acts it deletes the message and, by default, keeps the first 400 characters of it on the case — often the only copy left anywhere. It is kept so the record a member appeals against does not describe evidence that no longer exists. Switchable off per server. How that data is handled →

A door guard for raids

Screens arriving accounts on signals already in the join event, with no extra API call — because a raid is exactly when the rate limit is worst. Account age, default avatar, machine-shaped usernames, unverified apps, members wearing another server’s tag. Match any or all, with an exempt list.

For cleanup after one gets through, sweep:preview and sweep:act share a selection, so the list you read is the list that gets acted on.

Roles that survive a restart

Self-assign panels of buttons and select menus. Temporary roles whose expiry is an absolute timestamp swept by a background job, so a restart cannot lose a pending revocation. Sticky roles hand a returning member back what they left with. roles:sync back-fills across an existing membership, writes its progress down, and resumes where it stopped.

Every grant passes one privilege-escalation guard, re-checked against Discord rather than trusted from a session.

Onboarding, feeds and the rest

Welcome cards with alternate wordings, a hold-before-posting delay and an auto-delete-after. A click-to-verify gate that is a button rather than a reaction — idempotent, answered privately, and it survives a rejoin.

Feeds poll releases and any RSS or Atom URL; channel feeds resolve from a handle, a video URL or an id, with no API key. Signed inbound webhooks deduplicate and deliver durably with bounded retry and rotatable secrets. Experience per message on a cooldown, so rank measures presence rather than volume. Custom answers published as real guild slash commands.

Will not

Stated plainly, so you do not install it expecting these.

Recover a deleted message

Deletion logging records that a deletion happened and where. Discord does not send the content with the event, and caching every message to recover it is a deliberate non-goal. Bulk purges log a count only.

Put everything in the console

The console is a configuration surface. Discord-native rules, slowmode, lockdown and unlock, channel create, delete and sort, role create and delete, permission overwrites and message sweeps are command-line only. Every console action is also available from the command line; the containment runs that way round, not the other.

Show you who changed what

A server-side action trail is written, but nothing in the console or the command line reads it back. The logging you configure is a different thing: a mirror of Discord events into a channel you choose.

Do reaction roles

Panels are buttons and select menus. There are no emoji reactions anywhere, and the reactions intent is never requested.

Give you many slash commands

/help, /list, /config and /permissions always; your own answers when that module is on; right-click menus for warn, mute, kick, ban, view cases and purge when moderation is on. There is no /ban, /kick, /warn or /timeout — moderation here is a right-click and a modal.

Exist yet, in several areas

Not built: tickets, giveaways, starboards, music, polls, reminders, scheduled or recurring messages. No custom-branded bot on your own token — per-server identity is nickname, avatar, banner and bio only. No sharding.

Cover two known gaps

Sticky roles are recorded from the live role cache, so a member who leaves while the bot is down comes back stripped. Onboarding messages fail for any member who has direct messages from server members turned off, which is a common default; the failure is counted and onboarding continues.

Things it does differently

Backups restore settings without rewinding history

A snapshot deliberately excludes twenty named record fields — cases and their numbering, experience, who passed verification, sticky-role memory, running temporary grants, queued work, current boosters, what a lockdown is holding shut, filed reports. Restoring puts your patterns back without un-warning anybody. Twelve snapshots are kept per server.

The console cannot silently overwrite a co-admin

Every configuration write carries the version it read; without one the server answers 428 and hands back the current version, and a stale version answers 409 rather than clobbering. Every create additionally carries an idempotency key; a replay returns the original response rather than acting twice.

Console access that is not a Discord permission

Name roles or individuals who may configure the bot without handing them Manage Server, which also carries renaming the server and reading its invites. Only Discord’s own managers may name delegates, and being named grants nothing on Discord — a named manager who asks the bot to ban is still refused unless they could have banned anyway. Re-checked every time a server is opened, and while a live console stream is open.

It asks Discord only for what your settings need

Intents are computed from what is switched on, re-checked every ten seconds, and the connection restarts when the set changes — so flipping a setting takes effect immediately rather than at the next restart. The privileged message content intent is requested only when content filtering is on somewhere.

What it asks for

Exactly this, and nothing beyond it.
Sign-in scopes identify and guilds. Not email.
Bot permissions Manage Channels, Manage Roles, Manage Messages, Manage Server, View Channel, Send Messages, Send Messages in Threads, Embed Links, Read Message History, Kick Members, Ban Members, Moderate Members. Not Administrator.
Message content Requested only when content filtering is switched on somewhere. Experience and sticky messages never drag it in.
Stored about a member Their identifier, and — when auto-moderation acts and the server has left that on — up to 400 characters of the message it removed. The full account →

Where this is

anvilyx is written and run by one person. It is live in two Discord servers, both used for its own development.

It has not launched, there is no paid tier, and nothing about it is monetised today. If you install it, you are early. The status page is the honest view of whether it is running.