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.
npm i -D faircopy @faircopy/astro// 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',
},
})npx faircopy lint- 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.
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
| 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 |
| 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 |
MIT