/faircopy

Rules reference

The default regex rules and optional NLP rules.

On this page

The default rules package provides fast checks for common writing patterns. Enable and configure the rules that fit your project. It also offers an optional NLP pack for semantic checks that need part-of-speech tagging.

Default rules

no-em-dash

Bans the em-dash character (, U+2014).

Example violation:

The product ships this week — we hope.

Fix: split at the break. Use a period, semicolon, or parenthesis.

The product ships this week. We hope.

Em-dashes are a stylistic tell. Sentences with them often hide two shorter sentences that would read more directly on their own.

Options:

rules: {
  'no-em-dash': ['error', {
    flagEnDash: true,         // also flag – (U+2013). Default false.
    flagDoubleHyphen: true,   // also flag --. Default false.
  }],
}

no-weasel-words

Bans reinforcement adverbs that defend a claim instead of making it.

Default words: actually, truly, really, literally.

Example violation:

Our platform is fast.

If you write that sentence and your instinct is to stiffen it with “our platform is really fast”, the real problem is that “fast” on its own reads weak. Delete the adverb; if the sentence now reads unconvincing, rewrite the claim.

Options:

rules: {
  'no-weasel-words': ['error', {
    words: ['actually', 'truly', 'really', 'literally', 'just', 'simply'],
  }],
}

no-rhetorical-scaffolding

Catches two formulaic patterns:

  1. X is Y, not Z constructions.
  2. Without X... With X... sentence pairs.

Both spend a clause denying a straw man or performing a reveal instead of landing the claim. Drop the setup. Keep the claim.

Example violations:

  • “Our platform is a workflow, not a product.”
  • “Without structure, chaos. With structure, clarity.”

Fix: state the claim directly.

  • “Our platform organizes the team’s daily workflow.”
  • “Structure turns chaos into clarity.”

Options:

rules: {
  'no-rhetorical-scaffolding': ['error', {
    allowIsNotConstruction: false,        // disable pattern 1
    allowWithoutWithConstruction: false,  // disable pattern 2
    extraPatterns: ['\\bnot\\s+your\\s+\\w+\\b'], // extra regex patterns
  }],
}

no-non-inclusive-language

Flags non-inclusive terms and suggests neutral alternatives.

Default terms include guys, manpower, whitelist, blacklist, master, slave, crazy, insane, dumb, lame, sanity check, blind spot, grandfathered, and mankind.

Example violations:

  • “Add the IP to the whitelist.”
  • “The master branch handles the slave nodes.”
  • “We need a quick sanity check before shipping.”

Fix: replace the term with one of the suggested alternatives.

  • “Add the IP to the allowlist.”
  • “The main branch handles the worker nodes.”
  • “We need a quick confidence check before shipping.”

Options:

rules: {
  'no-non-inclusive-language': ['error', {
    terms: [
      { term: 'blacklist', alternatives: ['denylist', 'blocklist'] },
      { term: 'whitelist', alternatives: ['allowlist'] },
      { term: 'master', alternatives: ['primary', 'main', 'leader'] },
      { term: 'slave', alternatives: ['secondary', 'replica', 'follower'] },
      { term: 'guys', alternatives: ['everyone', 'team', 'folks'] },
      { term: 'manpower', alternatives: ['workforce', 'staffing', 'personnel'] },
      { term: 'sanity check', alternatives: ['quick check', 'confidence check', 'verification'], exact: true },
      { term: 'dummy', alternatives: ['placeholder', 'sample'] },
    ],
    allowedTerms: ['master'],
  }],
}

Single-word terms are always matched with word boundaries, so master will not flag masterpiece. Multi-word phrases are matched as written by default; set exact: true to require word boundaries around the whole phrase (for example, to flag sanity check but not sanity checker).

no-redundant-phrases

Flags padded phrases that repeat a simpler idea and suggests a tighter alternative.

Default phrases include in order toto, due to the fact thatbecause, at this point in timenow, and in the event thatif.

