How to use the unslop skill

By

The unslop skill removes AI writing tells from text. Learn where it comes from, why pstack includes it, and how to run it in Cursor, Claude Code and Codex.

~~~

The unslop skill is a single SKILL.md file that tells a coding agent how to remove AI writing patterns from a piece of text. It lists 28 numbered rules, covering things like “serves as”, “Not just X, but Y”, em dashes, bold labels and chatbot phrases. Its process has two steps: scan the text for those patterns, then rewrite it while keeping the meaning and the tone. You run it on text an agent wrote by typing /unslop in Cursor or Claude Code, or $unslop in Codex.

It comes from Cursor’s official plugins repository, where it’s part of pstack. If you installed pstack, you already have it.

Is unslop part of pstack?

Yes. The skill lives in the pstack/skills/unslop folder of Cursor’s plugins repository, next to poteto-mode and the rest of pstack. Lauren Tan maintains it along with the plugin, and it ships under pstack’s MIT license.

The unslop page on skills.sh points to that same file. When you install it with the Skills CLI, the lock file it writes lists pstack/skills/unslop/SKILL.md as the source.

Other pstack skills depend on it. poteto-mode sends every piece of prose through unslop, its own replies included, and the playbook for opening a PR applies it to the PR description and the commit bodies. That’s also why the rules have fixed numbers. Other skills cite them, so poteto-mode can say “unslop rule 14” when it means mid-sentence colons. My deep dive into pstack covers the rest of the plugin.

Be careful when you search skills.sh, because other skills share the name. theclaymethod/unslop is a separate project with its own teach, cleanup, rewrite and mimic commands and Python scanners. This post is about the one in Cursor’s repository.

How do I install unslop?

In Cursor, the easiest way is to install pstack as a plugin. Open a chat and run:

/add-plugin pstack

That gives you /unslop together with everything else in pstack.

If you only want this one skill, or you work in Claude Code or Codex, use the Skills CLI. This command installs unslop in the current project for all three agents:

npx skills add https://github.com/cursor/plugins --skill unslop --agent cursor claude-code codex -y

--skill picks unslop out of the 90-plus skills in the repository. --agent takes one or more agent names, and -y skips the confirmation prompts. Leave out --agent and the CLI looks for the agents installed on your machine, then asks you to choose when it finds more than one.

The command creates these files:

  • .agents/skills/unslop/SKILL.md, which both Cursor and Codex read
  • .claude/skills/unslop, a symlink to that folder, for Claude Code
  • skills-lock.json, which records where the skill came from

Add -g to install the skill for your user instead of one project. It then goes to ~/.agents/skills/unslop, with a symlink in ~/.claude/skills/unslop.

For other agents, --agent '*' installs it everywhere the CLI knows about. If your agent doesn’t support skills folders at all, this command prints a prompt with the whole skill inside, ready to paste into a chat:

npx skills use cursor/plugins@unslop

How do I run the unslop skill?

The skill’s frontmatter sets disable-model-invocation: true. In Cursor and Claude Code this means the agent never loads it on its own. It only runs when you type /unslop.

That can look like a contradiction, because the description right above that line says “Must always apply.” The agent follows the flag. Cursor’s docs say a skill with this setting is only included when you invoke it with /skill-name, and Claude Code’s docs say the same.

After the command, tell it what to clean and add any extra rules. The pstack guide uses prompts like this one:

/unslop the readme changes, no emdashes

Short prompts work too. Right after the agent writes something, this is enough:

/unslop that, tighten it

In Codex, you mention a skill with $, or run /skills in the CLI and pick it from the list:

$unslop rewrite the intro of README.md, keep every command as it is

What does unslop check?

The rules are grouped by type. I’ll summarize them here, but open the file before you rely on any of them, because it changes often.

The language rules are about word choice. There’s a list of AI vocabulary (delve, crucial, pivotal, tapestry, underscore, vibrant and a few more), plus rules against “serves as” and “boasts” where “is” and “has” would do. It also catches “Not just X, but Y”, forced groups of three, a subject that gets a new synonym every time it comes up, and false ranges like “from X to Y” when X and Y aren’t on any real scale.

The content rules target -ing phrases tacked onto the end of a sentence (“highlighting…”, “ensuring…”) and vague attributions like “Experts believe”. The fix for both is to name the source or delete the phrase.

Then there’s formatting and punctuation. Rule 13 bans em dashes, and it’s strict about what replaces them:

Use periods or commas only (no parentheses, no en dashes, no hyphen-as-dash substitutes).

Colons used as connectors in the middle of a sentence go too, along with bold on every name and acronym, “Label: text” bullet lists, Title Case headings, emoji in headings and curly quotes.

Other rules remove chatbot phrases like “I hope this helps!” and “Great question!”, filler like “in order to”, stacked hedges, and endings like “The future looks bright.” There’s also a list of abstract metaphor nouns (substrate, wedge, north star, flywheel) with plain replacements, like “base” for “substrate”.

The last group is called plain speech, and it’s the most useful one for technical text. It asks for active voice, shorter sentences, fewer adverbs and plain words, so “leverage” becomes “use”. Rule 27 has a good test for empty sentences:

One more check: if the sentence could appear unchanged in another project’s docs, it says nothing about this one. Cut it.

Rule 33 goes the other way. It targets notes compressed so much that you have to decode them, like “Parser rejects bad date → exit 2, no write”. The fix is a whole sentence with its articles and verbs.

You’ll notice the numbering has gaps. There’s no rule 1, 2, 4, 6 or 21. The file explains that “A removed rule leaves a gap”, so a skill that cites rule 14 never ends up pointing at a different rule. Older versions used those numbers for puffery, name-dropping, promotional language, formulaic “despite challenges” paragraphs and knowledge-cutoff disclaimers.

