How we reviewed this: we installed it in Docker on Python 3.12, ran its tests offline, and injected upstream failures against a local stand-in. We did not connect it to Discord.
What it does
Jev Moderation Bot, by brainstormity, screens every message in a Discord server. One request per message carries a Choice (legitimate / spam / scam link) and a Noul asking whether this is an outright malicious scam. Code turns that into tiers using thresholds you can set per server, and then owns everything that follows: delete, warn by DM, time out on a ladder (10 minutes on the third offence, an hour after), and a ban button an administrator must press. Jev never bans anyone.
There is also a /profile command that pulls a user’s recent history into one request with seven questions.
Its 54 tests pass offline.
Three things to know
It fails open, quietly. Any exception in the moderation path is logged and the message is allowed. That is a reasonable default for a chat bot — the alternative is deleting everything during an outage — but the README doesn’t mention it, so a dead key looks exactly like a quiet week.
A failed call becomes four requests. The client tries the SDK, whose own retries make three attempts, catches every exception with a bare except Exception: pass, and then falls through to a raw HTTP call. Under rate limiting that is the opposite of backing off, and the error the bot sees is a generic HTTP error rather than “your key is wrong”.
Nothing is ever deleted. Every message in the server is stored in SQLite to provide context for later judgments, offences keep the full message text and the state that was sent, and the prune_old_messages function — which takes a 30-day parameter — has no caller anywhere in the code.
One more, for accuracy: the thresholds are applied to the answer’s confidence, which is a measure of how peaked the distribution is, not the probability that the message is spam. The probabilities are in the response and unused. At a 0.95 setting, a message Jev calls spam with a spread-out distribution passes.
What it sends
Per message: the author’s Discord ID, account age, whether it contains an external link, the channel name and ID, and the full message text, untruncated — plus up to five recent messages other people posted that a moderator pardoned. /profile sends far more: username, join and creation dates, every role, and up to a hundred recent messages.
The key comes from the environment and only ever appears in an Authorization header.
Verdict
The structure is right — a classifier that only classifies, a ladder that only code can climb, and thresholds a server owner can tune. For a nine-commit project it is unusually complete, and the tests are real.
Before you put it in a server: know that an outage means no moderation at all, that your members’ messages accumulate indefinitely in a local database, and that there is no licence file to tell you what you may do with the code.
For guardrails on coding agents rather than chat, see pi-warden.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 20, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.