Skip to main content

safetype (Python)

Rule-based content moderation for Python servers: profanity, hate speech and harassment. It's the same engine and dictionaries as the SafeType.js JavaScript packages, so your backend can re-check exactly what the browser checked. It has no dependencies and runs fully offline.

pip install safetype
from safetype import create_moderation_engine

engine = create_moderation_engine(mode="mask")
engine.moderate("What the fuck are you doing?").text
# 'What the f*ck are you doing?'

Server-side enforcement

Client-side moderation can be bypassed (devtools, curl, modified clients). Re-check before you store:

engine = create_moderation_engine(
    mode="mask",
    policy={"hate": {"action": "block"}, "harassment": {"action": "block"}},
)

check = engine.validate(comment)
if not check.valid:
    raise ValidationError([v.category for v in check.violations])
store(check.result.text)                      # profanity masked
if check.result.requires_review:
    queue_for_human_review(comment)           # e.g. quoted or reported speech

FastAPI:

@app.post("/comments")
def create_comment(body: CommentIn):
    check = engine.validate(body.text)
    if not check.valid:
        raise HTTPException(422, detail=[{"category": v.category, "rule": v.rule_id} for v in check.violations])
    return save(check.result.text)

Django form:

def clean_body(self):
    check = engine.validate(self.cleaned_data["body"])
    if not check.valid:
        raise forms.ValidationError("Please keep it respectful.")
    return check.result.text

What it handles

  • Five actions (allow, mask, suggest, warn, block) and per-category policies
  • Profanity is masked deterministically. Hate and harassment rules are lower-confidence signals that context can weaken: quoted or reported speech becomes requires_review instead of being acted on
  • Unicode (accents, full-width, Cyrillic/Greek lookalikes, zero-width), leet (sh1t), repeated letters, spaced letters
  • No Scunthorpe problem, and masking is idempotent
  • English and Hinglish (romanized Hindi: "bhenchod", "chutiya", "teri maa ka...") out of the box; languages=["en"] turns Hinglish off
  • Spanish, French, German, Portuguese and Hindi (Devanagari), opt-in: languages=["en", "es"], language="pt-BR", or language="hi" (both Hindi scripts)
  • Custom words, custom rules, allow lists, mask styles (vowels, partial, full, or a function)

API

engine = create_moderation_engine(
    mode="mask", language="en", languages=None, categories=None, policy=None, packs=None,
    custom_words=None, allow_list=None, rules=None,
    mask_char="*", mask_style="vowels", detect_spaced_letters=True,
)
engine.moderate(text)   # ModerationResult(text, suggested_text, matches, action, allowed, requires_review, mapping)
engine.mask(text)       # str
engine.validate(text)   # ValidationResult(valid, result, violations)
engine.add_rule({"id": "app.x", "pattern": "(foo|bar*)", "category": "custom"})
engine.remove_rule("app.x")
engine.set_policy({"harassment": {"action": "block", "min_confidence": 0.7}})
engine.set_mode("warn")

safetype.moderate(text); safetype.mask(text)   # shared default engine

Offsets (match.start / match.end) are Python string indices (code points).

Parity with JavaScript

The test suite replays 684 cases recorded from the JavaScript engine and requires identical results. The dictionary is exported from the JavaScript build, so both always share the same rules.

Limitations

Rule-based detection misses novel spellings and sarcasm, and it can flag reclaimed or quoted language. Treat hate and harassment results as signals for review, not verdicts. Contextual (AI) classifiers are available in the JavaScript engine and planned for Python.

MIT licensed.

Metadata

Release files for safetype 1.11.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for safetype 1.11.0
File Size Uploaded
safetype-1.11.0.tar.gz 122.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for safetype 1.11.0
File Interpreter ABI Platform
safetype-1.11.0-py3-none-any.whl Python 3 none any Details

Total release size: 151.4 kB

Release files / safetype-1.11.0.tar.gz

Download URL safetype-1.11.0.tar.gz
Size 122.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f4fa6ebf36d4d8c1053f8a2599c7544119e4ef9e534cdc861c5e1337b8c346c1
BLAKE2b-256 checksum
How to use checksums
4428390e916c09280e81100ee189742b29a6906c829f568dfe5883544f9fe9f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / safetype-1.11.0-py3-none-any.whl

Download URL safetype-1.11.0-py3-none-any.whl
Size 28.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8bb04270b555496979b4f1f7c35e2d6797e60526e02808770af698bdd2b8d0f6
BLAKE2b-256 checksum
How to use checksums
18e51ff01cdcbffa59ce891eea16b30d29e15b0ff375fb92e3ef3e884208fda2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.11.0 This release

2 release files

1.10.0

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.1

2 release files

1.5.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page