berelevant-ai/slopless

Deterministic textlint rules and CLI for catching prose slop in English Markdown.

What it is

Slopless is a command-line tool that scans English Markdown files for what the README calls "slop" — vague, clichéd, or overconfident writing common in both AI-generated and human prose. It's built on top of textlint, a popular linting framework for text, but bundles everything so you don't need a separate textlint setup.

How it works

You run it against files or folders, and it returns JSON listing every problem it finds. The README shows a sample paragraph that triggers six findings across five rules — things like "let me be honest" (boilerplate framing), "in a world where" (prohibited phrase), "We do not sell software. We sell outcomes." (negation reframe), "everyone knows" (universalizing claim), and "at the end of the day" (cliché). So it's looking at structure and rhetoric, not just a banned-word list.

Exit codes

  • 0 — no problems found
  • 1 — problems found
  • 2 — something failed (e.g., no input given)

A bare npx slopless with no file path, glob, or stdin exits with code 2. The tool is English-only.

Two layers of checking

  1. Deterministic rules — run locally, always on. These are the phrase and structure checks.
  2. Jev checks — optional, require a TypeSafe API key in the JEV_API_KEY environment variable. These send your writing to TypeSafe for semantic judgments (e.g., "empty takeaway" or "repeated explanation"). There are 54 Jev checks across eleven families. They're experimental — the README says their quality varies by check — and they only run when you explicitly select them with --check flags.

Narrative-slop rules — a separate set of rules for fiction and memoir (named feelings, empty beats, action cadence, perception density, narrative clichés). These are off by default; you turn them on with --narrative.

Three ways to use it

  1. CLI — npx slopless "docs/**/*.md". Output is always JSON. You can redirect it to a file yourself.
  2. Library — import createSlopless and createJevClient in JavaScript/TypeScript, call lintText() or lintFiles(). Supports abort signals, concurrency limits, timeouts, and retries.
  3. textlint preset — if you already use textlint, add preset-slopless to your .textlintrc.json and it runs alongside your other rules, supporting textlint's output formatters.

Agent integration

You can install a "skill" for Codex or Claude Code with npx slopless install-skill codex (or claude). Both install the same skill body. The intended workflow: install the skill, start a fresh agent session, and tell the agent to use the Slopless skill to check, rewrite, and re-run until the JSON output has no findings.

Ignoring specific rules

You can wrap intentional exceptions in HTML comments:

<!-- textlint-disable slopless/semantic-thinness -->

Something shifted in the room.

<!-- textlint-enable slopless/semantic-thinness -->

Suppression by ID — npx slopless --list-checks shows each check's reportId, which you can use in those disable comments. Deterministic IDs are stable; Jev model IDs include their family name.

Security / provenance

Every release since 0.2.13 is published from GitHub Actions via OIDC and carries a SLSA v1 provenance attestation recorded in the Sigstore transparency log. You can verify with npm audit signatures slopless.

Credits

The flat-action-cadence rule uses the Compromise library for English word classification. Its physical-action and actor vocabulary comes from Open English WordNet 2025 (CC BY 4.0). The README also thanks Graham Rowe, whose antislop library is "fully incorporated."

Bottom line

Slopless is a writing-quality linter for English Markdown, aimed at catching the kind of confident-sounding but empty prose that AI models and rushed humans produce. It's deterministic by default, optionally augmented with AI-based semantic checks, and designed to be used both by humans and by writing agents that can iterate until the checks pass.

Related

  • Project
  • Dispatch
  • Project
  • Project
  • Project