Example violation:

We added this layer in order to simplify approvals.

Fix: replace the phrase with the shorter alternative.

We added this layer to simplify approvals.

Options:

rules: {
  'no-redundant-phrases': ['warn', {
    phrases: [
      { phrase: 'in order to', suggestion: 'to' },
      { phrase: 'due to the fact that', suggestion: 'because' },
    ],
  }],
}

no-passive-voice

Flags likely passive-voice constructions using auxiliary + past participle patterns.

Example violation:

The rollout was delayed by unclear ownership.

Fix: name the actor when it matters.

Unclear ownership delayed the rollout.

Passive voice often hides who acted and adds drag. The warning is a prompt to inspect the sentence, not a claim that every match is wrong.

Options:

rules: {
  'no-passive-voice': ['warn', {
    auxiliaries: ['is', 'are', 'was', 'were', 'be', 'been', 'being'],
    participles: ['approved', 'delayed', 'written'],
    allowedPhrases: ['is licensed', 'was founded'],
  }],
}

Optional NLP rules

Install the NLP pack when you want semantic checks in addition to the default rules.

npm install -D @faircopy/rules-nlp

These rules use compromise for lightweight POS tagging and browser-safe pattern matching. They are opt-in, so add the NLP ruleset and enable the rules you want in faircopy.config.ts.

no-filter-words

Flags distancing phrases that announce a perspective or pad the sentence instead of landing the claim.

Default phrases: I think, it seems, basically, in order to.

Example violations:

  • “I think this is the fastest way to onboard a team.”
  • “We added this layer in order to simplify approvals.”

Fix: remove the framing phrase and make the claim directly.

  • “This is the fastest way to onboard a team.”
  • “We added this layer to simplify approvals.”

Options:

rules: {
  'no-filter-words': ['error', {
    phrases: ['I think', 'it seems', 'basically', 'in order to', 'sort of'],
  }],
}

no-empty-transformation-claims

Flags broad transformation claims that promise a feeling instead of naming the concrete outcome.

It catches phrases like “transform the way teams work”, “unlock your productivity”, and “take your workflow to the next level”.

Example violations:

  • “Faircopy transforms the way teams work.”
  • “Unlock your productivity.”
  • “Take your workflow to the next level.”

Fix: name the workflow, metric, or customer outcome that changes.

  • “Faircopy flags vague launch copy before review.”
  • “The dashboard shows every blocked approval.”
  • “The workflow cuts status meetings from launch reviews.”

Options:

rules: {
  'no-empty-transformation-claims': ['warn', {
    allowedPhrases: ['transforms the way teams work'],
  }],
}

no-passive-voice

Flags likely passive voice with a copula or auxiliary followed by a past-tense verb.

Default severity is warn.

Example violation:

The rollout was delayed by unclear ownership.

Fix: name the actor when it matters.

Unclear ownership delayed the rollout.

Passive voice often hides who acted and adds drag. The warning is a prompt to inspect the sentence, not a claim that every match is wrong.

Options:

rules: {
  'no-passive-voice': ['warn', {
    allowedAuxiliaries: ['is', 'are', 'was', 'were', 'be', 'been', 'being'],
  }],
}

no-weak-modals

Flags hedged modal claims where a modal verb weakens an outcome claim.

Default modals: can, could, may, might.

Default verbs: boost, drive, enable, help, improve, increase, make, reduce, support, transform, unlock.

Example violation:

The workflow can help teams unlock better launches.

Fix: say what the workflow does, or name the proof behind the claim.

The workflow gives teams a launch checklist for every approval.

Options:

rules: {
  'no-weak-modals': ['warn', {
    modals: ['can', 'could', 'may', 'might'],
    verbs: ['help', 'improve', 'unlock'],
  }],
}

no-stacked-adjectives

Flags noun phrases with multiple adjectives before the noun.

Example violation:

The adaptive intelligent workflow engine keeps projects aligned.

