{"id":51073444,"url":"https://github.com/cfregly/claude-deslop","last_synced_at":"2026-06-23T12:06:20.480Z","repository":{"id":364689421,"uuid":"1268594399","full_name":"cfregly/claude-deslop","owner":"cfregly","description":"Deterministic de-slop linter: keep AI tells (em-dashes, buzzwords, the generated look) out of prose and rendered output, from one canonical ruleset. The credibility spine for the founder-to-builder repo set.","archived":false,"fork":false,"pushed_at":"2026-06-14T04:22:59.000Z","size":34,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T05:08:09.417Z","etag":null,"topics":["ai-slop","claude","claude-code","linter","llm","writing"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cfregly.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-13T18:04:05.000Z","updated_at":"2026-06-14T04:23:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cfregly/claude-deslop","commit_stats":null,"previous_names":["cfregly/claude-deslop"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/cfregly/claude-deslop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfregly%2Fclaude-deslop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfregly%2Fclaude-deslop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfregly%2Fclaude-deslop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfregly%2Fclaude-deslop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cfregly","download_url":"https://codeload.github.com/cfregly/claude-deslop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfregly%2Fclaude-deslop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34686789,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-slop","claude","claude-code","linter","llm","writing"],"created_at":"2026-06-23T12:06:18.053Z","updated_at":"2026-06-23T12:06:20.471Z","avatar_url":"https://github.com/cfregly.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# claude-deslop\n\n[![ci](https://github.com/cfregly/claude-deslop/actions/workflows/ci.yml/badge.svg)](https://github.com/cfregly/claude-deslop/actions/workflows/ci.yml)\n[![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n![deslop: a sloppy doc scores F, clean prose scores A](docs/demo.svg)\n\nDeterministic de-slop linter: a sloppy doc scores F, clean prose scores 100.\nOne canonical ruleset finds AI-slop in two places: the **prose** (em-dashes,\nbuzzwords, filler phrases, `it's not X, it's Y` framing, generic template copy)\nand the **rendered output** (purple gradients, centered-everything,\nemoji-as-design, border-left cards). Plain Python, stdlib\nonly, MIT.\n\nIt is also the source of truth for de-slop across a set of sibling repos: the\nword and phrase lists live here, in [`deslop/slop_rules.json`](deslop/slop_rules.json),\nand `scripts/sync.py` copies them out so nothing drifts by hand.\n\n- **Problem it solves:** rules hand-copied into a resume builder, a PDF check, and three linters drift apart, and an artifact that reads generated gets trusted less.\n- **Run in under 5 minutes:** `python -m deslop examples/sloppy.md` then `examples/clean.md` - F then A, stdlib only.\n- **Production lesson it encodes:** numbers over adjectives, short verb-led sentences, no line that could open any company's landing page.\n\n## Where this fits\n\nSix public repos, one per stage of Anthropic's Founder's Playbook (Idea, MVP, Launch, Scale), plus two disciplines that run across every stage. The playbook names what a founder does at each stage. These are the runnable tools that do it. Claude runs the judgment on every stage, and a deterministic gate verifies the output before it ships.\n\n- **Idea**, validate to problem-solution fit: [claude-startup-idea](https://github.com/cfregly/claude-startup-idea)\n- **MVP**, build the product, then a security review before any user: [claude-startup-mvp](https://github.com/cfregly/claude-startup-mvp)\n- **Launch**, turn traction into a growth engine that runs without founder bottlenecks: [claude-startup-launch](https://github.com/cfregly/claude-startup-launch)\n- **Scale**, build a GTM function and compound data into a moat: [claude-startup-scale](https://github.com/cfregly/claude-startup-scale)\n- **Quality**, every stage: **[claude-deslop](https://github.com/cfregly/claude-deslop) (this repo)**\n- **Cost**, every stage: [claude-cost-control](https://github.com/cfregly/claude-cost-control)\n\n## Why\n\n\"Deslop everything\" started as a habit and kept regressing, because the rules\nwere hand-copied into a resume builder, a PDF check, and three linters that then\ndrifted apart. This repo makes the rules a single artifact with a linter, a\nscore, and a sync check. Numbers over adjectives. Short, verb-led sentences. No\nline that could open any company's landing page.\n\nFor a founder the stakes are credibility, not polish. Investors and recruiters\nread a lot of AI output, and a deck, README, or resume that smells generated\ngets trusted less. This is the de-slop pass that keeps your own voice on the\nartifacts you raise and hire with.\n\n## Use\n\n```bash\npython -m deslop README.md           # prose: grade + findings\npython -m deslop index.html          # prose + visual AI-slop blacklist\necho \"We leverage seamless synergy\" | python -m deslop -\n```\n\nExit code is the count of error+warn findings (capped at 255), so it works in a\npre-commit hook or CI step. As a library:\n\n```python\nfrom deslop import lint, lint_text, lint_html\nreport = lint(open(\"README.md\").read())   # {prose_grade, findings, ...}\n```\n\n`lint` returns the report dict shown above. `lint_text` and `lint_html` return just the list of findings.\n\nThere is also a `deslop` Claude Code skill. Install it with `/plugin marketplace add cfregly/claude-deslop` then `/plugin install deslop@deslop-plugins`, or upload the [`skills/deslop`](skills/deslop/SKILL.md) folder in the Claude app under Settings \u003e Skills:\nit lints, then rewrites the flagged lines and re-lints until clean.\n\n### Blessing intentional choices: `.desloprc`\n\nDrop a `.desloprc` at your repo root (see [`.desloprc.example`](.desloprc.example))\nto permit a word, phrase, or rule you mean to keep. An advisor can ship one\nhouse-style file across a portfolio.\n\n```json\n{ \"allow_words\": [\"robust\"], \"allow_phrases\": [], \"disable_rules\": [\"DS013\"] }\n```\n\nThe CLI auto-loads it from the linted file's directory. The library takes it as\n`lint(text, config=load_config(\".\"))`.\n\n### The Claude judge\n\nThe rules catch the slop you can enumerate. They cannot catch slop that needs reading: a vague claim, a hedge, an empty sentence that could sit in any document. The judge has claude-opus-4-8 read for those and prints them as advisory notes. Claude reviews every interactive run. The gate (check_docs, CI, `--min-score`) stays deterministic and never calls the API. It prints below the score and never changes the score or the exit code, so the deterministic gate stays reproducible. The gate is deterministic by design, that is what a gate is, and Claude rides on top.\n\n```bash\npip install anthropic                              # optional dependency\nexport ANTHROPIC_API_KEY=sk-ant-...                # or put it in .env\npython -m deslop README.md                         # judge reviews this interactive run\npython -m deslop README.md --judge                 # force it on, even piped or in CI\npython -m deslop README.md --no-judge              # the rule score alone, even with a key\n```\n\nText the rules pass can still draw a note. A line with no dash and no listed buzzword scores a clean A, and the judge still flags it when it says nothing:\n\n```\nstdin: prose A (100/100)\n  clean\n  [judge] 1 advisory note(s) from claude-opus-4-8 (not scored):\n    - \"Our platform helps teams do more with less.\"\n      why: Vague claim with no specifics about what the platform does or saves.\n      try: Our platform cuts report prep from three hours to twenty minutes.\n```\n\nWith no key the judge is a no-op and the linter behaves exactly as before, so CI stays green offline. This is a single structured read of text you already have, so it uses the Messages API, not the Agent SDK.\n\n## Rules\n\nProse (`lint_text`): DS001 dash tell (em, en, bar, figure), DS002 buzzword\n(`cutting edge` counts like `cutting-edge`), DS003 filler phrase,\nDS004 `it's not X, it's Y`, DS005 generic template copy, DS006 draft marker or\nunfilled placeholder (`TODO`, `FIXME`, `once this repo has a remote`, a\n`\u003cyour-org\u003e` stub), DS007 emoji in prose. Prose rules skip fenced and inline\ncode, so install snippets and flag names are never flagged as prose.\nVisual (`lint_html`): DS010 purple/indigo palette, DS011 centered-everything,\nDS012 emoji-as-design, DS013 colored left-border card. Severities deduct from\n100. Prose and visual are graded A-F separately.\n\n## Single source of truth\n\n[`deslop/slop_rules.json`](deslop/slop_rules.json) is canonical. The sibling\nrepos vendor a synced copy and load from it:\n\n```bash\npython scripts/sync.py            # copy canonical into every sibling repo\npython scripts/sync.py --check    # fail if any copy drifted (pre-push / CI)\n```\n\nTargets: the resume and deck builder (`deslop_rules.js`), the `validate/` and\n`raise/` modules of claude-startup-idea, and the `harden/` module of\nclaude-startup-mvp. Repos that cite the canon in prose or prompts rather than code\n(`claude-gpu-perf-tune`, the `build/` module of claude-startup-mvp) are not synced from here.\n\n## Credits\n\nThe word, phrase, and visual-slop lists merge this project's own canon with the\ngstack writing rules ([github.com/garrytan/gstack](https://github.com/garrytan/gstack),\nMIT) and the visual blacklist gstack cites from OpenAI's \"Designing Delightful\nFrontends.\" See [NOTICE](NOTICE).\n\n## Limitations\n\nHeuristic, not a proofreader. The rules match known AI-slop tells, so they miss\nnovel slop and can flag a choice you meant to keep (bless it in `.desloprc`). A\nclean score means no known tell fired, not that the writing is good. The visual\nchecks read HTML and CSS, not a rendered screenshot.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfregly%2Fclaude-deslop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcfregly%2Fclaude-deslop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfregly%2Fclaude-deslop/lists"}