{"id":13594704,"url":"https://github.com/travisbrown/octocrabby","last_synced_at":"2026-03-07T22:32:21.029Z","repository":{"id":40544574,"uuid":"352121381","full_name":"travisbrown/octocrabby","owner":"travisbrown","description":"Tools for managing GitHub block lists","archived":false,"fork":false,"pushed_at":"2023-01-29T08:42:51.000Z","size":306,"stargazers_count":99,"open_issues_count":3,"forks_count":7,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-05T16:02:21.556Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/travisbrown.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}},"created_at":"2021-03-27T16:28:44.000Z","updated_at":"2025-03-28T06:33:03.000Z","dependencies_parsed_at":"2023-02-15T21:45:25.642Z","dependency_job_id":null,"html_url":"https://github.com/travisbrown/octocrabby","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/travisbrown/octocrabby","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Foctocrabby","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Foctocrabby/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Foctocrabby/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Foctocrabby/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/travisbrown","download_url":"https://codeload.github.com/travisbrown/octocrabby/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Foctocrabby/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30234596,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T19:01:10.287Z","status":"ssl_error","status_checked_at":"2026-03-07T18:59:58.103Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2024-08-01T16:01:38.023Z","updated_at":"2026-03-07T22:32:21.004Z","avatar_url":"https://github.com/travisbrown.png","language":"Rust","readme":"# GitHub block list management\n\n[![Build status](https://img.shields.io/github/workflow/status/travisbrown/octocrabby/ci.svg)](https://github.com/travisbrown/octocrabby/actions)\n\nOctocrabby is a small set of command-line tools and [Octocrab][octocrab] extensions\nthat are focused on managing block lists on [GitHub][github].\nThis project [was inspired][1375333996398325762] by an [open letter][rms-support-letter]\nsupporting Richard Stallman, which has been signed by several thousand GitHub users I\ndon't want to accidentally donate free open source support to.\n\nThis project may eventually get merged into [cancel-culture][cancel-culture], which is currently\nfocused on archiving and block list management for Twitter.\n\n## Usage\n\nThis project is made of [Rust][rust], and you currently need Rust and [Cargo][cargo] installed\nto use it. If you've followed [these instructions][rust-installation] and cloned this repo locally,\nyou can build the CLI by running the following command from the project directory:\n\n```bash\n$ cargo build --release\n   Compiling bytes v1.0.1\n   ...\n   Compiling octocrabby v0.1.0 (/home/travis/projects/octocrabby)\n    Finished release [optimized] target(s) in 1m 35s\n```\n\nMost operations require a [GitHub personal access token][github-token], which you currently have to\nprovide as a command-line option. If you want to use the mass-blocking functionality, you'll need to\nselect the `user` scope when creating your token. If you only want to generate reports or export your\nfollower or block lists, that shouldn't be necessary. The following examples assume that this has been\nexported to the environment variable `GH_TOKEN`.\n\n### Contributor reports\n\nOne operation that doesn't require a personal access token is `list-pr-contributors`:\n\n```bash\n$ target/release/crabby -vvvv list-pr-contributors -r rms-support-letter/rms-support-letter.github.io \u003e data/rms-support-letter-contributors.csv\n```\n\nIf no token is provided, this command will output a CSV document with a row for each GitHub user who contributed\na pull request to the given repository. Each row will have three columns:\n\n1. GitHub username\n2. GitHub user ID\n3. Number of PRs for this repository\n\nFor example:\n\n```csv\n0312birdzhang,1762041,1\n0hueliSJWpidorasi,81465353,1\n0kalekale,31927746,1\n0ver3inker,53104897,1\n0x0000ff,1977210,1\n```\n\nIf you provide a personal access token to this command (via `-t`), the output will include several additional columns:\n\n1. GitHub username\n2. GitHub user ID\n3. Number of PRs for this repo\n4. Number of days between account creation and the first PR to this repo\n5. The user's name (if available)\n6. The Twitter handle provided by the user (if available)\n7. A boolean indicating whether you follow this user\n8. A boolean indicating whether this user follows you\n\nFor example:\n\n```csv\n01012,14347178,2,2019,,,false,false\n0312birdzhang,1762041,1,3229,BirdZhang,,false,false\n0MazaHacka0,11509345,1,2204,Dmitry Abakumov,,false,false\n0hueliSJWpidorasi,81465353,1,0,,,false,false\n0kalekale,31927746,1,1288,kalekale,,false,false\n0mid,288476,1,3958,,,false,false\n0rhan,33350605,2,1241,Orhan Gurbanov,,false,false\n0ver3inker,53104897,1,617,0ver3inker,0ver3inker,false,false\n0x0000-dot-ru,1397843,2,3343,Dmitriy Balakin,,false,false\n0x0000ff,1977210,1,3176,,,false,false\n```\n\nPlease note that GitHub does not verify that the Twitter handle provided by a GitHub user in their\nGitHub profile is owned by that user (or that it exists, etc.), so that field should not be used\nfor automated blocking on Twitter. You can omit that column from the output by providing `--omit-twitter`.\n\nYou can find copies of the output of this command in this project's [data directory][data-directory].\n\nThis allows us to see how many of the signatories were using single-purpose throwaway accounts, for example.\nAs of this morning, only 82 of the 3,000+ accounts were created on the same day they opened their PR:\n\n```bash\n$ awk -F, '$4 == 0' data/rms-support-letter-contributors.csv | wc\n     82     102    3282\n```\n\nYou can also check how many of the signers follow you on GitHub:\n\n```bash\n$ egrep -r \"true,(true|false)$\" data/rms-support-letter-contributors.csv | wc\n      0       0       0\n```\n\nAnd how many you follow:\n\n```bash\n$ egrep -r \"true$\" data/rms-support-letter-contributors.csv | wc\n      0       0       0\n```\n\nGood.\n\n### Follow and block list export\n\nThe CLI also allows you to export lists of users you follow, are followed by, and block:\n\n```bash\n$ target/release/crabby -vvvv -t $GH_TOKEN list-following | wc\n     24      24     408\n\n$ target/release/crabby -vvvv -t $GH_TOKEN list-followers | wc\n    575     575   10416\n\n$ target/release/crabby -vvvv -t $GH_TOKEN list-blocks | head\nalexy,27491\nsoc,42493\njdegoes,156745\nvmarquez,427578\ngvolpe,443978\nneko-kai,450507\nhmemcpy,601206\nkubukoz,894884\npropensive,1024588\nphderome,11035032\n```\n\nThe format is a two-column CSV with username and user ID.\n\nIt's also possible to export the block list of an organization you administer by adding `--org $MY_ORG`\nto the `list-blocks` command (note that this requires your token to have the `read:org` scope enabled).\n\nIn general it's probably a good idea to save the output of the `list-blocks` command before using\nthe mass-blocking functionality in the next section.\n\n### Mass blocking\n\nThe CLI also includes a `block-users` command that accepts CSV rows from standard input. It ignores all\ncolumns except the first, which it expects to be a GitHub username. This is designed to make it convenient\nto save the output of `list-pr-contributors`, manually remove accounts if needed, and then block the rest.\n\n```\ntarget/release/crabby -vvv -t $GH_TOKEN block-users \u003c data/rms-support-letter-contributors.csv\n15:17:36 [WARN] Skipping 3936 known blocked users\n15:17:36 [INFO] Successfully blocked Aliaksei-Tatarynchyk\n...\n```\n\nIf you've set the logging level to at least `WARN` (via the `-vvv` or `-vvvv` options), it will show you\na message for each user who is blocked. Note that if you've blocked thousands of accounts or are running\nthe script on a repository for the first time, it may be faster to include the `--force` option, which\ndoesn't download your current block list, but simply requests a block for each user.\n\nIt's also possible to block a list of users on behalf of an organization that you administer by adding\n`--org $MY_ORG` to the `block-users` command (assuming your token has `write:org` enabled).\n\n### Other tools\n\nYou can view all currently supported commands with `-h`:\n\n```\ncrabby 0.1.0\nTravis Brown \u003ctravisrobertbrown@gmail.com\u003e\n\nUSAGE:\n    crabby [FLAGS] [OPTIONS] \u003cSUBCOMMAND\u003e\n\nFLAGS:\n    -h, --help       Prints help information\n    -v, --verbose    Logging verbosity\n    -V, --version    Prints version information\n\nOPTIONS:\n    -t, --token \u003ctoken\u003e    A GitHub personal access token (not needed for all operations)\n\nSUBCOMMANDS:\n    block-users             Block a list of users provided in CSV format to stdin\n    check-follow            Check whether one user follows another\n    help                    Prints this message or the help of the given subcommand(s)\n    list-blocks             List accounts the authenticated user blocks in CSV format to stdout\n    list-followers          List the authenticated user's followers in CSV format to stdout\n    list-following          List accounts the authenticated user follows in CSV format to stdout\n    list-pr-contributors    List PR contributors for the given repository\n```\n\n## Caveats and future work\n\nI wrote this thing yesterday afternoon. It's completely untested. It might not work. For your own safety\nplease don't use it with a personal access token with unneeded permissions (i.e. anything except `user`).\n\nIt's probably possible to include the account age in the contributor report even when unauthenticated—I just\nwasn't able to find a way to get information about multiple users via a single request except through the\nGraphQL endpoint, which is only available to authenticated users (and if you request each user individually,\nyou'll run into GitHub's rate limits for projects like the Stallman support letter).\n\n## Related projects\n\n* [highlight-rms-supporters] is a userscript that highlights signers of the Stallman support letter in the browser\n\n## License\n\nThis project is licensed under the Mozilla Public License, version 2.0. See the LICENSE file for details.\n\n[1375333996398325762]: https://twitter.com/travisbrown/status/1375333996398325762\n[cancel-culture]: https://github.com/travisbrown/cancel-culture\n[cargo]: https://doc.rust-lang.org/cargo/\n[data-directory]: https://github.com/travisbrown/octocrabby/tree/main/data\n[github]: https://github.com/\n[github-token]: https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token\n[highlight-rms-supporters]: https://github.com/sticks-stuff/highlight-RMS-supporters\n[octocrab]: https://github.com/XAMPPRocky/octocrab\n[rms-support-letter]: https://github.com/rms-support-letter/rms-support-letter.github.io\n[rust]: https://www.rust-lang.org/\n[rust-installation]: https://doc.rust-lang.org/book/ch01-01-installation.html","funding_links":[],"categories":["Rust","Tools"],"sub_categories":["Video Conference"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftravisbrown%2Foctocrabby","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftravisbrown%2Foctocrabby","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftravisbrown%2Foctocrabby/lists"}