Fix: keep the one descriptor that earns its place, or replace the phrase with concrete evidence.

The workflow engine keeps projects aligned.

Options:

rules: {
  'no-stacked-adjectives': ['warn', {
    allowedPhrases: ['continuous integration server'],
  }],
}

no-nominalized-phrases

Flags nominalized X of Y phrases that hide an action inside a noun.

Default suffixes: tion, sion, ment, ance, ence, ity.

Example violation:

The optimization of onboarding reduced support tickets.

Fix: turn the buried noun back into a verb.

Optimizing onboarding reduced support tickets.

Options:

rules: {
  'no-nominalized-phrases': ['warn', {
    suffixes: ['tion', 'sion', 'ment', 'ance', 'ence', 'ity'],
    allowedWords: ['accessibility', 'reliability', 'security'],
  }],
}

no-expletive-openers

Flags sentence openings that delay the real subject with phrases like “there are” and “there will be”.

Example violation:

There are faster ways to review launch copy.

Fix: start with the actor, product, or benefit.

Faster review starts with specific launch copy checks.

Options:

rules: {
  'no-expletive-openers': ['warn', {
    phrases: ['there is', 'there are', 'there was', 'there were', 'there will be'],
  }],
}

no-redundant-pairs

Flags fixed phrases that repeat the same idea twice.

Default phrases include first and foremost, end result, past history, and future plans.

Example violation:

First and foremost, remove the end result from your future plans.

Fix: keep the stronger word or replace the phrase with a specific claim.

Remove the result from your plan.

Options:

rules: {
  'no-redundant-pairs': ['warn', {
    phrases: ['first and foremost', 'end result', 'future plans'],
  }],
}

no-pronoun-led-claims

Flags vague sentence openers where a pronoun and generic verb carry the claim.

Default pronouns: this, that, it, these, those.

Default verbs: helps, enables, allows, lets, makes, drives, supports, improves, boosts, transforms, unlocks.

Example violation:

This helps teams move faster.

Fix: name the thing that helps and the concrete outcome.

The checklist shows teams which launch approvals are blocked.

Options:

rules: {
  'no-pronoun-led-claims': ['warn', {
    pronouns: ['this', 'that', 'it'],
    verbs: ['helps', 'enables', 'unlocks'],
  }],
}

no-buzzword-stacks

Flags sentences overloaded with abstract benefit nouns instead of concrete product behavior.

Default terms include platform, productivity, collaboration, transformation, innovation, and growth.

Example violation:

Our platform drives productivity, collaboration, and transformation.

Fix: name the workflow or evidence behind the claim.

The review queue shows owners, blockers, and approvals for each launch.

Options:

rules: {
  'no-buzzword-stacks': ['warn', {
    terms: ['platform', 'productivity', 'collaboration', 'transformation'],
    maxTermsPerSentence: 2,
  }],
}

no-hedge-words

Flags hedge words that soften a claim before the copy gives evidence.

Default hedges include kind of, sort of, somewhat, fairly, pretty, arguably, relatively, and more or less.

Example violation:

This is kind of fast, somewhat useful, and more or less ready.

Fix: remove the hedge or replace it with a specific proof point.

The workflow loads in 120ms, covers approvals, and is ready for launch review.

Options:

rules: {
  'no-hedge-words': ['warn', {
    hedges: ['kind of', 'somewhat', 'more or less'],
  }],
}

no-vague-quantifiers

Flags bare quantifiers that make claims hard to evaluate without a number, range, or concrete scope.

Default quantifiers include many, several, various, multiple, some, a number of, a range of, tons of, and lots of.

Example violation:

Many teams see several wins across a range of workflows.

Fix: replace the quantifier with a number or concrete scope.

Twelve launch teams cut review time across onboarding, approvals, and release notes.

Options:

rules: {
  'no-vague-quantifiers': ['warn', {
    quantifiers: ['many', 'several', 'a range of', 'tons of', 'lots of'],
  }],
}

