She runs the server.
You just live in it.

A self-hosted Discord bot in Go that schedules message purges, hands out timed tasks, relays anonymous confessions and gates who may contact whom — then tells you off about it.

Go, one binary MIT licensed 58 commands Self-hosted only
Server Domme Punishment is a role assignment. Don't romanticise it.
Server Domme's avatar: a cartoon woman in glasses and a corset, holding a clipboard in one hand and a riding crop in the other

the job

Four jobs, and only one of them is a bit.

Most of what she does is unglamorous server maintenance. The roleplay sits on top of it, in its own command groups, switchable off in one line.

Cleanup

Purge a channel now, or set it to purge anything older than a threshold on a schedule. Jobs are listed, and stoppable, per channel.

Roleplay

Timed tasks with reminders and a safeword, a brat role that can be handed out and taken back, anonymous confessions, and consent-gated contact requests.

Administration

Every feature reads its channels, roles and lists from per-server settings. Whole command groups can be enabled or disabled without redeploying.

Utilities

A URL shortener with its own redirect server, dice with real formula parsing, flag-emoji translation, and announcements posted on the bot's behalf.

the register

Not every command
is yours to run.

Pick a rank. The register stays whole — but everything above your station locks, and she explains why.

58 permitted acts

Who are you on this server? the number is how many of the 58 you may run

open anyone in the server role needs a configured role admin Administrator only

bedside manner

She never says it the same way twice.

Task outcomes and punishments draw from written line pools rather than a single template, so a channel that runs the same command all evening does not read like a log file.

Every line below is verbatim from the source. Shuffle as long as you like — there are well over a hundred more where these came from.

Server Domme BOT Today at 23:14

house rules

A bot with this theme
needs visible brakes.

The persona is a joke. The permission model is not. Here is every place the bot deliberately refuses to do what it is told.

01

The safeword ends it

A pending task can be closed with a safeword instead of a result. No cooldown penalty framing, no argument — the task is cancelled and she says so.

“Consent above all, darling.”

02

Contact is asked for, not taken

/ask posts a request the other person answers themselves. Nothing is stored: the posted message is the record, and either party can end the conversation afterwards.

03

Protected users

PROTECTED_USERS lists people who can never be punished or handed a task. The check guards the target, not the caller — so being protected does not quietly make you powerless.

04

Punishment is a role, and it is reversible

Only the configured Punisher role may run /discipline, only holders of the Victim role can be its target, and release undoes it. Nothing is deleted, nobody is kicked.

05

Cooldowns, not spam

Finishing or failing a task starts a per-user cooldown the admin sets. One task at a time; a second /task is refused while one is pending.

06

Any group can be switched off

/settings commands disable takes a whole group out of service for that server. Disable discipline, task, confess and ask, and what is left is a maintenance bot.

07

Deletion asks twice

Purges need the Administrator permission and the literal word yes typed into a confirm field. They only ever touch the channel they were run in.

08

Your data stays yours

There is no hosted instance to invite. You run the binary, you hold the token, and /maintenance export-data hands the whole per-server database back as JSON.

09

Anonymous means anonymous

A confession is posted without its author, and /confess is the one command excluded from the audit log — so /settings commands log cannot show that you ran it either. Not even the server owner can line up a timestamp against a name.

The opt-out is declared on the command itself and covered by a test, so a future middleware cannot quietly start recording it.

self-host

One binary, one token,
one machine.

There is no public instance, and that is on purpose. This bot reads messages, deletes them, and assigns roles — you should not have to trust a stranger's process with that.

Build it

Go 1.22 or newer. No system dependencies, no database server.

# clone, then go build -o server-domme ./cmd/discord

Give her a token

Copy .env.example to .env and fill in the two required fields. Everything else has a default.

DISCORD_TOKEN=your-bot-token TASKS_PATH=./data/default_task.list.json INIT_SLASH_COMMANDS=true # optional: nobody in this list can be punished or tasked PROTECTED_USERS=your-user-id

Invite her with the right permissions

She needs to read history to purge it, and manage roles to hand out the brat role. Nothing beyond that.

View ChannelSend MessagesManage Messages Manage RolesEmbed LinksAttach Files Read Message HistoryUse Application Commands

Tell her where things live

Nothing roleplay-related works until its channels and roles are set. Run these once, in the server, as an administrator.

/settings confess channel-set #confessions /settings discipline roles-set punisher @Domme /settings discipline roles-set victim @Member /settings discipline roles-set assigned @Brat /settings task role-set @Tasker # and turn off anything you would rather not host /settings commands disable discipline

questions

Asked before you ask.

Is there a public instance I can invite?

No, and that is deliberate. The bot reads and deletes messages, assigns roles, and stores per-server configuration. Handing that to someone else's process is a trust decision you should not have to make. Build the binary, add your own token, and the data never leaves your machine.

Do I have to use the roleplay features?

No. Every command belongs to a group, and any group can be switched off per server with /settings commands disable. Turn off discipline, task, confess and ask, and what remains is a purge scheduler, a URL shortener, a translation reaction and an announcement relay.

Can she delete messages she should not?

Purging is limited to the channel the command was run in, requires the Administrator permission, and requires typing the word yes into a confirm field. Scheduled jobs are listed by /purge jobs and stopped by /purge stop, so a job you forgot about is never invisible.

What does the bot store?

Per-server settings, shortened links, active purge jobs, task state and cooldowns, and a recent command log — every command except /confess, which is deliberately excluded so nothing records who confessed. It lives in a local datastore directory with a write-ahead log and snapshots, one process at a time. /maintenance export-data hands you the whole thing as JSON.

Can one instance serve several Discord servers?

Yes. Settings, roles, channels, tasks and purge jobs are all keyed per guild, so servers never see each other's configuration. One process handles them all; the limit is the machine you run it on.

Where do the tasks come from?

A JSON list you upload with /settings task tasks-upload. Each task carries a description, a duration in minutes, and optionally a list of role names allowed to receive it — so the same server can hand different tasks to different roles. tasks-download gives the current list back, tasks-reset restores the defaults.

I want a command that isn't here. What do I do?

Say so in the Ctrl+Z Discord server — that is where this bot actually runs, and where a request gets argued about before anyone writes code. If you would rather it be tracked, open an issue on GitHub instead.

If you write Go, the bar is low by design: a command is one type with a handful of methods — Name, Description, Group, Category, UserPermissions and Run — plus a slash definition, and one cmdadapter.Register line in main.go. Permissions, group toggles and audit logging come from middleware you do not have to think about.

Your server could use a firm hand.

Clone it, build it, point it at your own token. She will take it from there.

That is where she lives, where feature requests get argued about, and where you can watch her misbehave before hosting her yourself.