taste-lint
Catches AI slop in a diff before it ships.
Matthew Blode’s linter runs semantic taste checks over changed files. Jev judges the writing and the code that a rule-based linter has no way to see.
# [Taste Lint](https://blode.co/taste-lint) **Catch AI slop before you ship.** Design review on every commit, from the [Taste Training](https://blode.co/taste-training) and [Agent Skills](https://github.com/mblode/agent-skills) rules. <p align="center"> <a href="https://www.npmjs.com/package/taste-lint"><img alt="npm version" src="https://img.shields.io/npm/v/taste-lint?style=flat&colorA=000000&colorB=000000" /></a> <a href="https://github.com/mblode/taste-lint/blob/main/LICENSE.md"><img alt="MIT license" src="https://img.shields.io/npm/l/taste-lint?style=flat&colorA=000000&colorB=000000" /></a> </p> </div> ## Install ```bash npx taste-lint@latest init ``` Node 24.11+. Init adds a `taste` script that runs `taste-lint lint --profile product`. ## Quickstart ```bash npm run taste -- --dry-run ``` No key, no account. The mechanical checks run and fail the build on what they find. To add the Jev review notes, get a [Vercel AI Gateway key](https://vercel.com/docs/ai-gateway/authentication-and-byok/api-keys): ```bash export AI_GATEWAY_API_KEY="your-vercel-ai-gateway-key" npm run taste ``` Checks bill your key and cache between runs. `--dry-run` previews the cost first. To block commits on the mechanical checks, add a pre-commit hook with lefthook, husky or lint-staged: ```bash npx taste-lint init --hook lefthook ``` ## What it checks - **Motion:** `transition-all` and `transition: all`, ease-in, linear easing, transitions over 300ms, entrances from scale zero, `framer-motion` imports. - **Copy:** the [ghostwriter](https://github.com/mblode/agent-skills/tree/main/skills/ghostwriter) structure tells (participle tails, “it’s not X, it’s Y”, “Here’s the thing”), “click here” links, “successfully” toasts, emoji in UI, nominalisations, anthropomorphism, long sen