Keep your repo
🤬 Potty Mouth
free.
A drop-in GitHub Action that scans issues, pull requests, and comments for profane content — then replaces it with the strategy of your choice. Built with .NET Native AOT for instant, dependency-free runs.
MIT licensed · No registration · Works with the built-in GITHUB_TOKEN
# .github/workflows/profanity-filter.yml
name: Profanity filter
on:
issues:
types: [opened, edited, reopened]
pull_request:
types: [opened, edited, reopened]
issue_comment:
types: [created, edited]
permissions:
issues: write
pull-requests: write
jobs:
apply-filter:
runs-on: ubuntu-latest
steps:
- name: Scan for profanity
if: github.actor != 'dependabot[bot]'
uses: IEvangelist/profanity-filter@main
with:
token: ${{ secrets.GITHUB_TOKEN }}
replacement-strategy: emoji Not every contributor is sunshine and rainbows.
Open source is a public-facing space, and the tone of a project sets the tone of its community. Potty Mouth quietly catches the rough edges — rewriting profane content, flagging the issue, and leaving a clean audit trail behind — so you can keep building without playing comment-thread cop.
With this action in your workflow, your repo can be 🌈 and 🐎.
Everything you need. Nothing you don't.
One step in your workflow, fourteen strategies, nine languages, and a clean job summary on every run.
9 languages, 4,900+ words
Curated word lists across English, Spanish, French, German, Italian, Portuguese, Russian, Arabic, and Chinese — kept up to date in plain text files anyone can audit.
14 replacement strategies
Pick the vibe — from classic **** asterisks to playful 😡 anger emojis or full ████ redactions.
Native AOT performance
Built with .NET 10 and Native AOT — instant cold starts, tiny binaries, and no .NET runtime to install on the runner.
Drop-in step
A single GitHub Action step. Add it to a new workflow or paste it into an existing one — no scripts, no infrastructure, no maintenance.
Workflow job summaries
Every run produces a clean, detailed summary table showing exactly what was found and how it was replaced — perfect for audits.
Bring your own words
Extend the dictionary with a comma-separated list or pull from your own URL. Works alongside the built-in filters automatically.
14 ways to say that word.
Pick the strategy that fits your project's tone — from buttoned-up to playful.
asterisk **** Classic asterisks — the safe default.
emoji 💩 A random expressive emoji per match.
grawlix #%$! Comic-book style symbol soup.
bold-grawlix #%$! Grawlix, but louder.
bleep bleep Replaces with the literal word "bleep".
redacted-rectangle ████ Top-secret redaction blocks.
anger-emoji 😡 A random anger-themed emoji.
middle-asterisk f**k Keeps first and last letters intact.
middle-swear-emoji f🤬k A swear emoji in the middle.
random-asterisk * — **** Random number of asterisks.
first-letter-then-asterisk f*** Keep the first letter only.
vowel-asterisk sh*t Replaces only the vowels.
strike-through Wraps content in <del> tags.
underscores ____ Replaces with underscores.
More than a GitHub Action.
The same engine ships as a containerized Aspire resource. Drop
AddProfanityFilter
into your AppHost — in C# or TypeScript — and you have a fast, local-first
HTTP filter alongside the rest of your services.
// apphost.cs
var builder = DistributedApplication.CreateBuilder(args);
var filter = builder.AddProfanityFilter("profanity-filter")
.WithCustomDataBindMount("./CustomData");
builder.AddProject<Projects.MyApi>("api")
.WithReference(filter)
.WaitFor(filter);
builder.Build().Run(); Ready to clean up your repo?
Two minutes from this page to a working workflow. No registration, no infrastructure, no excuses.