Privacy

You are about to let a bot read every message in your server. This page says what it does with them. The three answers most people actually want are first; everything under them is the detail, for the member who asks and for the regulator.

Privacy notice for the hosted jevmod bot for Discord and for this site, effective 2026-09-19. Each statement about the code points to the line it comes from; the list is in CLAIMS.md and the code is on GitHub. Where something is not settled yet this page says so, marked "still missing", instead of pretending.

Jump to a section (20)

The short answers

Will it delete my members' messages?

Not unless you turn that on. Every category starts at flag, which reports the message in your log channel and does nothing to it; the bot deletes or times out only for a category or rule you set to delete or timeout yourself.

With everything turned on, the worst it can do is delete a message and time a member out for 10 minutes. It has no code path that bans anyone: the only actions it knows are off, flag, delete and timeout.

Who can see what my members wrote?

For each message it judges, the bot sends the message text and the topic of the channel to Jev, the model run by TypeSafe. It does not send the author's name, the author's id or the server's name.

Then it forgets the text. The decision record has a text column, but the hosted bot runs with JEVMOD_KEEP_TEXT_CHARS set to 0, so that column is always empty. What is left in the operator's database is ids, categories and probabilities, and that is also all the operator can read.

The readable copy is the one inside your own server: the flag the bot posts goes to a log channel created with the everyone role unable to read it. Your moderators can read it, Discord holds it, and you can delete it.

How do I get rid of it?

Decision records are kept for 30 days and then deleted, whether you ask or not.

To not wait, /mod forget deletes everything stored about your server now, and kicking the bot out does the same thing. /mod forget_user does it for one member.

Deleting your data does not cancel your subscription. /mod forget deletes the subscription row in jevmod's database and never calls Stripe, so a subscription that is still live in Stripe keeps being charged. Cancel in Stripe first, then delete.

The rest of this page: who is responsible, what goes to the model, what is stored, what stays in your Discord, your rights and the commands that deliver them, what you owe your own members.

Who is responsible

The hosted bot and the demo on this site are run by one person, not a company.

For this site, for the demo and for anyone who buys Pro, Omar Hernandez is the data controller. There is no data protection officer; the law does not require one for an operation this size, and appointing one would be a claim without substance.

Inside someone else's Discord server the roles change, and this page reads differently depending on which of two people you are.

A server owner who also pays is both.

What the hosted bot sends to the model

The judging request itself is in the short answers: message text and channel topic to TypeSafe, no name, no id, no server name. Messages are numbered by position inside the request and nothing else identifies them. Two more things are true about it.

The author's id is kept only in the bot's own log, so that erasure requests can be honoured.

Messages from members who can manage messages, and from roles you mark as trusted with /mod trust, are never sent to the model at all.

A message a local rule catches, a blocked link, word, pattern or raid hit, is decided by the bot's own code and never reaches the model either. This runs on every plan, including Free, which never sends anything to the model at all.

TypeSafe processes what it receives under its own terms: typesafe.ai. That request leaves the EU; see sending message text to the United States.

What the hosted bot stores

The bot writes a record only when a message crosses one of your thresholds and gets an action (flag, delete or time out).

A message that passes is not written anywhere.

Each stored record holds: the message id, the author id, the first 80 characters of the channel topic, the category, its probability, the action taken, the probability of every category asked, a request id and a timestamp.

The store cuts the message text to the number of characters it is configured to keep before writing it, and with 0, which is what the hosted bot runs, nothing of the text is written. A test in the repository checks that setting.

Per server and per calendar month the bot also counts judged messages, model requests and tokens, for the quota.

Records older than the 30 days above are deleted before every batch is judged.

Your settings (thresholds, actions, rules, trusted roles, channel topics, the id of the log channel) are stored for as long as the bot is in your server.

A message can say something sensitive about the person who wrote it, about their health, their beliefs or their sexuality. The self-harm and hate categories exist precisely to catch that kind of message. The hosted bot keeps none of that text in its own database, but the flag it posts into your log channel does contain the message, and that copy is yours to manage. Read what stays in your Discord before you turn on a category that will collect that.

What stays in your Discord

Every flagged message is posted to a log channel as an embed that contains the first 500 characters of the message text. That embed also mentions the author and the channel.

That embed is a message in your server: Discord holds it, not jevmod. To remove it, delete the message or the log channel like any other content in your server.

When a message is deleted or a member is timed out, the member receives a direct message from the bot with the server name, the channel, the category and the confidence, and a note to contact the server's moderators.

Decisions made without a person looking

