{"id":50670101,"url":"https://github.com/peeramid-labs/sloppoke","last_synced_at":"2026-06-10T12:00:48.214Z","repository":{"id":363155259,"uuid":"1262144056","full_name":"peeramid-labs/sloppoke","owner":"peeramid-labs","description":"Blazing-fast AI-slop firewall","archived":false,"fork":false,"pushed_at":"2026-06-09T04:51:52.000Z","size":2749,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"dev","last_synced_at":"2026-06-09T11:24:24.997Z","etag":null,"topics":["ai","ai-slop","ai-slop-detection","ai-slop-fixer","codereview","llm-slop","qa","qa-automation","slop"],"latest_commit_sha":null,"homepage":"https://sloppoke.me","language":"Rust","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/peeramid-labs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-07T16:22:26.000Z","updated_at":"2026-06-09T04:51:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/peeramid-labs/sloppoke","commit_stats":null,"previous_names":["peeramid-labs/slop-cli","peeramid-labs/sloppoke"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/peeramid-labs/sloppoke","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peeramid-labs%2Fsloppoke","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peeramid-labs%2Fsloppoke/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peeramid-labs%2Fsloppoke/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peeramid-labs%2Fsloppoke/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peeramid-labs","download_url":"https://codeload.github.com/peeramid-labs/sloppoke/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peeramid-labs%2Fsloppoke/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34151276,"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-10T02:00:07.152Z","response_time":89,"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","ai-slop","ai-slop-detection","ai-slop-fixer","codereview","llm-slop","qa","qa-automation","slop"],"created_at":"2026-06-08T10:04:58.137Z","updated_at":"2026-06-10T12:00:48.199Z","avatar_url":"https://github.com/peeramid-labs.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sloppoke\n\n[![Release](https://img.shields.io/github/v/release/peeramid-labs/sloppoke?label=release)](https://github.com/peeramid-labs/sloppoke/releases)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Server: sloppoke.me](https://img.shields.io/badge/server-sloppoke.me-green.svg)](https://sloppoke.me/)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/mascot.png\" alt=\"slop mascot\" width=\"500\"/\u003e\n\u003c/p\u003e\n\n**Blazing-fast AI-slop firewall for your git workflow.** Sub-10ms\nverdict per patch. Learns from every correction you ship.\n\n```\nslop poke                                # working tree vs HEAD (default)\nslop poke --staged                       # the staged index\nslop poke --range main..HEAD             # everything diverged from main\nslop poke --since main                   # shorthand for the same\nslop poke --patch foo.patch              # raw unified-diff file\nslop poke --gh org/repo --range X..Y     # any public github repo, no clone needed\nslop poke --repo URL  --range X..Y       # any git URL (gitlab, bitbucket, self-hosted)\nslop apply                               # apply the cached patch, amend HEAD\nslop learn \"false positive on src/foo.rs\"\n```\n\nOutput goes to **stdout** as a unified-diff patch — apply hint and\nverdict line on stderr — so piping is trivial:\n\n```\nslop poke \u003e slop.patch                   # save the patch\nslop poke | git apply --unidiff-zero     # apply directly\nslop poke | delta                        # view in a pager\n```\n\n## How do we characterize slop?\n\nSlop is what writing-by-suggestion leaves in source. Three flavours,\neasier to feel than to define:\n\n- **Wordy nothing** — comments that restate the next line, names\n  that say less than nothing, prose that drifts.\n- **Defensive theatre** — guards for impossible cases, empty\n  catches, retries with no upstream, asserts that can't fire.\n- **Unfinished work shipped** — placeholder brackets, untested\n  branches, stub markers, AI-authorship trailers committed instead\n  of staying in metadata.\n\nWe don't publish the catalog, and it isn't static. Every `slop\nlearn \"…\"` you submit calibrates the engine for your account; the\nset firing on your repo on day 30 isn't the set firing today.\n\n## What it does\n\nslop sweeps your diff through a blazing-fast machine-learning engine\nthat knows what AI-generated code looks like — and pulls it out before\nyou ship.\n\n- **Catches the artefacts an LLM leaves behind.** Scaffolding\n  comments, placeholder identifiers, defensive crud, half-finished\n  markers, untested branches — the residue that survives \"looks fine\"\n  review but rots six months later.\n- **Adapts to your codebase.** Every `slop learn` you submit tunes the\n  engine for your account and your project. The catalogue you scan\n  against on day 30 isn't the catalogue you started with — it's the\n  one calibrated to your team's idioms.\n- **Fixes what's safe, flags what isn't.** Mechanical noise is\n  stripped automatically; anything that could change behaviour gets a\n  TODO comment spliced into your diff for you to decide on. The CLI\n  refuses to mutate your tree unless `git apply` agrees the change is\n  clean.\n\nDetection runs server-side and updates continuously — no re-install\nneeded. Works on every language; the deepest analysis lights up first\nfor Rust, TypeScript/JavaScript, Python, and Go.\n\n## Install\n\n### Homebrew (macOS + Linux)\n\n```\nbrew install peeramid-labs/tap/slop\n```\n\nPrebuilt binaries for macOS (arm64 + x86_64) and Linux (arm64 + x86_64).\nAPT repo still pending.\n\n### Build from source\n\n```\ngit clone https://github.com/peeramid-labs/sloppoke.git\ncd sloppoke\ncargo install --path crates/sloppoke-cli\n```\n\nNeeds rust `1.86+`. One binary, no runtime daemons, no native deps\nbeyond `ssh-keygen` for request signing. `cargo install` places `slop`\nin `~/.cargo/bin/` — make sure that's on your `$PATH`.\n\n## Get started\n\n```\nslop login                     # SSH-key handshake; cache identity\nslop poke                      # scan; 402 returns a Stripe Checkout URL\nslop apply                     # auto-strip flagged lines, amend HEAD\nslop learn \"false positive\"    # shapes future scans\n```\n\n`slop apply` runs `git apply` + `git commit --amend` locally. Use\n`--no-commit` if you want to inspect the staged diff first.\n\n## Learns as you go\n\nslop adapts to **your** code and **your** preferences through machine\nlearning. Every `slop learn \"…\"` you submit teaches the engine — for\nyour account and your project specifically. False positives get\nquieter. Real misses get caught next time. The catalog you experience\non day 30 is calibrated to your team's idioms in ways the day-1\ncatalog could not be.\n\n\u003e slop does not retain user information. Learning signals are folded\n\u003e into the model and the raw inputs do not persist.\n\nNeed more headroom or have an unusual workload? Ping\n[engineering@peeramid.xyz](mailto:engineering@peeramid.xyz).\n\n## Auth\n\nSSH key = identity. `slop login` picks the key OpenSSH would use for\nthe server host (same resolution git observes), caches the fingerprint\nlocally, and signs each request with `ssh-keygen -Y sign`. No accounts,\nno signups beyond Stripe checkout.\n\n## Use in CI\n\nDrop into any GitHub Actions job to gate merges on a clean scan:\n\n```yaml\njobs:\n  slop:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0                  # need history for range diff\n      - name: install slop\n        run: |\n          curl -fsSL https://github.com/peeramid-labs/sloppoke/releases/latest/download/sloppoke-cli-x86_64-unknown-linux-gnu.tar.gz \\\n            | tar -xz -C /usr/local/bin\n      - name: configure identity\n        env:\n          SLOP_SSH_KEY: ${{ secrets.SLOP_SSH_KEY }}\n        run: |\n          mkdir -p ~/.ssh\n          echo \"$SLOP_SSH_KEY\" \u003e ~/.ssh/id_ed25519\n          chmod 600 ~/.ssh/id_ed25519\n          slop login\n      - name: scan PR\n        run: |\n          slop poke --range origin/${{ github.base_ref }}..HEAD \u003e slop.patch\n          if [ -s slop.patch ]; then\n            echo \"::error::sloppoke flagged AI-slop in this PR\"\n            cat slop.patch\n            exit 1\n          fi\n```\n\nMechanics:\n\n- **SSH key as secret.** `SLOP_SSH_KEY` holds the private key whose\n  fingerprint owns your subscription. Generate a dedicated CI key, run\n  `slop login` once locally to register the fingerprint, then store\n  the private half in GitHub Secrets. Same auth model as your laptop —\n  no separate token to manage.\n- **Scope to the PR diff.** `--range origin/${base_ref}..HEAD` keeps\n  the scan to changed lines only, so the run burns one poke per PR\n  instead of one per file.\n- **Exit code is the gate.** Empty stdout = clean = pass. Patch on\n  stdout = slop = fail the job, optionally print the patch in logs so\n  reviewers see the suggested fix.\n\nFor monorepos or trunk-based flows where `origin/main..HEAD` is too\nbroad, swap in `HEAD~1..HEAD` (last commit only) or a specific tag.\n\n## Claude skill\n\n`/slop` is bundled as a Claude skill in `skills/slop.md` — wires the\nCLI into your agent so it pokes before every commit.\n\n## License\n\nMIT. See `LICENSE`.\n\n---\n\nBuilt by [Peeramid Labs](https://peeramid.xyz/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeeramid-labs%2Fsloppoke","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeeramid-labs%2Fsloppoke","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeeramid-labs%2Fsloppoke/lists"}