How does unslop work?

The whole process section is two lines:

  1. Scan for the patterns below.
  2. Rewrite. Preserve meaning, match intended tone.

Earlier versions had more. They told the agent to “add soul” (have opinions, vary the rhythm, use “I” when it fits) and ended with a self-audit that asked “What makes this obviously AI generated?”. Both are gone from the current file, so the check after the rewrite is your job.

That’s how I use anti-slop skills anyway. Once the first version is done, I run them as a separate pass with a narrow prompt: keep the facts, fix only the patterns the skill covers. Then I inspect the diff myself. The reasons for keeping it a separate step are in Why I use anti-slop skills.

A before and after example

Here’s a test. This is a README intro for a small CLI that tells you which process is using a port, written on purpose with most of the habits the skill targets. Save it as draft.md:

# 🚀 portwho: Your Ultimate Port Detective

In today's fast-paced development landscape, port conflicts can be a frustrating roadblock — disrupting your workflow and slowing down your entire team. portwho serves as a powerful, lightweight, and intuitive command-line tool that seamlessly identifies which process is using a given port.

It's not just a port checker — it's a comprehensive solution for modern developers. Whether you're debugging a stubborn dev server, juggling microservices, or simply exploring your system, portwho empowers you to take full control of your environment.

**Key Features:**

- **Instant Detection:** Run `portwho 3000` to instantly see the PID, the process name, and the user, ensuring a smooth development experience.
- **Cross-Platform Support:** Works seamlessly on macOS and Linux, fostering consistency across your team.
- **Developer-Friendly Output:** Clean, readable output that showcases exactly the information you need.

Experts agree that efficient tooling is crucial for developer productivity. With portwho, the future of port management looks bright.

This command runs the Cursor CLI from the folder that contains draft.md, with a fast Grok model and the skill installed by the Skills CLI command from earlier. --mode ask makes the agent read-only, so it prints the result instead of editing the file, and --trust skips the workspace trust prompt:

agent -p --mode ask --trust --model grok-4.7-medium-fast "Read the skill at .agents/skills/unslop/SKILL.md and apply it to the text in draft.md. Print only the rewritten text."

If you installed pstack as a Cursor plugin instead, the same file lives in Cursor’s plugin cache under ~/.cursor/plugins/cache.

Here’s what it returned:

# portwho finds which process uses a port

When a port is already taken, your server cannot start. portwho is a command-line tool that shows the process using that port.

Run `portwho 3000`. It prints the PID, the process name, and the user. It works on macOS and Linux.

The emoji and the Title Case heading are gone, and so are both em dashes. “serves as” became “is”. The “not just a port checker” line, the “Experts agree” sentence and the bright future at the end were deleted. The bold feature list turned into two plain sentences that kept the facts from its first two bullets.

It also made edits worth checking. The sentence about debugging dev servers and juggling microservices is gone. So is the “clean, readable output” bullet, which said nothing, but a real feature could disappear the same way. And “your server cannot start” is new. The draft only talked about “port conflicts”, and the model filled in the consequence by itself. It happens to be true here, and you only catch that kind of edit by comparing the two versions.

When should I use unslop?

Use it on text an agent wrote that other people will read:

  • READMEs and documentation pages
  • PR descriptions and commit messages
  • release notes and changelog entries
  • UI copy, error messages and onboarding screens

Agents write a lot of this text, and it’s easy to ship it without a close read. Sending it that way is what Tobi Lütke calls a slop grenade. A cleanup pass won’t replace the read, but it gives you a shorter, plainer text to review.

unslop is for prose. For code, Cursor ships a separate /deslop skill in its cursor-team-kit plugin (/add-plugin cursor-team-kit). It checks the branch diff against main for things like unnecessary comments, unusual try/catch blocks and casts to any.

What unslop won’t do

It doesn’t check facts. If the agent got a flag wrong in the README, unslop rewrites the wrong flag in plainer words.

It doesn’t know your voice either, because the rules reflect Lauren’s taste and pstack’s style. Rule 13, for example, won’t let the agent use parentheses in place of an em dash, and you may like parentheses.

It can also drop content, as the example above shows, or flatten an unusual phrase you chose on purpose. I treat every edit as a proposal.

How do I make my own version?

Treat the public rules as a starting point. When the same pattern slips through twice, add a rule for it. When a rule keeps producing awkward sentences, change it or delete it.

To do that, copy the skill into your project under a new name:

mkdir -p .agents/skills/readme-unslop
cp .agents/skills/unslop/SKILL.md .agents/skills/readme-unslop/SKILL.md

The new name matters. If two skills have the same name, Codex doesn’t merge them and shows both in the skill picker.

Then edit the frontmatter and add your own rules at the end of the file:

---
name: readme-unslop
description: Remove AI writing patterns from the portwho README and release notes.
disable-model-invocation: true
---

<!-- the unslop rules stay here -->

## Project rules

- Keep every command, flag and version number exactly as written.
- Keep the install command in the first screen of the README.
- Write "you", not "users" or "developers".
- Write the project name in lowercase: portwho.

Cursor and Codex pick it up from .agents/skills as /readme-unslop and $readme-unslop. Claude Code only reads .claude/skills, so put the folder there, or add a symlink like the Skills CLI does.

If you’d rather write a skill from scratch, my free AI Agent Skills course walks through the whole process, including how to test when a skill should and shouldn’t trigger.

Tagged: AI · All topics

Want me to talk about your product? You can sponsor this site.

~~~

Related posts about ai: