Two benchmarks, and both count the false alarms. One is open for anyone to run against their own filter. The other puts Unprofane beside the Perspective API, OpenAI moderation and the npm filters on the same judged texts.
Real text in 17 languages, labelled blind by AI judges. Every system answers the same texts, and each is also read at the same false-alarm rate.
89.0%
toxic text caught by Unprofane, flagging 7.0% of clean text
58.4%
Perspective at the same rate
40.8%
OpenAI moderation at the same rate
The private test set, 9,029 texts, read once on 2026-09-28
See the resultsDisguised spellings by technique, and innocent words that contain a profane string. Download the public split and run it on any filter.
0.918
F1, Unprofane's rules alone
0.0%
false positives on innocent words and names
The public split, 15,530 items, run of 2026-10-12
See the results| Head to head | The Scunthorpe Test | |
|---|---|---|
| The question | Which filter catches more abuse in real text without flagging more clean text? | Can a filter be fooled by a disguised spelling, and does it block Scunthorpe? |
| The texts | Comments, chat and usernames from open datasets, and disguised spellings, labelled blind by AI judges | Generated from graded seeds: each disguise made by one named technique, and innocent words bare and in sentences |
| What runs | Unprofane with its model, the Perspective API, OpenAI moderation and the npm filters | Unprofane in each mode, the models alone and the npm filters |
| Who can run it | Us: the texts are third-party and not ours to republish | Anyone: the split, the runner and the method are on GitHub |