When you set a category to delete or time out, the bot acts on a probability without anyone reading the message first. That is an automated decision, and two things limit it.

The effect stays inside one Discord server: a deleted message and a time out of a few minutes. No account is closed, no money moves and nothing follows the person anywhere else.

There is a human at the end of it. The direct message the member receives tells them to contact the server's moderators, and the moderators can undo the time out and change the setting. If you enable deleting or timing out, tell your members that automated moderation is in use and that they can ask a moderator to look again.

Your rights, and the commands that deliver them

Under the GDPR you can ask for access, rectification, erasure, restriction, portability, and you can object. Here is what each one means here and how to actually get it.

The commands that change settings or delete data ask for the Manage Server permission; the ones that only show what the bot did need Manage Messages.

Exactly what /mod forget removes: the server's settings, usage counters, decision records, API keys and subscription row. /mod forget_user @member deletes that member's decision records and replies with how many were removed.

A request sent to the operator gets an answer within a month. There is no charge for it.

Two honest limits. The demo log holds no name and no address, only a hash, so a request about the demo usually cannot be matched to a row; those rows go by themselves after 90 days. And the embed in your log channel is held by Discord in your server, so only the server's own moderators can delete it.

If you run a Discord server

In your server you are the data controller and jevmod is your processor. You decide that your members' messages get judged, which categories are on and what happens when one crosses the line. jevmod only carries that out. Three things follow.

The agreement. The article 28 processing agreement is published at /dpa/. It is written by the operator rather than by a lawyer and is offered as it stands; if your organisation needs its own wording or a signed copy, write and say so.

Why this is allowed

Each thing the bot does rests on a different part of article 6 of the GDPR.

Where legitimate interest is the basis, you can object. See your rights.

Who else receives data

Four companies are involved today, and no others. Each one gets a different slice.

Three more join once sign-in ships, and only for people who use the parts that need them.

better-auth, which runs the sign-in itself, is not one of them: it is a self-hosted library, and the session it keeps and the Discord OAuth token it stores sit in the same database on the same Hetzner machine as everything else jevmod stores, not with a third party.

Not decided yet. Sentry can capture request data, including parts of a request, inside an error's stack trace. The plan does not yet say what gets scrubbed before an error reaches Sentry, so until this page says otherwise, treat an error report as a place your account data could end up.

Discord is not in this list, because Discord is not a recipient of anything jevmod sends. Discord already holds every message in your server, before jevmod sees it. What jevmod posts back into your server, it posts as a message in Discord like any other.

Nothing is sold, and nothing is shared with anyone for advertising.

Sending message text to the United States

The one thing that leaves the EU is the judging request: the text of the messages being judged and the channel topic go to TypeSafe's API.

TypeSafe's own privacy policy says "The Services are hosted in the United States". So the message text is processed in the United States, which is a transfer outside the EU. TypeSafe also states in writing: "We will not train or fine tune any artificial intelligence or machine learning models on your prompts or other Input." That is their commitment, quoted from their terms, not a promise jevmod can keep on their behalf.

Still missing. The operator does not yet have a data processing agreement or standard contractual clauses signed with TypeSafe. Today the transfer happens under TypeSafe's published terms alone. That is the honest position: there is no extra safeguard in place to point at. The operator has to obtain those clauses, and this page will say so when they exist.

If that gap matters to your community, there are two ways around it. Run jevmod yourself with your own TypeSafe key, so the decision is yours and not the operator's. Or do not send the affected channels: mark the roles or channels you care about as trusted so they are never judged.

Once sign-in ships, one more transfer joins this. Resend, which sends the account's email, is a United States company: even when sending is routed through its EU region, the account data itself is stored in the United States. Unlike the gap above, Resend's own data processing addendum is already signed for every account, automatically, and it covers this transfer under Standard Contractual Clauses and the EU-U.S. Data Privacy Framework, so there is a safeguard to point at from the day it is turned on.

Sentry and Crisp do not add a transfer, as planned. Sentry offers a European data region, in Frankfurt, on its free plan; the plan is to select it. Crisp is a French company and keeps its own data inside the EU. Both will be confirmed on this page once they are actually configured, the same way this section will be updated when TypeSafe's own safeguard exists.

Signing in and your account

This section is about the customer, not the server member. None of it exists yet. It describes what becomes true the day sign-in ships, from the plan it is being built against, so this page does not need rewriting the week it matters.

Registering creates an account from one thing: your email address. jevmod sends a link to it and a working link is the whole proof, so there is no password here to store, to leak or to reset.

