Pardon

Pardon is a profanity filter for the creative ways people spell things when they know there’s a filter.

Replacing letters with numbers, putting dots between them, or using characters from another alphabet can make a word look different to a filter while everyone reading it knows exactly what it says. Pardon checks for those variations, including Unicode characters that look almost identical to ordinary letters. It also detects profanity joined onto other words.

For example, sh1t, f.u.c.k, and a word with an invisible character inserted into it can still be detected. Behind that are several checks that handle different ways of disguising text. An allowlist helps prevent those broader checks from catching ordinary words such as “cocktail” or “classroom”.

We’ve gathered over 500,000 messages from real servers and run them through a script, then checked the results for mistakes. That lets us find normal words the filter catches and cases it misses. Real chat has typos, slang, and combinations of words you wouldn’t think to write as test cases yourself.

A lot of the work is in those details. Making a check catch more variations is easy enough. Making it do that without catching normal conversations takes a lot more checking.

Update, 9 October 2026

With Jev and OpenAI’s Decisions API, we’re now looking at whether we still need a custom filter at all. Both offer AI-based decisions that we could use to check messages.

We’re running experiments to see how they compare on real server chat, especially across hundreds of thousands of messages. We want to know how well they perform, and what it would cost to use them at that volume.

Speed is another question. Pardon’s detection itself takes about 2 to 5 ms, but we currently expose it through an API. A request can take around 30 ms just to reach our servers. That makes the time it takes to get a result back more useful to compare than detection speed alone. We’re checking whether either alternative adds enough delay to matter in practice.

We’re also not sure how well either handles the awkward cases Pardon was built for. Our hunch is that OpenAI’s Decisions API could handle more of them, and we’re less sure about Jev. That’s something the experiments need to answer, though. We don’t have enough results yet to call either a replacement.