Skip to content

Repository files navigation

faircopy

A copy linter for landing pages. Catches writing-quality bugs in the prose that ships inside your codebase: em-dashes, weasel words, and rhetorical scaffolding patterns.

error[no-em-dash]: use a sentence break instead of an em-dash
  ┌─ src/pages/index.astro:12:38
  │
12 │   <p>Omni Aura builds the memory layer — the part that matters.</p>
  │                                          ^
  │
  = help: Split the sentence. Use a period, a semicolon, or a new sentence.

Install

npm i -D faircopy @faircopy/astro

Configure

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

export default defineConfig({
  files: ['src/**/*.astro'],
  ignore: ['src/content/blog/**'],
  adapters: [astro()],
  rules: {
    'no-em-dash': 'error',
    'no-weasel-words': 'error',
    'no-rhetorical-scaffolding': 'error',
  },
})

Run

npx faircopy lint

CI

- uses: actions/checkout@v4
- run: npm ci
- run: npx faircopy lint --format github

--format github emits ::error workflow commands so diagnostics appear as inline PR annotations.

Claude Code plugin

Install the plugin to get a stop hook (blocks the turn if lint errors are found) and a skill (Claude runs faircopy automatically when editing marketing copy):

/plugin marketplace add github.com/omniaura/faircopy
/plugin install faircopy

Rules

Rule Default Description
no-em-dash error Ban in marketing copy
no-weasel-words error Ban actually, truly, really, literally
no-rhetorical-scaffolding error Ban X is Y, not Z and Without X / With X patterns
no-passive-voice warn Flag likely passive-voice constructions
no-complex-readability warn Flag prose whose Flesch-Kincaid grade level exceeds a target

Optional NLP rules live in @faircopy/rules-nlp. Load the ruleset once to configure its rules with bare IDs:

export default defineConfig({
  rulesets: ['@faircopy/rules-nlp'],
  rules: {
    'no-adverb-overuse': 'warn',
    'no-expletive-openers': 'warn',
    'no-filter-words': 'warn',
    'no-future-promises': 'warn',
    'no-hedge-words': 'warn',
    'no-jargon': 'warn',
    'no-passive-voice': 'warn',
    'no-weak-modals': 'warn',
    'no-stacked-adjectives': 'warn',
    'no-nominalized-phrases': 'warn',
    'no-pronoun-led-claims': 'warn',
    'no-buzzword-stacks': 'warn',
    'no-complex-readability': 'warn',
    'no-vague-quantifiers': 'warn',
    'no-meaningless-modifiers': 'warn',
    'no-superlative-claims': 'warn',
  },
})

Use a package-qualified ID if two loaded rulesets expose the same bare rule name.

Rule Description
@faircopy/rules-nlp/no-adverb-overuse Flag sentences with more than two adverbs ending in -ly
@faircopy/rules-nlp/no-expletive-openers Flag sentence openings like There are
@faircopy/rules-nlp/no-filter-words Ban filter phrases like I think and it seems
@faircopy/rules-nlp/no-future-promises Flag future-tense promises like will help you
@faircopy/rules-nlp/no-hedge-words Flag hedge words like kind of and somewhat
@faircopy/rules-nlp/no-jargon Flag business jargon like leverage and circle back
@faircopy/rules-nlp/no-passive-voice Flag likely passive-voice constructions
@faircopy/rules-nlp/no-weak-modals Flag hedged modal claims like can help and might improve
@faircopy/rules-nlp/no-stacked-adjectives Flag noun phrases with multiple adjectives before the noun
@faircopy/rules-nlp/no-nominalized-phrases Flag nominalized X of Y phrases like optimization of onboarding
@faircopy/rules-nlp/no-pronoun-led-claims Flag vague sentence openers like This helps and It enables
@faircopy/rules-nlp/no-buzzword-stacks Flag sentences overloaded with abstract benefit nouns
@faircopy/rules-nlp/no-vague-quantifiers Flag bare quantifiers without numeric anchors
@faircopy/rules-nlp/no-meaningless-modifiers Flag intensifiers like very and obviously that add no information
@faircopy/rules-nlp/no-superlative-claims Flag unproven superlatives like best and world-class

Packages

Package Purpose
faircopy Meta-package — install this
@faircopy/cli faircopy binary
@faircopy/core Engine: types, config loader, file resolver, rule runner
@faircopy/astro Astro adapter
@faircopy/rules-default Default ruleset
@faircopy/rules-nlp Optional NLP-powered ruleset
@faircopy/config defineConfig() helper
@faircopy/plugin Claude Code plugin

License

MIT

About

Copy linter for landing pages — catches em-dashes, weasel words, and rhetorical scaffolding in Astro files

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages