1.0.0 • Public • Published

    Profanity List

    This repository contains highly consumable lists of words and/or phrases that may be considered profane or inappropriate. The profanity lists come in two forms: JSON format that contains the words and phrases with associated meta information and a plain text format that contains one word or phrase per line.

    Please note that most entries in the JSON lists have started their life with a Severity Level of 3 (Strong) prior to any solid classification - this is not necessarily an accurate reflection of the common severity level of any of these words or phrases. Contributions are more than welcome to adjust these levels to bring them more in line with what you may expect.


    Name Code JSON Plain Text Meta
    English en en.json en.txt 434 profanities, 809 matches, 6 tags
    Emoji emoji emoji.json emoji.txt 7 profanities, 18 matches, 2 tags

    Available Tags

    Name Code Tags
    English en general
    Emoji emoji general

    JSON Format

    The JSON format has a top level array containing objects with the following structure:

    Property Required? Description
    id Y String in lowercase characters used as a unique ID for the profanity.
    match Y String in lowercase characters. Asterisks (*) can be used to indicate the previous character can have one or more appearances. Pipes (|) can be used as a separator if matching multiple terms under this profanity.
    severity Y Integer from 1 to 4 corresponding to a supported Severity Level.
    tags N An array of lowercase strings to indicate how this profanity is tagged. These should be in English.
    allow_partial N Boolean value. Whether or not this profanity should be used with partial matching. Explicitly set to false when the match may otherwise have hundreds or thousands of exceptions.
    Implementations should default to true if no attribute is present. (ie. the profanity can be used in partial matching)
    exceptions N An array of lowercase strings indicating exceptions to this profanity if using partial matching. An asterisk (*) is used as a placeholder for the matched word.
    Example: sp* would be a valid exception ('sparse') for the profanity arse if relying on partial matching._

    Severity Levels

    Value Severity
    1 Mild
    2 Medium
    3 Strong
    4 Severe

    Example Data Structure

        "id": "plain-text",
        "match": "plain text",
        "severity": 1,
        "tags": ["insults", "anti-computer"],
        "exceptions": ["unusually *", "very *"]
        "id": "multiple-matches",
        "match": "multiple|multipal",
        "severity": 2,
        "tags": ["functionality"]
        "id": "elongated-words",
        "match": "lo*ng",
        "severity": 3,
        "tags": ["long-words"],
        "exceptions": ["*ing"]
        "id": "exact-match-only",
        "match": "en",
        "severity": 1,
        "tags": ["exact-words"],
        "partial_match": "false"

    Example Matching

    Profanity ID Sentence Should Match? Comment
    plain-text I like plain text! Y Exact match
    plain-text I generally do plain texting. Y Partial match
    plain-text Unusually plain text is weird... N Part of an exception
    plain-text You have very plain text. N Part of an exception
    plain-text Plain old sentence with text N Not found at all
    multiple-matches There are multiple ways to match. Y Exact match on first match option
    multiple-matches I can spell multipal just fine, thx. Y Exact match on second match option
    multiple-matches I'm using the word many instead... N Not found at all
    elongated-words This is a long word. Y Exact match
    elongated-words Such a looooong wait! Y Match on repeating 'o'
    elongated-words I am longing for some food N Part of an exception
    elongated-words Short words are the best! N Not found at all
    exact-match-only The language of this is en Y Exact match
    exact-match-only Ensure I send a pencil to the agency. N Partial matching disallowed/discouraged

    Plain Text Format

    The plain text format contains one word or phrase per line and does not include any meta information on the matching such as asterisks to indicate one or more characters matched.

    Example Data Structure

    plain text

    Node Modules

    List / Data Package

    This package is available as an NPM package for use in JS projects.

    NPM installation:

    npm install @dsojevic/profanity-list

    Yarn installation:

    yarn add @dsojevic/profanity-list


    Contributions to the profanity lists are welcome. As profanities are subjective by nature, please use your best judgement when it comes to adding to or updating these lists.

    The source of truth for these lists is located in the JSON files in the src directory. The top level language files should be built from these source files using the ./bin/build.js command.

    Adding Profanities

    Adding new profanities to the lists and adding new lists for other languages are both highly encouraged. Please

    Removing Profanities

    Removal of items is discouraged - if you feel strongly that an item isn't profane or doesn't belong, it is preferred that you instead adjust the severity level of the item and/or update the tags associated with it. This allows consumers of the JSON formats to make those decisions for themselves.

    Managing Tags

    It is preferred that the number of tags used overall is kept relatively small in this data set so as to not overwhelm the choices required by a consumer. Please open an issue to propose any new tags so it can be made open for discussion.

    Tag usage should be kept consistent from language to language. Some cases may warrant a language (or set of languages) having a small number of tags that are only applicable to them, though this should only be for exceptional circumstances.

    Severity Levels

    As noted in the introduction, the default severity level for items in this list is 3 (Strong) as a starting point. Contributions that adjust these to levels that better reflect their severity are more than welcome. For example, if you believe an item is only mildly offensive to the common person, it can be downgraded to 1 (Mild) -- conversely, if you think it is even more offensive it can be upgraded to 4 (Severe).

    Copyright (c) 2021 David Sojevic


    npm i @dsojevic/profanity-list

    DownloadsWeekly Downloads






    Unpacked Size

    85 kB

    Total Files


    Last publish


    • dsojevic