no-meaningless-modifiers

Flags intensifiers that inflate a claim without adding evidence.

Default modifiers include very, really, actually, basically, literally, essentially, truly, definitely, clearly, and obviously.

Example violation:

This is very fast and obviously better.

Fix: delete the modifier or replace it with concrete detail.

The cached workflow loads in 120ms and cuts review steps from six to three.

Options:

rules: {
  'no-meaningless-modifiers': ['warn', {
    modifiers: ['very', 'really', 'clearly', 'obviously'],
  }],
}

no-complex-readability

Flags prose whose Flesch-Kincaid grade level exceeds a target. Landing-page copy should be readable by a broad audience.

Default options:

Example violation:

The implementation of multifaceted computational methodologies necessitates the rigorous examination of numerous interdependent variables.

Fix: break long sentences, replace jargon, and front-load the point.

This approach requires checking many related variables.

Options:

rules: {
  'no-complex-readability': ['warn', {
    maxGradeLevel: 12,  // target Flesch-Kincaid grade level
    minSentences: 3,    // minimum sentences before scoring
    minWords: 30,       // minimum words before scoring
  }],
}

no-vague-comparatives

Flags comparative claims that omit a clear baseline. Words like better, faster, or more efficient only persuade when the reader knows what is being compared.

Example violation:

Our editor is faster. It is also easier to use.

Fix: add a concrete baseline.

Our editor is faster than the old one. It is also easier to use than a spreadsheet.

Options:

rules: {
  'no-vague-comparatives': ['warn', {
    comparatives: ['better', 'worse', 'more', 'less', 'faster', 'slower', 'easier', 'harder', 'stronger', 'weaker', 'higher', 'lower', 'bigger', 'smaller', 'greater'],
    requireThan: true, // set false to flag comparatives even when "than" is present
  }],
}

no-qualifier-creep

Flags stacked qualifiers or intensifiers that dilute a claim.

Example violation:

The result is very really quite good.

Fix: keep the strongest qualifier or replace the phrase with concrete evidence.

The result is excellent.

Options:

rules: {
  'no-qualifier-creep': ['warn', {
    qualifiers: ['very', 'really', 'quite', 'fairly', 'somewhat', 'rather', 'pretty', 'basically', 'actually', 'literally', 'essentially', 'truly', 'definitely', 'clearly', 'obviously', 'absolutely', 'completely', 'totally', 'utterly'],
    maxQualifiers: 1, // maximum qualifiers allowed in a row before the excess are flagged
  }],
}

no-llm-speak

Flags phrases commonly overused by LLMs and suggests concrete alternatives.

Default phrases include delve into, it's important to note, robust, intricate, tapestry, furthermore, moreover, in conclusion, a myriad of, in the ever-evolving landscape, and navigate the complexities of.

Example violation:

It’s important to note that we will delve into the robust, intricate tapestry. Furthermore, the system is crucial.

Fix: replace the padded phrase with a direct verb or concrete noun.

Note that we will explore the strong, detailed pattern. Also, the system is critical.

Options:

rules: {
  'no-llm-speak': ['warn', {
    phrases: [
      { phrase: 'delve into', alternatives: ['explore', 'examine'] },
      { phrase: 'robust', alternatives: ['strong', 'resilient'] },
    ],
    allowedPhrases: ['crucial'],
  }],
}

no-adverb-overuse

Flags passages where -ly adverbs pile up past a threshold. Adverbs can be useful, but too many in one passage weaken claims and add noise.

Default options:

Example violation:

Quickly, quietly, and carefully, she walked slowly into the dark room.

Fix: remove adverbs or replace them with concrete detail.

She slipped into the dark room.

Options:

rules: {
  'no-adverb-overuse': ['warn', {
    maxAdverbs: 3,            // adverbs allowed per passage before reporting
    allowedAdverbs: ['only'], // adverbs to ignore entirely
  }],
}

