Open source on GitHub

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 yaml
# .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
4,900+
Curated words
across the dictionary
9
Languages
globally inclusive
14
Replacement strategies
for every taste
Native AOT
.NET 10 powered
instant cold starts
Why bother?

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 🐎.

What's inside

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.

Replacement strategies

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 shit

Wraps content in <del> tags.

underscores ____

Replaces with underscores.

Also for Aspire

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.