Connecting Discord to that account is a separate step, and only servers need it. Doing it stores your Discord user id and the list of servers Discord says you administer, refreshed each time you connect. Buying the API and never touching Discord means jevmod never learns you have an account there.

That list is only a shortcut for the dashboard's own server picker. Every time the dashboard reads or changes a server's settings, jevmod re-checks the Manage Server permission against Discord directly, the same check the bot already makes before it answers a slash command; the cached list by itself never grants access to anything.

Deleting the account removes this row and the list of servers with it; nothing in the plan keeps either afterward.

Staff accounts, which means Omar and anyone working with him, sign in the same way and additionally need a passkey on the device. That is a deliberately higher bar than a customer clears: a staff account can read any server's flagged messages.

A server's page also offers to email you: ticking that box stores the address you signed in with against that one server, for the monthly-limit notice and nothing else. Unticking it deletes the row, and so does the server's data being deleted.

Visiting a server's dashboard page also records, against that server, the language its interface was showing you at the time -- so a payment-failed or over-the-limit notice, which a webhook or a scheduled check sends and neither carries a browser to ask, can go out in that language instead of always defaulting to English. A server nobody has ever opened the dashboard for simply gets English; nothing errors for that.

Live since September 2026. Sign-in, the Discord connection and the dashboard are running. This section describes the account as it is, not as it was planned.

Payments

Payments run through Stripe. Card details go to Stripe and never reach jevmod, which stores only the Stripe customer id and subscription id against your server. A copy you run yourself has no billing at all.

Payment for the Pro plan happens on a Stripe Checkout page opened from /mod upgrade. Managing or cancelling the subscription happens in Stripe's billing portal, reached through the same command.

jevmod stores, per server: the Stripe customer id, the subscription id, the price id, the subscription status and the end of the current period.

Stripe notifies jevmod of changes through a webhook; when a subscription is cancelled or stops being active the server goes back to the Free plan.

Card numbers are entered on Stripe's pages. See Stripe's privacy policy. Stripe is also outside the EU for some of its processing, under its own terms; the operator does not control that part. Invoices and the records tax law requires are kept for as long as Spanish law says, which is longer than the 30 days that apply to a decision record.

What you get back if you change your mind, and who answers when you ask, are on the terms page.

The demo on this site

The text you type into the demo is sent to Jev, the model run by TypeSafe, in the same way as a message judged in a server.

The demo on the front page accepts up to 300 characters of text.

Each check is logged by the operator with the text, the category, the probabilities, a hash of your IP address, the country header set by the proxy, and the number of tokens it cost. The IP address is hashed with SHA-256 and a salt before it is stored; the address itself is not kept.

Each address may run 6 checks per minute and 40 per day. The demo also has a monthly spend cap, $0.50 by default, and answers with an error once it is reached.

Demo records are deleted 90 days after they are written; the deletion runs when the demo is used.

The demo does not use the bot's database, and unlike the bot it does keep the text. Do not type anything into it that you would not want kept for 90 days.

Analytics

A self-hosted Umami instance at analytics.hernandezbastos.es counts page views; it does not use cookies.

It runs on the same machine as the rest, so the page view counts do not leave the operator's server.

Self-hosted installs

If you run jevmod yourself, none of the above applies: the database is on your machine and the operator of this site never sees it. You are the controller and, for the judging request, you deal with TypeSafe directly under your own key.

One difference is worth knowing: a self-hosted copy keeps up to 300 characters of each flagged message by default, where the hosted bot keeps none. Set JEVMOD_KEEP_TEXT_CHARS=0 to keep none.

Discord permissions the bot asks for and why

The invite link asks for those seven permissions and no others.

Separately from the permissions above, the bot has Discord's Message Content intent enabled; without it Discord does not deliver message text to bots.

If a permission is missing the bot does nothing to the message, and the log entry says which permission is missing and where to fix it.

Complaining

If you think this is being handled badly, you can complain to a data protection authority. The operator is in Spain, so that is the Agencia Española de Protección de Datos, the AEPD, at aepd.es. You can also complain to the authority of the country you live in. Writing to the operator first is faster, but it is not a condition of complaining.

Changes to this notice

When this notice changes, the date at the top changes with it, and the previous version stays in the repository history. Nothing here is quietly rewritten.

Contact

Privacy requests, including access and erasure: omarhernandezbastos@gmail.com, to Omar Hernandez, in who is responsible.

Everything else, including bugs and questions about the code: github.com/ohernandezdev/jevmod/issues. A GitHub issue is public, so do not put a request that names a person in one.