no-overused-adverbs

Flags individual adverbs that appear excessively across the whole text. Repeating the same adverb weakens copy and suggests a lack of precise verbs or adjectives.

Example violation:

She quickly finished. He quickly left. They quickly agreed. We quickly moved.

Fix: cut the repeated adverb or replace it with stronger, specific language.

She finished. He left. They agreed. We moved.

Options:

rules: {
  'no-overused-adverbs': ['warn', {
    threshold: 3,              // occurrences allowed before later ones are flagged
    minLength: 3,              // minimum adverb length to consider
    allowedAdverbs: ['only', 'not'], // adverbs to ignore entirely
    adverbs: ['quickly'],      // optional: restrict checking to these adverbs
  }],
}

Example config

import { defineConfig } from '@faircopy/config'
import { astro } from '@faircopy/astro'

export default defineConfig({
  files: ['src/**/*.astro'],
  adapters: [astro()],
  rulesets: ['@faircopy/rules-nlp'],
  rules: {
    'no-em-dash': 'error',
    'no-weasel-words': 'error',
    'no-rhetorical-scaffolding': 'error',
    'no-non-inclusive-language': 'error',
    'no-filter-words': 'error',
    'no-empty-transformation-claims': 'warn',
    'no-passive-voice': 'warn',
    'no-weak-modals': 'warn',
    'no-stacked-adjectives': 'warn',
    'no-nominalized-phrases': 'warn',
    'no-expletive-openers': 'warn',
    'no-redundant-pairs': 'warn',
    'no-pronoun-led-claims': 'warn',
    'no-buzzword-stacks': 'warn',
    'no-hedge-words': 'warn',
    'no-vague-quantifiers': 'warn',
    'no-meaningless-modifiers': 'warn',
    'no-adverb-overuse': 'warn',
    'no-overused-adverbs': 'warn',
    'no-complex-readability': 'warn',
    'no-vague-comparatives': 'warn',
    'no-qualifier-creep': 'warn',
    'no-llm-speak': 'warn',
  },
})

Additional rules in 1.20

The following rules are also available in the current packages. Use the package-qualified ID when loading a rule from a specific pack.

no-complex-sentences

Flag individual sentences whose Flesch-Kincaid grade level exceeds a target.

Package: @faircopy/rules-default. Configure as @faircopy/rules-default/no-complex-sentences.

no-cliches

Flag overused or clichéd phrases and suggest fresher alternatives.

Package: @faircopy/rules-default. Configure as @faircopy/rules-default/no-cliches.

no-repetitive-sentence-startings

Flag consecutive sentences that start with the same word.

Package: @faircopy/rules-default. Configure as @faircopy/rules-default/no-repetitive-sentence-startings.

no-filler-words

Ban filler words that pad out a sentence without adding meaning.

Package: @faircopy/rules-default. Configure as @faircopy/rules-default/no-filler-words.

no-absolute-intensifiers

Flag intensifiers before absolute adjectives.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/no-absolute-intensifiers.

no-future-promises

Flag future-tense promises without present evidence.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/no-future-promises.

no-jargon

Flag business jargon and vague workplace idioms.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/no-jargon.

no-non-inclusive-language-nlp

Flag non-inclusive terms and suggest neutral alternatives using NLP-aware matching.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/no-non-inclusive-language-nlp.

no-noun-strings

Flag dense strings of consecutive nouns.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/no-noun-strings.

no-overly-complex-sentences

Flag sentences with too many coordinating or subordinating conjunctions.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/no-overly-complex-sentences.

no-superlative-claims

Flag unproven superlatives and market-positioning claims.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/no-superlative-claims.

no-weak-verbs

Flag vague action verbs and suggest stronger alternatives.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/no-weak-verbs.

sentence-complexity

Flag sentences that exceed a word or clause threshold.

Package: @faircopy/rules-nlp. Configure as @faircopy/rules-nlp/sentence-complexity.